
    giI>                        d Z ddlZddlmZ ddlZ ee      j                  j                  Z ee      ej                  vr"ej                  j                  d ee             edz  Z ee      ej                  vr"ej                  j                  d ee             	 ddlmZ dZej                   j#                  e d	      Zd
edededefdZd
ede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 G d d      Z G d d      Zy# e$ r 	 ddlZdZn# e$ r dZY nw xY wY w xY w)u  
test_spec_compliance.py - spec_compliance verifier 단위 테스트

테스트 항목:
1. task 파일에 체크리스트 있고, 보고서에 모든 키워드 포함 → PASS
2. task 파일에 체크리스트 있고, 보고서에 일부 키워드만 → WARN
3. task 파일 없음 → SKIP
4. 보고서 없음 → SKIP
5. 체크리스트 항목 0개 → PASS
6. - [x] 항목은 이미 완료로 간주 (검증 대상 아님)
    N)Path	verifiers)spec_complianceTFuW   spec_compliance 모듈이 아직 구현되지 않음 — 구현 후 테스트 활성화)reasontmp_pathtask_idcontentreturnc                 l    | dz  }|j                  dd       || dz  }|j                  |d       |S )uG   임시 tasks 디렉토리에 task 파일을 생성하고 경로 반환.tasksTparentsexist_ok.mdutf-8encodingmkdir
write_text)r   r   r	   	tasks_dir	task_files        ?/home/jay/workspace/teams/dev1/qc/tests/test_spec_compliance.py_make_task_filer   3   sE    7"IOOD4O0wisO+I73    c                 l    | dz  }|j                  dd       || dz  }|j                  |d       |S )uN   임시 reports 디렉토리에 보고서 파일을 생성하고 경로 반환.reportsTr   r   r   r   r   )r   r   r	   reports_dirreport_files        r   _make_report_filer    <   sH    Y&KdT27)3/K7W5r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestAllChecklistItemsCovereduZ   task에 - [ ] 항목이 있고, 보고서에 해당 키워드가 모두 포함되면 PASS.c                     d}d}t        |d|      }t        |d|      }t        j                  dt	        |dz        t	        |dz              }|d   dk(  s
J d	|        y )
NuB   # 작업

- [ ] API 엔드포인트 구현
- [ ] 테스트 작성
uI   # 보고서

