
    
i(                       d Z ddlm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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j0                  j3                  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j0                  j3                  dddg      d        Z d Z!d Z"d&d Z#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     ;/home/jay/workspace/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                 T   ddl } | j                  j                  dt              }g }d}||u}|}|r|j                  }d}||u}|}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd	|	iz  }
|j                  |
       |rt        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  }|j                  |       t        j                  |d      i z  }t        j                  dt               dz   d|iz  }t        t        j                  |            dx}x}x}x}x}x}}| j                  j!                  |      }|t"        j$                  d<   |j                  j'                  |       |S )uS   auto_e2e_gate 모듈 동적 import (스크립트 형식이므로 importlib 사용).r   Nauto_e2e_gate)is not)z%(py2)s is not %(py5)sspecpy2py5%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16u   spec 로드 실패: z
>assert %(py19)spy19)importlib.utilutilspec_from_file_locationSCRIPTloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolop_format_assertmsgAssertionError_format_explanationmodule_from_specsysmodulesexec_module)	importlibr0   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                   r   _import_gater^   8   sD   >>11/6JDXtX4tXX4X4 7XXXX4tXXXXXX4XXX4XXXtXXXXXXX4XXXXXXXXXXXXXXX4XXXXXXXXXX;OPVx9XXXXXXXXX
..
)
)$
/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                  |       }fd|D        }t        |      }|st	        j
                   d|       dz   dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}}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    변경 매칭 실패: z.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anypy0r2   py4)r,   r^   detect_insuro_changesrj   r@   rH   rB   rC   rD   rE   rI   rJ   )r    rh   expect_filesgatematchedrP   rR   @py_format5s    `      r   #test_detect_changes_in_watched_dirsrs   D   s     K.>D((5G?w? 83?? 8? 8&7&7:,-gY78 8178 877  8 8.7i  8 8.7i @ 8 8.7i @ 8 8 8$7$78 8r!   c                   t        | dg       t               }|j                  |       }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            d x}}y )	Nzmemory/reports/foo.md==)z%(py0)s == %(py3)srq   )rl   py3u%   docs only — 0 매칭이어야 함: 
>assert %(py5)sr3   )r,   r^   rn   r@   rA   rB   rC   rD   rE   rH   rI   rJ   )r    rp   rq   @py_assert2rP   @py_format4rW   s          r   test_skip_on_docs_only_changer{   R   s    K"9!:;>D((5GK7b=KKK7bKKKKKK7KKK7KKKbKKKA'KKKKKKKr!   c                   |dz  }t        j                  t        j                  t	        t
              dddt	        |       dt	        |      gdd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#        j$                  |dz  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}}y )Nout	--task-idztask-fake-skip--project-pathz--output-dirT   )capture_outputtexttimeoutr   ru   z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)srcrl   r2   r3   zstderr=
>assert %(py7)sr5   zresult.jsonstatusskipz%(py1)s == %(py4)spy1rm   assert %(py6)spy6)r   r   rL   
executabler   r>   
returncoder@   rA   rB   rC   rD   rE   rH   stderrrI   rJ   jsonloads	read_text)r    r   out_dirr   rP   rQ   rR   rW   rX   resultrS   ry   rr   @py_format7s                 r   test_main_skip_when_no_changesr   Z   sA   G		V	&	3{+	W	' $
B ==4A4=A444=A44444424442444=444A44444444444ZZ=0;;=>F(%v%v%%%%v%%%%%%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(  }
|
st        j                   d|
fd||	f      dt#        j$                         v st        j&                  |      rt        j(                  |      nd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}
}	|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 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    r   stdoutr   r}   1/home/jay/workspace/tests/auto_e2e_gate/scenariosztask-fake-pass<   )timeout_secru   )z1%(py0)s == %(py4)s
{%(py4)s = %(py2)s.EXIT_PASS
}r   rp   rk   r   r   r   passr   r   )r,   r^   r   patchobjectr   r   whichr   Mockr   dumpsr   run_playwright	EXIT_PASSr@   rA   rB   rC   rD   rE   rI   rJ   )r    r   rp   fake_reportm_shutilm_runr   r   payloadrR   rP   rr   r   rS   ry   s                  r   %test_gate_pass_with_mocked_playwrightr   i   s   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 ^^#r^####r^######r###r######T###T###^#######x *F* F**** F*** ***F*******%+ + + + + + + + +s=   	+J<4-J0!G*J$J0J<$J-)J00J9	5J<<Kc           
     P   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(  }
|
st        j                  d|
fd||	f      dt!        j"                         v st        j$                  |      rt        j&                  |      nd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}
}	|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#   }
t-        |
      }	d}|	|k\  }|st        j                  d$|fd%|	|f      d&t!        j"                         v st        j$                  t,              rt        j&                  t,              nd&t        j&                  |
      t        j&                  |	      t        j&                  |      d'z  }d(d)|iz  }t)        t        j*                  |            d x}
x}	x}}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   r   u   main흰화면Fr   resultserrormessagezinnerText too shortr   r   r   testsr   r   r   Tr   r      r   r   r}   r   ztask-fake-failr   ru   z1%(py0)s == %(py4)s
{%(py4)s = %(py2)s.EXIT_FAIL
}r   rp   rk   r   r   r   failr   r   failures>=)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)slen)rl   r2   rm   r5   zassert %(py9)sr6   )r^   r   r   r   r   r   r   r   r   r   r   r   r   	EXIT_FAILr@   rA   rB   rC   rD   rE   rI   rJ   r   )r    r   rp   r   r   r   r   r   r   rR   rP   rr   r   rS   ry   @py_assert6@py_assert5rX   @py_format10s                      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
 ^^#r^####r^######r###r######T###T###^#######x *F* F**** F*** ***F*******:&,s&',1,'1,,,,'1,,,,,,s,,,s,,,&,,,',,,1,,,,,,,!- - - - - - - - -s=    +N+-NKN+N3NN	NN	NN%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(  }	|	st        j                  d|	fd||f      dt        j                          v st        j"                  |      rt        j$                  |      nd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}	}|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 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   r   r   Tr   r   npxr   )cmdr   r}   r   ztask-fake-timeoutru   )z7%(py0)s == %(py4)s
{%(py4)s = %(py2)s.EXIT_INFRA_FAIL
}r   rp   rk   r   r   r   
infra_failr   r   reasonr   )r^   r   r   r   r   r   r   r   TimeoutExpiredside_effectr   r   EXIT_INFRA_FAILr@   rA   rB   rC   rD   rE   rI   rJ   )r    r   rp   r   r   r   r   r   rR   rP   rr   r   rS   ry   s                 r   $test_gate_timeout_returns_infra_failr      s   >D			4	* .h			4??E	2.6;			499hT		B. '5#&55%KU"))DE(!
G
 )))r)))))r)))))))r)))r))))))T)))T)))))))))))x 0L0 L0000 L000 000L0000000x -I- I---- I--- ---I-------. . . . . . . . .s<   +L	-K=IK1K= L	1K:6K==L	L		L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(  }|st        j                  d|fd|	|f      dt!        j"                         v st        j$                  |	      rt        j&                  |	      nddt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      dz  }t        j(                  d      dz   d|iz  }t+        t        j,                  |            d x}}fd|
d   D        }t/        |      }|sdd t!        j"                         v st        j$                  t.              rt        j&                  t.              nd t        j&                  |      t        j&                  |      dz  }t+        t        j,                  |            d x}}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   r   Fz.spec.tsr   r   r   r   r   r   r   Tr   r   r   r   r   r}   r   r   ru   r   r   rp   rk   u   회귀 차단 실패z
>assert %(py6)sr   c              3  L   K   | ]  }|j                  d       xs dv   yw)r   r   N)get)rg   r+   	error_msgs     r   ri   z5test_gate_blocks_known_regressions.<locals>.<genexpr>   s#     T19w!526Ts   !$r   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}rj   )r^   r   r   r   r   r   r   r   r   r   r   r   r   r   r@   rA   rB   rC   rD   rE   rH   rI   rJ   rj   )r    r   scenario_namer   rp   r   r   r   r   r   r   rR   rP   rr   r   s      `           r   "test_gate_blocks_known_regressionsr      sD   
 >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
 ^^;r^#;;;r^;;;;;;r;;;r;;;;;;T;;;T;;;^;;;%;;;;;;;T
