
    iJ                    t   d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlmZ ddlmZ ddlmZ ddlZ ee      j)                         j*                  d   Zedz  Zej0                  j3                  d ee             ej0                  j3                  d ee             ddlZdd	lmZmZ d
Z ddddd	 	 	 	 	 	 	 	 	 	 	 d-dZ!d.dZ" G d d      Z#d/dZ$d/dZ%d0dZ&d0dZ'd0dZ(d1dZ)d0dZ*d0dZ+d0dZ,d0dZ-d0dZ.d0dZ/d0d Z0d0d!Z1d0d"Z2d2d#Z3d3d$Z4d0d%Z5d0d&Z6d0d'Z7d0d(Z8d0d)Z9d0d*Z:d4d+Z;d0d,Z<y)5u  Regression tests for ``scripts/auto_merge_controller.py`` (task-2444).

Coverage:

* All 8 required-check enforcement
* mergeable_state BLOCKED / behind / dirty / unstable rejection
* gemini-review-gate failure / SKIPPED rejection (with label)
* cancelled marker → close (no merge attempt)
* Forbidden flag tripwire (--admin)
* Forbidden direct push to main
* End-to-end 6 scenarios (A1..A6) using mocked GitHub API responses.

Tests are pure-Python — no network, no real ``gh`` CLI invocations.
    )annotationsN)Path)Any)mock   scripts)FileLockLockTimeoutzTestOwner/test-repoztask/task-9999-dev2main(deadbeefdeadbeefdeadbeefdeadbeefdeadbeefclean)branchbaseshamergeable_statec                    | ||dd|i|dd d dS )N)refr   r   F)numberheadr   r   merged	merged_atmerge_commit_sha )r   r   r   r   r   s        Y/home/jay/workspace/.worktrees/task-2444-dev2/tests/scripts/test_auto_merge_controller.pymake_prr   ,   s,     s+*      c                     t         j                  D cg c]  }|dd	 }}t        |       }|D ]  }|d   |v s||d      |d<    |S c c}w )z;Return 8 required check-runs all ``success`` (overridable).successname
conclusionr    r!   )amcREQUIRED_CHECKSdict)extra_statusr    runs	overridesrs        r   all_success_check_runsr)   ?   sd    @C@S@STT3TDT\"I 3V9	!'&	2AlO3 K Us   Ac                  N    e Zd ZdZddddd	 	 	 	 	 	 	 	 	 d	dZd
dZddZddZy)
FakeGitHubzDIn-memory stub for the gh REST + GraphQL surface used by controller.N(0000000000000000000000000000000000000000)
check_runspr_full_overridesreview_threads	main_headc                   t        |      | _        |xs i | _        |xs i | _        |xs i | _        |g| _        g | _        y N)listprsr-   r.   r/   main_head_historycalls)selfr4   r-   r.   r/   r0   s         r   __init__zFakeGitHub.__init__L   sF     9$*!2!8b,2"+,.
r   c                   | j                   j                  d|f       |j                  d      rdd| j                  d   iiS d|v rD|j	                  d      d   j	                  d	      d
   }d| j
                  j                  |g       iS d|v r|j                  d      sot        |j                  d	d      d         t        fd| j                  D        d       }|t        d       | j                  j                  i       }i ||S |j                  d      r&| j                  D cg c]  }|d   d   dk(  s| c}S t        d|       c c}w )Napiz/branches/maincommitr   z/check-runsz	/commits/   /r   r-   z/pulls/z?state=open&base=mainc              3  4   K   | ]  }|d    k(  s|  yw)r   Nr   ).0pnums     r   	<genexpr>z!FakeGitHub.api.<locals>.<genexpr>f   s     Cq(s0BCs   zPR not found: r   r   r   zunexpected path: )r6   appendendswithr5   splitr-   getintrsplitnextr4   RuntimeErrorr.   AssertionError)r7   pathr   r   overriderA   rB   s         @r   r:   zFakeGitHub.api]   sV   

5$-(==)*ud&<&<R&@ABBD **[)!,2237:C $//"5"5c2">??T]]3J%Kdkk#q)"-.CCDHHCTJD|"^C5#9::--11#r:H'd'h''==01#xxF!1V9U+;v+EAFF0788 Gs   .E?Ec                    |d   }| j                   j                  |g       D cg c]  }d|i }}ddddd|iiiiiS c c}w )Nr   
isResolveddata
repositorypullRequestreviewThreadsnodes)r/   rG   )r7   _query	variablesrB   resolvedrU   s         r   graphqlzFakeGitHub.graphqlo   se    !:>:M:M:Q:QRUWY:Z[h,)[[}%@P.QR
 	
 \s   =c                :    | j                   j                  |       y r2   )r5   rD   )r7   new_shas     r   advance_mainzFakeGitHub.advance_mainy   s    %%g.r   )