API 엔드포인트 구현 완료. 테스트 작성 완료.
ztask-test-passr   r   r   r   statusPASSu+   모든 항목 커버 시 PASS 기대, got: r   r    r   verifystr)selfr   task_contentreport_contentr   r   results          r   test_all_covered_status_passz9TestAllChecklistItemsCovered.test_all_covered_status_passM   s{    _g#H.>M	'2BNS ''(W,-Hy01

 h6)a-XY_X`+aa)r   c                     d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }d|v sJ d       d	|v sJ d
       t        |d	   t              sJ d       y )Nu'   - [ ] 데이터베이스 연결 설정
u)   데이터베이스 연결 설정 완료.
z	task-keysr   r   r$   r%   u    결과에 'status' 키가 없음detailsu!   결과에 'details' 키가 없음u   'details'는 list여야 함r   r    r   r(   r)   
isinstancelistr*   r   r+   r,   r-   s        r   "test_all_covered_has_required_keysz?TestAllChecklistItemsCovered.test_all_covered_has_required_keys[   s    AE+|<(K@ ''(W,-Hy01

 6!E#EE!F"G$GG"&+T2Q4QQ2r   c                     d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }t        |d         dkD  sJ d	       y )
Nu   - [ ] 파일 검증 구현
u,   파일 검증 구현을 완료했습니다.
ztask-detailsr   r   r$   r0   r   u/   PASS여도 details에 최소 1개 항목 필요)r   r    r   r(   r)   lenr4   s        r   "test_all_covered_details_not_emptyz?TestAllChecklistItemsCovered.test_all_covered_details_not_emptyk   sq    5H.,?(NNC ''(W,-Hy01

 6)$%)\+\\)r   c                     d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   dk(  s
J d	|        y )
Nui   # 작업 지시서

- [ ] 스키마 정의
- [ ] 마이그레이션 실행
- [ ] 단위 테스트 추가
ul   ## 완료 사항
스키마 정의 완료.
마이그레이션 실행 완료.
단위 테스트 추가 완료.
z
task-multir   r   r$   r%   r&   u0   3개 항목 모두 커버 → PASS 기대, got: r'   r4   s        r   )test_multiple_checklist_items_all_coveredzFTestAllChecklistItemsCovered.test_multiple_checklist_items_all_coveredy   s{     Q U,=(L.A ''(W,-Hy01

 h6)f-]^d]e+ff)r   N)__name__
__module____qualname____doc__r.   r5   r8   r:    r   r   r"   r"   J   s    dbR ]gr   r"   c                   "    e Zd ZdZd Zd Zd Zy)TestSomeChecklistItemsUncovereduJ   일부 체크리스트 항목의 키워드가 보고서에 없으면 WARN.c                     d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   dk(  s
J d	|        y )
Nu<   - [ ] 캐시 레이어 구현
- [ ] 성능 최적화 적용
u    캐시 레이어 구현 완료.
z	task-warnr   r   r$   r%   WARNu'   일부 미커버 → WARN 기대, got: r'   r4   s        r    test_partial_covered_status_warnz@TestSomeChecklistItemsUncovered.test_partial_covered_status_warn   su    Z<+|<(K@ ''(W,-Hy01

 h6)]-TU[T\+]])r   c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }dj                  |d         }d	|v s'd
|v s"d|j                         v sd|v s
J d|        y y y y )Nu9   - [ ] 로깅 시스템 구축
- [ ] 알림 발송 기능
u    로깅 시스템 구축 완료.
ztask-warn-detailr   r   r$   
r0   u   알림u   발송	uncoveredu	   미커버u4   미커버 항목이 details에 언급되지 않음: )r   r    r   r(   r)   joinlowerr*   r   r+   r,   r-   details_strs         r   .test_partial_covered_details_mention_uncoveredzNTestSomeChecklistItemsUncovered.test_partial_covered_details_mention_uncovered   s    W<"4lC($6G ''(W,-Hy01

 iiy 12 #;&k//11k)		P
 B+O	P* * 2 ' $r   c                     d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   dk(  s
J d	|        y )
Nu$   - [ ] 복잡한 리팩토링 작업
u   작업을 완료했습니다.
ztask-all-uncoveredr   r   r$   r%   rC   u'   전체 미커버 → WARN 기대, got: r'   r4   s        r   test_all_uncovered_status_warnz>TestSomeChecklistItemsUncovered.test_all_uncovered_status_warn   sw    >:"6E($8.I '' (W,-Hy01

 h6)]-TU[T\+]])r   N)r;   r<   r=   r>   rD   rL   rN   r?   r   r   rA   rA      s    T^P*^r   rA   c                       e Zd ZdZd Zd Zy)TestTaskFileMissingu+   task 파일이 존재하지 않으면 SKIP.c                     |dz  }|j                  dd       t        j                  dt        |dz        t        |            }|d   dk(  s
J d	|        y )
Nr   Tr   ztask-nonexistentr   r$   r%   SKIPu(   task 파일 없으면 SKIP 기대, got: )r   r   r(   r)   )r*   r   r   r-   s       r   "test_missing_task_file_status_skipz6TestTaskFileMissing.test_missing_task_file_status_skip   sk    *$6 ''(W,-K(

 h6)^-UV\U]+^^)r   c                     t        j                  dt        |dz        t        |dz              }t        |d         dkD  sJ d       y )Ntask-no-filenonexistent_tasksr   r$   r0   r   &   SKIP이어도 details에 이유 필요)r   r(   r)   r7   r*   r   r-   s      r   -test_missing_task_file_details_mention_reasonzATestTaskFileMissing.test_missing_task_file_details_mention_reason   sP     ''(%889Hy01

 6)$%)S+SS)r   N)r;   r<   r=   r>   rS   rY   r?   r   r   rP   rP      s    5
_Tr   rP   c                       e Zd ZdZd Zd Zy)TestReportFileMissingu0   보고서 파일이 존재하지 않으면 SKIP.c                     d}t        |d|       t        j                  dt        |dz        t        |dz              }|d   dk(  s
J d|        y )	N   - [ ] 기능 구현
ztask-no-reportr   r   r$   r%   rR   u&   보고서 없으면 SKIP 기대, got: )r   r   r(   r)   r*   r   r+   r-   s       r   $test_missing_report_file_status_skipz:TestReportFileMissing.test_missing_report_file_status_skip   sg    ."2LA !''(W,-Hy01

 h6)\-STZS[+\\)r   c                     d}t        |d|       t        j                  dt        |dz        t        |dz              }t	        |d         dkD  sJ d       y )	Nr]   ztask-no-report2r   nonexistent_reportsr$   r0   r   rW   )r   r   r(   r)   r7   r^   s       r   *test_missing_report_details_mention_reasonz@TestReportFileMissing.test_missing_report_details_mention_reason   sb    ."3\B ''(W,-H'<<=

 6)$%)S+SS)r   N)r;   r<   r=   r>   r_   rb   r?   r   r   r[   r[      s    :
]	Tr   r[   c                       e Zd ZdZd Zd Zy)TestNoChecklistItemsu0   체크리스트 항목이 없으면 (0개) PASS.c                     d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   dk(  s
J d	|        y )
Nu,   # 작업 지시서

단순 작업입니다.
u#   # 완료 보고서

작업 완료.
ztask-no-checklistr   r   r$   r%   r&   u+   체크리스트 0개 → PASS 기대, got: r'   r4   s        r   test_no_checklist_status_passz2TestNoChecklistItems.test_no_checklist_status_pass  sw    HA"5|D($7H ''(W,-Hy01

 h6)a-XY_X`+aa)r   c                     d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   dk(  s
J d	|        y
)u>   - [x] 항목만 있으면 미완료 항목 0개이므로 PASS.uG   # 작업

