
    ~i"                       d Z ddl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	m
Z
 ddlZ e ee      j                         j                  d         Zeej"                  vrej"                  j%                  de        e ee      j                         j                  d   dz        Zeej"                  vrej"                  j%                  de       dddZdd	Z	 	 	 	 	 	 dd
Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy)u   
test_request_review.py — cmd_request_review 회귀 테스트.

1. bot author PR + human reviewer → PASS (gh pr edit monkeypatched)
2. human author PR + same reviewer → FAIL (self-approval or non-bot author)
    )annotationsN)Path)Any   scriptsc                >   | dz  dz  }|j                  dd       ||g dg dddi dddd	d}dd}t        j                   ||      j                               j	                         }||d	<   || d
z  }|j                  t        j                  |dd      d       y)u6   테스트용 task state json 생성 (checksum 포함)..tasksstateTparentsexist_okN)	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       R/home/jay/workspace/.worktrees/task-2481-dev4/tests/scripts/test_request_review.py
_canonicalz_make_state.<locals>._canonical2   sF    $%GGIBDAqk1A1a4BBzz'R\]] Cs
   AAr   z.jsonFr   )r   indentutf-8encoding)r%   dictreturnstr)mkdirhashlibsha256encode	hexdigest
write_textr#   r$   )tmp_pathr   r   	state_dirr
   r*   checksum
state_paths           r)   _make_stater<      s    8#g-IOOD4O0 & ##

	E"^ ~~j/6689CCEH!E+y..J$**UqIT[\    c                6    ~ddl }|j                  | ddd      S )u   gh pr edit 성공 mock.r   N )
returncodestdoutstderr)
subprocessCompletedProcess)cmdkwargsrC   s      r)   _fake_run_successrG   =   s"    &&sqB&OOr=   c                >   d}|j                  dt        |              |j                  dd       |j                  dd       | dz  dz  }|j                  d	d	
       |dz  j                  t	        j
                  dg g dd      d       |j                  t        j                  dd       t        | |d       ddl
}t        t              dz  dz  }|j                  j                  dt        |            }|j                  j                  |      }|j                   j#                  |       |j%                  |d|        |j%                  |d| dz  dz         |j%                  |d| dz  d z         |j%                  |d!t&               t)        j*                  |d"d#$      }|j-                  |      }	|	dk(  s
J d%|	        | dz  d z  |z  }
t/        |
j1                  d&            }|sJ d'       t	        j2                  |d(   j5                               }|j7                  d)      d*k(  s
J d+|        |j7                  d,      dk(  s'd-t        |j7                  d,d.            v s
J d/|        |j7                  d0      d#k(  sJ d1|j7                  d0              y)2uE   bot author + human reviewer → PASS. evidence에 result=PASS 기록.	task-2481WORKSPACE_ROOTTASKCTL_TEST_MODE1TASKCTL_PR_AUTHOR_OVERRIDEjeon-jonghyuk-taskctl-bot[bot]memoryspecsTr   allowed_approvers.json   )jonghyuk-jeonJonghyukJeonJeon-Jonghyukversion	approversmanual_loginsr,   r-   utils.bot_pr_authorFraisingPR_OPENr   r   Nr   
taskctl.py_taskctl_scripts	WORKSPACE	STATE_DIRr	   r
   EVIDENCE_DIRr   _rund   rS   r   prreviewerzexpected 0 exit code, got *.jsonevidence file not createdresultPASSzexpected result=PASS, got: authorzjeon-jonghyuk-taskctl-botr?   zbot author not in evidence: rh   zreviewer mismatch: )setenvr1   r2   r7   r#   r$   delitemsysmodulesr<   importlib.utilr   _WORKTREE_ROOTutilspec_from_file_locationmodule_from_specloaderexec_modulesetattrrG   argparse	Namespacecmd_request_reviewsortedglobloads	read_textget)r8   monkeypatchr   allowed_dir	importlibtaskctl_pathspectcargsrl   evidence_direv_filesev_datas                r)   )test_request_review_human_reviewer_passesr   D   s    G'X7*C035UV X%/KdT2++77

KD 9 	 8  %:EJ';')3lBL>>112Dc,FWXD		(	(	.BKKBK2KH)<w)FGNHx,?*,LM F$56 D ""4(FQ;=4VH==; h&3g=Ll''12H0008jj"//12G;;x F*S.I',SS*;;x $DD&#gkk(B.G*HH4)'34 I ;;z"o5 
gkk*5675r=   c                x   d}|j                  dt        |              |j                  dd       |j                  dd       t        | |d       d	d
l}t	        t
              dz  dz  }|j                  j                  dt        |            }|j                  j                  |      }|j                  j                  |       |j                  |d|        |j                  |d| dz  dz         |j                  |d| dz  dz         |j                  |dt               t        j                  |dd      }t        j                   t"              5 }|j%                  |       d
