
    iR                    4   d Z ddlmZ ddlZddlmc mZ ddl	Z	e	j                  j                  dd       ddlZddlmZmZmZmZ ddlZddlmZmZmZ d ZdBdZdCd	ZdDd
Z	 	 	 dE	 	 	 	 	 	 	 dFdZdGdHdZdGdHdZdDdZdDdZdIdJdZ d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d  Z0d! Z1d" Z2d# Z3d$ Z4e5d%k(  rddl6Z6d&e!fd'e"fd(e#fd)e$fd*e%fd+e&fd,e'fd-e(fd.e)fd/e*fd0e+fd1e,fd2e-fd3e.fd4e/fd5e0fd6e1fd7e2fd8e3fd9e4fgZ7dZ8 e9e7      Z:e7D ]  \  Z;Z<	  e<         e=d:e;        e8d;z  Z8  e=d>e8 d?e: d@       e8e:k(  r	 e=dA       y e	j                  d;       yy# e>$ r)Z? e=d<e; d=e?         e6j                          Y dZ?[?zdZ?[?ww xY w)Ku  
Tests for Story 6.06 (Track B): OCCCommitEngine — Barrier Sync + OCC Write

Black Box tests (BB): verify public contract from the outside.
    BB1: 3 workers submit → all collected → merged → committed → success=True
    BB2: Version conflict on first attempt → retry succeeds on attempt 2 → retries=1
    BB3: All 3 retries fail → CommitResult(success=False), saga_status="conflict_exhausted"
    BB4: Merge fails → CommitResult(success=False), saga_status="merge_failed"
    BB5: saga_writer.close_saga called on both success and failure paths

White Box tests (WB): verify internal mechanics.
    WB1: merge_interceptor.merge called with correct args (deltas, current_state, version)
    WB2: staging.wait_for_all called with expected_workers and timeout_ms=60000
    WB3: MAX_RETRIES constant equals 3
    WB4: commit_patch called with correct version for OCC check

Story: 6.06
File under test: core/coherence/occ_commit.py

ALL tests use mocks — NO real Redis connection is made.
NO SQLite anywhere in this module.
    )annotationsNz/mnt/e/genesis-system)	AsyncMock	MagicMockcallpatch)OCCCommitEngineOccCommitResultMAX_RETRIESc                    t        j                         }	 |j                  |       |j                          S # |j                          w xY w)z<Run a coroutine synchronously (pytest-asyncio not required).)asyncionew_event_looprun_until_completeclose)coroloops     6/mnt/e/genesis-system/tests/track_b/test_story_6_06.pyrunr   3   s6    !!#D&&t,



s	   7 A	c                <    t               }t        |       |_        |S )zMReturn a mock StagingArea that immediately yields `deltas` from wait_for_all.return_value)r   r   wait_for_all)deltasstagings     r   _make_stagingr   @   s    kG$&9GN    c                l    t               }d|_        | |_        t               }t        |      |_        |S )zGReturn a mock merge interceptor that returns a successful merge result.Tr   r   successmerged_patchr   merge)r   merge_resultinterceptors      r   _make_merge_okr#   G   s3    ;LL ,L+K!|<Kr   c                 l    t               } d| _        g | _        t               }t        |       |_        |S )zCReturn a mock merge interceptor that returns a failed merge result.Fr   r   )r!   r"   s     r   _make_merge_failr%   R   s3    ;L L "L+K!|<Kr   c                    |ddi}t               }||_        |r| dz   nd|_        | |_        t               }t	        | |f      |_        t	        |      |_        |S )a   
    Return a mock RedisMasterState.

    get_snapshot always returns (version, data).
    commit_patch returns a CommitResult-like mock with
        success = commit_ok
        new_version = version + 1 (if commit_ok)
        conflict = not commit_ok
    statusrunning   r   r   r   r   new_versionconflictr   get_snapshotcommit_patch)versiondata	commit_okcommit_resultmasters        r   _make_master_stater4   ]   sf     |)$KM%M/8!aM!*]M[F#'4AF#?FMr   c                    |i }t               }d|_        d|_        d|_        t               }d|_        | dz   |_        d|_        t               }t	        | |f      |_        t	        ||g      |_        |S )z
    RedisMasterState that fails commit on attempt 0 (conflict), then succeeds.
    get_snapshot always returns the same (version, data).
    commit_patch alternates: fail on call 1, succeed on call 2.
    Fr   Tr)   r   )side_effectr*   )r/   r0   fail_result	ok_resultr3   s        r   _make_master_conflict_then_okr9   y   s     |+KKKKII#aKII[F#'4AF#i0HIFMr   c                    |i }t               }d|_        d|_        d|_        t               }t	        | |f      |_        t	        |      |_        |S )z@RedisMasterState that ALWAYS returns a conflict on commit_patch.Fr   Tr   r*   )r/   r0   r7   r3   s       r   _make_master_always_conflictr;      sU    |+KKKK[F#'4AF#=FMr   c                 8    t               } t               | _        | S )zReturn a mock saga writer.)r   r   
