
    <i%                        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mZ ddlmZmZ  ee
j"                  j%                  dd            Zedz  Z eej,                        Zej0                  j3                  d ee            Zg ZdZeeuZeZerej>                  Z dZ!e e!uZ"e"ZesB ejF                  d	efd
eef      d ejH                         v s ejJ                  e      r ejL                  e      nd ejL                  e      dz  Z'dde'iz  Z(ejS                  e(       er ejF                  d	e"fde e!f      d ejH                         v s ejJ                  e      r ejL                  e      nd ejL                  e        ejL                  e!      dz  Z*dde*iz  Z+ejS                  e+        ejX                  ed      i z  Z-dde-iz  Z. e/ ej`                  e.            dxZxZxZxZxZ xZ"Z!ej0                  jc                  e      Z2g dZ3e3D ]%  Z4e4ejj                  vs e       ejj                  e4<   ' eejl                  vrejl                  jo                  de       ej>                  jq                  e2       g dZ9dede:fdZ;dede:fdZ< G d d      Z= G d d      Z> G d  d!      Z? G d" d#      Z@ G d$ d%      ZAy)&uu  
test_qc_gate.py - qc_verify.py --gate 플래그 기능 테스트

테스트 항목:
1. test_gate_pass_creates_qc_result: --gate + 전체 PASS → .qc-result 파일 생성
2. test_gate_warn_creates_qc_result: --gate + WARN → .qc-result 파일 생성
3. test_gate_fail_no_qc_result: --gate + FAIL → .qc-result 파일 미생성
4. test_no_gate_flag_no_qc_result: --gate 없이 실행 → 기존 동작 유지, .qc-result 미생성
5. test_qc_result_file_content: .qc-result 파일의 JSON 내용이 올바른 형식인지 확인

Note: _handle_gate()는 .done이 아닌 .qc-result만 생성. .done은 finish-task.sh가 담당.
    N)Path)	MagicMockpatchWORKSPACE_ROOTz/home/jay/workspacezteams/dev1/qc/qc_verify.py	qc_verify)is not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16zassert %(py19)spy19)
	verifierszverifiers.api_healthzverifiers.data_integrityzverifiers.file_checkzverifiers.pyright_checkzverifiers.schema_contractzverifiers.scope_checkzverifiers.style_checkzverifiers.tdd_checkzverifiers.test_runner)	
api_health
file_checkdata_integritytest_runner	tdd_checkschema_contractpyright_checkstyle_checkscope_checkstatusreturnc                 <    t         D ci c]  }|| g d
 c}S c c}w )u:   모든 check를 동일한 status로 설정한 dict 반환.r   details)_ALL_CHECKS)r   names     )/home/jay/workspace/tests/test_qc_gate.py_make_checksr$   H   s     @KLDV33LLLs   overallc                 .    t        |       }dd| |d|  dS )u9   build_result()와 동일한 구조의 result dict 반환.task-test-001z2026-03-09T17:50:00z9 )task_idverified_atr%   checkssummary)r$   )r%   r*   s     r#   _make_resultr,   M   s+    '"F",y>     c                       e Zd ZdZd Zy)TestGatePassCreatesQcResultuE   --gate + 전체 PASS → .qc-result 파일이 생성되어야 한다.c                 n   d}|dz  dz  | dz  }t        j                  t        j                  dt	        |      i      5  t        d      }t        j                  ||d       d d d        |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}}y # 1 sw Y   xY w)Nr'   memoryevents
.qc-resultr   PASS	dev1-team*   .qc-result 파일이 생성되어야 함: C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}qc_result_pathpy0r
   py4r   dictosenvironstrr,   r   _handle_gateexists
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselftmp_pathr(   r8   result@py_assert1@py_assert3@py_format5s           r#    test_gate_pass_creates_qc_resultz<TestGatePassCreatesQcResult.test_gate_pass_creates_qc_resulta       !!H,x7WIZ:PPZZ

%5s8}$EF 	A!&)F""67K@	A $$e$&e&ee*TUcTd(eeeeeee~eee~eee$eee&eeeeee		A 	A    #D++D4N)__name__
__module____qualname____doc__rR    r-   r#   r/   r/   ^   s    Ofr-   r/   c                       e Zd ZdZd Zy)TestGateWarnCreatesQcResultu>   --gate + WARN → .qc-result 파일이 생성되어야 한다.c                 n   d}|dz  dz  | dz  }t        j                  t        j                  dt	        |      i      5  t        d      }t        j                  ||d       d d d        |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}}y # 1 sw Y   xY w)Nztask-test-002r1   r2   r3   r   WARNr5   r6   r7   r8   r9   r<   rK   s           r#    test_gate_warn_creates_qc_resultz<TestGateWarnCreatesQcResult.test_gate_warn_creates_qc_resultt   rS   rT   N)rU   rV   rW   rX   r^   rY   r-   r#   r[   r[   q   s    Hfr-   r[   c                       e Zd ZdZd Zy)TestGateFailNoQcResultuE   --gate + FAIL → .qc-result 파일이 생성되지 않아야 한다.c                 x   d}|dz  dz  | dz  }t        j                  t        j                  dt	        |      i      5  t        d      }t        j                  ||d       d d d        |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}x}}y # 1 sw Y   xY w)Nztask-test-003r1   r2   r3   r   FAILr5   u+   .qc-result 파일이 생성되면 안 됨: G
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r8   r9   r<   )	rL   rM   r(   r8   rN   rO   rP   @py_assert5@py_format6s	            r#   test_gate_fail_no_qc_resultz2TestGateFailNoQcResult.test_gate_fail_no_qc_result   s    !!H,x7WIZ:PPZZ

%5s8}$EF 	A!&)F""67K@	A "((j(*j**j*jj.YZhYi,jjjjjjj>jjj>jjj(jjj*jjjjjj		A 	As    #D00D9N)rU   rV   rW   rX   rf   rY   r-   r#   r`   r`      s    Okr-   r`   c                       e Zd ZdZd Zy)TestNoGateFlagNoQcResultue   --gate 없이 실행 시 기존 동작 유지 — .qc-result 파일이 생성되지 않아야 한다.c           	         d}|dz  dz  | dz  }t        j                  t        j                  dt	        |      i      5  t        ddd|g      5  t        j
                  t        d	d
