
    ~i                        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ZddlmZ ddlZ e ee      j%                         j&                  d         Zeej*                  vrej*                  j-                  de       d	dZd
dZddZy)u   
test_no_admin_override.py — admin override / bypass 차단 회귀 테스트.

1. enqueue-merge --admin 플래그 → exit code != 0, ADMIN OVERRIDE BLOCKED
2. detect_admin_override_attempt 키워드 검출 + no_admin_override=False → MergeQueueError
    )annotationsN)Path   c                >   ddl }| dz  dz  }|j                  dd       |dg dg dddi dddd	d	}dd
}|j                   ||      j                               j	                         }||d<   || dz  }|j                  t        j                  |dd      d       y)u6   테스트용 task state json 생성 (checksum 포함).r   Nz.tasksstateT)parentsexist_okHUMAN_APPROVED)	git_diff_shachanged_pathsbranch	pr_numberpr_state	ci_checksguard_sh_resultgemini_evidence	qc_report)task_idcurrent_statetransitionsevidencec                    | j                         D ci c]  \  }}|dk7  s|| }}}t        j                  |ddd      S c c}}w )N	_checksumFT),:)ensure_ascii	sort_keys
separators)itemsjsondumps)skvpayloads       X/home/jay/workspace/.worktrees/task-2481-dev4/tests/regression/test_no_admin_override.py
_canonicalz_make_state.<locals>._canonical/   sF    $%GGIBDAqk1A1a4BBzz'R\]] Cs
   AAr   z.jsonFr   )r   indentutf-8encoding)r"   dictreturnstr)hashlibmkdirsha256encode	hexdigest
write_textr    r!   )tmp_pathr   r/   	state_dirr   r'   checksum
state_paths           r&   _make_stater9      s    8#g-IOOD4O0 ) ##

	E"^ ~~j/6689CCEH!E+y..J$**UqIT[\    c           	     	   d}t        | |       i t        j                  dt        |       i}t        dz   }t        j                  t        j                  |d|dddgdd|d	
      }|j                  }d}||k7  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                   d|j                   d|j"                   d|j$                         dz   d|iz  }	t'        t        j(                  |	            dx}x}}g }d}
|j$                  }|
|v }|}|s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  }|j+                  |       |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  }|j+                  |       t        j,                  |d       i z  }t        j                   d!|j"                   d|j$                         d"z   d#|iz  }t'        t        j(                  |            dx}x}x}
x}x}x}x}}| d$z  d%z  d&z  }|j/                         rY|j1                  d'(      j3                         j5                         }t7        |      }
d}|
|k(  }|st        j                  d)|fd*|
|f      d+t        j                         v st        j                  t6              rt        j                  t6              nd+d,t        j                         v st        j                  |      rt        j                  |      nd,t        j                  |
      t        j                  |      d-z  }t        j                   d.|       d/z   d0|iz  }t'        t        j(                  |            dx}
x}}yy)1uU   scripts/taskctl.py enqueue-merge --admin → exit code != 0 + ADMIN OVERRIDE BLOCKED.z	task-2481WORKSPACE_ROOTz/scripts/taskctl.pyzenqueue-mergez--pr99z--adminT   )capture_outputtextenvtimeoutr   )!=)z2%(py2)s
{%(py2)s = %(py0)s.returncode
} != %(py5)sproc)py0py2py5z-expected non-zero exit for --admin flag, got z
stdout=z
stderr=z
>assert %(py7)spy7NzADMIN OVERRIDE BLOCKEDin)z.%(py3)s in %(py7)s
{%(py7)s = %(py5)s.stderr
})py3rG   rH   z%(py9)spy9)z2%(py12)s in %(py16)s
{%(py16)s = %(py14)s.stdout
})py12py14py16z%(py18)spy18   z,ADMIN OVERRIDE BLOCKED not in output
stdout=z
>assert %(py21)spy21memoryorchestration-auditzadmin-override.jsonlr)   r*   )==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenlines)rE   py1rK   py6z2admin-override.jsonl should not have new entries: z
>assert %(py8)spy8)r9   osenvironr.   _WORKTREE_ROOT
subprocessrunsys
executable
returncode
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgstdoutstderrAssertionError_format_explanationappend_format_boolopexists	read_textstrip
splitlinesrV   )r5   r   rA   taskctl_scriptrD   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert2@py_assert6@py_assert0@py_assert11@py_assert15@py_assert13@py_format10@py_format17@py_format19@py_format20@py_format22tmp_override_logrW   @py_assert5@py_format7@py_format9s                             r&   %test_enqueue_merge_admin_flag_blockedr   9   sM   G'"
9RZZ
9)3x=
9C#&;;N>>	'64QZ[D ?? a ?a  ?a                       87H I++i}	6    # t{{ #{2 6N RVR]R] 6NR]6]   #{    $      (,    (,    (3     6NR]    7O      SW    SW    S^        8}Idkk][        (*-BBE[[  **G*<BBDOOQ5z 	
Q 	
zQ 	
 	
 	
zQ 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		  	
 	
  AH	
 	
 	
 	
 	
 	
 !r:   c           
        |j                  dt        |              |j                  t        j                  dd       |j                  t        j                  dd       ddlm} | dz  d	z  d
