
    Si6                        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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d Zd Zd Zd Zy)u   tests/state_machine/test_transitions.py
명세 §3 "6개 금지 전이" + 상태 enum 검증 (task-2467)

벨레스(개발6팀 테스터) 작성. 스바로그의 구현 완료 전 선작성(TDD).
    )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 )
u5   test마다 .tasks/state/ 와 .tasks/evidence/ 격리.WORKSPACE_ROOT.tasksstateT)parentsexist_okevidencememoryeventszorchestration-audit)osenvironstrmkdir)tmp_pathenvs     U/home/jay/workspace/.worktrees/task-2467-dev6/tests/state_machine/test_transitions.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   _run_taskctlr"   $   s-    >>	CL!D($C r   c                d    | dz  dz  | dz  }t        j                  |j                               S )Nr   r	   .json)jsonloads	read_text)r   task_idps      r   _stater*   +   s2    8g%7)5(99A::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 )u   테스트 전용: state 파일을 직접 조작하여 체크섬 재계산 후 저장.

    구현이 _compute_checksum 로직을 노출하지 않으므로, 직접 sha256 재계산.
    r   Nr   r	   r$   current_state	_checksumFT),:)ensure_ascii	sort_keys
separatorszutf-8   )r0   indent)hashlibr%   r&   r'   popitemsdumpssha256encode	hexdigest
write_text)r   r(   target_stater5   r)   r	   kvpayloadcanonchecksums              r   _force_staterC   0   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 t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|g|       | dz  d	z  | d
z  }|j                         sJ d       t	        j
                  |j                               }|d   }|dvs
J d|        y)uq  §3.9 (1): PR_OPEN 없이 VERIFIED 진입 차단.

    init → dispatch → ack → run → verify (PR_OPEN 미경유)
    현재 MVP 상태모델에서 RUNNING → GUARD_PASS(=VERIFIED)는
    PR_OPEN을 거치지 않으므로 허용되면 안 된다.
    신규 14+5 상태모델에서는 RUNNING → COMMITTED → PR_OPEN → ... → VERIFIED 경로만 허용.
    ztask-forbidden-01initr   dispatchackr   verifyr   r	   r$   u    state 파일이 존재해야 함r,   >   VERIFIED
GUARD_PASSu2   PR_OPEN 없이 VERIFIED/GUARD_PASS 진입 발생: N)r   r"   
returncodeexistsr%   r&   r'   )r   r   r(   
state_filer	   currents         r   6test_forbidden_transition_pr_open_to_verified_directlyrO   G   s    h
'C!G)3/::a???W-s3>>!CCC(#.99Q>>>(#.99Q>>> (G$c*H$w.G9E1BBJB BBJJz++-.EO$G 44 
<WIF4r   c                   t        |       }d}t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|dd	g|      j                  dk(  sJ t        d
|ddg|      }|j                  dk7  sJ d       t        | |      }|d   dvsJ d|d           y)u   §3.9 (2): VERIFIED 없이 HUMAN_APPROVED 차단.

    PR_OPEN 상태에서 approve 시도 → 차단 (VERIFIED/GUARD_PASS 필요).
    ztask-forbidden-02rE   r   rF   rG   r   pr-open--pr200approve--byzhuman-revieweru<   VERIFIED 없이 HUMAN_APPROVED 진입이 차단되어야 함r,   >   HUMAN_APPROVEDu.   VERIFIED 없이 HUMAN_APPROVED 진입 발생: Nr   r"   rK   r*   r   r   r(   procr	   s        r   =test_forbidden_transition_verified_to_human_approved_skippingrZ   j   s   
 h
'C!G)3/::a???W-s3>>!CCC(#.99Q>>>(#.99Q>>>GVU;SALLPQQQQ GV5EFLD??a_!__8W%E!);; 
89O8PQ;r   c                j   t        |       }d}t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|dd	g|      j                  dk(  sJ t        d
|dg|      }|j                  dk7  sJ d       t        | |      }|d   dvsJ d|d           d|j                  v s@d|j                  v s1d|j                  j                         v sJ d|j                          yyy)u   §3.9 (3): HUMAN_APPROVED 없이 MERGING 차단.

    PR_OPEN 상태 (또는 GUARD_PASS/VERIFIED 상태)에서 merge 시도 → 거부.
    ztask-forbidden-03rE   r   rF   rG   r   rQ   rR   300merge	--dry-runu;   HUMAN_APPROVED 없이 MERGING 진입이 차단되어야 함r,   >   MERGEDMERGINGu4   HUMAN_APPROVED 없이 MERGING/MERGED 진입 발생: rV   u   차단blockedu    예상 에러 메시지 없음: N)r   r"   rK   r*   stderrlowerrX   s        r   ;test_forbidden_transition_human_approved_to_merging_skippedrd      sp   
 h
'C!G)3/::a???W-s3>>!CCC(#.99Q>>>(#.99Q>>>GVU;SALLPQQQQ ';7=D??a^!^^8W%E!)>> 
>u_?U>VW> t{{*h$++.EVZVaVaVgVgViIi 
*4;;-8iIi.E*r   c                   t        |       }d}t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|dd	g|      j                  dk(  sJ t        d
|g|      }|j                  dk7  sJ d       t        | |      }|d   dvsJ d|d           y)uc   §3.9 (4): MERGED 없이 DONE 차단.

    PR_OPEN 상태에서 done 명령 시도 → 거부.
    ztask-forbidden-04rE   r   rF   rG   r   rQ   rR   400doneu0   MERGED 없이 DONE 진입이 차단되어야 함r,   >   DONEu"   MERGED 없이 DONE 진입 발생: NrW   rX   s        r   2test_forbidden_transition_merged_required_for_doneri      s   
 h
