
    i!                     ~   d Z ddlZddlmc mZ ddlZddl	m
Z
  e
e      j                  j                  dz  Zej                  j                  d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j2                  defdeef      d ej4                         v s ej6                  e      r ej8                  e      nd ej8                  e      d	z  Zd
deiz  Zej?                  e       er ej2                  defdeef      d ej4                         v s ej6                  e      r ej8                  e      nd ej8                  e       ej8                  e      dz  Z dde iz  Z!ej?                  e!        ejD                  ed      i z  Z#dde#iz  Z$ e% ejL                  e$            dxZxZxZxZxZxZZej                  jO                  e      Z(ej*                  jS                  e(       e(jT                  Z*dZ+de
de,ddfdZ-de
de,ddfdZ.d Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d  Z7d! Z8y)"u  
test_l1_smoketest_check.py — l1_smoketest_check.py의 verify 함수 단위 테스트.

10개 시나리오:
1. 보고서 파일 없음 → SKIP
2. 보고서에 L1 섹션 없음 → FAIL
3. BLOCK 패턴 매칭 → FAIL
4. 백엔드 작업 + 해당없음 3줄 → PASS (EXEMPT)
5. 프론트 작업 + 해당없음 3줄 → FAIL (EXEMPT 무효화)
6. 증거 누락 → FAIL
7. 정상 스크린샷 증거 → PASS
8. 정상 curl 증거 → PASS
9. 정상 pytest 증거 → PASS
10. BLOCK 패턴 "N/A.*L1" 매칭 → FAIL
    N)Pathzl1_smoketest_check.pyl1_smoketest_check)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py19ztask-test-9999tmp_pathcontentreturnc                 t    | dz  dz  }|j                  dd       |t         dz  j                  |d       y)	u;   tmp_path/memory/reports/{TASK_ID}.md 에 content를 기록.memoryreportsTparentsexist_ok.mdutf-8encodingNmkdirTASK_ID
write_text)r   r   
report_dirs      L/home/jay/workspace/teams/dev1/qc/verifiers/tests/test_l1_smoketest_check.py_write_reportr"   !   sB    H$y0JTD1WIS/!--g-H    c                 t    | dz  dz  }|j                  dd       |t         dz  j                  |d       y)	u9   tmp_path/memory/tasks/{TASK_ID}.md 에 content를 기록.r   tasksTr   r   r   r   Nr   )r   r   task_dirs      r!   _write_taskr'   (   s?    ("W,HNN4$N/7)3++Gg+Fr#   c                    t        t        t        |             }|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
   }|s8ddt        j
                  |      iz  }t        t        j                  |            d	}y	)uA   보고서 파일 자체가 없으면 SKIP을 반환해야 한다.workspace_rootstatusSKIP==z%(py1)s == %(py4)spy1py4assert %(py6)spy6Ndetailszassert %(py1)sr1   )verifyr   str
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanation)r   result@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_format2s           r!    test_no_report_file_returns_skiprD   4   s    GCM:F(%v%v%%%%v%%%%%%v%%%%%%%)r#   c                 T   d}t        | |       t        t        t        |             }|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
)ud   보고서 파일은 있으나 L1 스모크테스트 섹션이 없으면 FAIL을 반환해야 한다.uk   ## 작업 개요

이 작업은 간단한 리팩토링입니다.

## 변경 내역

- 일부 코드 정리
r)   r+   FAILr-   r/   r0   r3   r4   N	r"   r6   r   r7   r8   r9   r:   r;   r<   r   r   r=   r>   r?   r@   rA   rB   s           r!   test_no_l1_section_returns_failrI   @   sw    G (G$GCM:F(%v%v%%%%v%%%%%%v%%%%%%%r#   c                    d}t        | |       t        t        t        |             }|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        }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}}y
)up   보고서에 'UI 직접 확인 불가' 패턴이 있으면 FAIL이며 details에 'BLOCK 패턴'이 포함된다.uo   ## L1 스모크테스트 결과

