
    i2                     d   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
Z
ddlZddlmZ ddlmZ ddlmZmZ ddlZdedej&                  fdZ ej*                         d	        Z ej*                         d
        Z	 	 	 	 ddededededededefdZ G d d      Z G d d      Z G d d      Zy)u  
test_phase4_integration.py

fireauto Phase 4 통합 테스트 — F12 completion-promise + 기존 시스템 회귀 검증

테스트 시나리오:
1. chain_manager retry → dispatch → retry → dispatch → circuit breaker 전체 흐름
2. escalation 파일 + audit-trail 기록 동시 검증
3. 기존 chain_manager 기능 회귀 없음
4. 주요 스크립트 존재 확인 (smoke test)
    N)datetime)Path)	MagicMockpatchtmp_pathreturnc                    t        t        j                  j                  dd            }t	        |      t
        j                  vr)t
        j                  j                  dt	        |             t        t
        j                  j                               D ]  }|dk(  s	t
        j                  |=  t        j                  j                  dd       ddl}| |_        | dz  d	z  |_        |j                  j                  d
d
       |S )uK   chain_manager 모듈을 tmp_path를 WORKSPACE로 설정하여 로드한다.WORKSPACE_ROOTz/home/jay/workspacer   chain_managerCOKACDIR_KEY_ANUztest-dummy-keyNmemorychainsTparentsexist_ok)r   osenvirongetstrsyspathinsertlistmoduleskeys
setdefaultr   	WORKSPACE
CHAINS_DIRmkdir)r   	workspacemod_namecms       @/home/jay/workspace/tests/integration/test_phase4_integration.py_load_chain_managerr$      s    RZZ^^$46KLMI
9~SXX%3y>* ))+, &&H%& JJ,.>?BLx'(2BMMMt4I    c                     t        |       S )uI   격리된 WORKSPACE를 사용하는 chain_manager 모듈을 반환한다.)r$   )r   s    r#   r"   r"   8   s     x((r%   c                 <    | dz  dz  }|j                  dd       |S )u"   체인 파일 저장 디렉토리.r   r   Tr   )r   )r   ds     r#   
chains_dirr)   >   s(     	8h&AGGD4G(Hr%   r)   task_idretry_countreport_contentchain_idc           
         dddd|dt        j                         j                         d|d	dd	dd
dddddg}|dt        j                         j                         dddd|d}| | dz  }|j                  t	        j
                  |dd      d       |dz  dz  }	|	j                  dd       |	| dz  j                  |d       |S )u<   E2E 테스트용 체인과 보고서를 생성하는 헬퍼.   zmemory/tasks/task-e2e-1.md	dev2-teamrunningautoN)	order	task_fileteamstatusr*   gate
started_atcompleted_atr+      zmemory/tasks/task-e2e-2.mdpending
task-e2e.2)r3   r4   r5   r6   r*   r7   r8   r9   anuactiveu   E2E retry 테스트
   zcron-e2e)r-   
created_by
created_atr6   scope	max_taskswatchdog_cron_idtasks.jsonF)ensure_asciiindentutf-8encodingr   reportsTr   .md)r   now	isoformat
write_textjsondumpsr   )
r)   r   r*   r+   r,   r-   rE   datar   reports_dirs
             r#   _create_retry_chainrU   K   s     5",,.224 &
	
 5# 		
E0 lln..0&&	D 8*E**DOODJJt%BWOUX%	1KdT2gYc?"..~.PKr%   c                       e Zd ZdZd Zd Zy)TestE2ERetryFlowu%   F12 retry 전체 흐름 E2E 테스트c                 F   d}dt        ||d|       |j                  t        j                               t	        j
                  |j                         j                        }|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}	}|| dz  }t	        j
                  |j                  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}	}t        f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z  dz   dz  j                  dd       |j                  t        j                               t	        j
                  |j                         j                        }|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}	}t	        j
                  |j                  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}	}t        f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z  dz   dz  j                  dd       |j                  t        j                               t	        j
                  |j                         j                        }|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!   }||v }	|	slt        j                  d"|	fd#||f      t        j                  |      t        j                  |      d
