
    Si60                         d Z ddlZddlZddlZddlmZ ddlZdZdee	   dedej                  fdZded	e	defd
Z G d d      Z G d d      Z G d d      Zy)u*   test_kickoff.py - kickoff.py CLI 테스트    N)Pathz/home/jay/workspace/kickoff.pyargsbase_dirreturnc                 ~    t        |      dd}t        j                  t        j                  t
        g| z   dd|      S )u@   kickoff.py를 subprocess로 실행하고 결과를 반환한다.z/usr/bin:/bin:/usr/local/bin)KICKOFF_BASE_DIRPATHT)capture_outputtextenv)str
subprocessrunsys
executable
KICKOFF_PY)r   r   r   s      C/home/jay/workspace/.worktrees/task-2117-dev1/tests/test_kickoff.pyrun_kickoffr      s<    "8}6T
UC>>	$t+	     projectc                     | dz  dz  |z  dz  S )u*   kickoff-state.json 경로를 반환한다.memorykickoffzkickoff-state.json )r   r   s     r   
state_pathr      s    h*W47KKKr   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TestInitc                     t        g d|      }|j                  dk(  sJ d|j                          t        |d      j	                         sJ y)u8   정상 초기화 시 kickoff-state.json이 생성된다.init	--projectmyproj--taskzT-001r   stderr: r"   N)r   
returncodestderrr   existsselftmp_pathresults      r   test_init_creates_state_filez%TestInit.test_init_creates_state_file#   sM    OQYZ  A%A&--'AA%(H-44666r   c                     t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       dv sJ d|v sJ d	|v sJ d
|v sJ d|v sJ y# 1 sw Y   (xY w)ug   생성된 JSON에 필수 키(project, task_id, current_phase, phases, approval_points)가 존재한다.r   r"   rutf-8encodingNr   task_idcurrent_phasephasesapproval_pointsr   r   openjsonloadr)   r*   fstates       r   test_init_json_schemazTestInit.test_init_json_schema*   s    FQ(+00w0G 	!1IIaLE	! E!!!E!!!%'''5    E)))	! 	!s   A))A2c                     t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   dk(  sJ |d   d	k(  sJ y# 1 sw Y   xY w)
uB   project와 task_id 값이 인수로 전달한 값과 일치한다.)r    r!   alphar#   ROOT-42r?   r.   r/   r0   Nr   r2   r@   r6   r:   s       r   $test_init_project_and_task_id_valuesz-TestInit.test_init_project_and_task_id_values7   ss    GR'*//g/F 	!!IIaLE	! Y7***Y9,,,		! 	!s   AA(c                 N   t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   }t        |j                               h dk(  sJ |j                         D ]  \  }}|d	   d
k(  rJ d| d        y# 1 sw Y   ZxY w)u;   초기화 직후 모든 Phase의 status가 "pending"이다.r   r"   r.   r/   r0   Nr4   >   0123statuspendingPhase z status is not pending)r   r   r7   r8   r9   setkeysitems)r)   r*   r;   r<   r4   keyphases          r   test_init_all_phases_pendingz%TestInit.test_init_all_phases_pendingA   s    FQ(+00w0G 	!1IIaLE	! x6;;=!%9999 ,,. 	VJC?i/U6#>T1UU/	V	! 	!s   BB$c                     t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   dk(  sJ y# 1 sw Y   xY w)	u*   초기화 직후 current_phase가 0이다.r   r"   r.   r/   r0   Nr3   r   r6   r:   s       r   test_init_current_phase_is_zeroz(TestInit.test_init_current_phase_is_zeroM   s`    FQ(+00w0G 	!1IIaLE	! _%***	! 	!s   AAc                     t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   }d|v sJ d	|v sJ d
|v sJ y# 1 sw Y   !xY w)uU   approval_points에 phase0_review, phase2_review, phase3_approval 키가 존재한다.r   r"   r.   r/   r0   Nr5   phase0_reviewphase2_reviewphase3_approvalr6   )r)   r*   r;   r<   aps        r    test_init_approval_points_schemaz)TestInit.test_init_approval_points_schemaV   s    FQ(+00w0G 	!1IIaLE	! $%"$$$"$$$ B&&&	! 	!s   A""A+c                     t        g d|       t        g d|      }|j                  dk7  sJ d|j                  j                         v sd|j                  j                         v sJ yy)uV   이미 kickoff-state.json이 존재할 때 두 번 init 하면 에러가 발생한다.r   )r    r!   r"   r#   zT-002r   zalready existserrorN)r   r%   r&   lowerr(   s      r    test_init_duplicate_raises_errorz)TestInit.test_init_duplicate_raises_errorb   sd    FQOQYZ  A%%%6==#6#6#88Gv}}GZGZG\<\\\<\8r   N)
__name__
__module____qualname__r,   r=   rA   rO   rQ   rW   r[   r   r   r   r   r   "   s'    7*-
V+
']r   r   c                       e Zd Zd Zd Zd Zy)
TestStatusc                     t        g d|       t        g d|      }|j                  dk(  sJ d|j                          d|j                  v sJ y)u1   status 출력에 프로젝트명이 포함된다.r    r!   betaprojr#   zT-010rG   r!   rc   r   r$   rc   N)r   r%   r&   stdoutr(   s      r   (test_status_output_contains_project_namez3TestStatus.test_status_output_contains_project_nameq   sP    H(S@(K  A%A&--'AA%V]]***r   c                     t        g d|       t        g d|      }|j                  dk(  sJ d|j                  v sd|j                  j                         v sJ yy)u.   status 출력에 Phase 정보가 포함된다.rb   rd   r   PhaserN   N)r   r%   re   rZ   r(   s      r   &test_status_output_contains_phase_infoz1TestStatus.test_status_output_contains_phase_infoy   sZ    H(S@(K  A%%%&--'7fmm6I6I6K+KKK+K'r   c                     t        g d|      }|j                  dk7  sJ |j                  j                         dk7  sJ y)uR   존재하지 않는 프로젝트를 status로 조회하면 에러가 발생한다.)rG   r!   nonexistentr    Nr   r%   r&   stripr(   s      r   )test_status_missing_project_returns_errorz4TestStatus.test_status_missing_project_returns_error   s>    CXN  A%%%}}""$***r   N)r\   r]   r^   rf   ri   ro   r   r   r   r`   r`   p   s    +L+r   r`   c                   N    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestPhaseDonec                 0   t        g d|       t        g d|      }|j                  dk(  sJ d|j                          t        |d      j	                  dd      5 }t        j                  |      }d	d	d	       d
   d   d   dk(  sJ y	# 1 sw Y   xY w)u>   Phase 0 완료 후 phases["0"]["status"]가 "completed"이다.r    r!   projr#   zT-100
phase-doner!   rt   --phaserC   --output/tmp/out0.mdr   r$   rt   r.   r/   r0   Nr4   rC   rG   	completed)r   r%   r&   r   r7   r8   r9   )r)   r*   r+   r;   r<   s        r   test_phase0_done_sets_completedz-TestPhaseDone.test_phase0_done_sets_completed   s    DhO[

   A%A&--'AA%&)..sW.E 	!IIaLE	! Xs#H-<<<	! 	!s   BBc                     t        g d|       t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   d	   d
   dk(  sJ y# 1 sw Y   xY w)u@   Phase 0 완료 후 phases["1"]["status"]가 "in_progress"이다.rs   ru   rt   r.   r/   r0   Nr4   rD   rG   in_progressr6   r:   s       r   (test_phase0_done_sets_phase1_in_progressz6TestPhaseDone.test_phase0_done_sets_phase1_in_progress   sy    DhO[	

 &)..sW.E 	!IIaLE	! Xs#H->>>	! 	!   A))A2c                     t        g d|       t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   d	k(  sJ y# 1 sw Y   xY w)
u<   Phase 0 완료 후 current_phase가 1로 업데이트된다.rs   ru   rt   r.   r/   r0   Nr3      r6   r:   s       r   &test_phase0_done_updates_current_phasez4TestPhaseDone.test_phase0_done_updates_current_phase   sp    DhO[	

 &)..sW.E 	!IIaLE	! _%***	! 	!s   A##A,c                     t        g d|       t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   d	   d
   dk(  sJ y# 1 sw Y   xY w)u9   Phase 0 완료 후 output 경로가 JSON에 기록된다.rs   ru   rt   r.   r/   r0   Nr4   rC   outputry   r6   r:   s       r   $test_phase0_done_records_output_pathz2TestPhaseDone.test_phase0_done_records_output_path   sy    DhO[	

 &)..sW.E 	!IIaLE	! Xs#H-???	! 	!r   c                    t        g d|       t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       dd	   d
   v sJ |d	   d
   d   dk7  sJ y# 1 sw Y   &xY w)u@   Phase 0 완료 후 completed_at 타임스탬프가 기록된다.rs   ru   rt   r.   r/   r0   Ncompleted_atr4   rC   rl   r6   r:   s       r   %test_phase0_done_records_completed_atz3TestPhaseDone.test_phase0_done_records_completed_at   s    DhO[	

 &)..sW.E 	!IIaLE	! x!5555Xs#N3r999		! 	!s   A55A>c                     t        g d|       t        g d|      }|j                  dk7  sJ |j                  j                         dk7  sJ y)uP   Phase 0 완료 전에 Phase 1 phase-done을 실행하면 에러가 발생한다.rs   )rv   r!   rt   rw   rD   rx   z/tmp/out1.mdr   rl   Nrm   r(   s      r   &test_phase1_before_phase0_raises_errorz4TestPhaseDone.test_phase1_before_phase0_raises_error   N    DhO[

   A%%%}}""$***r   c                     t        g d|       t        g d|      }|j                  dk7  sJ |j                  j                         dk7  sJ y)uK   유효하지 않은 phase 번호(5)를 전달하면 에러가 발생한다.rs   )rv   r!   rt   rw   5rx   z/tmp/out5.mdr   rl   Nrm   r(   s      r   &test_invalid_phase_number_raises_errorz4TestPhaseDone.test_invalid_phase_number_raises_error   r   r   c                    t        g d|       t        d      D ]U  }t        ddddt        |      dd| d	g|      }|j                  d
