
    ?# j,                        d Z ddlmZ ddlZddlZddlZddlmZ ddlZ ed      Z	e	dz  dz  Z
ddZdd	Zdd
ZddZd Zd Zd Zd Zd Zy)u  tests/taskctl/test_lifecycle.py
PR Lifecycle 정상 흐름 검증 (task-2467)

벨레스(개발6팀 테스터) 작성. 스바로그의 구현 완료 전 선작성(TDD).

케이스:
    1. test_init_dispatch_ack_run_committed_chain
    2. test_pr_open_records_pr_number_and_evidence
    3. test_verify_evidence_file_created
    4. test_done_requires_merged_state
    5. test_done_creates_done_file
    )annotationsN)Pathz-/home/jay/workspace/.worktrees/task-2467-dev6scriptsz
taskctl.pyc                   i t         j                  }t        |       |d<   | dz  dz  j                  dd       | dz  dz  j                  dd       | dz  dz  j                  dd       | dz  d	z  j                  dd       |S )
u:   test마다 WORKSPACE_ROOT를 격리된 tmp_path로 설정.WORKSPACE_ROOT.tasksstateT)parentsexist_okevidencememoryeventszorchestration-audit)osenvironstrmkdir)tmp_pathenvs     M/home/jay/workspace/.worktrees/task-2537-dev4/tests/taskctl/test_lifecycle.py_isolated_workspacer      s    
RZZ.CMC7"))$)F:%,,TD,I8#**4$*G0077t7TJ    c                Z    t        j                  dt        t              g| z   dd|d      S )Npython3T   )capture_outputtextr   timeout)
subprocessrunr   TASKCTL)argsr   s     r   _runr"   )   s-    >>	CL!D($C r   c                    | dz  dz  | dz  }|j                         s
J d|        t        j                  |j                               S )Nr   r	   .jsonu   state 파일 없음: )existsjsonloads	read_text)r   task_idps      r   _stater+   0   sM    8g%7)5(99A88:2.qc22:::akkm$$r   c                   ddl }| dz  dz  | dz  }t        j                  |j                               }||d<   |j	                  dd       |j                         D ci c]  \  }}|dk7  s|| }}}t        j                  |dd	d
      }	|j                  |	j                  d            j                         }
|
|d<   |j                  t        j                  |dd             yc c}}w )uW   테스트 전용: state를 강제로 특정 상태로 설정하고 체크섬 재계산.r   Nr   r	   r$   current_state	_checksumFT),:)ensure_ascii	sort_keys
separatorszutf-8   )r1   indent)hashlibr&   r'   r(   popitemsdumpssha256encode	hexdigest
write_text)r   r)   target_stater6   r*   r	   kvpayloadcanonchecksums              r   _force_state_with_checksumrD   6   s    8g%7)5(99AJJq{{}%E)E/	IIk4  %B1k1Aq!tBGBJJwUdzZE~~ell734>>@H!E+LLEa@A	 Cs    C*.C*c                   t        |       }d}t        d|g|      }|j                  dk(  sJ d|j                          t	        | |      d   dk(  sJ t        d|g|      }|j                  dk(  sJ d|j                          t	        | |      d   d	v sJ t        d
|g|      }|j                  dk(  sJ d|j                          t	        | |      d   dv sJ t        d|g|      }|j                  dk(  sJ d|j                          t	        | |      d   dk(  sJ t        d|g|      }t	        | |      }|j                  dk(  r|d   dv s"J d|d           |d   dk(  sJ d|d           |d   }t        |      dk\  sJ dt        |       d       |D ]0  }|j                  d      d|v s
J d|        d|v r(J d|         y)u   정상 lifecycle: init → dispatch → ack → run → commit 체인.

    commit 명령이 구현되면 COMMITTED 진입 검증.
    현재 MVP에서는 RUNNING까지만 확인.
    ztask-lifecycle-01initr   u   init 실패: r-   CREATEDdispatchu   dispatch 실패: >   
DISPATCHEDWORKTREE_READYacku   ack 실패: >   ACKEDrJ   r   u   run 실패: RUNNINGcommit>   rM   	COMMITTEDu   commit 후 예상 외 상태: u/   commit 실패 후 상태가 RUNNING이 아님: transitions   u   전이 이력 부족: u   건fromNtsu   전이에 ts 누락: actoru   전이에 actor 누락: )r   r"   
returncodestderrr+   lenget)r   r   r)   procproc_commitstate_afterrP   ts           r   *test_init_dispatch_ack_run_committed_chainr]   I   sU    h
'C!G!3'D??a>=!>>(G$_5BBBW%s+D??aB#4T[[M!BB(G$_59YYYY #&D??a=<}!==(G$_59TTTT #&D??a=<}!==(G$_5BBB '*C0K7+K"?+/GG 	
,[-I,JK	
G
 ?+y8 	
=k/>Z=[\	
8
 m,K{q P$:3{;K:LC"PP   @55=$199 5aS999a<?#;A3!??<@r   c                   t        |       }d}d|gd|gd|gd|gfD ]  }t        ||      j                  dk(  rJ  t        d|dd	g|      }|j                  dk(  sJ d
|j                          t	        | |      }|d   dv sJ d|d           |j                  di       }|j                  d      dk(  sJ d|j                  d              | dz  dz  |z  dz  }|j                         rmt        j                  |j                               }|j                  d      dk(  s
J d|        dD ]&  }	|	|v rd|v rJ d|	 d|j                                  yt        j                  d       y)u   pr-open --pr 100 → state.evidence.pr_number == 100, evidence/pr-open.json 생성.

    evidence 디렉토리 방식은 신규 구현에서 추가. MVP는 state.evidence dict 방식.
    ztask-lifecycle-02rF   rH   rK   r   r   pr-open--pr100u   pr-open 실패: r-   >   PR_OPENu)   pr-open 후 상태가 PR_OPEN이 아님: r   	pr_numberd   u   pr_number 미기록: r   zpr-open.jsonu%   pr-open.json에 pr_number 미기록: )command	exit_code	timestamprS   u   pr-open.json에 필수 필드 'u
   ' 누락: uC   evidence/pr-open.json 파일 방식 미구현 (스바로그 대기)N)r   r"   rU   rV   r+   rX   r%   r&   r'   r(   keyspytestxfail)