r4   list[dict[str, Any]]r-   z&dict[str, list[dict[str, Any]]] | Noner.   z dict[int, dict[str, Any]] | Noner/   zdict[int, list[bool]] | Noner0   str)rM   r^   returnr   )rV   r^   rW   dict[str, Any]r_   r   )r[   r^   r_   None)__name__
__module____qualname____doc__r8   r:   rY   r\   r   r   r   r+   r+   I   sZ    N >B>B7;!/ "/ ;	/
 </ 5/ /"9$
/r   r+   c                    | dz  }t        |d      5  	 d d d        t        |d      5  	 d d d        y # 1 sw Y   !xY w# 1 sw Y   y xY w)Nx.lockr=   timeout)r	   )tmp_pathrA   s     r   test_filelock_releases_on_exitrk      sW    8A	!Q	  
!Q	    s   5A>A
c                6   | dz  }t        |d      }|j                          	 t        j                  t              5  t        |d      5  	 d d d        d d d        |j                          y # 1 sw Y   "xY w# 1 sw Y   &xY w# |j                          w xY w)Nrg   
   rh   g333333?)r	   acquirepytestraisesr
   release)rj   rA   holders      r   &test_filelock_blocks_concurrent_holderrs      s    8Aa$F
NN]];' 	!S) 	 	 	 	 	s:   B A:A.A:B .A7	3A::B?B Bc                     t        j                  t        d      5  t        j                  g d       d d d        y # 1 sw Y   y xY w)NzFORBIDDEN.*--adminmatch)ghprmerge1--admin--mergero   rp   rK   r"   run_cmdr   r   r   test_run_cmd_blocks_admin_flagr      s7    	|+@	A FDEF F F	   =Ac                     t        j                  t        d      5  t        j                  g d       d d d        y # 1 sw Y   y xY w)NFORBIDDEN.*push to mainru   )gitpushoriginr   r}   r   r   r   $test_run_cmd_blocks_direct_main_pushr      s3    	|+E	F 7567 7 7r   c                     t        j                  t        d      5  t        j                  g d       d d d        y # 1 sw Y   y xY w)Nr   ru   )r   r   r   z	HEAD:mainr}   r   r   r   %test_run_cmd_blocks_head_to_main_pushr      s3    	|+E	F <:;< < <r   c                   i fd}| j                  t        j                  d|       t        j                  g d      }|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}}d}d   }||v}	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}	}y )Nc               >    | d<   t        j                  | ddd      S )Ncmdr   ok )
subprocessCompletedProcess)r   capture_outputtextcheckcaptureds       r   fake_runz8test_run_cmd_allows_normal_gh_pr_merge.<locals>.fake_run   s#    **34<<r   run)rw   rx   ry   5z--autor|   z--delete-branchr   ==)z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sprocpy0py2py5assert %(py7)spy7r{   r   )not in)z%(py1)s not in %(py4)spy1py4assert %(py6)spy6)setattrr"   r   r~   
returncode
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprrL   _format_explanation)monkeypatchr   r   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert0@py_assert2@py_format5@py_format7r   s               @r   &test_run_cmd_allows_normal_gh_pr_merger      s    !H= x8;;YZD??a?a?a44?a+HUO+9O++++9O+++9+++O+++++++r   c                 v   t        dd      } t        | g      }t        j                  | t        |j
                  |j                  d       }d }||u}|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}}d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y )Nr=   develop)r   r4   c                     yNFr   _ts    r   <lambda>z3test_evaluate_skips_non_main_base.<locals>.<lambda>       r   repor:   rY   cancelled_marker_existsis notz%(py0)s is not %(py3)sdecisionr   py3assert %(py5)sr   znot maininz.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.reason
}r   r   r   r   r   )r   r+   r"   evaluate_prREPOr:   rY   r   r   r   r   r   r   rL   r   reason
rx   faker   r   r   @py_format4r   r   r   r   s
             r   !test_evaluate_skips_non_main_baser      s   		#B2$D
