
    ci!                    8   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      j                         j                  d   ZddZ ej$                         dd       Zd	d
d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZddZddZddZddZddZddZy)u1  tests/regression/test_cleanup_branch_failclosed.py — task-2471+1 자동화 회귀.

회장 명령 (C): merged branch cleanup 자동화 — fail-closed 4 조건.

1. state.current_state == "DONE"
2. state.evidence.pr_state == "MERGED"
3. mergeCommit ancestry (origin/main 포함)
4. .done 존재 + .g3-fail 부재 + .done.escalated 부재(or archived)

조건 미충족 시: 삭제 차단 + audit 기록 + exit 1.

격리 환경에서 ``cmd_cleanup_branch`` 직접 호출로 실제 git 호출 없이
조건 검증 자체의 fail-closed 동작을 검증한다.
    )annotationsN)Path)Any   c                p   | j                  dt        |             t        j                  j	                  dt        t
        dz  dz              }|r|j                  sJ t        j                  j                  |      }|t        j                  |j                  <   |j                  j                  |       |S )uC   taskctl 모듈을 임시 WORKSPACE_ROOT 환경에서 격리 로드.WORKSPACE_ROOTtaskctl_isolated_cleanupscriptsz
taskctl.py)setenvstr	importlibutilspec_from_file_location	WORKSPACEloadermodule_from_specsysmodulesnameexec_module)monkeypatchrootspecmods       b/home/jay/workspace/.worktrees/task-2471+1-dev2/tests/regression/test_cleanup_branch_failclosed.py_load_taskctlr      s    'T3>>11"I	!L01D DKK
..
)
)$
/C CKK		KKC J    c                    | dz  dz  }| dz  dz  }| dz  dz  }| dz  dz  }||||fD ]  }|j                  dd        t        ||       }| |||||d	S )
N.tasksstateevidencememoryeventszorchestration-auditTparentsexist_ok)tmp_pathr   	state_direvidence_dir
events_dir	audit_dir)mkdirr   )r'   r   r(   r)   r*   r+   dr   s           r   isolatedr.   +   s    8#g-Ih&3LH$x/J8#&;;Iz9= -	t,-
X
.C$  r   ztask/task-99999-dev0i )branch	pr_numberc               >   ddl }||g dg ||||i dddi ddddddddddddd}t        j                  |ddd	
      }	|j                  |	j	                  d            j                         |d<   | | dz  j                  t        j                  |dd      d       y)u;   checksum 포함 state 직접 기록 (taskctl _save 우회).r   N)git_diff_shachanged_pathsr/   r0   pr_statemerge_commit_sha	ci_checksguard_sh_resultqc_report_guard_resultmerge_timestamp
exit_codesTF)usedtsactor)r;   r<   r=   reasonaudit_log_offset)task_idcurrent_statetransitionsr!   human_approvedbypassadmin_override),:)ensure_ascii	sort_keys
separatorszutf-8	_checksumz.jsonr   )rH   indent)encoding)hashlibjsondumpssha256encode	hexdigest
write_text)
r(   r@   rA   r4   	merge_shar/   r0   rN   payload	canonicals
             r   _write_staterX   >   s      & "  )#&*#
  t< $
'G6 

et
I #>>)*:*:7*CDNNPGKG9E""..

7q9G / r   c           
         t        j                  | |j                  d      |j                  dd      |j                  dd      |j                  dd            S )Nr/   remoteFdry_runTmachine)r@   r/   rZ   r[   r\   )argparse	Namespaceget)r@   kwargss     r   
_make_argsra   o   sN    zz(#zz(E*

9d+

9d+ r   c                   d}t        | d   |ddd       | d   j                  t        |            }|dk(  sJ |j                         j                  }t        j                  |      }|d   d	u sJ t        d
 |d   D              sJ y)u   state != DONE → 차단.ztask-cleanup-001r(   MERGEDabcd1234rA   r4   rU   r      okFc              3  $   K   | ]  }d |v  
 yw)DONEN .0rs     r   	<genexpr>z;test_cleanup_blocked_when_state_not_done.<locals>.<genexpr>   s     :qv{:   failed_reasonsN)rX   cmd_cleanup_branchra   
readouterroutrO   loadsany)r.   capsysr@   rcrs   recs         r   (test_cleanup_blocked_when_state_not_donery   y   s     G 
%	+	+Jw,?	@B7N7




!
!C
**S/Ct9:C(8$9::::r   c                D   d}t        | d   |ddd       | d   | dz  j                  d	       | d
   j                  t        |            }|dk(  sJ t	        j
                  |j                         j                        }|d   du sJ t        d |d   D              sJ y)u   pr_state != MERGED → 차단.ztask-cleanup-002r(   ri   OPENrd   re   r*   .done{}r   rf   rg   Fc              3  0   K   | ]  }d |v xs d|v   yw)rc   r{   Nrj   rk   s     r   rn   z@test_cleanup_blocked_when_pr_state_not_merged.<locals>.<genexpr>   s      Kx1}+!+Ks   rp   N)	rX   rT   rq   ra   rO   rt   rr   rs   ru   r.   rv   r@   rw   rx   s        r   -test_cleanup_blocked_when_pr_state_not_mergedr      s     G l	//;;DA	%	+	+Jw,?	@B7N7
