
    i!                    ~   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m	Z	 ddl
Z
 ed      Zedz  dz  Zedz  d	z  Ze
j                  d d
       Zd!dZd Ze
j$                  j'                  dddgfddgfddgfg      d        Zd Zd Zd Zd Zd Ze
j$                  j'                  dddg      d        Zd Zd Zy)"u   
test_phase_gamma_e2e_gate.py — task-2385 Phase γ 머지 전 자동 E2E 회귀 차단 게이트 회귀 테스트

8 회귀 + finish-task.sh hook smoke.
    )annotationsN)Path)mockz/home/jay/workspacescriptsauto_e2e_gate.pyzfinish-task.shc           
        | dz  }|j                          t        j                  dddddt        |      gd       t        j                  dd	t        |      d
ddgd       t        j                  dd	t        |      d
ddgd       |dz  j	                  d       t        j                  dd	t        |      ddgd       t        j                  dd	t        |      ddddgd       |S )uX   InsuRo 이름의 가짜 git repo 생성. main..HEAD diff 시뮬을 위한 helper 포함.InsuRogitinit-q-bmainTcheck-Cconfigz
user.emailztest@test.comz	user.nametestz	README.mdadd.commit-m)mkdir
subprocessrunstr
write_text)tmp_pathprojs     'tests/dev2/test_phase_gamma_e2e_gate.pygit_projectr       s     hDJJLNNE64vs4yANNN	c$i<IQU NN	c$i;?t 
K##F+NNE4TE37tDNN	c$i4v>d K    c           	     ^   t        j                  ddt        |       ddddgd       |D ]5  }| |z  }|j                  j	                  dd	       |j                  d
       7 t        j                  ddt        |       ddgd       t        j                  ddt        |       dddd
gd       y)u]   주어진 파일들을 생성하고 별도 브랜치에서 커밋 → main..HEAD diff 발생.r
   r   checkoutr   r   featureTr   )parentsexist_okchanger   r   r   r   N)r   r   r   parentr   r   )r   filesrelfs       r   _commit_changesr,   )   s    NN	c$iT4C4  3J	td3	X NNE4TE37tDNN	c$i4x@r!   c                    ddl } | j                  j                  dt              }||j                  J dt                | j                  j                  |      }|t        j                  d<   |j                  j                  |       |S )uS   auto_e2e_gate 모듈 동적 import (스크립트 형식이므로 importlib 사용).r   Nauto_e2e_gateu   spec 로드 실패: )	importlib.utilutilspec_from_file_locationSCRIPTloadermodule_from_specsysmodulesexec_module)	importlibspecmods      r   _import_gater;   8   sw    >>11/6JD 7X;OPVx9XX7
..
)
)$
/C#&CKK KKC Jr!   zchange_dir,expect_filesserverserver/api.pysrczsrc/components/Foo.tsx	extensionzextension/manifest.jsonc                    t        | |       t               }|j                  |       }t        fd|D              sJ  d|        y )Nc              3  F   K   | ]  }|j                  d z           yw)/N)
startswith).0r+   
change_dirs     r   	<genexpr>z6test_detect_changes_in_watched_dirs.<locals>.<genexpr>M   s     ?!q||J,-?s   !u    변경 매칭 실패: )r,   r;   detect_insuro_changesany)r    rE   expect_filesgatematcheds    `   r   #test_detect_changes_in_watched_dirsrL   D   sP     K.>D((5G?w?? 8,-gY78?r!   c                r    t        | dg       t               }|j                  |       }|g k(  s
J d|        y )Nzmemory/reports/foo.mdu%   docs only — 0 매칭이어야 함: )r,   r;   rG   )r    rJ   rK   s      r   test_skip_on_docs_only_changerN   R   s@    K"9!:;>D((5Gb=KA'KK=r!   c                P   |dz  }t        j                  t        j                  t	        t
              dddt	        |       dt	        |      gddd      }|j                  d	k(  sJ d
|j                          t        j                  |dz  j                               }|d   dk(  sJ y )Noutz	--task-idztask-fake-skipz--project-pathz--output-dirT   )capture_outputtexttimeoutr   zstderr=zresult.jsonstatusskip)r   r   r5   
executabler   r2   
returncodestderrjsonloads	read_text)r    r   out_dirrcresults        r   test_main_skip_when_no_changesr`   Z   s    G		V	&	3{+	W	' $
B ==A444ZZ=0;;=>F(v%%%r!   c           
        t        | dg       t               }ddddddddd	dgigi}t        j                  j	                  |d
      5 }t        j                  j	                  |j
                  d      5 }t        j                  j	                  |j                  dd      5  d|j                  _        t        j                  dt        j                  |      d      |_        |dz  }|j                          |j                  | t        d      |dd      \  }}||j                  k(  sJ |d   dk(  sJ 	 d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr=   suitesspecss1T
01.spec.ts)titleokfiles2z
02.spec.tsshutilr   existsreturn_value/usr/bin/npxr    rX   stdoutrY   rP   1/home/jay/workspace/tests/auto_e2e_gate/scenariosztask-fake-pass<   )timeout_secrU   pass)r,   r;   r   patchobjectr   r   whichrm   MockrZ   dumpsr   run_playwright	EXIT_PASS	r    r   rJ   fake_reportm_shutilm_runr]   r^   payloads	            r   %test_gate_pass_with_mocked_playwrightr   i   sm   K/!23>DwdL9dL9)   	K
 
		4	* +h			4??E	2+6;			499hT		B+ '5#!YYK!8
 U"))DE * 