g d      5  t        d      5  t        j                         }d d d        d d d        d d d        d d d        |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}x}}d}	|	k(  }|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  }t        t        j                   |            d x}}	y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nztask-test-004r1   r2   r3   r   zsys.argvzqc_verify.pyz	--task-id	run_checkSKIPr   )return_valuezbuiltins.printuV   --gate 플래그 없이 실행했으므로 .qc-result 파일이 생성되면 안 됨: rc   r8   r9   r   ==)z%(py0)s == %(py3)sreturn_code)r:   py3zassert %(py5)sr   )r   r=   r>   r?   r@   objectr   mainrB   rC   rD   rE   rF   rG   rH   rI   rJ   _call_reprcompare)rL   rM   r(   r8   ro   rO   rP   rd   re   @py_assert2@py_format4s              r#   test_no_gate_flag_no_qc_resultz7TestNoGateFlagNoQcResult.test_no_gate_flag_no_qc_result   s	   !!H,x7WIZ:PP
 JJrzz$4c(m#DE	+*~{GDE	+ LLK\^>_`	+ "#		+ $..*K	+ 	+ 	+ 	+ "((  	V(*  	V**  	V*  	V  	V  /E  FT  EU  -V  	V  	V  	V  	V  	V  	V>  	V  	V  	V>  	V  	V  	V(  	V  	V  	V*  	V  	V  	V  	V  	V  	V{a{a{{a	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+sT    I H60H)<H	H)H6!IH&!H))H3.H66I 	;IIN)rU   rV   rW   rX   rv   rY   r-   r#   rh   rh      s
    o r-   rh   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestQcResultFileContentuE   .qc-result 파일의 JSON 내용이 올바른 형식이어야 한다.c                 R   d}d}|dz  dz  | dz  }t        j                  t        j                  dt	        |      i      5  t        d      }t        j                  |||       d d d        |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}}t!        |dd      5 }	t#        j$                  |	      }