'C!G)3/::a???W-s3>>!CCC(#.99Q>>>(#.99Q>>>GVU;SALLPQQQQ )3/D??aS!SS8W%E!1 
,U?-C,DE1r   c                H   t        |       }d}t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        | |      }|d   dk(  sJ t        d|g|      }|j                  dk7  sJ d       t        | |      }|d   dk(  sJ d	|d           y
)uy   §3.9 (5): CANCELLED는 terminal — 다른 상태로 복귀 불가.

    init → cancel → run 시도 → 차단.
    ztask-forbidden-05rE   r   cancelr,   	CANCELLEDr   u1   CANCELLED에서 RUN 진입이 차단되어야 함u&   CANCELLED에서 상태 변경 발생: NrW   r   r   r(   r	   rY   s        r   8test_forbidden_transition_cancelled_terminal_no_recoveryrn      s    
 h
'C!G)3/::a???7+S1<<AAA8W%E![000 (#.D??aT!TT8W%E![0 
01G0HI0r   c                
   t        |       }d}t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|ddg|      }|j                  dk7  sJ d       t        | |      }|d	   d
k(  sJ y)u:   §3.9 (5) 보완: CANCELLED 후 approve 시도 → 차단.ztask-forbidden-05brE   r   rk   rT   rU   humanu5   CANCELLED에서 approve 시도가 차단되어야 함r,   rl   NrW   rX   s        r   .test_forbidden_transition_cancelled_no_approverq      s    
h
'C"G)3/::a???7+S1<<AAAGVW=sCD??aX!XX8W%E![000r   c                   t        |       }d}t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|g|      j                  dk(  sJ t        d|dd	g|      j                  dk(  sJ t        | |d
       t	        | |      }|d   d
k(  sJ d       t        d|dg|      }|j                  dk7  sJ d       t	        | |      }|d   dvsJ d|d           y)u   §3.9 (6): BLOCKED 상태에서 MERGING 진입 차단.

    state 파일을 BLOCKED로 강제 진입시킨 후 merge 시도 → 차단.
    (신규 구현에서 BLOCKED 상태 진입 명령이 추가되면 해당 명령으로 대체 가능)
    ztask-forbidden-06rE   r   rF   rG   r   rQ   rR   600BLOCKEDr,   u   강제 BLOCKED 설정 실패r]   r^   u:   BLOCKED 상태에서 MERGING 진입이 차단되어야 함>   rh   r_   r`   u%   BLOCKED에서 MERGING 진입 발생: N)r   r"   rK   rC   r*   rm   s        r   ,test_forbidden_transition_blocked_to_mergingru      sO    h
'C!G)3/::a???W-s3>>!CCC(#.99Q>>>(#.99Q>>>GVU;SALLPQQQQ 7I.8W%E!Y.N0NN. ';7=D??a]!]]8W%E!)FF 
/o0F/GHFr   c                    t         j                  j                  dt        t        dz               	 t        j                  d      } t        j                  |        	 t        | j                        }h d}h d}||z
  }||z
  }|r
J d|        |rWddhd	hd
}t               }|D ]3  }|j                  |t                     }	|	|z  r#|j                  |       5 |r
J d|        yy# w xY w)u   STATES enum이 14 정상 + 5 예외 상태를 포함하는지 검증.

    신규 구현 완료 후 통과 예상. 현재 MVP는 11종만 정의.
    r   r   taskctl>   rh   r_   CREATEDr`   PR_OPENRUNNINGrI   	COMMITTED
CI_PENDINGREVIEW_READYHANDOFF_READYGEMINI_PENDINGrV   WORKTREE_READY>   FAILEDrt   rl   	ESCALATEDADMIN_OVERRIDE_USEDu   누락된 예외 상태: 
DISPATCHEDACKEDrJ   )r   rI   u(   누락된 정상 상태 (alias 없음): N)syspathinsertr   	WORKSPACE	importlibimport_modulereloadsetSTATESgetadd)
taskctl_modstatesexpected_normalexpected_exceptionmissing_normalmissing_exception	alias_map
unresolvedmaliasess
             r   .test_state_enum_includes_14_normal_5_exceptionr   
  s   
 HHOOAs9y012--i8%##$FO %v-N*V3 !Q$=>O=P"QQ   ,W5%
	 U
 	"AmmAsu-Gf$q!	" V!I*VV~: ) 	s   *C* *C,c                 N   t         j                  j                  dt        t        dz               	 t        j                  d      } t        j                  |        	 | j                  }h d}dh}||z
  }|r
J d|        ||z
  }|rt        j                  d|        yy# w xY w)	uy   DONE/CANCELLED/FAILED/ADMIN_OVERRIDE_USED는 terminal 상태.

    TERMINAL_STATES에 반드시 포함되어야 함.
    r   r   rw   >   rh   r   rl   r   u    누락된 core terminal 상태: u8   신규 terminal 상태 미구현 (스바로그 대기): N)r   r   r   r   r   r   r   r   TERMINAL_STATESpytestxfail)r   terminalexpectedexpected_newmissing_coremissing_news         r   'test_terminal_states_no_transitions_outr   6  s    
 HHOOAs9y012--i8%**H.H)*Lh&LN?~NN )KOP[}]^  	s   *B" "B$)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   r   r   pathlibr   r   r   r    r   r"   r*   rC   rO   rZ   rd   ri   rn   rq   ru   r   r    r   r   <module>r      s   
 #   	  
  @A	
i
,
.%
B.F6>6.1$D)WX_r   