close_saga)sagas    r   _make_saga_writerr?      s    ;DkDOKr   c                 8    t               } t               | _        | S )zReturn a mock cold ledger.)r   write_event)ledgers    r   _make_cold_ledgerrC      s    [F"FMr   c           
     d    t        |       D cg c]  }d| dddd| d| dgd c}S c c}w )	zKReturn a list of `count` minimal delta dicts (as StagingArea would return).zagent-	sess-test   addz/keyvaloppathvalue)agent_id
session_idversion_at_readr   )range)countis     r   _sample_deltasrS      sT     u  !% "d1#J3qcKL		
  s   -c                 	   t        d      } ddddg}t        |       }t        |      }t        dd      }t	               }t               }t        |||||      }t        |j                  dd	            }|j                  }	d}
|	|
u }|st        j                  d
|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
|j$                  }	|	|k(  }|st        j                  d|fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t!        t        j"                  |            dx}	}|j&                  }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
|j(                  }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
|j*                  }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
y)u   
    BB1: 3 workers submit deltas → all collected from staging →
         merged successfully → committed → OccCommitResult(success=True).
       rG   z/mergedTrI   rF   r/   r1   rE   expected_workersisz/%(py2)s
{%(py2)s = %(py0)s.success
} is %(py5)sresultpy0py2py5assert %(py7)spy7N==z4%(py2)s
{%(py2)s = %(py0)s.merged_patch
} == %(py4)sr   r^   r_   py4assert %(py6)spy6   z/%(py2)s
{%(py2)s = %(py0)s.version
} == %(py5)sr   z/%(py2)s
{%(py2)s = %(py0)s.retries
} == %(py5)s	completedz3%(py2)s
{%(py2)s = %(py0)s.saga_status
} == %(py5)s)rS   r   r#   r4   r?   rC   r   r   execute_commitr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r/   retriessaga_status)r   r   r   mergerr3   r>   rB   enginer\   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_format5@py_format7s                   r   =test_bb1_three_workers_all_collected_merged_committed_successr      s   
 AF )dCDLF#GL)FT:FD FWffdFCF&&{Q&GHF>>!T!>T!!!!>T!!!!!!6!!!6!!!>!!!T!!!!!!!.,....,......6...6.........,...,.......>>Q>Q>Q66>Q>>Q>Q>Q66>Q,,,,,,,,,,,,6,,,6,,,,,,,,,,,,,r   c                 
   t        d      } ddddg}t        |       }t        |      }t        d      }t	               }t               }t        |||||      }t        |j                  dd	            }|j                  }	d
}
|	|
u }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
|j$                  }	|	|k(  }|st        j                  d|fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t!        t        j"                  |            dx}	}|j&                  }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
|j(                  }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
|j*                  }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
|j,                  }	|	j.                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      t        j                  |      d z  }d!d"|iz  }t!        t        j"                  |            dx}	x}x}}y)#z
    BB2: First commit_patch returns conflict; second attempt succeeds.
         result.retries == 1 (zero-indexed attempt number for success).
       replacez/statemergedrI      r/   z