@STTsTTTTTTTTTsTTTsTTTTTTTTTTTTTTU U U U U U U U Us=   +L /-K4H3K(K4L (K1-K44K=	9L  L	c                    t         j                  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  }t        j                  d      d	z   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 )Nutf-8encodingu   1.7. Phase γ Auto E2E Gateinz%(py1)s in %(py3)scontentr   rw   u    finish-task.sh에 hook 미삽입rx   r3   r   assert %(py5)sz.e2e-gate-donez.e2e-gate-failed)FINISHr   r@   rA   rE   rB   rC   rD   rH   rI   rJ   )r   rS   ry   rz   rW   s        r   %test_finish_task_sh_has_e2e_gate_hookr      s   0G(W(G3WWW(GWWW(WWWWWWGWWWGWWWW5WWWWWWW((((((((((((((((((((((((&w&&&&w&&&&&&&&&w&&&w&&&&&&&((((((((((((((((((((((((r!   c                 *   t        j                  ddt        t              gd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}}y )Nbashz-nT)r   r   r   ru   r   r   r   zbash syntax: r   r5   )r   r   r   r   r   r@   rA   rB   rC   rD   rE   rH   r   rI   rJ   )r   rP   rQ   rR   rW   rX   s         r   test_finish_task_sh_syntax_okr      s    	s6{3Dt	TB==:A:=A:::=A::::::2:::2:::=:::A:::ryyk::::::::r!   c                    t         j                  d      } | j                  d      }| j                  d|      }g }d}||kD  }|}|r||kD  }|}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }	|j                  |	       |rt        j                  dfd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }|j                  |       t        j                  |d      i z  }t        j                  d      dz   d|iz  }t        t        j                  |            d x}x}x}x}}| || S )Nr   r   u   # 1.7. Phase γ Auto E2E Gateu   # 2. 머지r   )>)z%(py2)s > %(py5)sstartr1   r4   r5   )z%(py9)s > %(py11)send)r6   r7   z%(py13)spy13u   hook 블록 추출 실패z
>assert %(py16)sr9   )r   r   findr@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   )r   r   r   rP   rQ   rR   rS   rT   rW   rX   @py_format12@py_format14rY   rZ   s                 r   _extract_hook_blockr      s   0GLL89E
,,}e
,CA1A519AuAAAA51AAAAAA5AAA5AAA1AAAAAAAuAAAAAAAAAAAAAAAuAAAuAAAAAAAAAA&AAAAAAAA5r!   c                 "   t               } g }d}|| v }|}|sd}|| v }|}|s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  }
|j                  |
       |st        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  }|j                  |       |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  }|j                  |       t        j                  |d      i z  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}x}x}x}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  }t        j                  d      dz   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  }t        j                  d      dz   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  }t        j                  d       dz   d|iz  }	t        t        j                  |	            dx}}| j                  }d!} ||      }d"}||k\  }|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  }t        j                  d&| j                  d!             d'z   d(|iz  }t        t        j                  |            dx}x}x}x}}y))u^   hook이 PASS/FAIL/INFRA_FAIL 세 경로 모두 다른 이벤트 파일을 만드는지 검증.zE2E_RC" = "0"zE2E_RC = "0"z"$E2E_RC" = "0"r   )z%(py3)s in %(py5)shook)rw   r3   r4   r5   )z%(py10)s in %(py12)s)py10py12z%(py14)sr8   )z%(py17)s in %(py19)s)py17r:   z%(py21)spy21r   u"   PASS 분기 (exit 0) 처리 누락z
>assert %(py24)spy24Ninfra_fail_skippedr   r   u!   skip-allowed 우회 분기 누락rx   r3   ze2e-gate-infra-failu   INFRA_FAIL 분기 누락ze2e-gate-failedu   FAIL 분기 누락zexit 1   r   )zK%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.count
}(%(py4)s)
} >= %(py9)s)rl   r2   rm   r   r6   u   hook에 exit 1이 2회 미만: z
>assert %(py11)sr7   )r   r@   rA   rE   rB   rC   rD   rF   rG   rH   rI   rJ   count)r   rP   ry   rQ   rS   @py_assert9@py_assert11@py_assert16@py_assert18rW   rX   @py_format13rY   r\   @py_format22@py_format23@py_format25rz   rR   r   @py_assert8@py_assert7r   r   s                           r   &test_hook_block_handles_three_outcomesr     s    D- -% -)9 -)9T)A -EV -EVZ^E^ - -,,- - -#,9  - -&,f- -,, "& - -#,9 "& - - -&,f-&,-,,-)9T - -#,9 *: - -&,f- -,, >B - -#,9 >B - - -&,f-&,-,,-EVZ^ - -#,9 FW - -&,f- -,, [_ - -#,9 [_ - - -&,f-&,-,n- -,,,- - -,,- - - -  L4'LLL4LLLLLLLLL4LLL4LLLL)LLLLLLL D D(DDD DDDD DDDDDDDDDDDDDDD*DDDDDDD:$:::::::::::::::::::&:::::::::^h^:h^1^1$^^^1^^^^^^4^^^4^^^:^^^h^^^^^^1^^^(G

