
    i%                        d 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j$                  j'                  d ee            Zeej*                  J ej$                  j-                  e      Zg d	ZeD ]%  Zeej4                  vs e	       ej4                  e<   ' eej6                  vrej6                  j9                  de       ej*                  j;                  e       g d
Zd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      Z&y)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)
	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     C/home/jay/workspace/.worktrees/task-2116-dev1/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                 $   d}|dz  dz  | dz  }t        j                  t        j                  dt	        |      i      5  t        d      }t        j                  ||d       d d d        |j                         s
J d|        y # 1 sw Y   $xY w)	Nr   memoryevents
.qc-resultr   PASS	dev1-team*   .qc-result 파일이 생성되어야 함: 	r   dictosenvironstrr"   r   _handle_gateexistsselftmp_pathr   qc_result_pathresults        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*TUcTd(ee&		A 	A    #BBN)__name__
__module____qualname____doc__r9    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                 $   d}|dz  dz  | dz  }t        j                  t        j                  dt	        |      i      5  t        d      }t        j                  ||d       d d d        |j                         s
J d|        y # 1 sw Y   $xY w)	Nztask-test-002r'   r(   r)   r   WARNr+   r,   r-   r4   s        r    test_gate_warn_creates_qc_resultz<TestGateWarnCreatesQcResult.test_gate_warn_creates_qc_resultt   r:   r;   N)r<   r=   r>   r?   rE   r@   r#   r   rB   rB   q   s    Hfr#   rB   c                       e Zd ZdZd Zy)TestGateFailNoQcResultuE   --gate + FAIL → .qc-result 파일이 생성되지 않아야 한다.c                 $   d}|dz  dz  | dz  }t        j                  t        j                  dt	        |      i      5  t        d      }t        j                  ||d       d d d        |j                         r
J d|        y # 1 sw Y   $xY w)	Nztask-test-003r'   r(   r)   r   FAILr+   u+   .qc-result 파일이 생성되면 안 됨: r-   r4   s        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.YZhYi,jj**		A 	Ar;   N)r<   r=   r>   r?   rJ   r@   r#   r   rG   rG      s    Okr#   rG   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                         r
J d|        dk(  sJ y # 1 sw Y   CxY w# 1 sw Y   GxY w# 1 sw Y   KxY w# 1 sw Y   OxY w)Nztask-test-004r'   r(   r)   r   zsys.argvzqc_verify.pyz	--task-id	run_checkSKIPr   )return_valuezbuiltins.printuV   --gate 플래그 없이 실행했으므로 .qc-result 파일이 생성되면 안 됨: r   )	r   r.   r/   r0   r1   objectr   mainr3   )r5   r6   r   r7   return_codes        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  /E  FT  EU  -V  	V*a	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+sT    C7 C+0C<C	CC+!C7CCC($C++C4	0C77D N)r<   r=   r>   r?   rT   r@   r#   r   rL   rL      s
    o r#   rL   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestQcResultFileContentuE   .qc-result 파일의 JSON 내용이 올바른 형식이어야 한다.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                         sJ t        |dd	
      5 }t        j                  |      }d d d        d   |k(  sJ d       |d   |k(  sJ d       |d   dk(  sJ d       d|v sJ d       y # 1 sw Y   xY w# 1 sw Y   NxY w)Nztask-test-005r+   r'   r(   r)   r   r*   rutf-8encodingr   u   task_id가 일치해야 함teamu   team이 일치해야 함	qc_resultu   qc_result가 PASS이어야 함	timestampu!   timestamp 필드가 있어야 함r   r.   r/   r0   r1   r"   r   r2   r3   openjsonloadr5   r6   r   r\   r7   r8   fdatas           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)F|t#?%??#K F*L,LL*d"G$GG"	: 	:	  	 s   #C$C0$C-0C9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                         sJ t        |d	d
      5 }t        j                  |      }ddd       d   dk(  sJ d       y# 1 sw Y   WxY w# 1 sw Y   %xY w)u@   WARN 결과도 qc_result에 올바르게 기록되어야 한다.ztask-test-006r+   r'   r(   r)   r   rD   NrX   rY   rZ   r]   u   qc_result가 WARN이어야 함r_   rc   s           r    test_qc_result_file_content_warnz8TestQcResultFileContent.test_qc_result_file_content_warn   s    !!H,x7WIZ:PPZZ

%5s8}$EF 	:!&)F""67D9	: $$&&&.#8 	 A99Q<D	  K F*L,LL*	: 	:	  	 s   #B;C;CC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         sJ d|d           y# 1 sw Y   ZxY w# 1 sw Y   :xY w)u@   timestamp가 ISO 8601 형식(%Y-%m-%dT%H:%M:%S)이어야 한다.r   Nztask-test-007r'   r(   r)   r   r*   r+   rX   rY   rZ   z%^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$r^   u)   timestamp 형식이 올바르지 않음: )rer   r.   r/   r0   r1   r"   r   r2   r`   ra   rb   match)	r5   r6   rj   r   r7   r8   rd   re   iso_patterns	            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T+%67x;deijuevdw9xx7	A 	A	  	 s   #C =C C	Cc                 t   d}|dz  dz  }|| dz  }|j                         rJ t        j                  t        j                  dt        |      i      5  t        d      }t        j                  ||d       ddd       |j                         sJ d	       |j                         sJ d
       y# 1 sw Y   8xY w)u?   events 디렉토리가 없어도 자동 생성되어야 한다.ztask-test-008r'   r(   r)   r   r*   r+   Nu8   memory/events 디렉토리가 자동 생성되어야 함u(   .qc-result 파일이 생성되어야 함)	r3   r   r.   r/   r0   r1   r"   r   r2   )r5   r6   r   
events_dirr7   r8   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   "^$^^"$$&R(RR&	A 	As   #B..B7N)r<   r=   r>   r?   rf   rh   rm   rp   r@   r#   r   rV   rV      s    OH(M"y"Sr#   rV   )'r?   importlib.util	importlibra   r/   syspathlibr   unittest.mockr   r   r0   get
_WORKSPACE_QC_VERIFY_PATHr1   parent_QC_DIRutilspec_from_file_locationspecloadermodule_from_specr   _MOCK_VERIFIER_NAMES_namemodulespathinsertexec_moduler   r.   r   r"   r%   rB   rG   rL   rV   r@   r#   r   <module>r      so     	 
  * "**..!13HIJ
;;
o$$
% ~~--k3;OPDKK3 33NN++D1	  " )ECKK&[E)
 #((HHOOAw   	 "
M M M
	# 	$ 	"f f&f f&k k&   6GS GSr#   