488T\\ 0H  8484884((:((((:(((:(((((((((((((((((((r   c                    t        dd      } t        | g| d   d   t               i      }t        j                  | t
        |j                  |j                  d       }d }||u}|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}}d}|j                   }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y )Nr=   ztask/task-1234-dev1r   r   r   r4   r-   c                    | dk(  S )Nz	task-1234r   )tids    r   r   z6test_evaluate_skips_cancelled_marker.<locals>.<lambda>   s    C;,> r   r   r   r   r   r   r   r   	cancelledr   r   r   r   r   r   r+   r)   r"   r   r   r:   rY   r   r   r   r   r   r   rL   r   r   r   s
             r   $test_evaluate_skips_cancelled_markerr      s   	0	1BDvJu%'='?@D 
488T\\ >H  8484884)(//);/))));/)));))))))()))()))/)))))))r   c                 \   t        d      } t               D cg c]  }|d   dk7  s| }}t        | g| d   d   |i      }t        j                  | t
        |j                  |j                  d       }d }||u}|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}}d}	|j                   }
|	|
v }|st        j                  d|fd|	|
f      t        j                  |	      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}	x}}
|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 c c}w )Nr=   r    qc-checkr   r   r   c                     yr   r   r   s    r   r   z<test_evaluate_skips_missing_required_check.<locals>.<lambda>   r   r   r   r   r   r   r   r   r   r   r   r   r   r   is)z-%(py2)s
{%(py2)s = %(py0)s.label
} is %(py5)sr   r   r)   r+   r"   r   r   r:   rY   r   r   r   r   r   r   rL   r   r   label)rx   r(   r&   r   r   r   r   r   r   r   r   r   r   s                r   *test_evaluate_skips_missing_required_checkr      s   	B-/K!1V9
3JAKDK2$BvJu,=t+DED
488T\\ 0H  8484884((:((((:(((:(((((((((((((((((((>>!T!>T!!!!>T!!!!!!8!!!8!!!>!!!T!!!!!!! Ls
   J)J)c                 *   t        d      } t        d      }t        | g| d   d   |i      }t        j                  | t
        |j                  |j                  d       }d }||u}|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}}d}|j                   }	||	v }|st        j                  d|fd||	f      t        j                  |      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}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 )Nr=   )r   failurer   r   r   c                     yr   r   r   s    r   r   z=test_evaluate_skips_failed_check_with_label.<locals>.<lambda>   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   auto-merge-blockedr   z-%(py2)s
{%(py2)s = %(py0)s.label
} == %(py5)sr   r   )rx   r&   r   r   r   r   r   r   r   r   r   r   s               r   +test_evaluate_skips_failed_check_with_labelr      s   	B!"9:D2$BvJu,=t+DED
488T\\ 0H  8484884((:((((:(((:(((((((((((((((((((>>111>11111>111111181118111>11111111111r   c                 (   t        dd      } t        | g| d   d   t               i      }t        j                  | t
        |j                  |j                  d       }d }||u}|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}}d}|j                   }||v }|st        j                  d|fd||f      t        j                  |      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}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 )Nr=   blockedr   r   r   r   c                     yr   r   r   s    r   r   z=test_evaluate_skips_blocked_mergeable_state.<locals>.<lambda>   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r+   r)   r"   r   r   r:   rY   r   r   r   r   r   r   rL   r   r   r   )rx   r   r   r   r   r   r   r   r   r   r   s              r   +test_evaluate_skips_blocked_mergeable_stater      s   	I	.BDvJu%'='?@D 
488T\\ 0H  8484884''9''''9'''9'''''''''''''''''''>>111>11111>111111181118111>11111111111r   c                    t        dd      } t        | g| d   d   t               i      }t        j                  | t
        |j                  |j                  d       }d }||u}|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}}d}|j                   }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y )Nr=   behindr   r   r   r   c                     yr   r   r   s    r   r   z1test_evaluate_skips_behind_main.<locals>.<lambda>  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s
             r   test_evaluate_skips_behind_mainr      s   	H	-BDvJu%'='?@D 
488T\\ 0H  8484884&x&8&&&&8&&&8&&&&&&x&&&x&&&&&&&&&&r   c                    t        d      } t        | g| d   d   t               idddgi      }t        j                  | t
        |j                  |j                  d       }d }||u}|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}}d}|j                   }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y )Nr=   r   r   TFr4   r-   r/   c                     yr   r   r   s    r   r   z8test_evaluate_skips_unresolved_threads.<locals>.<lambda>  r   r   r   r   r   r   r   r   r   
unresolvedr   r   r   r   r   r   r   s
             r   &test_evaluate_skips_unresolved_threadsr     s'   	BDvJu%'='?@D%=)D
 
488T\\ 0H  8484884*8??*<?****<?***<******8***8***?*******r   c                    t        d      } t        | g| d   d   t               idddgi      }t        j                  | t
        |j                  |j                  d       }d }||u }|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 )Nr=   r   r   Tr   c                     yr   r   r   s    r   r   z5test_evaluate_passes_when_all_clear.<locals>.<lambda>%  r   r   r   r   )z%(py0)s is %(py3)sr   r   r   r   )r   r+   r)   r"   r   r   r:   rY   r   r   r   r   r   r   rL   r   )rx   r   r   r   r   r   r   s          r   #test_evaluate_passes_when_all_clearr     s    	BDvJu%'='?@D$<(D
 
488T\\ 0H 8t8t88tr   c                    t        d      } t        d      }t        | g| d   d   |i      }t        j                  | t
        |j                  |j                  d       }d}||u}|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}}|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)zIgemini-review-gate==SKIPPED should be rejected with gemini-blocked label.r=   gemini-review-gateskippedr   r   r   c                     yr   r   r   s    r   r   zMtest_evaluate_skipped_check_without_success_flag_is_blocked.<locals>.<lambda>1  r   r   r   Nr   r   r   r   r   r   gemini-blockedr   r   r   r   r   )r   r)   r+   r"   r   r   r:   rY   r   r   r   r   r   r   rL   r   r   )rx   r&   r   r   r   r   r   r   r   r   r   s              r   ;test_evaluate_skipped_check_without_success_flag_is_blockedr  *  s    	B!"CDD2$BvJu,=t+DED