z  }|j                  |d|        |j                  |d|       |j                  dg      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d      dz   d|iz  }t!        t        j"                  |            dx}}g }d}|j$                  }	 |	       }
||
v }|}|s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                  |	      t        j                  |
      dz  }dd|iz  }|j'                  |       |st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                        t        j                  |      dz  }dd|iz  }|j'                  |       t        j(                  |d       i z  }t        j                  d!|       d"z   d#|iz  }t!        t        j"                  |            dx}x}x}x}x}	x}
x}x}x}}|j                  d$g      }d}||u}|st        j                  d|fd||f      d%t        j                         v st        j                  |      rt        j                  |      nd%t        j                  |      dz  }t        j                  d&      dz   d|iz  }t!        t        j"                  |            dx}}t+        j,                  |j.                        5 }|j1                  d dd'(       ddd       g }d)}j2                  }t        |      }|j$                  } |       }||v }|}|sd*}|j2                  }t        |      }||v }|}|st        j                  d|fd+||f      t        j                  |      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                  |      t        j                  |      d.z  } d/d0| iz  }!|j'                  |!       |st        j                  dfd1f      t        j                  |      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                  |      d2z  }"d3d4|"iz  }#|j'                  |#       t        j(                  |d       i z  }$t        j                  d5|j2                         d6z   d7|$iz  }%t!        t        j"                  |%            dx}x}x}x}x}x}x}x}x}x}x}}y# 1 sw Y    xY w)8uV   detect_admin_override_attempt 키워드 + no_admin_override=False → MergeQueueError.r<   zutils.merge_queue_clientF)raisingzutils.bot_pr_authorr   NrS   rT   zmerge-queue.jsonl	WORKSPACEMERGE_QUEUE_LOGz--force-merge)is not)z%(py0)s is not %(py3)sreason1)rE   rK   z*expected non-None reason for --force-mergez
>assert %(py5)srG   zforce-mergeadminrI   )zD%(py3)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.lower
}()
})rK   rG   rH   rL   z%(py11)spy11)zJ%(py14)s in %(py20)s
{%(py20)s = %(py18)s
{%(py18)s = %(py16)s.lower
}()
})rN   rO   rP   py20z%(py22)spy22rQ   zreason should mention keyword: z
>assert %(py25)spy25bypassreason2z%expected non-None reason for 'bypass'T)no_admin_overridedry_runzadmin overrider   )z%(py3)s in %(py14)s
{%(py14)s = %(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py5)s(%(py8)s
{%(py8)s = %(py6)s.value
})
}.lower
}()
}r.   exc_info)rK   rG   rY   rZ   py10rM   rN   z%(py16)srO   )zR%(py19)s in %(py26)s
{%(py26)s = %(py21)s(%(py24)s
{%(py24)s = %(py22)s.value
})
})py19rR   r   py24py26z%(py28)spy28z$expected admin override error, got: z
>assert %(py31)spy31)setenvr.   delitemr`   modulesutils.merge_queue_clientmerge_queue_clientsetattrdetect_admin_override_attemptrc   rd   re   rf   rg   rh   ri   rl   rm   lowerrn   ro   pytestraisesMergeQueueError
enqueue_prvalue)&r5   monkeypatchmqclog_pathr   rz   ru   @py_format4rx   r{   @py_assert8rv   r|   r   @py_assert17@py_assert19r~   r   @py_format12@py_format21@py_format23@py_format24@py_format26r   r   @py_assert7@py_assert9r}   @py_assert18@py_assert23@py_assert25@py_assert20@py_format15r   @py_format27@py_format29@py_format30@py_format32s&                                         r&   &test_enqueue_pr_bypass_keyword_blockedr   `   s   'X7%?O%:EJ*("%::=PPH[(3.9 //0ABGL7$LLL7$LLLLLL7LLL7LLL$LLL LLLLLLL= GMM MO =O+ w '-- -/ w//I   =O          $    $    *    ,     w/    07      ;B    ;B    ;H    ;J        *'3      
 //
;GG7$GGG7$GGGGGG7GGG7GGG$GGG GGGGGGG 
s**	+ AxqE4@A 8>> s>2 288 8: :: &.nn"%n"5"55  :           #     #      $,    $,    $2     3     9     ;     "5        #&   #&     '/   '/   '5   #6       /x~~.>?       A As   "]55]?)r5   r   r   r.   r-   None)r5   r   r-   r   )r5   r   r   zpytest.MonkeyPatchr-   r   )__doc__
__future__r   builtinsre   _pytest.assertion.rewrite	assertionrewriterc   r    r[   r^   r`   pathlibr   r   r.   __file__resolver   r]   pathinsertr9   r   r    r:   r&   <module>r      sy    #    	  
   T(^++-55a89!HHOOA~&]D$
Nr:   