
    i60                         d Z ddlZddlmc m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      )/home/jay/workspace/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           	      H   t        g d|      }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                         dz   d	|iz  }t        t        j                  |            d
x}x}}d}t        ||      }|j                  }	 |	       }
|
sddt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |	      t        j                  |
      dz  }t        t        j                  |            d
x}x}x}	}
y
)u8   정상 초기화 시 kickoff-state.json이 생성된다.init	--projectmyproj--taskzT-001r   ==z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sresultpy0py2py5stderr: 
>assert %(py7)spy7Nr"   zhassert %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}.exists
}()
}r   tmp_path)r)   py1py3r+   r.   py9)r   
returncode
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgstderrAssertionError_format_explanationr   exists)selfr/   r'   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert2@py_assert6@py_assert8@py_format10s               r   test_init_creates_state_filez%TestInit.test_init_creates_state_file#   s>   OQYZ  AAA A%AAA AAAAAAAvAAAvAAA AAAAAAA&--'AAAAAAAA$,6z(H-6-446466666666z666z666666(666(666H666-66646666666666r   c                 "   t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d}|v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y# 1 sw Y   DxY w)ug   생성된 JSON에 필수 키(project, task_id, current_phase, phases, approval_points)가 존재한다.r   r"   rutf-8encodingNr   inz%(py1)s in %(py3)sstater0   r1   assert %(py5)sr+   task_idcurrent_phasephasesapproval_pointsr   r   openjsonloadr4   r5   r9   r6   r7   r8   r<   r=   )r?   r/   frR   @py_assert0rE   @py_format4rC   s           r   test_init_json_schemazTestInit.test_init_json_schema*   s   FQ(+00w0G 	!1IIaLE	! !yE!!!!yE!!!y!!!!!!E!!!E!!!!!!!!yE!!!!yE!!!y!!!!!!E!!!E!!!!!!!'%''''%'''''''''%'''%''''''' x5    x5   x      5   5        ) E)))) E))) ))))))E)))E)))))))	! 	!s   NNc                    t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   }d}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)uB   project와 task_id 값이 인수로 전달한 값과 일치한다.)r    r!   alphar#   ROOT-42rb   rK   rL   rM   Nr   r$   z%(py1)s == %(py4)sr0   py4assert %(py6)spy6rU   rc   
r   r   rZ   r[   r\   r4   r5   r9   r<   r=   	r?   r/   r]   rR   r^   rB   rE   @py_format5@py_format7s	            r   $test_init_project_and_task_id_valuesz-TestInit.test_init_project_and_task_id_values7   s    GR'*//g/F 	!!IIaLE	! Y*7*7****7******7*******Y,9,9,,,,9,,,,,,9,,,,,,,		! 	!s   EEc           	         t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   }|j
                  } |       }t        |      }h d}||k(  }	|	st        j                  d	|	fd
||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j                         D ]  \  }}|d   }d}||k(  }|st        j                  d	|fd||f      t        j                  |      t        j                  |      dz  }t        j                   d| d      dz   d|iz  }t        t        j                  |            dx}x}} y# 1 sw Y   xY w)u;   초기화 직후 모든 Phase의 status가 "pending"이다.r   r"   rK   rL   rM   NrW   >   0123r$   )zb%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.keys
}()
})
} == %(py10)sset)r)   r0   r1   r+   r.   py10zassert %(py12)spy12statuspendingrd   re   Phase z status is not pending
>assert %(py6)srh   )r   r   rZ   r[   r\   keysrs   r4   r5   r6   r7   r8   r9   r<   r=   itemsr:   )r?   r/   r]   rR   rW   rE   rA   rF   @py_assert9rG   @py_format11@py_format13keyphaser^   rB   rk   rl   s                     r   test_init_all_phases_pendingz%TestInit.test_init_all_phases_pendingA   s   FQ(+00w0G 	!1IIaLE	! x;;9;=9s=!9%99!%99999!%9999999s999s99999969996999;999=999!999%99999999 ,,. 	VJC?UiU?i/UUU?iUUU?UUUiUUU6#>T1UUUUUUUU	V	! 	!s   IIc                    t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   }d}||k(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)u*   초기화 직후 current_phase가 0이다.r   r"   rK   rL   rM   NrV   r   r$   rd   re   rg   rh   ri   rj   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   CCc                    t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   }d}||v }|st        j                  d	|fd
||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d	|fd
||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d	|fd
||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}y# 1 sw Y   xY w)uU   approval_points에 phase0_review, phase2_review, phase3_approval 키가 존재한다.r   r"   rK   rL   rM   NrX   phase0_reviewrO   rQ   aprS   rT   r+   phase2_reviewphase3_approvalrY   )	r?   r/   r]   rR   r   r^   rE   r_   rC   s	            r    test_init_approval_points_schemaz)TestInit.test_init_approval_points_schemaV   sf   FQ(+00w0G 	!1IIaLE	! $%$"$$$$"$$$$$$$$$"$$$"$$$$$$$$"$$$$"$$$$$$$$$"$$$"$$$$$$$ & B&&&& B&&& &&&&&&B&&&B&&&&&&&	! 	!s   H??I	c                 F   t        g d|       t        g d|      }|j                  }d}||k7  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}g }d}|j                  }	|	j                  }
 |
       }||v }|}|s'd}|j                  }|j                  } |       }||v }|}|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      t        j                  |      dz  }dd|iz  }|j                  |       |st        j                  dfdf      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                        t        j                        t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d
x}x}x}x}x}	x}
x}x}x}x}x}}y
)uV   이미 kickoff-state.json이 존재할 때 두 번 init 하면 에러가 발생한다.r   )r    r!   r"   r#   zT-002r   !=z2%(py2)s
{%(py2)s = %(py0)s.returncode
} != %(py5)sr'   r(   assert %(py7)sr.   Nzalready existserrorrO   )zb%(py3)s in %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.stderr
}.lower
}()
})r1   r+   r.   r2   py11z%(py13)spy13)zh%(py16)s in %(py24)s
{%(py24)s = %(py22)s
{%(py22)s = %(py20)s
{%(py20)s = %(py18)s.stderr
}.lower
}()
})py16py18py20py22py24z%(py26)spy26   zassert %(py29)spy29)r   r3   r4   r5   r6   r7   r8   r9   r<   r=   r;   lowerappend_format_boolop)r?   r/   r'   r@   rA   rB   rC   rD   rE   rF   rG   @py_assert10r^   @py_assert15@py_assert19@py_assert21@py_assert23@py_assert17@py_format12@py_format14@py_format25@py_format27@py_format28@py_format30s                           r    test_init_duplicate_raises_errorz)TestInit.test_init_duplicate_raises_errorb   s   FQOQYZ  %A% A%%%% A%%%%%%v%%%v%%% %%%A%%%%%%%\\6==\=#6#6\#6#8\#88\G\v}}\}GZGZ\GZG\\GG\<\\\\\#8\\\\\\\\\6\\\6\\\=\\\#6\\\#8\\\\\\\GG\\\\G\\\\\\v\\\v\\\}\\\GZ\\\G\\\\\\\\\\\\\\\\r   N)
__name__
__module____qualname__rI   r`   rm   r   r   r   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(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                         d	z   d
|iz  }t        t        j                  |            dx}x}}d}|j                  }||v }	|	st        j                  d|	fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd
|iz  }t        t        j                  |            dx}x}	}y)u1   status 출력에 프로젝트명이 포함된다.r    r!   betaprojr#   zT-010rv   r!   r   r   r$   r&   r'   r(   r,   r-   r.   Nr   rO   )z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.stdout
})r0   r1   r+   r   )r   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   stdout)
r?   r/   r'   r@   rA   rB   rC   rD   r^   rE   s
             r   (test_status_output_contains_project_namez3TestStatus.test_status_output_contains_project_nameq   s   H(S@(K  AAA A%AAA AAAAAAAvAAAvAAA AAAAAAA&--'AAAAAAAA*V]]*z]****z]***z******V***V***]*******r   c                    t        g d|       t        g d|      }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}g }d}|j                  }	||	v }|}
|s'd}|j                  }|j                  } |       }||v }|}
|
st        j                  d|fd||	f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }dd|iz  }|j                  |       |st        j                  dfdf      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                        t        j                        t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d
x}
x}x}x}x}	x}x}x}x}}y
)u.   status 출력에 Phase 정보가 포함된다.r   r   r   r$   r&   r'   r(   r   r.   NPhaser   rO   )z.%(py3)s in %(py7)s
{%(py7)s = %(py5)s.stdout
})r1   r+   r.   z%(py9)sr2   )zh%(py12)s in %(py20)s
{%(py20)s = %(py18)s
{%(py18)s = %(py16)s
{%(py16)s = %(py14)s.stdout
}.lower
}()
})ru   py14r   r   r   z%(py22)sr   r   zassert %(py25)spy25)r   r3   r4   r5   r6   r7   r8   r9   r<   r=   r   r   r   r   )r?   r/   r'   r@   rA   rB   rC   rD   rE   rF   r^   @py_assert11r   r   r   @py_assert13rH   @py_format21@py_format23@py_format24@py_format26s                        r   &test_status_output_contains_phase_infoz1TestStatus.test_status_output_contains_phase_infoy   s   H(S@(K  %A% A%%%% A%%%%%%v%%%v%%% %%%A%%%%%%%KwK&--Kw-'K7KfmmKm6I6IK6I6KK76K+KKKKKw-KKKwKKKKKK&KKK&KKK-KKKKKKK76KKKK7KKKKKKfKKKfKKKmKKK6IKKK6KKKKKKKKKKKKKKKKr   c                    t        g d|      }|j                  }d}||k7  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}|j                  }|j                  } |       }d
}	||	k7  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d	x}x}x}x}
}	y	)uR   존재하지 않는 프로젝트를 status로 조회하면 에러가 발생한다.)rv   r!   nonexistentr   r   r   r'   r(   r   r.   N z`%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.stderr
}.strip
}()
} != %(py9)sr)   r*   rf   rh   r2   assert %(py11)sr   r   r3   r4   r5   r6   r7   r8   r9   r<   r=   r;   stripr?   r/   r'   r@   rA   rB   rC   rD   @py_assert5rG   @py_assert7rH   r   s                r   )test_status_missing_project_returns_errorz4TestStatus.test_status_missing_project_returns_error   s   CXN  %A% A%%%% A%%%%%%v%%%v%%% %%%A%%%%%%%}}*}""*"$**$****$******v***v***}***"***$***********r   N)r   r   r   r   r   r   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                    t        g d|       t        g d|      }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                         d	z   d
|iz  }t        t        j                  |            dx}x}}t        |d      j                  dd      5 }t        j                  |      }	ddd       	d   d   d   }
d}|
|k(  }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}y# 1 sw Y   xY w)u>   Phase 0 완료 후 phases["0"]["status"]가 "completed"이다.r    r!   projr#   zT-100
phase-doner!   r   --phasero   --output/tmp/out0.mdr   r$   r&   r'   r(   r,   r-   r.   Nr   rK   rL   rM   rW   ro   rv   	completedrd   re   rg   rh   )r   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r   rZ   r[   r\   )r?   r/   r'   r@   rA   rB   rC   rD   r]   rR   r^   rE   rk   rl   s                 r   test_phase0_done_sets_completedz-TestPhaseDone.test_phase0_done_sets_completed   sB   DhO[

   AAA A%AAA AAAAAAAvAAAvAAA AAAAAAA&--'AAAAAAAA&)..sW.E 	!IIaLE	! Xs#H-<<-<<<<-<<<-<<<<<<<<<<	! 	!s   %G

Gc                    t        g d|       t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   d	   d
   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)u@   Phase 0 완료 후 phases["1"]["status"]가 "in_progress"이다.r   r   r   rK   rL   rM   NrW   rp   rv   in_progressr$   rd   re   rg   rh   ri   rj   s	            r   (test_phase0_done_sets_phase1_in_progressz6TestPhaseDone.test_phase0_done_sets_phase1_in_progress   s    DhO[	

 &)..sW.E 	!IIaLE	! Xs#H->>->>>>->>>->>>>>>>>>>	! 	!   CC(c                    t        g d|       t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   }d	}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)u<   Phase 0 완료 후 current_phase가 1로 업데이트된다.r   r   r   rK   rL   rM   NrV   r   r$   rd   re   rg   rh   ri   rj   s	            r   &test_phase0_done_updates_current_phasez4TestPhaseDone.test_phase0_done_updates_current_phase   s    DhO[	

 &)..sW.E 	!IIaLE	! _%**%****%***%**********	! 	!s   CC"c                    t        g d|       t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   d	   d
   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)u9   Phase 0 완료 후 output 경로가 JSON에 기록된다.r   r   r   rK   rL   rM   NrW   ro   outputr   r$   rd   re   rg   rh   ri   rj   s	            r   $test_phase0_done_records_output_pathz2TestPhaseDone.test_phase0_done_records_output_path   s    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 }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d	   d
   d   }d}||k7  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)u@   Phase 0 완료 후 completed_at 타임스탬프가 기록된다.r   r   r   rK   rL   rM   Ncompleted_atrW   ro   rO   )z%(py1)s in %(py4)sre   rg   rh   r   r   )z%(py1)s != %(py4)sri   rj   s	            r   %test_phase0_done_records_completed_atz3TestPhaseDone.test_phase0_done_records_completed_at   s   DhO[	

 &)..sW.E 	!IIaLE	! 5x!55~!55555~!5555~555!55555555Xs#N39r93r99993r9993999r9999999		! 	!s   E!!E+c                    t        g d|       t        g d|      }|j                  }d}||k7  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}|j                  }|j                  } |       }d}	||	k7  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d
x}x}x}x}
}	y
)uP   Phase 0 완료 전에 Phase 1 phase-done을 실행하면 에러가 발생한다.r   )r   r!   r   r   rp   r   z/tmp/out1.mdr   r   r   r'   r(   r   r.   Nr   r   r   r   r   r   r   s                r   &test_phase1_before_phase0_raises_errorz4TestPhaseDone.test_phase1_before_phase0_raises_error   /   DhO[

   %A% A%%%% A%%%%%%v%%%v%%% %%%A%%%%%%%}}*}""*"$**$****$******v***v***}***"***$***********r   c                    t        g d|       t        g d|      }|j                  }d}||k7  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}|j                  }|j                  } |       }d}	||	k7  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d
x}x}x}x}
}	y
)uK   유효하지 않은 phase 번호(5)를 전달하면 에러가 발생한다.r   )r   r!   r   r   5r   z/tmp/out5.mdr   r   r   r'   r(   r   r.   Nr   r   r   r   r   r   r   s                r   &test_invalid_phase_number_raises_errorz4TestPhaseDone.test_invalid_phase_number_raises_error   r   r   c                 V   t        g d|       t        d      D ]  }t        ddddt        |      dd| d	g|      }|j                  }d
}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }t	        j                  d| d|j                   d|j                         dz   d|iz  }t        t	        j                  |            dx}x}}! t        |d      j!                  dd      5 }	t#        j$                  |	      }
ddd       dD ]  }
d   |   d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d| d      dz   d |iz  }t        t	        j                  |            dx}x}} y# 1 sw Y   xY w)!uP   Phase 0 -> 1 -> 2 -> 3 순차 완료 후 모든 Phase가 completed 상태이다.)r    r!   fullflowr#   zT-999   r   r!   r   r   r   /tmp/out.mdr   r$   r&   r'   r(   rx   z failed - stdout: z	 stderr: r-   r.   NrK   rL   rM   )ro   rp   rq   rr   rW   rv   r   rd   re   z is not completedry   rh   )r   ranger   r3   r4   r5   r6   r7   r8   r9   r:   r   r;   r<   r=   r   rZ   r[   r\   )r?   r/   r   r'   r@   rA   rB   rC   rD   r]   rR   	phase_keyr^   rE   rk   rl   s                   r   #test_full_flow_all_phases_completedz1TestPhaseDone.test_full_flow_all_phases_completed   s(   H(S1X 	E  JugS) F $$  $)  $  v     I   I %  I )*    1&--	&--Y     	" *-2232I 	!QIIaLE	! . 	I?9-h7 ; 7;F  7;  I 8  I <G    #45     		! 	!s   HH(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(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y# 1 sw Y   xY w)uI   모든 Phase 완료 후 current_phase가 마지막 Phase 번호(3)이다.)r    r!   	fullflow2r#   zT-888r   r   r!   r   r   r   r   r   rK   rL   rM   NrV      r$   rd   re   rg   rh   )r   r   r   r   rZ   r[   r\   r4   r5   r9   r<   r=   )
r?   r/   r   r]   rR   r^   rB   rE   rk   rl   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   C;;Dc                    t        g d|       t        g d|       t        |d      j                  dd      5 }t        j                  |      }ddd       d   d	   d
   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)uO   Phase 0 완료 후 phase0_review approval point가 pending_review 상태이다.r   r   r   rK   rL   rM   NrX   r   rv   pending_reviewr$   rd   re   rg   rh   ri   rj   s	            r   (test_approval_point_updated_after_phase0z6TestPhaseDone.test_approval_point_updated_after_phase0  s    DhO[	

 &)..sW.E 	!IIaLE	! &'8BVFVVBFVVVVVBFVVVVBVVVFVVVVVVVV	! 	!r   c                    t        g d|      }|j                  }d}||k7  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}|j                  }|j                  } |       }d
}	||	k7  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d	x}x}x}x}
}	y	)uV   존재하지 않는 프로젝트에 phase-done을 실행하면 에러가 발생한다.)r   r!   ghostr   ro   r   z/tmp/out.mdr   r   r   r'   r(   r   r.   Nr   r   r   r   r   r   r   s                r   ,test_phase_done_missing_project_raises_errorz:TestPhaseDone.test_phase_done_missing_project_raises_error+  s$   [

   %A% A%%%% A%%%%%%v%%%v%%% %%%A%%%%%%%}}*}""*"$**$****$******v***v***}***"***$***********r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s;    =?+@:	+	+:+.W+r   r   )__doc__builtinsr6   _pytest.assertion.rewrite	assertionrewriter4   r[   r   r   pathlibr   pytestr   listr   CompletedProcessr   r   r   r   r   r   r   r   <module>r     s    0     
  -
d3i 4 J4O4O L L L LF] F]\+ +>d+ d+r   