
     hi;                        d Z ddlZddlZddlZddlmZ ddlZ ed      Z ed      Zedz  Z	edz  Z
dZe	j                          Ze
j                          Zej                  j!                  ed	
      Zej                  j!                  ed
      Z	 d$dededededz  def
dZdedededefdZ	 d$dededededz  dedz  defdZededdfd       Zededdfd       Zededdfd       Zededdfd       Zededdfd       Zededdfd       Zededdfd       Zed%d        Zed%d!       Z ededdfd"       Z!ededdfd#       Z"y)&u7  
test_qc_report_guard.py — qc_report_guard.py 회귀 테스트 (Guard MVP Phase 1, task-2434)

시나리오 (9개):
    1. test_pass_pass_ok                             — JSON=PASS + frontmatter PASS → ok=True
    2. test_warn_overall_pass_fail                    — JSON=WARN + 본문 OVERALL PASS → ok=False (task-2431)
    3. test_warn_pass_with_warn_ok                   — JSON=WARN + frontmatter PASS_WITH_WARN + 항목 명시 → ok=True
    4. test_warn_pass_with_warn_missing_items_fail    — JSON=WARN + PASS_WITH_WARN 그러나 항목 누락 → ok=False
    5. test_fail_overall_fail_ok                     — JSON=FAIL + 본문 OVERALL FAIL + 사유 → ok=True
    6. test_quoted_overall_pass_ignored              — 인용 블록 가짜 verdict 무시, 실제 PASS_WITH_WARN → ok=True
    7. test_no_verdict_marker_fail                   — frontmatter도 ## QC Verdict도 없음 → ok=False
    8. test_pass_pass_with_warn_mismatch_fail        — JSON=PASS + 보고서 PASS_WITH_WARN → ok=False (MISMATCH)
    9. test_missing_warns_no_uncaught_exception_when_json_pass — JSON=PASS 시 UnboundLocalError 없음

    (통합) test_guard_sh_help                    — guard.sh --help → exit 0
    (통합) test_guard_sh_phase2_3_not_implemented — guard.sh enqueue → exit 2 + "not implemented"
    N)Pathz/home/jay/workspace/scriptsz/home/jay/workspacezqc_report_guard.pyzguard.shztask-2434-qc-testz9qc_report_guard.py not yet implemented (Thor in progress))reasonz/guard.sh not yet implemented (Thor in progress)pathtask_idverdictchecks_summaryreturnc                     | dz  | dz  }|j                   j                  dd       |||xs i d}|j                  t        j                  |      d       |S )u5   memory/events/<task_id>.qc-result JSON 파일 생성.eventsz
.qc-resultTparentsexist_ok)r   	qc_resultr   utf-8encoding)parentmkdir
write_textjsondumps)r   r   r   r   fpayloads         9/home/jay/workspace/tests/scripts/test_qc_report_guard.py_write_qc_resultr   8   sb     	xWIZ00AHHNN4$N/(.BG
 LLG$wL7H    contentc                 |    | dz  | dz  }|j                   j                  dd       |j                  |d       |S )u*   memory/reports/<task_id>.md 파일 생성.reportsz.mdTr   r   r   )r   r   r   )r   r   r   r   s       r   _write_reportr    F   s@    ygYc?*AHHNN4$N/LL7L+Hr   tmp
qc_verdictreport_contentc                    | dz  }|j                  dd       t        ||||      }d}|t        |||      }t        t              t
        j                  vr-t
        j                  j                  dt        t                     ddl}|j                  d      }	|	j                  |t        |      t        |      |rt        |      nd      }
|
S )u   
    qc_report_guard.py 의 check() 함수를 subprocess CLI로 호출하여
    결과 dict를 반환.  --json-output 플래그로 stdout에 JSON 출력 기대.
    CLI가 없으면 직접 임포트하여 check() 호출.
    	workspaceTr   Nr   qc_report_guard)r   r%   qc_result_pathreport_path)r   r   r    str_SCRIPTS_DIRsysr   insert	importlibimport_modulecheck)r!   r   r"   r#   r   wsqc_pathr(   r-   modresults              r   
_run_checkr4   N   s     
{	BHHTDH)"2w
NKGK!#B@ <(3|,-

!
!"3
4CYYb'7|(3C$	  F Mr   tmp_pathc                     d}t        | t        d|      }|d   du sJ d|d    d|j                  d              |d   g k(  sJ d	|d           y
)u5   JSON=PASS + frontmatter qc_verdict: PASS → ok=True.z7---
qc_verdict: PASS
---
# Report

## QC Verdict