r   r   r)   cmdrY   r	   ev
pr_open_evev_datafields
             r   +test_pr_open_records_pr_number_and_evidencerp      s   
 h
'C!G!J#8 5'"24 .C~((A---. GVU3S9D??aA#3DKK=!AA8W%E![0 
3E/4J3KL0
 
:r	"B66+#% 
{ 345%
 H$z1G;nLJ**Z1134{{;'3. 	
3G9=	
. ; 	EG#tw 1%
7<<>BRS6	 	Z[r   c                F   t        |       }d}d|gd|gd|gd|gd|ddgfD ]  }t        ||      j                  d	k(  rJ  t        d
|g|       t        | |      }|j	                  di       }d|v sJ d|j                                 |d   dv sJ d|d           d|v rd
|j	                  di       v s
J d|        | dz  dz  |z  dz  }|j                         rEt        j                  |j                               }d|v sd|v sJ d|j                                 yyy)u   verify 실행 후 evidence/verify.json 생성 (guard.sh 통과 여부와 무관).

    guard.sh가 없거나 실패해도 evidence 파일 자체는 기록되어야 함.
    ztask-lifecycle-03rF   rH   rK   r   r_   r`   103r   verifyr   guard_sh_resultu&   verify 후 guard_sh_result 미기록: >   FAILPASSMISSINGu   guard_sh_result 값 이상: 
exit_codesu   exit_codes.verify 미기록: r   zverify.jsonguard_resultu'   verify.json에 guard_sh_result 누락: N)
r   r"   rU   r+   rX   rh   r%   r&   r'   r(   )r   r   r)   rk   r	   rl   	verify_evrn   s           r   !test_verify_evidence_file_createdr{      s   
 h
'C!G!J#8 5'"2GVU35 . C~((A---. 	(G	c"8W%E 
:r	"B" 
0<"  $?? 
&r*;'<&=>? 2(bff\2.F"F 
't,F
 8#j07:]JI**Y0023 G+~/H 	
5glln5EF	
H/H+ r   c                   t        |       }d}d|gd|gd|gd|gd|ddgfD ]  }t        ||      j                  d	k(  rJ  t        d
|g|      }|j                  d	k7  sJ d       t        | |      }|d   dvsJ d|d           y)uN   §3.9 (4) 보완: PR_OPEN/RUNNING 등 비-MERGED 상태에서 done → 차단.ztask-lifecycle-04rF   rH   rK   r   r_   r`   104r   doneu0   PR_OPEN 상태에서 done이 차단되어야 함r-   >   DONEu,   비-MERGED 상태에서 DONE 진입 발생: N)r   r"   rU   r+   )r   r   r)   rk   rY   r	   s         r   test_done_requires_merged_stater      s    
h
'C!G!J#8 5'"2GVU35 . C~((A---. !3'D??aS!SS8W%E!1 
6u_7M6NO1r   c                   t        |       }d}d|gd|gd|gd|gd|ddgfD ]  }t        ||      j                  d	k(  rJ  t        | |d
       t	        | |      }|d   d
k(  sJ d       t        d|g|      }| dz  dz  | dz  }|j                  d	k(  r<|j                         s
J d|        t	        | |      }|d   dk(  sJ d|d           yt        j                  d|j                  dd         y)u   MERGED 상태에서 done → memory/events/<task-id>.done 생성.

    MERGED 상태를 강제로 만든 후 done 명령 실행.
    신규 구현에서 done 명령이 MERGED를 검증하고 .done 파일을 생성해야 함.
    ztask-lifecycle-05rF   rH   rK   r   r_   r`   105r   MERGEDr-   u   강제 MERGED 설정 실패r~   r   r   z.doneu1   done 명령 성공했지만 .done 파일 없음: r   u#   done 후 상태가 DONE이 아님: uL   done 명령 미구현 또는 외부 의존성 실패 (스바로그 대기): N   )	r   r"   rU   rD   r+   r%   ri   rj   rV   )r   r   r)   rk   r	   rY   	done_files          r   test_done_creates_done_filer      s[    h
'C!G!J#8 5'"2GVU35 . C~((A---. x(;8W%E!X-L/LL- !3'D8#h.G9E1BBI!! 	
?	{K	
! x)_%/ 	
1%2H1IJ	
/
 	Z[_[f[fgkhk[lZmn	
r   )r   r   returndict)r!   z	list[str]r   r   r   zsubprocess.CompletedProcess)r   r   r)   r   r   r   )r   r   r)   r   r>   r   r   None)__doc__
__future__r   r&   r   r   pathlibr   ri   	WORKSPACEr    r   r"   r+   rD   r]   rp   r{   r   r    r   r   <module>r      sk    #  	   @A	
i
,
.%B&/@l(\^$
X0%
r   