d d d        
d   }||k(  }|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   }||k(  }|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   }d}||k(  }|st        j&                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j(                  d      dz   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  }t        j(                  d!      dz   d|iz  }t        t        j                  |            d x}}y # 1 sw Y   xY w# 1 sw Y   xY w)"Nztask-test-005r5   r1   r2   r3   r   r4   Aassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r8   r9   rutf-8encodingr(   rm   )z%(py1)s == %(py3)s)py1rp   u   task_id가 일치해야 함z
>assert %(py5)sr   teamu   team이 일치해야 함	qc_resultz%(py1)s == %(py4)sr   r;   u   qc_result가 PASS이어야 함
>assert %(py6)spy6	timestamp)in)z%(py1)s in %(py3)sdatau!   timestamp 필드가 있어야 함r   r=   r>   r?   r@   r,   r   rA   rB   rE   rF   rC   rG   rH   rI   rJ   openjsonloadrs   rD   )rL   rM   r(   r   r8   rN   rO   rP   rQ   fr   @py_assert0rt   ru   re   @py_format7s                   r#   test_qc_result_file_contentz3TestQcResultFileContent.test_qc_result_file_content   s   !!H,x7WIZ:PPZZ

%5s8}$EF 	:!&)F""67D9	: $$&$&&&&&&&&~&&&~&&&$&&&&&&&&&&.#8 	 A99Q<D	  IH')HHH'HHHHHHHHH'HHH'HHHH+HHHHHHHF|?|t#???|t???|??????t???t????%???????K LFL F*LLL FLLL LLLFLLL,LLLLLLLLG{d"GGG{dGGG{GGGGGGdGGGdGGGG$GGGGGGG	: 	:	  	 s   #P!PPP&c                    d}d}|dz  dz  | dz  }t        j                  t        j                  dt	        |      i      5  t        d      }t        j                  |||       ddd       |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}}t!        |dd      5 }	t#        j$                  |	      }
ddd       
d   }d}||k(  }|st        j&                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j(                  d      dz   d|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   sxY w# 1 sw Y   xY w)u@   WARN 결과도 qc_result에 올바르게 기록되어야 한다.ztask-test-006r5   r1   r2   r3   r   r]   Nrz   r8   r9   r{   r|   r}   r   rm   r   r   u   qc_result가 WARN이어야 함r   r   r   )rL   rM   r(   r   r8   rN   rO   rP   rQ   r   r   r   rt   r   s                 r#    test_qc_result_file_content_warnz8TestQcResultFileContent.test_qc_result_file_content_warn   sd   !!H,x7WIZ:PPZZ

%5s8}$EF 	:!&)F""67D9	: $$&$&&&&&&&&~&&&~&&&$&&&&&&&&&&.#8 	 A99Q<D	  K LFL F*LLL FLLL LLLFLLL,LLLLLLLL	: 	:	  	 s   #G!G#G #G,c                    ddl }d}|dz  dz  | dz  }t        j                  t        j                  dt        |      i      5  t        d      }t        j                  ||d	       ddd       t        |d
d      5 }t        j                  |      }ddd       d}|j                  }	d   }
 |	||
      }|st        j                  d|d          dz   dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |
      t        j$                  |      dz  }t'        t        j(                  |            dx}	x}
}y# 1 sw Y   YxY w# 1 sw Y   :xY w)u@   timestamp가 ISO 8601 형식(%Y-%m-%dT%H:%M:%S)이어야 한다.r   Nztask-test-007r1   r2   r3   r   r4   r5   r{   r|   r}   z%^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$r   u)   timestamp 형식이 올바르지 않음: zR
>assert %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.match
}(%(py3)s, %(py5)s)
}reiso_pattern)r:   r
   rp   r   r   )r   r   r=   r>   r?   r@   r,   r   rA   r   r   r   matchrC   rD   rE   rF   rG   rH   rI   rJ   )rL   rM   r   r(   r8   rN   r   r   r   rO   @py_assert4@py_assert6@py_format8s                r#   $test_qc_result_file_timestamp_formatz<TestQcResultFileContent.test_qc_result_file_timestamp_format   s^   !!H,x7WIZ:PPZZ

%5s8}$EF 	A!&)F""67K@	A .#8 	 A99Q<D	  ?xxxT+%6xx%67x7xx;deijuevdw9xxxxxxxrxxxrxxxxxxxxxxxxxxxx%6xxx7xxxxxx	A 	A	  	 s   #F>=G>GGc                 <   d}|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}x}}t        j                  t        j                  d	t        |      i      5  t        d
      }	t        j                  |	|d       ddd       |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}}|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}}y# 1 sw Y   xY w)u?   events 디렉토리가 없어도 자동 생성되어야 한다.ztask-test-008r1   r2   r3   zEassert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}
events_dirr9   Nr   r4   r5   u8   memory/events 디렉토리가 자동 생성되어야 함r7   u(   .qc-result 파일이 생성되어야 함r8   )rB   rE   rF   rC   rG   rH   rI   rJ   r   r=   r>   r?   r@   r,   r   rA   rD   )rL   rM   r(   r   r8   rO   rP   rd   re   rN   rQ   s              r#   &test_qc_result_parent_dir_auto_createdz>TestQcResultFileContent.test_qc_result_parent_dir_auto_created   s   !(83
#	&<< $$&$&&&&&&&&&&&:&&&:&&&$&&&&&&&&&&ZZ

%5s8}$EF 	A!&)F""67K@	A   ^ "^"^^$^^^^^^^z^^^z^^^ ^^^"^^^^^^$$R$&R&RR(RRRRRRR~RRR~RRR$RRR&RRRRRR	A 	As   -#JJN)rU   rV   rW   rX   r   r   r   r   rY   r-   r#   rx   rx      s    OH(M"y"Sr-   rx   )BrX   builtinsrE   _pytest.assertion.rewrite	assertionrewriterC   importlib.util	importlibr   r>   syspathlibr   unittest.mockr   r   r?   get
_WORKSPACE_QC_VERIFY_PATHr@   parent_QC_DIRutilspec_from_file_locationr	   rO   r   rP   r   loader@py_assert10@py_assert13@py_assert12rs   rF   rG   rH   re   r   append@py_format15@py_format17_format_boolop@py_format18@py_format20rI   rJ   module_from_specr   _MOCK_VERIFIER_NAMES_namemodulespathinsertexec_moduler!   r=   r$   r,   r/   r[   r`   rh   rx   rY   r-   r#   <module>r      s)       	 
  * "**..!13HIJ
;;
o$$
% ~~--k3;OP 34 3t4 3DKK 3t 3Kt3 3 3 3t4 3 3 3 3 3t 3 3 3t 3 3 34 3 3 3 3 3 3 3Kt 3 3 3 3 3D 3 3 3D 3 3 3K 3 3t 3 3 3 3 3 3 3 3 3 3 3 3 3NN++D1	  " )ECKK&[E)
 #((HHOOAw   	 "
M M M
	# 	$ 	"f f&f f&k k&   6GS GSr-   