PASS
PASSr"   r#   okTzexpected ok=True but got ok=, violations=
violationszexpected no violations but got Nr4   TASK_IDgetr5   reportr3   s      r   test_pass_pass_okrA   s   s    	"  'f'-/F $<4 
&vd|nM&**\BZA[\ ,2% 
)&*>)?@%r   c                     d}t        | t        d|      }|d   du sJ d|d           t        |d         dkD  sJ d	|d           y
)u   JSON=WARN + 보고서 본문 '## QC Verdict\n\nOVERALL PASS' → ok=False.

    WARN qc-result인데 보고서가 OVERALL PASS로 선언하는 불일치를 반드시 잡아야 한다.
    zA---
title: Some Report
---
# Report

## QC Verdict

OVERALL PASS
WARNr8   r9   Fz=expected ok=False (WARN vs OVERALL PASS mismatch) but got ok=r;   r   z&expected at least 1 violation but got N)r4   r=   lenr?   s      r   test_warn_overall_pass_failrE      s{    	*  'f'-/F $<5  
Gt~V  vl#$q( 
01E0FG(r   c           	          d}t        | t        d|ddi      }|d   du s1J d|d    d|j                  d	       d
|j                  d              |j                  dg       g k(  sJ d|j                  d              y)uR   JSON=WARN + frontmatter PASS_WITH_WARN + 본문에 WARN 항목 명시 → ok=True.u   ---
qc_verdict: PASS_WITH_WARN
---
# Report

## QC Verdict

PASS_WITH_WARN

### WARN Items
- WARN: 테스트 커버리지 60% (목표 80% 미달)
rC   u   테스트 커버리지r"   r#   r   r9   Tz?expected ok=True (WARN + PASS_WITH_WARN with items) but got ok=r:   r;   z, missing_warns=missing_warnsz"expected no missing_warns but got Nr<   r?   s      r   test_warn_pass_with_warn_okrI      s    	C  'f'-(@&'IKF $<4 Tl^=L1I0J KO45	7
 ::or*b0 
,VZZ-H,IJ0r   c                 ,   d}t        | t        d|ddi      }|d   du sJ d|d           t        |j                  dg             d	kD  sJt        |j                  d
g             d	kD  s+J d|j                  d       d|j                  d
              yy)u[   JSON=WARN + frontmatter PASS_WITH_WARN 그러나 본문에 WARN 항목 없음 → ok=False.ux   ---
qc_verdict: PASS_WITH_WARN
---
# Report

## QC Verdict

PASS_WITH_WARN

모든 항목이 기준을 충족합니다.
rC      문서 업데이트rG   r9   Fz@expected ok=False (PASS_WITH_WARN but no WARN items) but got ok=rH   r   r;   z;expected missing_warns or violations but got missing_warns=r:   N)r4   r=   rD   r>   r?   s      r   +test_warn_pass_with_warn_missing_items_failrL      s    	8  'f'-(=v'FHF $<5  Tl^	%  vzz/2./!3s6::lTV;W7X[\7\ O45]6::lC[B\	^\7\3r   c                 z    d}t        | t        d|      }|d   du sJ d|d    d|j                  d              y	)
u   JSON=FAIL + 본문 '## QC Verdict\n\nOVERALL FAIL' + 사유 명시 → ok=True.

    FAIL verdict를 정직하게 보고서에도 기재하면 ok=True 여야 한다.
    ue   ---
qc_verdict: FAIL
---
# Report

## QC Verdict

OVERALL FAIL

사유: 핵심 테스트 3건 실패
FAILr8   r9   Tz5expected ok=True (FAIL honestly reported) but got ok=r:   r;   Nr<   r?   s      r   test_fail_overall_fail_okrO      s`    	1  'f'-/F $<4 Tl^=L1I0J	Lr   c           	          d}t        | t        d|ddi      }|d   du s1J d|d    d|j                  d	       d
|j                  d              y)u   인용 블록(> ...) 안의 가짜 OVERALL PASS 무시 — 실제 verdict PASS_WITH_WARN → ok=True.

    보고서에 '> 이전 표현: OVERALL PASS' 인용이 있어도
    실제 ## QC Verdict 섹션이 PASS_WITH_WARN이면 ok=True여야 한다.
    u   ---
qc_verdict: PASS_WITH_WARN
---
# Report

> 이전 표현: OVERALL PASS

## QC Verdict

PASS_WITH_WARN

### WARN Items
- WARN: 문서 업데이트 지연
rC   rK   rG   r9   TzDexpected ok=True (quoted OVERALL PASS should be ignored) but got ok=r:   r;   z, report_verdict=report_verdictNr<   r?   s      r    test_quoted_overall_pass_ignoredrR     s~    	/  'f'-(=v'FHF $<4 Tl^=L1I0J K **%567	9r   c                     d}t        | t        d|      }|d   du sJ d|d           |j                  d      .|j                  d      d	k(  sJ d
|j                  d              yy)uW   frontmatter도 ## QC Verdict 섹션도 없으면 ok=False (보고서 정직성 강제).uF   # 그냥 보고서

작업 내용만 있고 QC Verdict 선언 없음.
r7   r8   r9   Fz1expected ok=False (no verdict marker) but got ok=rQ   N z1expected report_verdict to be None/empty but got r<   r?   s      r   test_no_verdict_marker_failrU   #  s    	>  'f'-/F $<5  
;F4L>J  ::&'/6::>N3OSU3U 
;FJJGW<X;YZU3U/r   c                  Z   t        j                  dt        t              dgddt        t                    } | j
                  dk(  s.J d| j
                   d| j                   d| j                          | j                  | j                  z   t        fd	d
D              s
J d        y)u8   ./scripts/guard.sh --help → exit 0 + 사용법 출력.bashz--helpTcapture_outputtextcwdr   z&expected exit 0 for --help but got rc=
stdout=
stderr=c              3   B   K   | ]  }|j                         v   y wN)lower).0kwcombineds     r   	<genexpr>z%test_guard_sh_help.<locals>.<genexpr>F  s     ^"rX^^%%^s   )usageguardscopehelpu   사용z&Expected usage info in --help output:
N)	
subprocessrunr)   	_GUARD_SH
_WORKSPACE
returncodestdoutstderrany)r3   rc   s    @r   test_guard_sh_helprq   9  s     ^^	Y*$
OF
 ! 
01B1B0C D--	&--	:! }}v}},H^0]^^ 
1(<^r   c            
      f   dD ]  } t        j                  dt        t              | dgddt        t                    }|j
                  dk(  s1J d|  d|j
                   d	|j                   d
|j                          d|j                  j                         v rJ d|  d|j                           y)uA   guard.sh enqueue task-x → exit 2 + stderr에 'not implemented'.)enqueuezpre-taskz
merge-nextrW   ztask-xTrX      z	guard.sh z: expected exit 2 but got rc=r\   r]   znot implementedz0: expected 'not implemented' in stderr but got:
N)	ri   rj   r)   rk   rl   rm   rn   ro   r`   )cmdr3   s     r   &test_guard_sh_phase2_3_not_implementedrv   K  s     5 
S^S(3dJ

   A% 	
u9&:K:K9L Mmm_Ifmm_>	
% !FMM$7$7$99 	
uMfmm_]	
9
r   c                    | dz  }|j                  dd       | dz  }|j                  dd       ddlm}  |d	t        |       t        |      t        |      
      }|d   du s