G T^^###x F***%+ + + + + + + + +s=   	+E'4-E!BE6E>E'EEE$	 E''E0c           
        t               }ddddddddd	iigigd
gigi}t        j                  j                  |d      5 }t        j                  j                  |j                  d      5 }t        j                  j                  |j
                  dd      5  d|j                  _        t        j                  dt        j                  |      d      |_        |dz  }|j                          |j                  | t        d      |dd      \  }}||j                  k(  sJ |d   dk(  sJ t        |d         dk\  sJ 	 d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nrb   rc   u   main흰화면Fre   resultserrormessagezinnerText too shortrf   rg   rh   testsrj   r   rk   Trl   rn      ro   rp   rP   rr   ztask-fake-failrs   rU   failfailures)r;   r   rv   rw   r   r   rx   rm   ry   rZ   rz   r   r{   	EXIT_FAILlenr}   s	            r   -test_gate_fail_with_mocked_playwright_failurer      s   >Dw!96K*L MNOP	R)   	K 
		4	* -h			4??E	2-6;			499hT		B- '5#!YYK!8
 U"))DE%r
G
 T^^###x F***7:&'1,,,!- - - - - - - - -s=    +E0+-E$B&E?E$E0E!E$$E-	)E00E9c           
        t               }t        j                  j                  |d      5 }t        j                  j                  |j                  d      5 }t        j                  j                  |j
                  dd      5  d|j                  _        t	        j                  dd	      |_	        |d
z  }|j                          |j                  | t        d      |dd      \  }}||j                  k(  sJ |d   dk(  sJ |d   dk(  sJ 	 d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nrj   r   rk   Trl   rn   npxr   )cmdrT   rP   rr   ztask-fake-timeoutrU   
infra_failreasonrT   )r;   r   rv   rw   r   r   rx   rm   TimeoutExpiredside_effectr   r{   EXIT_INFRA_FAIL)r    r   rJ   r   r   r]   r^   r   s           r   $test_gate_timeout_returns_infra_failr      s0   >D			4	* .h			4??E	2.6;			499hT		B. '5#&55%KU"))DE(!
G
 T)))))x L000x I---. . . . . . . . .s<   +D>-D2B	D&D2D>&D/+D22D;	7D>>Ezscenario_name,error_msg)z#task-2378-info-keyword-white-screenzMinified React error #31)z&task-2346-composite-design-no-responsez>TypeError: undefined is not an object (compositeDesign.result)c           
        t               }dd|d| ddddiigigdgigi}t        j                  j                  |d	      5 }t        j                  j                  |j                  d
      5 }t        j                  j                  |j
                  dd      5  d|j                  _        t        j                  dt        j                  |      d      |_        |dz  }|j                          |j                  | t        d      ||d      \  }	}
|	|j                  k(  sJ d       t        fd|
d   D              sJ 	 d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nrb   rc   Fz.spec.tsr   r   r   r   rj   r   rk   Trl   rn   r   ro   rp   rP   rr   rs   u   회귀 차단 실패c              3  L   K   | ]  }|j                  d       xs dv   yw)r   ro   N)get)rD   r+   	error_msgs     r   rF   z5test_gate_blocks_known_regressions.<locals>.<genexpr>   s#     T19w!526Ts   !$r   )r;   r   rv   rw   r   r   rx   rm   ry   rZ   rz   r   r{   r   rH   )r    r   scenario_namer   rJ   r~   r   r   r]   r^   r   s      `       r   "test_gate_blocks_known_regressionsr      s   
 >Dwux6P9i*@ ABCD	F)   	K 
		4	* Uh			4??E	2U6;			499hT		BU '5#!YYK!8
 U"))DE]B
G
 T^^#;%;;#T
@STTTTU U U U U U U U Us=   +E5/-E)B'EE)E5E&"E))E2	.E55E>c                 j    t         j                  d      } d| v sJ d       d| v sJ d| v sJ d| v sJ y )Nzutf-8)encodingu   1.7. Phase γ Auto E2E Gateu    finish-task.sh에 hook 미삽입r   z.e2e-gate-donez.e2e-gate-failed)FINISHr\   )contents    r   %test_finish_task_sh_has_e2e_gate_hookr      sS    0G(G3W5WW3(((w&&&(((r!   c                     t        j                  ddt        t              gdd      } | j                  dk(  sJ d| j
                          y )Nbashz-nT)rR   rS   r   zbash syntax: )r   r   r   r   rX   rY   )r^   s    r   test_finish_task_sh_syntax_okr      sA    	s6{3Dt	TB==A:ryyk::r!   )r   r   returnr   )r   r   r)   z	list[str]r   None)__doc__
__future__r   rZ   r   r5   pathlibr   unittestr   pytest	WORKSPACEr2   r   fixturer    r,   r;   markparametrizerL   rN   r`   r   r   r   r   r   r    r!   r   <module>r      s  
 #   
   &'		Y	!3	3	Y	!1	1  ( 2 !
%&',-.5 
8
8L&+>-4.( 2Gp5 U	U2);r!   