z  }
dd|
iz  }t        t        j                  |            dx}x}	}t	        j
                  |j                  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z  d$z   d%z  }|j                   } |       }|sd&d't#        j$                         v st        j&                  |      rt        j                  |      nd't        j                  |      t        j                  |      d(z  }
t        t        j                  |
            dx}}y))u;   retry 0→1→2→circuit breaker 전체 3회 시나리오.zchain-e2e-fullztask-e2e-full.1r   r*   r+   r-   r*   actiondispatch==z%(py1)s == %(py4)spy1py4assert %(py6)spy6Nretry_attemptr/   rF   rI   rJ   r6   r>   c              3   L   K   | ]  }|j                  d       k(  s|  ywr*   Nr   .0tr*   s     r#   	<genexpr>zBTestE2ERetryFlow.test_e2e_retry_flow_full_cycle.<locals>.<genexpr>   !     KquuY/?7/J!K   $$rE   r+   r   rL   rM   u   QC FAIL: 타입 에러.r:   c              3   L   K   | ]  }|j                  d       k(  s|  ywrg   rh   ri   s     r#   rl   zBTestE2ERetryFlow.test_e2e_retry_flow_full_cycle.<locals>.<genexpr>   rm   rn   u   QC FAIL: 여전히 실패.stalledcircuit_breakerreason)in)z%(py1)s in %(py4)sescalationsz_escalation.jsonzAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}escalation_filepy0py2rb   )rU   cmd_nextargparse	NamespacerQ   loads
readouterrout
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanation	read_textnextrP   exists@py_builtinslocals_should_repr_global_name)selfr"   r   r)   capsysr-   output1@py_assert0@py_assert3@py_assert2@py_format5@py_format7
chain_filedata1t1output2data2t2output3data3ru   @py_assert1r*   s                         @r#   test_e2e_retry_flow_full_cyclez/TestE2ERetryFlow.test_e2e_retry_flow_full_cycle   s   ## 			
 	H&&w78**V..0445x .J. J.... J... ...J.......',1,'1,,,,'1,,,',,,1,,,,,,,  XJe"44


