
    üi(                       d Z ddlmZ ddlZddlZddlmZ ddlZ ee      j                         j                  d   Zedz  Z ee      ej                  vr"ej                  j                  d ee             ddlZddlZej(                  dd       Zej(                  dd       Zdd	Zdd
Zd Zd ZddZddZd Zd Zd ZddZ ddZ!ddZ"d Z#ddZ$y)u   
test_lifecycle_guards.py — task-2468 P1 통합 테스트 14건 (A~N).

회장 명시: 14건 중 1건이라도 FAIL → ESCALATED.
task-2467+3 silent corruption 4대 결함이 본 task 코드로 차단됨을 증명.
    )annotationsN)Path   scriptsc                0    | dz  }|j                          |S )Neventsmkdirtmp_pathds     T/home/jay/workspace/.worktrees/task-2487-dev2/tests/taskctl/test_lifecycle_guards.py
tmp_eventsr      s    8AGGIH    c                0    | dz  }|j                          |S )Nevidencer	   r   s     r   tmp_evidencer      s    :AGGIHr   c                v   d}| | dz  j                  t        j                  |dgd      d       t        j                  ||       }|j
                  du sJ d	|j                                 d|j                  v sd
|j                  j                         v sJ t        d |j                  D              sJ y )Nztask-test-A.g3-failtest)task_idfail_reasonsutf-8encoding
events_dirFzexpected FAIL but got g3c              3  T   K   | ]   }d t        |      v xs dt        |      v  " yw)r   z.g3_failN)str).0ps     r   	<genexpr>z-test_A_g3_fail_blocks_done.<locals>.<genexpr>-   s*     PzSV#;zSV';;Ps   &()
write_textjsondumpslgcheck_g3_fail_blocks_doneokas_dictreasonloweranyblockingr   r   rs      r   test_A_g3_fail_blocks_doner1   %   s    GWIX&&22

wABW 3  	$$WDA445=@2199;-@@=!TQXX^^-=%===PQZZPPPPr   c                   d}| | dz  j                  dd       | | dz  j                  dd       t        j                  ||       }|j                  du sJ d	|j                  j                         v sd
|j                  v sJ y y )Nztask-test-Br   z{}r   r   z.doner   Fconflictu   동시)r$   r'   check_done_fail_conflictr)   r+   r,   r/   s      r   test_B_done_fail_conflictr5   1   s    GWIX&&224'2JWIU##//w/G
##G
CA445==))X-AAA-A)r   c                 ^    d} t        j                  |       }|d   dk\  sJ d|d    d       y )Nu  ## High Priority Issues

🔴 **High:** Bot author allowlist에 `app/` prefix 누락

### Critical: self-approve guard 우회 가능

severity: critical — chairman PAT fallback 시 PR author=human

## Medium

⚠️ Medium: TASKCTL_CWD env hook은 임시방편

## Low