d
d
       j&                  j(                  d	k7  sJ d|j&                  j(                          | dz  dz  |z  }	t+        |	j-                  d            }
|
sJ d       t/        j0                  |
d   j3                               }|j5                  d      dk(  s
J d|        |j5                  d      s
J d|        y
# 1 sw Y   xY w) uU   human author + same reviewer (self-approval) → SystemExit, evidence에 result=FAIL.rI   rJ   rK   rL   rM   z
human-userr]   r^   r   Nr   r_   r`   ra   rb   r	   r
   rc   r   rd   re   rf   z=expected non-zero exit for self-approval/non-bot author, got ri   z)evidence file not created even on failurerk   rl   FAIL'expected result=FAIL in evidence, got: reasonz"reason field missing in evidence: )ro   r1   r<   rs   r   rt   ru   rv   rw   rx   ry   rz   rG   r{   r|   pytestraises
SystemExitr}   valuecoder~   r   r#   r   r   r   )r8   r   r   r   r   r   r   r   exc_infor   r   r   s               r)   *test_request_review_self_approval_rejectedr      s!    G'X7*C03\B';')3lBL>>112Dc,FWXD		(	(	.BKKBK2KH)<w)FGNHx,?*,LMF$56D 
z	" $h
d#$ >>!# 
GH[H[G\]#
 h&3g=Ll''12H@@@8jj"//12G;;x F* 
1';* ;;x P$Fwi"PP !$ $s   H00H9c                   d}|j                  dt        |              |j                  dd       |j                  dd       | dz  dz  }|j                  d	d	
       |dz  j                  t	        j
                  dg ddgd      d       t        | |d       ddl}t        t              dz  dz  }|j                  j                  dt        |            }|j                  j                  |      }|j                  j                  |       |j                  |d|        |j                  |d| dz  dz         |j                  |d| dz  dz         |j                  |dt                |j#                  t$        j&                  d d!"       t)        j*                  |d#d$%      }t-        j.                  t0              5 }	|j3                  |       ddd       	j4                  j6                  dk7  sJ d&|	j4                  j6                          | dz  dz  |z  }
t9        |
j;                  d'            }|sJ d(       t	        j<                  |d)   j?                               }|jA                  d*      d+k(  s
J d,|        d-t        |jA                  d.d/            v s(d0t        |jA                  d.d/            v s
J d1|        yy# 1 sw Y   xY w)2uV   allowed_approvers.json이 정의된 환경에서 비허용 사람 reviewer → reject.rI   rJ   rK   rL   rM   rN   rO   rP   Tr   rQ   rR   rT   rU   rV   r,   r-   r]   r^   r   Nr   r_   _taskctl_scripts2ra   rb   r	   r
   rc   r   rd   rZ   Fr[   re   zrandom-strangerrf   z6expected non-zero exit for unauthorized reviewer, got ri   rj   rk   rl   r   r   allowed_approversr   r?   rY   z!reason should mention allowlist: )!ro   r1   r2   r7   r#   r$   r<   rs   r   rt   ru   rv   rw   rx   ry   rz   rG   rp   rq   rr   r{   r|   r   r   r   r}   r   r   r~   r   r   r   r   )r8   r   r   r   r   r   r   r   r   r   r   r   r   s                r)   8test_request_review_unauthorized_human_reviewer_rejectedr      s    G'X7*C035UV X%/KdT2++77

(/:D 9 	 8  ';')3lBL>>112Es<GXYD		(	(	.BKKBK2KH)<w)FGNHx,?*,LMF$56 %:EJ"D 
z	" $h
d#$ >>!# 
@ATAT@UV# h&3g=Ll''12H0008jj"//12G;;x F* 
1';* #gkk(B&?"@@c'++h";<<
+G95 =< A$ $s   =KK)r]   )r8   r   r   r1   r   r1   r0   None)rE   z	list[str]rF   r   )r8   r   r   zpytest.MonkeyPatchr0   r   )__doc__
__future__r   r{   r3   r#   rq   pathlibr   typingr   r   r1   __file__resolver   rt   pathinsert_SCRIPTS_DIRr<   rG   r   r   r    r=   r)   <module>r      s   #    
    T(^++-55a89!HHOOA~&4>))+33A6BCsxxHHOOA|$]BP99!39	9x-Q-Q!3-Q	-Q`;;!3;	;r=   