J d|        t	        d |d   D              sJ y)uK   JSON=PASS인데 보고서가 PASS_WITH_WARN이면 정직성 위반 — FAILqc.jsonz+{"qc_result": "PASS", "checks_summary": {}}r   r   	report.mduN   ---
qc_verdict: PASS_WITH_WARN
---
# 보고서

## QC Verdict

PASS with WARN
r   r/   test-xr%   r(   r'   r9   Fu(   PASS+PASS_WITH_WARN 은 mismatch여야: c              3   $   K   | ]  }d |v  
 yw)MISMATCHN )ra   vs     r   rd   z9test_pass_pass_with_warn_mismatch_fail.<locals>.<genexpr>o  s     =1zQ=s   r;   N)r   r&   r/   r)   rp   r5   r1   r(   r/   r3   s        r   &test_pass_pass_with_warn_mismatch_failr   a  s     "GDwW[(K`   &8s8}";/GNF$<5 U$LVH"UU =|(<====r   c                     | dz  }|j                  dd       | dz  }|j                  dd       ddlm}  |d	t        |       t        |      t        |      
      }|d   du s
J d|        |d   g k(  sJ y)u\   JSON=PASS일 때 missing_warns 분기 들어가지 않아도 UnboundLocalError 없이 동작rx   z8{"qc_result": "PASS", "checks_summary": {"foo": "PASS"}}r   r   ry   uB   ---
qc_verdict: PASS
---
# 보고서

## QC Verdict

OVERALL PASS
r   rz   r{   r|   r9   Tu   PASS+PASS는 OK여야: rH   N)r   r&   r/   r)   r   s        r   7test_missing_warns_no_uncaught_exception_when_json_passr   r  s     "GQ\cd[(KT   &8s8}";/GNF$<4C#:6(!CC/"b(((r   r_   )r	   N)#__doc__r   ri   r+   pathlibr   pytestr*   rl   _GUARD_QC_PYrk   r=   exists_QC_MISSING_SH_MISSINGmarkskipif_skip_qc_skip_shr)   dictr   r    r4   rA   rE   rI   rL   rO   rR   rU   rq   rv   r   r   r   r   r   <module>r      s  $   
  
 12)*
22j(	"
  &&((##%%;;F   ;;<   484 #  %)D[<@ s S T  .2D 3 "Tz  $d{ 7;J 
   
0 
$ 4  
6 
$ 4  
< 
$ 4  
< 
   
6 
t   
@ 
$ 4  
* 
 
" 

 

* 
>T >d > 
>  
)d )t ) 
)r   