- Minor: typo
high   zhigh=u)    (expected >=3) — task-2467+3 미재현)gspcount_severities)fixtureresults     r   test_C_gemini_high_3_countr=   ;   sA    G  !!'*F&>Qa%v'77` aar   c                     d} t        j                  |       }|j                  du sJ d|j                                 |j                  j                  dd      dk\  sJ y )Nu   ## High
🔴 BLOCKING issue)textFzexpected FAIL: r7   r      )r'   check_gemini_severityr)   r*   detailget)r?   r0   s     r   #test_D_gemini_high_blocks_automergerD   Q   sV    /D
  d+A445=9OAIIK=99=88<<"a'''r   c                Z   | dz  }|j                  t        j                  dddgdgd      d       t        j                  d|	      }|j
                  d
u sJ d|j                                 d|j                  j                         v sd|j                  j                         v sJ y y )Nallowed_approvers.jsontaskctl-gatesystemlogintypeJonghyukJeon	approversmanual_loginsr   r   allowlist_pathFu1   chairman approver는 manual로 분류돼야 함: manual)	r$   r%   r&   r'   check_approver_identityr)   r*   r+   r,   r   cfgr0   s      r   "test_E_chairman_approver_is_manualrV   Z   s    
-
-CNN4:: .AB()     	"">#FA445=[Maiik][[=qxx~~''8qxx~~7G+GGG+G'r   c                    | dz  }|j                  t        j                  dddgdgd      d       t        j                  d|	      }|j
                  d
u sJ d|j                                 y )NrF   rG   rH   rI   rL   rM   r   r   rP   Tzsystem approver: )r$   r%   r&   r'   rS   r)   r*   rT   s      r   test_F_system_approver_is_autorX   f   s{    
-
-CNN4:: .AB()     	"">#FA444<:,QYY[M::<r   c                8   dd}| j                  t        d|       t        j                  dd      }|j                  du sJ d|j                  j                         v s<d|j                  j                         v sd	|j                  j                         v sJ y
y
y
)u@   merge_commit_sha 빈 값 시 차단. fetch_pr_merge_sha를 mock.c                    dddi dS )N mainTmerge_commit_shabase_refr)   raw )
_pr_number_repos     r   
fake_fetchz1test_G_merge_sha_empty_blocks.<locals>.fake_fetchs   s    $&F$rRRr   fetch_pr_merge_sha!   
dummy/reporepoFshaemptynullN)rb   intrc   r    returndictsetattrr'   check_merge_commit_shar)   r+   r,   )monkeypatchrd   r0   s      r   test_G_merge_sha_empty_blocksrt   q   s    S0*=
!!"<8A445==AHHNN$$188>>3C(CvQRQYQYQ_Q_QaGaaaGa(C$r   c                *   | j                  t        dd        | j                  t        dd        t        j                  dd      }|j                  du sJ d	|j                  j                         v s d
|j                  v sd|j                  v sJ y y y )Nre   c                    dddi dS )Nabc123r\   Tr]   ra   _prrc   s     r   <lambda>z2test_H_merge_sha_mismatch_blocks.<locals>.<lambda>~   s    V\dhqs+t r   fetch_origin_head_shac                     y)NDIFFERENT_SHAra   )_base_kws     r   rz   z2test_H_merge_sha_mismatch_blocks.<locals>.<lambda>   s    r   rf   rg   rh   Fmismatchu	   불일치u   ≠rp   rs   r0   s     r    test_H_merge_sha_mismatch_blocksr   |   s    0tv3<>
!!"<8A445==))[AHH-DQRQYQYHYYYHY-D)r   c                    | j                  t        dd        | j                  t        dd        t        j                  dd      }|j                  du sJ d	|j	                                 y )
Nre   c                    dddi dS )Nrw   developTr]   ra   rx   s     r   rz   z2test_I_nonmain_base_dynamic_pass.<locals>.<lambda>   s    V_gktv+w r   r{   c                    | dk(  rdS dS )Nr   rw   WRONGra   )baser   s     r   rz   z2test_I_nonmain_base_dynamic_pass.<locals>.<lambda>   s    	8IH w r   2   rg   rh   Tu)   develop base에서도 동적으로 PASS: )rq   r'   rr   r)   r*   r   s     r    test_I_nonmain_base_dynamic_passr      se    0wy3VX
!!"<8A444<RDQYY[MRR<r   c                    | dz  }|j                          t        j                  dddi|      }|j                  du sJ d|j                  j                         v sd|j                  j                         v sJ y y )	Nadmin-override.jsonlztask-test-JTASKCTL_BYPASS1env
audit_pathFauditbypass)touchr'   check_bypass_auditr)   r+   r,   r   r   r0   s      r   !test_J_bypass_without_audit_failsr      sr    --E	KKM
m2BC1HUZ[A445==ahhnn&&(ahhnn6F*FFF*F&r   c                    | dz  }|j                          t        j                  dddi|      }|j                  du sJ y )Nr   ztask-test-KTASKCTL_PR_AUTHOR_OVERRIDEzfake-botr   F)r   r'   r   r)   r   s      r   -test_K_pr_author_override_without_audit_failsr      sE    --E	KKM
m$@*#M*/	1A 445==r   c                    | dz  }|j                  t        j                  dgdgdgd      d       t        j                  d|	      }|j
                  d
u sJ d|j                                 y )Nzallowed_bot_accounts.jsonzjeon-jonghyuk-taskctl-bot[bot]z[bot]zapp/)exactwildcard_suffixwildcard_prefixr   r   zmalicious-userrP   Fzunknown author blocked: )r$   r%   r&   r'   check_bot_author_allowlistr)   r*   rT   s      r   "test_L_unknown_author_blocks_merger      s{    
0
0CNN4::23#9"8  	  
 	%%&6sKA445=B4QYY[MBB=r   c                 |    t        j                  dd      } | j                  du sJ d| j                                 y )NFAILEDDONEFu   FAILED → DONE 금지: )r'   check_state_transitionr)   r*   )r0   s    r   test_M_fail_to_done_forbiddenr      s7    
!!(F3A445=B4QYY[MBB=r   c                
   d}t        j                  |dd|       }|j                  du sJ d|j                  j	                         v s<d|j                  j	                         v sd|j                  j	                         v sJ y y y )	Nztask-test-Nrf   abc)	pr_numberhead_shaevidence_dirFr   r   missing)r'   check_done_g3_pass_evidencer)   r+   r,   )r   r   r0   s      r   !test_N_no_g3_pass_evidence_blocksr      s|    G
&&w"u5A	CA445==))TQXX^^5E-EVWV^V^VdVdVfIfffIf-E)r   )r   r   rn   r   )r   r   )r   r   )r   r   )%__doc__
__future__r   r%   syspathlibr   pytest__file__resolveparents
_REPO_ROOT_SCRIPTS_DIRr    pathinsertlifecycle_guardsr'   gemini_severity_parserr9   r;   r   r   r1   r5   r=   rD   rV   rX   rt   r   r   r   r   r   r   r   ra   r   r   <module>r      s    #    (^##%--a0
I%|CHH$HHOOAs<()  $    QBb,(H;bZSGCCgr   