:///ABX*(*(****(******(*******KU7^KK- %A% A%%%% A%%% %%%A%%%%%%% 
H	y	(gYc?	:FF% 	G 	
 	H&&w78**V..0445x .J. J.... J... ...J.......',1,'1,,,,'1,,,',,,1,,,,,,,

:///ABX*(*(****(******(*******KU7^KK- %A% A%%%% A%%% %%%A%%%%%%% 
H	y	(gYc?	:FF(7 	G 	
 	H&&w78**V..0445x -I- I---- I--- ---I------- 5GH$55 $55555 $5555 555$55555555 

:///ABX+)+)++++)++++++)+++++++ #X-=7)K[@\\%%'%''''''''''''''%''''''''''r%   c                 	   d}dt        ||d|       |j                  t        j                               t	        j
                  |j                         j                        }|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}	}|| dz  }t	        j
                  |j                  d            }t        f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z  dz   dz  j                  dd       |j                  t        j                               t	        j
                  |j                         j                        }|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}	}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}}	t	        j
                  |j                  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)$u7   retry 1회 후 QC PASS → 다음 task 정상 dispatch.zchain-e2e-successztask-e2e-success.1r   rY   rZ   r[   r\   r]   r_   r`   rc   rd   Nre   r/   rF   rI   rJ   c              3   L   K   | ]  }|j                  d       k(  s|  ywrg   rh   ri   s     r#   rl   z?TestE2ERetryFlow.test_e2e_retry_then_success.<locals>.<genexpr>   s!     IqQUU9-=-HIrn   rE   r+   r   rL   rM   u'   작업 완료. 모든 테스트 통과.r*   r<   )not in)z%(py1)s not in %(py3)sout_success)ra   py3zassert %(py5)spy5r6   r>   )rU   ry   rz   r{   rQ   r|   r}   r~   r   r   r   r   r   r   r   rP   r   r   r   )r   r"   r   r)   r   r-   	out_retryr   r   r   r   r   r   rS   rk   r   @py_format4@py_format6
final_datar*   s                      @r#   test_e2e_retry_then_successz,TestE2ERetryFlow.test_e2e_retry_then_success   sg   && 			
 	H&&w78JJv002667	"0j0"j0000"j000"000j0000000).Q.)Q....)Q...)...Q.......  XJe"44
zz*...@AIDMII$1$1$$$$1$$$$$$1$$$$$$$ 
H	y	(gYc?	:FF5 	G 	
 	H&&w78jj!2!2!4!8!898$2
2$
2222$
222$222
22222229%55%5555%555%55555555551k1111k111111111k111k1111111 ZZ
 4 4g 4 FG
(#/x/#x////#x///#///x///////r%   N)__name__
__module____qualname____doc__r   r    r%   r#   rW   rW      s    /6(p#0r%   rW   c                       e Zd ZdZd Zy)TestScriptsExistSmokeu,   주요 스크립트 파일 존재 smoke testc           
      V   t        d      t        d      t        d      t        d      t        d      t        d      t        d      t        d      d	}g }|j                         D ]-  \  }}|j                         r|j                  | d
| d       / | }|st	        j
                  ddj                  |             dz   ddt        j                         v st	        j                  |      rt	        j                  |      ndiz  }t        t	        j                  |            d}y)u)   주요 스크립트 파일 존재 확인.z/home/jay/workspace/dispatch.pyz$/home/jay/workspace/chain_manager.pyz0/home/jay/workspace/scripts/notify-completion.pyz*/home/jay/workspace/scripts/finish-task.shz(/home/jay/workspace/memory/task-timer.pyz-/home/jay/workspace/teams/shared/qc_verify.pyz./home/jay/workspace/scripts/whisper-compile.pyz,/home/jay/workspace/scripts/memory-search.py)zdispatch.pyzchain_manager.pyznotify-completion.pyzfinish-task.shztask-timer.pyzqc_verify.pyzwhisper-compile.pyzmemory-search.pyz ()u   누락된 스크립트: z, z
>assert not %(py0)srw   missingN)r   itemsr   appendr   _format_assertmsgjoinr   r   r   r   r   r   )r   scriptsr   namer   r   @py_format2s          r#   test_scripts_exist_smokez.TestScriptsExistSmoke.test_scripts_exist_smoke   s       AB $%K L$()[$\"#OP!"LM !PQ"&'W"X $%S T	
 !--/ 	3JD$;;=$r$q12	3 {K{KK6tyy7I6JKKKKKKK7KKK7KKKKKKr%   N)r   r   r   r   r   r   r%   r#   r   r      s    6Lr%   r   c                       e Zd ZdZd Zy)TestChainManagerNoRegressionu0   기존 chain_manager 기능 회귀 없음 확인c                    ddddddddd	dd
dg}t        j                  dt        j                  |      ddd      }t	        j
                  |d      5 }t               }d|_        d|_        ||j                  _
        |j                  |       ddd       |dz  }	|	j                  }
 |
       }|st        j                  d      dz   dt        j                          v st        j"                  |	      rt        j$                  |	      ndt        j$                  |
      t        j$                  |      dz  }t'        t        j(                  |            dx}
}t        j*                  |	j-                  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}}|d#   }
t1        |
      }d}||k(  }|st        j.                  d|fd$||f      d%t        j                          v st        j"                  t0              rt        j$                  t0              nd%t        j$                  |
      t        j$                  |      t        j$                  |      d&z  }d'd(|iz  }t'        t        j(                  |            dx}
x}x}}|j3                          t        j                  dd)*      }|j5                  |       t        j*                  |	j-                  d            }t7        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}||u}|slt        j.                  d-|fd.||f      t        j$                  |      t        j$                  |      dz  }dd |iz  }t'        t        j(                  |            dx}x}}|j3                          t        j                  d/      }|j9                  |       |j3                         }t        j*                  |j:                        }|d0   }d1}||u }|slt        j.                  d2|fd3||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}}|d4   }d5}||u }|slt        j.                  d2|fd3||f      t        j$                  |      t        j$                  |      dz  }dd |iz  }t'        t        j(                  |            dx}x}}|d6   }d
}||k(  }|slt        j.                  d|fd||f      t        j$                  |      t        j$                  |      dz  }dd |iz  }t'        t        j(                  |            dx}x}}|d7z  d8z  }|j=                  d1d19       |d:z  j?                  d;d       t        j                  d/      }|jA                  |       |j3                         }t        j*                  |j:                        }|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}}|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}}t        j*                  |	j-                  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>   기존 cmd_create, cmd_update, cmd_check 정상 동작 확인.r/   zmemory/tasks/regress-1.mdz	dev1-teamr2   task-regress.1)r3   r4   r5   r7   r*   r:   zmemory/tasks/regress-2.mdr0   ztask-regress.2zregression-chainu   회귀 테스트r=   r?   )r-   rE   rB   r@   rC   
subprocessr   z{"cron_id": "cron-regress"}Nzchain-regression-chain.jsonu$   체인 파일이 생성되어야 함zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   rv   rI   rJ   r-   r]   r_   r`   rc   rd   r6   r>   rE   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slen)rw   rx   rb   py7zassert %(py9)spy9r1   )r*   r6   c              3   J   K   | ]  }|j                  d       dk(  s|  yw)r*   r   Nrh   )rj   rk   s     r#   rl   zPTestChainManagerNoRegression.test_chain_manager_no_regression.<locals>.<genexpr>9  s!     [aeeI6FJZ6Z![s   ##r8   )is not)z%(py1)s is not %(py4)srZ   in_chainT)is)z%(py1)s is %(py4)sis_lastFnext_task_idr   rL   r   ztask-regress.1.mdu   작업 완료. 성공.r[   r\   r*   r5   )!rz   r{   rQ   rR   r   objectr   
returncodestdoutrunreturn_value
cmd_creater   r   r   r   r   r   r   r   r   r|   r   r   r   r}   
cmd_updater   	cmd_checkr~   r   rP   ry   )r   r"   r   r)   r   rE   args_createmock_submock_resultr   r   r   r   rS   r   r   r   @py_assert6@py_assert5@py_format8@py_format10args_updateupdated_datar   
args_checkcapturedcheck_outputrT   	args_nextnext_outputr   s                                  r#    test_chain_manager_no_regressionz=TestChainManagerNoRegression.test_chain_manager_no_regression  s   
 8#+ 8#+
  (('**U#$
 \\"l+ 	'x#+K%&K"!>K(3HLL%MM+&	'  "??
  J "J"JJ$JJJJJJJzJJJzJJJ JJJ"JJJJJJzz*...@AJ5#55#55555#5555555#55555555H~))~))))~)))~))))))))))=&s=!&Q&!Q&&&&!Q&&&&&&s&&&s&&&=&&&!&&&Q&&&&&&& ((1A)T
k"zz*"6"6"6"HI[\'2[[(|(y(|y((((|y(((|(((y(((((((,+t+t++++t++++++t+++++++ ''0@A

Z $$&zz(,,/J'/4/'4////'4///'///4///////J'=+=='+====='+===='===+========I&/%/&%////&%///&///%///////N+?/??+/?????+/????+???/???????? )I5$6	*	*667OZa6b&&/?@	
I$$&jj.8$2
2$
2222$
222$222
22222229%9)99%)99999%)9999%999)999999996"1k1"k1111"k111"111k1111111 ZZ
 4 4g 4 FG
(#/x/#x////#x///#///x///////c	' 	's   ;g))g3N)r   r   r   r   r   r   r%   r#   r   r     s    :L0r%   r   )z
task-e2e.1r   u   QC FAIL: 오류.zchain-e2e-test)r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   rz   rQ   r   r   typesr   pathlibr   unittest.mockr   r   pytest
ModuleTyper$   fixturer"   r)   r   intrU   rW   r   r   r   r%   r#   <module>r      s   
    	 
    * $ 5+;+; 4 ) )
    ,$111 1 	1
 1 1 
1t^0 ^0LL L:O0 O0r%   