sess-retryrW   TrY   r[   r\   r]   ra   rb   Nrc   re   r   rf   rh   ri      rk   r)   rl   rm   rn   )zT%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.commit_patch
}.call_count
} == %(py7)sr3   )r^   r_   rg   rb   zassert %(py9)spy9)rS   r   r#   r9   r?   rC   r   r   ro   r   rp   rq   rr   rs   rt   ru   rv   rw   r   r/   rx   ry   r.   
call_count)r   r   r   rz   r3   r>   rB   r{   r\   r|   r}   r~   r   r   r   r   @py_assert6@py_assert5@py_format10s                      r   6test_bb2_version_conflict_first_attempt_retry_succeedsr      s=   
 AF$hJKLF#GL)F*15FD FWffdFCF&&|a&HIF>>!T!>T!!!!>T!!!!!!6!!!6!!!>!!!T!!!!!!!.,....,......6...6.........,...,.......>>Q>Q>Q66>Q>>Q>Q>Q66>Q,,,,,,,,,,,,6,,,6,,,,,,,,,,,,, .)).Q.)Q....)Q......6...6......)...Q.......r   c                 	   t        d      } ddddg}t        |       }t        |      }t        d      }t	               }t               }t        |||||      }t        |j                  dd            }|j                  }	d	}
|	|
u }|st        j                  d
|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
|j$                  }	g }
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
|j&                  }	|	t(        k(  }|st        j                  d|fd|	t(        f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dt        j                         v st        j                  t(              rt        j                  t(              nddz  }dd|iz  }t!        t        j"                  |            dx}	}|j*                  }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }t!        t        j"                  |            dx}	x}}
|j,                  }	|	j.                  }|t(        k(  }|st        j                  d|fd|t(        f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dt        j                         v st        j                  t(              rt        j                  t(              nddz  }dd|iz  }t!        t        j"                  |            dx}	x}}y)z
    BB3: All MAX_RETRIES (3) OCC attempts fail with conflict.
         OccCommitResult(success=False, saga_status="conflict_exhausted").
    r)   rG   z/xrI   rU   r   zsess-exhaustrW   FrY   r[   r\   r]   ra   rb   Nrc   z4%(py2)s
{%(py2)s = %(py0)s.merged_patch
} == %(py5)s)z/%(py2)s
{%(py2)s = %(py0)s.retries
} == %(py4)sr
   rf   rh   ri   conflict_exhaustedrn   )zT%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.commit_patch
}.call_count
} == %(py6)sr3   r^   r_   rg   ri   assert %(py8)spy8)rS   r   r#   r;   r?   rC   r   r   ro   r   rp   rq   rr   rs   rt   ru   rv   rw   r   rx   r
   ry   r.   r   )r   r   r   rz   r3   r>   rB   r{   r\   r|   r}   r~   r   r   r   r   r   @py_format9s                     r   ,test_bb3_all_retries_fail_conflict_exhaustedr      s   
 AF $;<LF#GL)F)!4FD FWffdFCF&&~&JKF>>"U">U"""">U""""""6"""6""">"""U"""""""$"$"$$$$"$$$$$$6$$$6$$$$$$"$$$$$$$>>(>[((((>[((((((6(((6(((>(((((([((([(((((((5!55!55555!555555565556555555!55555555 8))8)[8888)[88888868886888888)888888[888[8888888r   c                    t        d      } t        |       }t               }t        dd      }t	               }t        ||||      }t        |j                  dd            }|j                  }d}||u }	|	st        j                  d|	fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                   |            dx}x}	}|j"                  }g }||k(  }	|	st        j                  d|	fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                   |            dx}x}	}|j$                  }d}||k(  }	|	st        j                  d|	fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                   |            dx}x}	}|j&                  j)                          y)z
    BB4: merge_interceptor.merge returns success=False.
         OccCommitResult(success=False, saga_status="merge_failed").
    r   rF   TrV   zsess-merge-failrW   FrY   r[   r\   r]   ra   rb   Nrc   r   merge_failedrn   )rS   r   r%   r4   r?   r   r   ro   r   rp   rq   rr   rs   rt   ru   rv   rw   r   ry   r.   assert_not_called)r   r   rz   r3   r>   r{   r\   r|   r}   r~   r   r   s               r   0test_bb4_merge_fails_returns_merge_failed_statusr     s   
 AFF#GFT:FDWffd;F&&'81&MNF>>"U">U"""">U""""""6"""6""">"""U"""""""$"$"$$$$"$$$$$$6$$$6$$$$$$"$$$$$$$////////////6///6/////////////
))+r   c                 
   t        d      } t        |       }t        ddddg      }t        dd      }t	               }t        ||||      }t        |j                  dd	             |j                  j                  dd
       y)zO
    BB5a: saga_writer.close_saga is called with ("completed") on success.
    r)   rG   /krI   r   TrV   zsess-saga-okrW   rm   N)