- UI 직접 확인 불가 (원격 환경 제약)
- 스크린샷: 해당없음
r)   r+   rF   r-   r/   r0   r3   r4   Nc              3   $   K   | ]  }d |v  
 ywu   BLOCK 패턴N .0ds     r!   	<genexpr>z<test_block_pattern_ui_direct_returns_fail.<locals>.<genexpr>`        >q~">   r5   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anypy0r   r2   r"   r6   r   r7   r8   r9   r:   r;   r<   rU   @py_builtinslocals_should_repr_global_name	r   r   r=   r>   r?   r@   rA   rB   @py_assert1s	            r!   )test_block_pattern_ui_direct_returns_failr^   U   s    G (G$GCM:F(%v%v%%%%v%%%%%%v%%%%%%%>F9,=>>3>>>>>>>>>3>>>3>>>>>>>>>>>>>>r#   c                 l   t        | d       d}t        | |       t        t        t	        |             }|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)uq   
    task 파일에 UI/프론트 키워드 없고 보고서에 해당없음 3줄 이상이면 PASS (면제).
    u9   배치 스크립트 로그 포맷 개선 작업입니다.u   ## 작업 개요

배치 스크립트 수정 작업입니다.

## L1 스모크테스트 결과

- 서버 재시작: 해당없음 (배치 스크립트, 서버 코드 아님)
- API 응답 확인: 해당없음
- 스크린샷: 해당없음
r)   r+   PASSr-   r/   r0   r3   r4   N
r'   r"   r6   r   r7   r8   r9   r:   r;   r<   rH   s           r!   1test_backend_task_three_naexclusions_returns_passrb   h   s     UV
G (G$GCM:F(%v%v%%%%v%%%%%%v%%%%%%%r#   c                 l   t        | d       d}t        | |       t        t        t	        |             }|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)u   
    task 파일에 'UI 컴포넌트' 키워드가 있고 보고서에 해당없음 3줄 + 증거 없으면 FAIL.
    (프론트 작업이므로 면제 무효화)
    u@   UI 컴포넌트 수정 작업입니다. 버튼 스타일 변경.u   ## L1 스모크테스트 결과

- 버튼 렌더링: 해당없음
- 화면 전환: 해당없음
- 레이아웃 확인: 해당없음
r)   r+   rF   r-   r/   r0   r3   r4   Nra   rH   s           r!   2test_frontend_task_three_naexclusions_returns_failrd      s    
 \]G (G$GCM:F(%v%v%%%%v%%%%%%v%%%%%%%r#   c                    d}t        | |       t        t        t        |             }|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        }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}}y
)ub   L1 섹션에 '성공' 키워드가 있어도 스크린샷/curl/테스트 증거가 없으면 FAIL.uR   ## L1 스모크테스트 결과

- 서버 재시작 성공
- 동작 확인 완료
r)   r+   rF   r-   r/   r0   r3   r4   Nc              3   $   K   | ]  }d |v  
 yw)u   증거 부족NrM   rN   s     r!   rQ   z=test_keyword_without_evidence_returns_fail.<locals>.<genexpr>   s     ?!#?rS   r5   rT   rU   rV   rX   r\   s	            r!   *test_keyword_without_evidence_returns_failrg      s    G (G$GCM:F(%v%v%%%%v%%%%%%v%%%%%%%?VI->??3?????????3???3??????????????r#   c                 T   d}t        | |       t        t        t        |             }|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
)uN   L1 섹션에 '성공' 키워드 + 스크린샷 경로(.png)가 있으면 PASS.u`   ## L1 스모크테스트 결과

- 화면 동작 성공
- 스크린샷: /path/to/screenshot.png
r)   r+   r`   r-   r/   r0   r3   r4   NrG   rH   s           r!   %test_screenshot_evidence_returns_passri      w    G (G$GCM:F(%v%v%%%%v%%%%%%v%%%%%%%r#   c                 T   d}t        | |       t        t        t        |             }|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
)uI   L1 섹션에 '확인' 키워드 + 'curl 200 OK' 증거가 있으면 PASS.uX   ## L1 스모크테스트 결과

- API 응답 확인 완료
- curl 200 OK 응답 수신
r)   r+   r`   r-   r/   r0   r3   r4   NrG   rH   s           r!   test_curl_evidence_returns_passrl      rj   r#   c                 T   d}t        | |       t        t        t        |             }|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
)uN   L1 섹션에 '확인' 키워드 + 'pytest 33 passed' 증거가 있으면 PASS.u_   ## L1 스모크테스트 결과

- 테스트 실행 결과 확인
- pytest 33 passed, 0 failed
r)   r+   r`   r-   r/   r0   r3   r4   NrG   rH   s           r!   !test_pytest_evidence_returns_passrn      rj   r#   c                    d}t        | |       t        t        t        |             }|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        }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}}y
)uh   보고서에 'N/A - L1 스킵' 패턴이 있으면 FAIL이며 details에 'BLOCK 패턴'이 포함된다.u   ## 작업 개요

간단한 설정 파일 수정입니다.

## L1 스모크테스트 결과

- N/A - L1 스킵 (설정 파일 변경만)
r)   r+   rF   r-   r/   r0   r3   r4   Nc              3   $   K   | ]  }d |v  
 ywrL   rM   rN   s     r!   rQ   z8test_block_pattern_na_l1_returns_fail.<locals>.<genexpr>   rR   rS   r5   rT   rU   rV   rX   r\   s	            r!   %test_block_pattern_na_l1_returns_failrq      s    G (G$GCM:F(%v%v%%%%v%%%%%%v%%%%%%%>F9,=>>3>>>>>>>>>3>>>3>>>>>>>>>>>>>>r#   )9__doc__builtinsrY   _pytest.assertion.rewrite	assertionrewriter8   importlib.util	importlibpathlibr   __file__parent_MODULE_PATHutilspec_from_file_locationr   r]   @py_assert4r?   r>   loader@py_assert10@py_assert13@py_assert12r9   rZ   r[   r:   @py_format6@py_format8append@py_format15@py_format17_format_boolop@py_format18@py_format20r;   r<   module_from_spec_moduleexec_moduler6   r   r7   r"   r'   rD   rI   r^   rb   rd   rg   ri   rl   rn   rq   rM   r#   r!   <module>r      s        H~$$++.EE../C\R 5D 5uD 5U\\ 5 5\5 5 5 5uD 5 5 5 5 5u 5 5 5u 5 5 5D 5 5 5 5 5 5 5\ 5 5 5 5 5U 5 5 5U 5 5 5\ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
..
)
)%
0    !	
ID I3 I4 IG$ G G G&*?&&4&.@&
&$
&$
&$?r#   