**V&&(,,
-Ct9KS9I5JKKKKr   c                   d}t        | d   |ddd       | d   j                  t        |            }|dk(  sJ t        j                  |j                         j                        }|d	   d
u sJ t        d |d   D              sJ y)u@   state DONE + pr MERGED 이지만 .done 마커 부재 → 차단.ztask-cleanup-003r(   ri   rc   rd   re   r   rf   rg   Fc              3  $   K   | ]  }d |v  
 yw)r|   Nrj   rk   s     r   rn   z@test_cleanup_blocked_when_done_marker_missing.<locals>.<genexpr>   s     ;w!|;ro   rp   N)rX   rq   ra   rO   rt   rr   rs   ru   r   s        r   -test_cleanup_blocked_when_done_marker_missingr      s     G 
%	+	+Jw,?	@B7N7
**V&&(,,
-Ct9;S)9%:;;;;r   c                   d}t        | d   |ddd       | d   | dz  j                  d	       | d   | d
z  j                  d	       | d   dz  dz  |z  j                  dd       | d   j                  t	        |            }|dk(  sJ t        j                  |j                         j                        }|d   du sJ t        d |d   D              sJ y)u"   .g3-fail 마커 잔존 → 차단.ztask-cleanup-004r(   ri   rc   rd   re   r*   r|   r}   z.g3-failr'   r   r!   Tr$   r   rf   rg   Fc              3  $   K   | ]  }d |v  
 yw)zg3-failNrj   rk   s     r   rn   z;test_cleanup_blocked_when_g3fail_present.<locals>.<genexpr>   s     =!yA~=ro   rp   N)
rX   rT   r,   rq   ra   rO   rt   rr   rs   ru   r   s        r   (test_cleanup_blocked_when_g3fail_presentr      s     G l	//;;DAl	22>>tDjH$z1G;BBt C  
%	+	+Jw,?	@B7N7
**V&&(,,
-Ct9=s+;'<====r   c                   d}t        | d   |ddd       | d   | dz  j                  d	       | d   | d
z  j                  t        j                  ddd             | d   dz  dz  |z  j	                  dd       | d   j                  t        |            }|dk(  sJ t        j                  |j                         j                        }|d   du sJ t        d |d   D              sJ y)u4   .done.escalated 잔존 (archive 안 됨) → 차단.ztask-cleanup-005r(   ri   rc   rd   re   r*   r|   r}   z.done.escalatedxy)triggerr>   r'   r   r!   Tr$   r   rf   rg   Fc              3  $   K   | ]  }d |v  
 yw)	escalatedNrj   rk   s     r   rn   z>test_cleanup_blocked_when_escalated_present.<locals>.<genexpr>   s     ?A{a?ro   rp   N)rX   rT   rO   rP   r,   rq   ra   rt   rr   rs   ru   r   s        r   +test_cleanup_blocked_when_escalated_presentr      s    G l	//;;DAl	99EE

sc23 jH$z1G;BBt C  
%	+	+Jw,?	@B7N7
**V&&(,,
-Ct9?-=)>????r   c                   d}t        | d   |ddd       | d   | dz  j                  d	       | d
   dz  dz  |z  j                  dd       | d   j                  t	        |d            }t        j                  |j                         j                        }|d   d   d   }|d   d   d   }|d   d   d   }|d   d   d   }|r|r|r|sJ |d   d   d   du sJ |d   d   du sJ |d   du sJ |dk(  sJ y)u  모든 조건 충족 + dry-run → ok=True / 실제 삭제는 skip.

    NOTE: ancestry git 호출이 임시 dir에서 실패할 수 있어 ok=False인 것이
    정상 (fail-closed). 본 테스트는 그 한 가지가 아닌 다른 모든 조건이
    PASS인지 확인한다.
    ztask-cleanup-006r(   ri   rc   rd   re   r*   r|   r}   r'   r   r!   Tr$   r   )r[   checksstate_currentrg   pr_state_mergedr)   markersancestryFdeletionr[   rf   N)	rX   rT   r,   rq   ra   rO   rt   rr   rs   )	r.   rv   r@   rw   rx   
state_done	pr_mergedevidence_dir_ok
markers_oks	            r   3test_cleanup_dry_run_passes_when_all_conditions_metr      sY    !G l	//;;DAjH$z1G;BBt C  
%	+	+Jw,M	NB
**V&&(,,
-CX/5JH/06I(mN3D9OXy)$/J)JFFx=$T*e333z?9%---t97N7r   )r   pytest.MonkeyPatchr   r   )r'   r   r   r   )r(   r   r@   r   rA   r   r4   
str | NonerU   r   r/   r   r0   intreturnNone)r@   r   r   zargparse.Namespace)r   r   )__doc__
__future__r   r]   importlib.utilr   rO   r   pathlibr   typingr   pytest__file__resolver%   r   r   fixturer.   rX   ra   ry   r   r   r   r   r   rj   r   r   <module>r      s    #    
   N""$,,Q/	  2 )... 	.
 . . . . 
.b;$L&<$>.@0 r   