rS   r   r#   r4   r?   r   r   ro   r=   assert_awaited_once_withr   r   rz   r3   r>   r{   s         r   &test_bb5_saga_writer_called_on_successr   %  s|     AFF#GE4!DEFFT:FDWffd;FnqABOO,,^[Ir   c                    t        d      } t        |       }t        ddddg      }t        d      }t	               }t        ||||      }t        |j                  dd             |j                  j                  dd	       y
)z]
    BB5b: saga_writer.close_saga is called even when commit fails (conflict_exhausted).
    r)   rG   r   rI   r   r   zsess-saga-failrW   r   N)
rS   r   r#   r;   r?   r   r   ro   r=   r   r   s         r   'test_bb5b_saga_writer_called_on_failurer   5  s}     AFF#GE4!DEFF)!4FDWffd;F.CDOO,,-=?STr   c                     t        d      } t        |       }t               }t        dd      }t	               }t        ||||      }t        |j                  dd             |j                  j                  dd       y)	zQ
    BB5c: saga_writer.close_saga is called when merge fails (merge_failed).
    r)   r   TrV   zsess-saga-merge-failrW   r   N)
rS   r   r%   r4   r?   r   r   ro   r=   r   r   s         r   -test_bb5c_saga_writer_called_on_merge_failurer   E  sr     AFF#GFT:FDWffd;F4qIJOO,,-C^Tr   c                     ddi} d}t        d      }t        |      }t        g       }t        || d      }t	        |||      }t        |j                  dd             |j                  j                  || |       y	)
zh
    WB1: merge_interceptor.merge is called with
         (deltas, current_state, version) exactly.
    agentstate	   r   T)r/   r0   r1   zsess-wb1rW   N)	rS   r   r#   r4   r   r   ro   r    r   )current_datar/   r   r   rz   r3   r{   s          r   'test_wb1_merge_called_with_correct_argsr   Z  s{    
 W%LGAFF#GBFldSFWff5Fj1=>
LL))&,Hr   c                     t        d      } t        |       }t        g       }t        dd      }t	        |||      }t        |j                  dd             |j                  j                  ddd       y	)
zm
    WB2: staging.wait_for_all is called with
         (session_id, expected_workers, timeout_ms=60000).
    rU   r)   TrV   zsess-wb2rW   i`  )
timeout_msN)	rS   r   r#   r4   r   r   ro   r   r   )r   r   rz   r3   r{   s        r   6test_wb2_staging_wait_for_all_called_with_correct_argsr   m  sv    
 AFF#GBFT:FWff5Fj1=>11	 2 r   c                    d} t         | k(  }|st        j                  d|fdt         | f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |       dz  }t        j                  dt                dz   d|iz  }t        t        j                  |            d	x}} y	)
z0WB3: MAX_RETRIES module-level constant equals 3.rU   rc   z%(py0)s == %(py3)sr
   r^   py3zMAX_RETRIES should be 3, got z
>assert %(py5)sr`   N)
r
   rp   rq   rr   rs   rt   ru   _format_assertmsgrv   rw   )@py_assert2r|   @py_format4r   s       r   "test_wb3_max_retries_constant_is_3r     sk    J;!JJJ;!JJJJJJ;JJJ;JJJ!JJJ<[MJJJJJJJr   c                     d} t        d      }dd| dg}t        |      }t        |      }t        | d      }t	        |||      }t        |j                  dd	             |j                  j                  d| |       y
)u   
    WB4: commit_patch is called with the exact version returned by
         get_snapshot — not an off-by-one or stale value.
    *   r)   rG   z/vrI   TrV   zsess-wb4rW   N)	rS   r   r#   r4   r   r   ro   r.   r   )r/   r   r   r   rz   r3   r{   s          r   1test_wb4_commit_patch_called_with_correct_versionr     s    
 GAF $ABLF#GL)F4@FWff5Fj1=>
