
    (<iO%                        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)u  
test_qc_gate.py - qc_verify.py --gate 플래그 기능 테스트

테스트 항목:
1. test_gate_pass_creates_done_file: --gate + 전체 PASS → .done 파일 생성
2. test_gate_warn_creates_done_file: --gate + WARN → .done 파일 생성
3. test_gate_fail_no_done_file: --gate + FAIL → .done 파일 미생성
4. test_no_gate_flag_no_done_file: --gate 없이 실행 → 기존 동작 유지, .done 미생성
5. test_done_file_content: .done 파일의 JSON 내용이 올바른 형식인지 확인
    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-2057-dev2/tests/test_qc_gate.py_make_checksr   F   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"   K   s+    '"F",y>     c                       e Zd ZdZd Zy)TestGatePassCreatesDoneFileu@   --gate + 전체 PASS → .done 파일이 생성되어야 한다.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.doner   PASS	dev1-team%   .done 파일이 생성되어야 함: 	r   dictosenvironstrr"   r   _handle_gateexistsselftmp_pathr   	done_pathresults        r    test_gate_pass_creates_done_filez<TestGatePassCreatesDoneFile.test_gate_pass_creates_done_file_       !x'(2y5FF	ZZ

%5s8}$EF 	A!&)F""67K@	A !V%J9+#VV!		A 	A    #BBN)__name__
__module____qualname____doc__r9    r#   r   r%   r%   \   s    JWr#   r%   c                       e Zd ZdZd Zy)TestGateWarnCreatesDoneFileu9   --gate + WARN → .done 파일이 생성되어야 한다.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_done_filez<TestGateWarnCreatesDoneFile.test_gate_warn_creates_done_filer   r:   r;   N)r<   r=   r>   r?   rE   r@   r#   r   rB   rB   o   s    CWr#   rB   c                       e Zd ZdZd Zy)TestGateFailNoDoneFileu@   --gate + FAIL → .done 파일이 생성되지 않아야 한다.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&   .done 파일이 생성되면 안 됨: r-   r4   s        r   test_gate_fail_no_done_filez2TestGateFailNoDoneFile.test_gate_fail_no_done_file   s    !x'(2y5FF	ZZ

%5s8}$EF 	A!&)F""67K@	A ##%[)OPY{'[[%%		A 	Ar;   N)r<   r=   r>   r?   rJ   r@   r#   r   rG   rG      s    J\r#   rG   c                       e Zd ZdZd Zy)TestNoGateFlagNoDoneFileu`   --gate 없이 실행 시 기존 동작 유지 — .done 파일이 생성되지 않아야 한다.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.printuQ   --gate 플래그 없이 실행했으므로 .done 파일이 생성되면 안 됨: r   )	r   r.   r/   r0   r1   objectr   mainr3   )r5   r6   r   r7   return_codes        r   test_no_gate_flag_no_done_filez7TestNoGateFlagNoDoneFile.test_no_gate_flag_no_done_file   s   !x'(2y5FF	
 JJrzz$4c(m#DE	+*~{GDE	+ LLK\^>_`	+ "#		+ $..*K	+ 	+ 	+ 	+ ##%  	G)z  |E  {F  (G  	G%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
    j r#   rL   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestDoneFileContentu@   .done 파일의 JSON 내용이 올바른 형식이어야 한다.c                 J   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       |d   dk(  sJ d       |d   du sJ d       |d   J d       y # 1 sw Y   xY w# 1 sw Y   wx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   doneu   status가 'done'이어야 함merge_neededFu"   merge_needed가 False이어야 함merge_branchu!   merge_branch가 None이어야 함r   r.   r/   r0   r1   r"   r   r2   r3   openjsonloadr5   r6   r   r\   r7   r8   fdatas           r   test_done_file_contentz*TestDoneFileContent.test_done_file_content   s_   !x'(2y5FF	ZZ

%5s8}$EF 	:!&)F""67D9	: !!!)S73 	 q99Q<D	  I')H+HH)F|t#?%??#K F*L,LL*d"G$GG"H~'H)HH'N#u,R.RR,N#+P-PP+!	: 	:	  	 s   #DDDD"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       |d   dk(  sJ y# 1 sw Y   ax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   r_   rb   rf   s           r   test_done_file_content_warnz/TestDoneFileContent.test_done_file_content_warn   s    !x'(2y5FF	ZZ

%5s8}$EF 	:!&)F""67D9	: !!!)S73 	 q99Q<D	  K F*L,LL*H~'''	: 	:	  	 s   #C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   rc   rd   re   match)	r5   r6   rm   r   r7   r8   rg   rh   iso_patterns	            r   test_done_file_timestamp_formatz3TestDoneFileContent.test_done_file_timestamp_format   s    !x'(2y5FF	ZZ

%5s8}$EF 	A!&)F""67K@	A )S73 	 q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#   .done 파일이 생성되어야 함)	r3   r   r.   r/   r0   r1   r"   r   r2   )r5   r6   r   
events_dirr7   r8   s         r   &test_done_file_parent_dir_auto_createdz:TestDoneFileContent.test_done_file_parent_dir_auto_created   s    !(83
G9E!22	 $$&&&ZZ

%5s8}$EF 	A!&)F""67K@	A   "^$^^"!H#HH!	A 	As   #B..B7N)r<   r=   r>   r?   ri   rk   rp   rs   r@   r#   r   rV   rV      s    JQ.($y"Ir#   rV   )'r?   importlib.util	importlibrd   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
	# 	$ 	"W W&W W&\ \&   6KI KIr#   