- [x] 이미 완료된 항목
- [x] 또 다른 완료 항목
u#   # 보고서

모든 작업 완료.
ztask-only-doner   r   r$   r%   r&   u,   - [x] 항목만 있으면 PASS 기대, got: Nr'   r4   s        r   1test_only_completed_items_treated_as_no_checklistzFTestNoChecklistItems.test_only_completed_items_treated_as_no_checklist  sw    dA"2LA($4nE ''(W,-Hy01

 h6)b-YZ`Ya+bb)r   N)r;   r<   r=   r>   rf   rh   r?   r   r   rd   rd     s    :bcr   rd   c                       e Zd ZdZd Zd Zy)TestCompletedItemsIgnoredu;   - [x] 항목은 검증 대상에서 제외되어야 한다.c                     d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   dk(  s
J d	|        y )
Nu<   - [x] 완료된 작업 항목
- [ ] 미완료 작업 항목
u'   미완료 작업 항목 처리 완료.
z
task-mixedr   r   r$   r%   r&   uD   - [x] 항목은 무시되고 - [ ] 항목만 검증해야 함, got: r'   r4   s        r   !test_completed_items_not_verifiedz;TestCompletedItemsIgnored.test_completed_items_not_verified.  su    ZC,=(L.A ''(W,-Hy01
 h6)z-qrxqy+zz)r   c                     d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }dj                  |d         }d	|vs|d
   dk(  s
J d|        y y )NuB   - [x] 완료된 특별한 작업
- [ ] 진행중인 신규 기능
u#   완료된 특별한 작업 내용.
ztask-mixed-warnr   r   r$   rF   r0   u   완료된 특별한 작업r%   r&   u:   - [x] 항목이 미커버 목록에 나타나면 안 됨: )r   r    r   r(   r)   rH   rJ   s         r   *test_completed_items_not_in_uncovered_listzDTestCompletedItemsIgnored.test_completed_items_not_in_uncovered_list>  s    `?"3\B($5~F ''(W,-Hy01

 iiy 12 );vh?OSY?Y	VG}U	VY?Y;r   N)r;   r<   r=   r>   rl   rn   r?   r   r   rj   rj   +  s    E{ Vr   rj   c                   "    e Zd ZdZd Zd Zd Zy)TestReturnFormatContractuO   verify() 반환 딕셔너리가 항상 규약된 형식을 따르는지 확인.c                     d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }|d   dv sJ d	|d           y )
Nr]      기능 구현 완료.
ztask-formatr   r   r$   r%   >   FAILr&   rR   rC   u(   status가 유효한 enum 값이 아님: r'   r4   s        r   test_status_is_valid_enumz2TestReturnFormatContract.test_status_is_valid_enumZ  s    .2->(M>B ''(W,-Hy01

 h $
 
 	I
 6fX6F5GH	I 
r   c                    d}d}t        |d|       t        |d|       t        j                  dt	        |dz        t	        |dz              }t        |d   t              sJ d       |d   D ]  }t        |t              rJ d	|        y )
Nr]   rr   ztask-format2r   r   r$   r0   u   details가 list가 아님u!   details 항목이 str이 아님: r1   )r*   r   r+   r,   r-   items         r   test_details_is_list_of_stringsz8TestReturnFormatContract.test_details_is_list_of_stringsm  s    .2.,?(NNC ''(W,-Hy01

 &+T2O4OO29% 	WDdC(V,MdX*VV(	Wr   c                 |    t        j                  dt        |dz        t        |dz              }d|v sJ d|v sJ y )NrU   no_tasks
no_reportsr$   r%   r0   )r   r(   r)   rX   s      r   test_has_both_required_keysz4TestReturnFormatContract.test_has_both_required_keys}  sM     ''(Z/0H|34

 6!!!F"""r   N)r;   r<   r=   r>   rt   rw   r{   r?   r   r   rp   rp   W  s    YI&W #r   rp   )r>   syspathlibr   pytest__file__parent_QC_DIRr)   pathinsert_VERIFIERS_DIRr   r   _MODULE_AVAILABLEImportErrormarkskipif
pytestmarkr   r    r"   rA   rP   r[   rd   rj   rp   r?   r   r   <module>r      s  
    x.


&
&w<sxxHHOOAs7|$;&~chh&HHOOAs>*+
") [[d   
d S 3 4  s S T ;g ;gF3^ 3^vT T:T T@c cL$V $VX-# -#o	  ""  "!""s6   D$ $E*D10E1D;8E:D;;E E