00r   c                    t        d      } t        |       }t        ddddg      }t        dd      }t	               }t        ||||      }t        |j                  d	d
             |j                  j                  d	di        y)zRcold_ledger.write_event is called with session_id and 'saga_committed' on success.r)   rG   r   rI   rU   TrV   cold_ledgerzsess-ledgerrW   saga_committedN)
rS   r   r#   r4   rC   r   r   ro   rA   assert_called_once_withr   r   rz   r3   rB   r{   s         r   .test_cold_ledger_write_event_called_on_successr     s    AFF#GE4!DEFFT:F FWff&IFma@A
..}>NPRSr   c                    t        d      } t        |       }t        ddddg      }t        d      }t	               }t        ||||      }t        |j                  dd	             |j                  j                          y
)z8cold_ledger.write_event is NOT called when commit fails.r)   rG   r   rI   rU   r   r   zsess-ledger-failrW   N)
rS   r   r#   r;   rC   r   r   ro   rA   r   r   s         r   &test_cold_ledger_not_called_on_failurer     sw    AFF#GE4!DEFF)!4F FWff&IF01EF
((*r   c                 @   t        d      } t        |       }t        g       }t        dd      }t	        |||      }t        |j                  dd            }|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }	d
d|	iz  }
t        t        j                  |
            dx}x}}y)z3When saga_writer=None, success path does not raise.r)   TrV   zsess-no-sagarW   rY   r[   r\   r]   ra   rb   NrS   r   r#   r4   r   r   ro   r   rp   rq   rr   rs   rt   ru   rv   rw   r   r   rz   r3   r{   r\   r|   r}   r~   r   r   s              r   "test_no_saga_writer_does_not_raiser     s    AFF#GBFT:FWff5F&&~&JKF>>!T!>T!!!!>T!!!!!!6!!!6!!!>!!!T!!!!!!!r   c                 @   t        d      } t        |       }t        g       }t        dd      }t	        |||      }t        |j                  dd            }|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }	d
d|	iz  }
t        t        j                  |
            dx}x}}y)z3When cold_ledger=None, success path does not raise.r)   TrV   zsess-no-ledgerrW   rY   r[   r\   r]   ra   rb   Nr   r   s              r   "test_no_cold_ledger_does_not_raiser     s    AFF#GBFT:FWff5F&&'7!&LMF>>!T!>T!!!!>T!!!!!!6!!!6!!!>!!!T!!!!!!!r   c                     t        d      } t        |       }t        ddddg      }t        d      }t	        |||      }t        |j                  dd             |j                  }|j                  }|t        k(  }|st        j                  d	|fd
|t        f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }	t!        t        j"                  |	            dx}x}}y)z?get_snapshot is called once per OCC retry attempt (not cached).r)   rG   r   rI   r   r   zsess-snapshot-callsrW   rc   )zT%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_snapshot
}.call_count
} == %(py6)sr3   r
   r   r   r   N)rS   r   r#   r;   r   r   ro   r-   r   r
   rp   rq   rr   rs   rt   ru   rv   rw   )