k(  r3J d| d|j                   d|j
                           t        |d      j                  dd      5 }t        j                  |      }ddd       dD ]  }d   |   d   dk(  rJ d| d        y# 1 sw Y   *xY w)uP   Phase 0 -> 1 -> 2 -> 3 순차 완료 후 모든 Phase가 completed 상태이다.)r    r!   fullflowr#   zT-999   rv   r!   r   rw   rx   /tmp/out.mdr   rI   z failed - stdout: z	 stderr: r.   r/   r0   N)rC   rD   rE   rF   r4   rG   rz   z is not completed)
r   ranger   r%   re   r&   r   r7   r8   r9   )r)   r*   rN   r+   r;   r<   	phase_keys          r   #test_full_flow_all_phases_completedz1TestPhaseDone.test_full_flow_all_phases_completed   s   H(S1X 	E  JugS) F $$) 1&--	&--Y)	" *-2232I 	!QIIaLE	! . 	I?9-h7;F #45F		! 	!s   CCc                 "   t        g d|       t        d      D ]"  }t        ddddt        |      dd| d	g|       $ t        |d      j	                  d
d      5 }t        j                  |      }ddd       d   dk(  sJ y# 1 sw Y   xY w)uI   모든 Phase 완료 후 current_phase가 마지막 Phase 번호(3)이다.)r    r!   	fullflow2r#   zT-888r   rv   r!   r   rw   rx   r   r   r.   r/   r0   Nr3      )r   r   r   r   r7   r8   r9   )r)   r*   rN   r;   r<   s        r   'test_full_flow_current_phase_after_lastz5TestPhaseDone.test_full_flow_current_phase_after_last  s    I8T1X 	E JugS) 	 +.33C'3J 	!aIIaLE	! _%***	! 	!s   BBc                     t        g d|       t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   d	   d
   dk(  sJ y# 1 sw Y   xY w)uO   Phase 0 완료 후 phase0_review approval point가 pending_review 상태이다.rs   ru   rt   r.   r/   r0   Nr5   rS   rG   pending_reviewr6   r:   s       r   (test_approval_point_updated_after_phase0z6TestPhaseDone.test_approval_point_updated_after_phase0  s|    DhO[	

 &)..sW.E 	!IIaLE	! &'8BFVVVV	! 	!r   c                     t        g d|      }|j                  dk7  sJ |j                  j                         dk7  sJ y)uV   존재하지 않는 프로젝트에 phase-done을 실행하면 에러가 발생한다.)rv   r!   ghostrw   rC   rx   z/tmp/out.mdr   rl   Nrm   r(   s      r   ,test_phase_done_missing_project_raises_errorz:TestPhaseDone.test_phase_done_missing_project_raises_error+  sC    [

   A%%%}}""$***r   N)r\   r]   r^   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   rq   rq      s;    =?+@:	+	+:+.W+r   rq   )__doc__r8   r   r   pathlibr   pytestr   listr   CompletedProcessr   r   r   r`   rq   r   r   r   <module>r      s    0   
  -
d3i 4 J4O4O L L L LF] F]\+ +>d+ d+r   