488T\\ 0H  8484884>>--->----->-------8---8--->-----------r   c                    	
 g g 
g g 	dd	 fd}d
 
fd} fd}d fd}d	fd} fd}
	||||||d
S )zDBuild a process_open_prs harness using FakeGitHub side-effect stubs.c                x    j                   d   }| |d}|r|j                  |       j                  |       |S )Nr<   )stager0   )r5   updaterD   )r  extrar   entryauditr   s       r   head_recorderz)_make_cycle_runner.<locals>.head_recorderC  s=    $$R(*/c BLLU
r   c                    j                  |        d| dj                  dd      }j                  |       j                  D ]  }|d   | k(  sd|d<   d|  d	|d
<   ||d<     t	        j
                  g ddd      S )Nzmerge-08x(   0r   Tr   2026-05-04T00:00:0Zr   r   r   r   )argsr   stdoutstderr)rD   ljustr\   r4   r   r   )pr_num_repor[   rA   r   merged_callss       r   safe_merge_fnz)_make_cycle_runner.<locals>.safe_merge_fnK  s    F#6#,'--b#6'" 	0A{f$"(#5fXQ!?+(/$%		0
 **qTVWWr   c                f    j                   D cg c]  }|d   r	|d   d   dk(  s| c}S c c}w )Nr   r   r   r   r   )r  rA   r   s     r   list_prsz$_make_cycle_runner.<locals>.list_prsW  s1    88Va1X;1V9U;Kv;UVVVs   
...c                P    | j                   j                  dt                     v S )N_cancelled_set)__dict__rG   set)r   r   s    r   cancelled_markerz,_make_cycle_runner.<locals>.cancelled_markerZ  s"    dmm''(8#%@@@r   c                ,    j                  | |f       y r2   )rD   )r  r   r  labelss      r   label_blockedz)_make_cycle_runner.<locals>.label_blocked]  s    vuo&r   c                |    j                  | d          j                  D ]  }|d   | d   k(  sd|d<   d|d<    y )Nr   closedstateFr   )rD   r4   )rx   r  rA   closed_callsr   s      r   handle_cancelledz,_make_cycle_runner.<locals>.handle_cancelled`  sJ    BxL) 	$A{bl*%'
#(	$r   )
r  r  r)  r$  r  r  r  r"  r%  r*  r2   )r  r^   r
  zdict[str, Any] | None)r  rH   r  r^   )r   r^   r_   bool)r  rH   r   r^   r  r^   r_   ra   r   )r   r  r  r  r"  r%  r*  r  r)  r$  r  s   `      @@@@r   _make_cycle_runnerr,  <  sb    "$E L L$&F