S[H\G]&^^^^^^^^r!   c                 "   t               } d}|| v }|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }t        j                  d      dz   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 )Nz%"$WORKSPACE/scripts/auto_e2e_gate.py"r   r   r   r   u(   auto_e2e_gate.py 호출 경로 불일치rx   r3   r~   r   r   
r   r@   rA   rE   rB   rC   rD   rH   rI   rJ   r   rS   ry   rz   rW   s        r   #test_hook_calls_correct_script_pathr     sb    D2 32d: 3!2!232d 3 3)2 3 3 3,2F3 322 7; 3 3)2 7; 3 3!2!223 3 3223 3;$;$;$$#t####t#########t###t#######r!   c                    t               } d}|| v }|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }t        j                  d      dz   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	)uT   PROJECT_PATH 미지정 시 hook이 스킵 처리하는지 (시스템 작업 안전).zelif [ -z "$PROJECT_PATH" ]r   r   r   r   u+   PROJECT_PATH 미지정 스킵 분기 누락rx   r3   Nu   시스템 작업r   r	  r
  s        r   $test_hook_skips_when_no_project_pathr     s     D(_(D0___(D___(______D___D____2_______%%%%%%%%%%%%%%%%%%%%%%%%r!   )r   r   returnr   )r   r   r)   z	list[str]r  None)r  r   )'__doc__
__future__r   builtinsrB   _pytest.assertion.rewrite	assertionrewriter@   r   r   rL   pathlibr   unittestr   pytest	WORKSPACEr>   r   fixturer    r,   r^   markparametrizers   r{   r   r   r   r   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!   