r   r   rz   r3   r{   r|   r~   r   r   r   s
             r   &test_get_snapshot_called_on_each_retryr     s    AFF#GE4!DEFF)!4FWff5F3aHI 8))8)[8888)[88888868886888888)888888[888[8888888r   c                    t        d      } | j                  }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}| j                  }g }||k(  }|st        j                  d
|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}| j                  }d}||k(  }|st        j                  d
|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}| j                  }d}||k(  }|st        j                  d
|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}| j                  }d}||k(  }|st        j                  d
|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)zDOccCommitResult dataclass has expected fields with correct defaults.T)r   rY   r[   r\   r]   ra   rb   Nrc   r   r   rk   rl   unknownrn   )r	   r   rp   rq   rr   rs   rt   ru   rv   rw   r   r/   rx   ry   )r\   r|   r}   r~   r   r   s         r   'test_occ_commit_result_dataclass_fieldsr     s7   T*F>>!T!>T!!!!>T!!!!!!6!!!6!!!>!!!T!!!!!!!$"$"$$$$"$$$$$$6$$$6$$$$$$"$$$$$$$>>Q>Q>Q66>Q>>Q>Q>Q66>Q************6***6*************r   c                    ddl m}  | t        u }|st        j                  d|fd| t        f      dt	        j
                         v st        j                  |       rt        j                  |       nddt	        j
                         v st        j                  t              rt        j                  t              nddz  }dd	|iz  }t        t        j                  |            d
}y
)z>Package level: OCCCommitEngine importable from core.coherence.r   )r   rY   z%(py0)s is %(py2)sOCEr   r^   r_   assert %(py4)srg   N)
core.coherencer   rp   rq   rr   rs   rt   ru   rv   rw   )r   r|   @py_format3r   s       r   &test_package_exports_occ_commit_enginer     m    5/!!!!3/!!!!!!3!!!3!!!!!!/!!!/!!!!!!!r   c                    ddl m}  | t        u }|st        j                  d|fd| t        f      dt	        j
                         v st        j                  |       rt        j                  |       nddt	        j
                         v st        j                  t              rt        j                  t              nddz  }dd	|iz  }t        t        j                  |            d
}y
)z>Package level: OccCommitResult importable from core.coherence.r   )r	   rY   r   OCRr	   r   r   rg   N)
r   r	   rp   rq   rr   rs   rt   ru   rv   rw   )r   r|   r   r   s       r   &test_package_exports_occ_commit_resultr     r   r   c                 \   ddl m}  d}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}}y
)z:Package level: MAX_RETRIES importable from core.coherence.r   )r
   rU   rc   r   MRr   zassert %(py5)sr`   N)
r   r
   rp   rq   rr   rs   rt   ru   rv   rw   )r   r   r|   r   r   s        r    test_package_exports_max_retriesr     sF    0N27NNN2NNNNNN2NNN2NNNNNNNNNNr   __main__uF   BB1: 3 workers → collected → merged → committed → success=TrueuH   BB2: Conflict on attempt 0 → retry succeeds on attempt 1 → retries=1u.   BB3: All 3 retries fail → conflict_exhaustedu!   BB4: Merge fails → merge_failedz.BB5a: saga_writer.close_saga called on successz9BB5b: saga_writer.close_saga called on conflict_exhaustedz3BB5c: saga_writer.close_saga called on merge_failedz7WB1: merge called with (deltas, current_state, version)zEWB2: staging.wait_for_all called with correct args + timeout_ms=60000zWB3: MAX_RETRIES == 3z?WB4: commit_patch called with correct version from get_snapshotz)cold_ledger.write_event called on successz!cold_ledger NOT called on failureu   No saga_writer → no raiseu   No cold_ledger → no raisez"get_snapshot called once per retryz OccCommitResult dataclass fieldsz3PKG: OCCCommitEngine importable from core.coherencez3PKG: OccCommitResult importable from core.coherencez/PKG: MAX_RETRIES importable from core.coherencez	  [PASS] r)   z	  [FAIL] z: 
/z tests passedz(ALL TESTS PASSED -- Story 6.06 (Track B))r   listreturnr   )r   r   r   r   )r   r   )rF   NT)r/   intr0   dictr1   boolr   r   )rF   N)r/   r   r0   r   r   r   )rU   )rQ   r   r   r   )B__doc__
__future__r   builtinsrr   _pytest.assertion.rewrite	assertionrewriterp   sysrK   insertr   unittest.mockr   r   r   r   pytestcore.coherence.occ_commitr   r	   r
   r   r   r#   r%   r4   r9   r;   r?   rC   rS   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __name__	tracebacktestspassedlentotalnamefnprint	Exceptionexc	print_excexit r   r   <module>r      s  . #   
 * +  ; ;   
  	82 
$-0/694,,J U U*I&(K
8T+
"
"9+"" z 
R	F	H	S	?	A	9	5	7	,	9	;	9	/	1	D	0	2	>	6	8	B	0	2	P	?	A	 	+	-	J	:	<	4	7	9	,	/	1	&	+	-	&	+	-	-	/	1	+	0	2	>	/	1	>	/	1	:	)	+O)EV FJE "b	"DIdV$%aKF	" 
Bvhawm
,-89{ j  	"IdV2cU+,I!!	"s   E))F.FF