XWA'$ $$&&,&, r   c                     t         j                  j                  t        d|d         5  t         j                  j                  t        d|d         5  t         j                  j                  t        d fd      5  t        j                  t
         j                   j                  |d   |d   |d   |d	   d
       cddd       cddd       cddd       S # 1 sw Y   nxY wddd       n# 1 sw Y   nxY wddd       y# 1 sw Y   yxY w)zFInvoke process_open_prs with full dependency injection + side effects.r%  handle_cancelled_prr*  
post_checkc                4    dd|  ddj                   d   dS )NTr  r  r<   )r   r   branch_deletedr   )r5   )pnbrr   r   s      r   r   z%_run_with_overrides.<locals>.<lambda>y  s+    ,>rd!*D#9O9OPR9SD r   r  r  r  r"  c                      y)Ng    mAr   r   r   r   r   z%_run_with_overrides.<locals>.<lambda>  r   r   )r   r:   rY   r  r  r  r   nowN)r   patchobjectr"   process_open_prsr   r:   rY   )r   harnesss   ` r   _run_with_overridesr:  u  s    			31I	J 
			3 5w?Q7R	S
			3 / 

 ##LLZ(!/2!/2$+,>$?$	

 
 
 
 
 
 
 
 
 
 
sB   )D)C/<AC>	C/	DC#C/&	D/C8	4DDc                 l   t        d      } t        | g| d   d   t               iddgid      }t        |      }t	        ||      }|d   }dg}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}|j                  }t        |      }	d}
|	|
k(  }|s
t        j                  d|fd|	|
f      dt        j                         v st        j                  t              rt        j                  t              nd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}}
|j                  d   }|j                  }d}||k(  }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}	}|j                  d   }|j                  }d}||u }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}	}|j                  d   }|j                   }|j                  d   }|j"                  }
||
k7  }	|	st        j                  d|	fd||
f      t        j                  |      t        j                  |      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}x}	x}}
|d   D cg c]  }|d   	 }}d }||v }|st        j                  d!|fd"||f      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}}d'}||v }|st        j                  d!|fd"||f      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}}d(}||v }|st        j                  d!|fd"||f      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}}y c c}w ))Ne   r   r   T(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar4   r-   r/   r0   r  r   z%(py1)s == %(py4)sr   r   r   r=   )zL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.merged
})
} == %(py8)slenresult)r   r   r   r   py8zassert %(py10)spy10r   )z1%(py3)s
{%(py3)s = %(py1)s.pr_number
} == %(py6)s)r   r   r   assert %(py8)srB  r   )z.%(py3)s
{%(py3)s = %(py1)s.merged
} is %(py6)s)!=)z]%(py3)s
{%(py3)s = %(py1)s.main_head_before
} != %(py8)s
{%(py8)s = %(py6)s.main_head_after
})r   r   r   rB  r  r  zbefore-cycler   z%(py1)s in %(py3)sstagesr   r   r   r   zbefore-merge-pr-101zafter-merge-pr-101)r   r+   r)   r,  r:  r   r   r   rL   r   r   r@  r   r   r   	pr_numbermain_head_beforemain_head_after)rx   r   r9  rA  r   r   r   r   r   r   @py_assert7@py_assert6@py_format9@py_format11@py_assert5arG  r   r   s                      r   &test_A1_all_checks_success_auto_mergesrR    s   	BDvJu%'='?@dV}"	D !&G w/F>"+se+"e++++"e+++"+++e+++++++}}"3}""""""""""""3"""3""""""v"""v"""}"""""""""""""==,%%,,%,,,,%,,,,,,%,,,,,,,,,,==*""*d*"d****"d******"***d*******==P,,Pa0@P0@0P0PP,0PPPPP,0PPPPPPP,PPP0@PPP0PPPPPPPP")'"23Qaj3F3#>V####>V###>######V###V####### * F**** F*** ******F***F*******)6))))6)))))))))6)))6))))))) 4s   3X1c                 :   t        d      } t        d      }t        | g| d   d   |idddiidg i      }t        |      }t	        ||      }|d   }g }||k(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}}d |j                  D        }
t        |
      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            d x}
}d}|d   D cg c]  \  }}|	 }}}||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}}y c c}}w )Nf   )cancel-kill-switchr   r   r   r   r   )r4   r-   r.   r/   r  r   r?  r   r   r   c              3  8   K   | ]  }d |j                   v   yw)rU  Nr   r@   ss     r   rC   z=test_A2_ci_failure_blocks_merge_with_label.<locals>.<genexpr>       HA#qxx/H   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr   r   r   r   r$  r   z%(py1)s in %(py4)sr   r)   r+   r,  r:  r   r   r   rL   r   r  r]  r   r   r   )rx   r&   r   r9  rA  r   r   r   r   r   r   _lbls                r   *test_A2_ci_failure_blocks_merge_with_labelrc    s   	B!"CDDDvJu%t,!2I >?Ry	D !&G w/F>"(b("b(((("b((("(((b(((((((HHH3HHHHHHHHH3HHH3HHHHHHHHHHHHHH Jwx7H$IVQS$IJ$I $IIJJJ $IJJJ JJJ$IJJJJJJJ$Is   Hc                 2   t        d      } t               D cg c]  }|d   dv r| }}t        | g| d   d   |idg i      }t        |      }t	        ||      }|d   }g }||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }g }||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }	dd|	iz  }
t        t        j                  |
            d x}x}}d |j                  D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }	t        t        j                  |	            d x}}y c c}w )Ng   r    >   hidden-path-auditguardci/guardr   rU  r   r   r   r  r   r?  r   r   r   r$  c              3  8   K   | ]  }d |j                   v   yw)missingNrW  rX  s     r   rC   z7test_A3_pending_checks_skip_no_label.<locals>.<genexpr>  s     =yAHH$=r[  r\  r]  r^  r`  )rx   r(   r&   r   r9  rA  r   r   r   r   r   r   s               r   $test_A3_pending_checks_skip_no_labelrk    s   	B-/ j!yhh  jD jDvJu%t,RyD
 !&G w/F>"(b("b(((("b((("(((b(((((((8"""""""""""""""""""=fnn==3=========3===3==============js   Hc                 0   t        d      } t        d      }t        | g| d   d   |idg i      }t        |      }t	        ||      }|d   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            d x}x}}d}|d   D 
cg c]  \  }
}|	 }}
}||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            d x}x}}d |j                  D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y c c}}
w )Nh   r   r   r   r   r  r   r?  r   r   r   r  r$  r   r_  c              3  8   K   | ]  }d |j                   v   yw)r  NrW  rX  s     r   rC   z4test_A4_gemini_blocked_with_label.<locals>.<genexpr>  rZ  r[  r\  r]  r^  r`  )rx   r&   r   r9  rA  r   r   r   r   r   ra  rb  r   s                r   !test_A4_gemini_blocked_with_labelro    sw   	B!"CDDDvJu%t,RyD
 !&G w/F>"(b("b(((("b((("(((b(((((((F783D EC EF E EEFFF EFFFFFF EFFFFFFFHHH3HHHHHHHHH3HHH3HHHHHHHHHHHHHH !Fs   Hc                 2   t        dd      } t        | g| d   d   t               idg i      }dh|_        t	        |      }t        ||      }|d   }g }||k(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   }dg}||k(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }	d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}}
y )Ni   ztask/task-7777-dev1r   r   r   r   z	task-7777r  r   r?  r   r   r   r)  )z8%(py2)s
{%(py2)s = %(py0)s.cancelled_closed
} == %(py5)srA  r   r   r   )r   r+   r)   r  r,  r:  r   r   r   rL   r   cancelled_closedr   r   r   )rx   r   r9  rA  r   r   r   r   r   r   r   r   r   s                r   )test_A5_cancelled_pr_is_closed_not_mergedrs    sv   	2	3BDvJu%'='?@RyD
 '-D &G w/F>"(b("b(((("b((("(((b(((((((>"+se+"e++++"e+++"+++e+++++++""+se+"e++++"e++++++6+++6+++"+++e+++++++r   c            	        dD  cg c]  } t        | |  dz         }} t        ||D ci c]  }|d   d   t                c}|D ci c]  }|d   g 
 c}d      }t        |      }t	        ||      }|d	   }g d}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   D cg c]  }|d   j                  d      s| }}t               }|D ]  }|j                  |d           t        |      }d}||k\  }|st        j                  d|fd||f      dt        j                         v st        j                   t              rt        j                  t              nd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 cg c]  }|j$                   }}t'        |      }||k(  }|s#t        j                  d
|fd||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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 c c} w c c}w c c}w c c}w c c}w )!N)         r  )r   r   r   r   r,   r>  r  r   r?  r   r   r   r  r  )zbefore-mergezafter-merger0      )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr@  seen_shar   r   r   r   rD  rB  )z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}r   sorted)r   r   r   r   r   r   )r   r+   r)   r,  r:  r   r   r   rL   r   
startswithr!  addr@  r   r   r   r   r   r|  )nr4   rA   r   r9  rA  r   r   r   r   r   rQ  audit_headsrz  r  rP  r   rN  mr   r   r   r   s                          r   test_A6_three_prs_serializedr    s   0?
@171QC2+&
@C
@HKL1AfIe$&<&>>L145A(R5	D !&G w/F>"5o5"o5555"o555"555o5555555%g.i!G*2G2GHg2h1iKiH )U;'() x=A=A=A33xx=A&,mm44I4y))9)))))9)))))))9)))9)))))))))))))))y)))y)))))))))))) A M5 j 5s"   N0N5
N:=N?N? Oc                   | dz  }|j                  t        d|       |j                  t        dd        t        j                  dt        ddi      }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}}t        j                  |j                         j                               }|d   }	d}
|	|
k(  }|slt	        j
                  d
|fd|	|
f      t	        j                  |	      t	        j                  |
      dz  }dd|iz  }t        t	        j                  |            d x}	x}}
|d   }	d	}
|	|
k(  }|slt	        j
                  d
|fd|	|
f      t	        j                  |	      t	        j                  |
      dz  }dd|iz  }t        t	        j                  |            d x}	x}}
|d   }	|	t        k(  }|st	        j
                  d
|fd|	t        f      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}	}|d   }	d}
|	|
k(  }|slt	        j
                  d
|fd|	|
f      t	        j                  |	      t	        j                  |
      dz  }dd|iz  }t        t	        j                  |            d x}	x}}
y )Nzaudit.jsonl	AUDIT_LOGget_main_headc                     y)Nabc123r   )_rs    r   r   z5test_record_main_head_appends_jsonl.<locals>.<lambda>  r   r   z
test-stagefoobar)r
  r  r   )z%(py0)s == %(py3)sr   r   r   r   r  r?  r   r   r   r0   r   )z%(py1)s == %(py3)sr   rH  )r   r"   record_main_headr   r   r   r   r   r   r   rL   r   jsonloads	read_textstrip)rj   r   log_pathr   r   r   r   r   liner   r   r   r   s                r   #test_record_main_head_appends_jsonlr    s   -'H[(3_.AB


|T%
HC3(?3(33(::h((*0023D=(L(=L((((=L(((=(((L((((((((((((((((((((((((((<<4<4<44;%;%;%;%r   c                 ,   ddddddddddddg} t        j                  |       \  }}d}||v }|st        j                  d|fd	||f      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}}d}||v }|st        j                  d|fd	||f      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}}t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nd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}}t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nd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 )Nrh  r   r   rg  rU  r   r   r   rF  non_successrH  r   r   r  rj  rx  r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr@  r{  rD  rB  r=   )r"   required_check_stater   r   r   r   r   r   rL   r   r@  )r&   rj  r  r   r   r   r   rP  r   r   rN  s              r   1test_required_check_state_detects_partial_successr    s   95	2%Y?95	D 33D9G[$:$$$$:$$$:$$$$$$$$$$$$$$$$*7****7*********7***7*******w<1<1<133ww<1{ q q    q      3   3      {   {      q       r   )r   rH   r   r^   r   r^   r   r^   r   r^   r_   r`   )r%   ztuple[str, str]r_   r]   )rj   r   r_   ra   )r_   ra   )r   pytest.MonkeyPatchr_   ra   )r   r+   )r   r+   r9  r`   )rj   r   r   r  r_   ra   )=re   
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r  r   syspathlibr   typingr   unittestr   ro   __file__resolveparents	WORKSPACESCRIPTSrM   insertr^   auto_merge_controllerr"   auto_merge_lockr	   r
   r   r   r)   r+   rk   rs   r   r   r   r   r   r   r   r   r   r   r   r   r  r,  r:  rR  rc  rk  ro  rs  r  r  r  r   r   r   <module>r     sf   #     
    N""$,,Q/	
i
 3w<   3y> " # 1  ("  	
 
  &1/ 1/r	"F
7
<

,$)*
"
22'+
.$6r
(*0K">$I , *:
 !r   