
    Ai:                     d   d Z ddlZddl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	             ddlmZm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y)u  
test_file_check_enhanced.py - file_check 강화 및 duplicate_check 단위 테스트

테스트 항목:
1. file_check: task_id가 보고서에 포함 → PASS (기존 동작 유지)
2. file_check: task_id가 보고서에 미포함 → WARN
3. file_check: SCQA 섹션 모두 존재 → PASS
4. file_check: SCQA 섹션 누락 → WARN (FAIL 아님)
5. duplicate_check: 유사 보고서 없음 → PASS
6. duplicate_check: 유사 보고서 있음 (80%+) → WARN
7. duplicate_check: 보고서 없음 → SKIP
    N)Path)duplicate_check
file_checkreports_dirtask_idcontentreturnc                     t         j                  j                  | | d      }t        |dd      5 }|j	                  |       ddd       |S # 1 sw Y   |S xY w)uA   reports_dir에 {task_id}.md 파일을 생성하고 경로 반환.z.mdwzutf-8)encodingN)ospathjoinopenwrite)r   r   r   r   fs        C/home/jay/workspace/teams/dev1/qc/tests/test_file_check_enhanced.py_write_reportr   !   sP    77<<y_5D	dC'	* a	KKs   AAc                   &    e Zd ZdZdZd Zd Zd Zy)TestFileCheckTaskIdInReportu1   보고서 파일 내 task_id 포함 여부 검증uR   S: 상황 설명
C: 문제 발생
Q: 해결 방법은?
A: 다음과 같이 해결
c                    d}d| d| j                    }t        j                         5 }t        |||       t	        j
                  |g d|      }ddd       dj                  d         }d	|j                         vsJ y# 1 sw Y   2xY w)
uI   task_id가 보고서에 포함 → warnings에 task_id 관련 WARN 없음task-792# u    완료 보고서
Tr   
file_paths	skip_done_reports_dirN
detailsztask_id not found_SCQA_CONTENTtempfileTemporaryDirectoryr   r   verifyr   lowerselfr   r   tmp_dirresultdetails_strs         r   test_task_id_present_no_warnz8TestFileCheckTaskIdInReport.test_task_id_present_no_warn3   s    wi243E3E2FG((* 	g'7G4&&$	F	 iiy 12"+*;*;*====	 	s   'BB
c                 B   d}d| j                   z   }t        j                         5 }t        |||       t	        j
                  |g d|      }ddd       d   dk(  s
J d|        d	j                  |d
         }d|j                         v sd|v sJ yy# 1 sw Y   IxY w)u1   task_id가 보고서에 미포함 → WARN 반환r   u   # 다른 태스크 보고서
Tr   NstatusWARNu(   task_id 미포함 → WARN 기대, got: r   r   r   r    r&   s         r   test_task_id_absent_warnz4TestFileCheckTaskIdInReport.test_task_id_absent_warnC   s    2T5G5GG((* 	g'7G4&&$	F	 h6)^-UV\U]+^^)iiy 12K--//:3LLL3L/	 	s   'BBc                    d}d| j                   z   }t        j                         5 }t        |||       t	        j
                  |g d|      }ddd       dj                  d         }d|v sd|j                         v sJ yy# 1 sw Y   7xY w)	u@   task_id 미포함 시 details에 task_id 관련 메시지 포함r   u   # 복사된 보고서입니다
Tr   Nr   r   r   r    r&   s         r   +test_task_id_absent_details_mention_task_idzGTestFileCheckTaskIdInReport.test_task_id_absent_details_mention_task_idS   s    4t7I7II((* 	g'7G4&&$	F	 iiy 12[(I9J9J9L,LLL,L(	 	s   'BBN)__name__
__module____qualname____doc__r!   r+   r/   r1        r   r   r   .   s    ;uM> M Mr7   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestFileCheckSCQASectionsu#   보고서 SCQA 섹션 존재 검증c                    d}d| d}t        j                         5 }t        |||       t        j                  |g d|      }ddd       dj                  d         }d	|vsd
|d   vsd|j                         vsJ yyy# 1 sw Y   ?xY w)u5   SCQA 섹션 모두 존재 → SCQA 관련 WARN 없음r   r   up   
**S**: 현재 시스템 상황
**C**: 문제 발생
**Q**: 어떻게 해결?
**A**: 다음 방법으로 해결
Tr   Nr   r   SCQAr.   r-   zscqa missingr"   r#   r   r   r$   r   r%   r&   s         r   &test_all_scqa_sections_present_no_warnz@TestFileCheckSCQASections.test_all_scqa_sections_present_no_warnk   s    	 2 2 	 ((* 	g'7G4&&$	F	 iiy 12[(F&:J,JndodududwNwwwNw,J(	 	s   'BBc                     d}d| d}t        j                         5 }t        |||       t        j                  |g d|      }ddd       d   dk(  s
J d	|        |d   d
k7  sJ d       y# 1 sw Y   +xY w)u)   SCQA 섹션 누락 → WARN (FAIL 아님)r   r   uW   
이것은 SCQA 포맷이 없는 보고서입니다.
구현 내용만 기술합니다.
Tr   Nr-   r.   u"   SCQA 누락 → WARN 기대, got: FAILu2   SCQA 누락은 FAIL이 아니라 WARN이어야 함r"   r#   r   r   r$   r'   r   r   r(   r)   s        r   (test_scqa_sections_missing_warn_not_failzBTestFileCheckSCQASections.test_scqa_sections_missing_warn_not_fail   s    wiyz((* 	g'7G4&&$	F	 h6)X-OPVx+XX)h6)_+__)	 	s   'A..A7c                    d}d| d}t        j                         5 }t        |||       t        j                  |g d|      }ddd       dj                  d         }d	|v sd
|j                         v sJ yy# 1 sw Y   7xY w)u7   SCQA 누락 시 details에 SCQA 관련 메시지 포함r   r   u#   
일반 보고서 내용입니다.
Tr   Nr   r   r;   scqar<   r&   s         r   &test_scqa_missing_details_mention_scqaz@TestFileCheckSCQASections.test_scqa_missing_details_mention_scqa   s    wiDE((* 	g'7G4&&$	F	 iiy 12$+2C2C2E(EEE(E$	 	   'A::Bc                    d}d| d}t        j                         5 }t        |||       t        j                  |g d|      }ddd       dj                  d         }d	|vsd
|j                         vsJ yy# 1 sw Y   7xY w)uB   Situation/Complication/Question/Answer 키워드도 SCQA로 인정r   r   uW   
## Situation
현재 상황
## Complication
문제
## Question
질문
## Answer
답변
Tr   Nr   r   r;   missingr<   r&   s         r   !test_scqa_with_full_word_keywordsz;TestFileCheckSCQASections.test_scqa_with_full_word_keywords   s    	 " " 	 ((* 	g'7G4&&$	F	 iiy 12[(I[=N=N=P,PPP,P(	 	rF   c                     d}d| d}t        j                         5 }t        |||       t        j                  |g d|      }ddd       d   dk(  sJ y# 1 sw Y   xY w)	u$   일부 SCQA 섹션만 있으면 WARNr   r   u   
S: 상황
C: 문제
Tr   Nr-   r.   r@   rA   s        r   test_scqa_partial_missing_warnz8TestFileCheckSCQASections.test_scqa_partial_missing_warn   s    	   	 ((* 	g'7G4&&$	F	 h6)))	 	s   'AA N)	r2   r3   r4   r5   r=   rB   rE   rI   rK   r6   r7   r   r9   r9   h   s"    -x*`FQ,*r7   r9   c                       e Zd ZdZd Zd Zy)TestDuplicateCheckNoSimilaru*   유사 보고서가 없을 때 PASS 반환c                    d}d| d}d}d}t        j                         5 }t        |||       t        |d|       t        |d|       t        j                  ||      }d	d	d	       d
   dk(  s
J d|        y	# 1 sw Y   xY w)u0   완전히 다른 내용의 보고서들 → PASSr   r   u    완료 보고서
S: 새로운 검증 기능 구현 완료
C: 보고서 검증이 필요함
Q: 어떻게 자동화할까?
A: duplicate_check verifier를 추가하여 해결
u   # task-100 다른 보고서
전혀 다른 내용의 보고서입니다. API 설계 관련.
데이터베이스 스키마를 변경하였습니다.
u   # task-200 또 다른 보고서
완전히 새로운 주제의 보고서. UI 개선 관련.
사용자 경험을 향상시켰습니다.
task-100ztask-200r   Nr-   PASSu.   유사 보고서 없음 → PASS 기대, got: r"   r#   r   r   r$   )r'   r   current_contentother_content_1other_content_2r(   r)   s          r   test_no_similar_reports_passz8TestDuplicateCheckNoSimilar.test_no_similar_reports_pass   s    	 C C 	G 	; 	
 ((* 	Kg'7O<':?':?$++G'JF		K
 h6)d-[\b[c+dd)	K 	Ks   ?A;;Bc                     d}d| d}t        j                         5 }t        |||       t        j                  ||      }ddd       dv sJ d|v sJ t        |d   t              sJ y# 1 sw Y   +xY w)u)   PASS 결과에 status, details 키 존재r   r      
내용
rP   Nr-   r   )r"   r#   r   r   r$   
isinstancelistrA   s        r   "test_pass_result_has_required_keysz>TestDuplicateCheckNoSimilar.test_pass_result_has_required_keys   s    wiz*((* 	Kg'7G4$++G'JF	K 6!!!F"""&+T222	K 	Ks   %A,,A5N)r2   r3   r4   r5   rV   r[   r6   r7   r   rM   rM      s    4e6	3r7   rM   c                   "    e Zd ZdZd Zd Zd Zy) TestDuplicateCheckHighSimilarityu5   80% 이상 유사한 보고서 존재 시 WARN 반환c                     d}d}d| d|z   }d|z   }t        j                         5 }t        |||       t        |d|       t        j                  ||      }ddd       d	   d
k(  s
J d|        y# 1 sw Y   xY w)u#   거의 동일한 보고서 → WARNr   u   # 완료 보고서
S: 현재 시스템 상황 설명
C: 문제가 발생하여 해결이 필요함
Q: 어떻게 해결할까?
A: 다음 방법으로 해결하였음
구현 내용: 로직 수정 및 테스트 추가
결론: 정상 동작 확인
r   r   # task-old
task-oldrP   Nr-   r.   u3   80%+ 유사 보고서 존재 → WARN 기대, got: rR   )r'   r   base_contentrS   similar_contentr(   r)   s          r   test_high_similarity_warnz:TestDuplicateCheckHighSimilarity.test_high_similarity_warn   s    - 	 wir*\9(<7((* 	Kg'7O<':?$++G'JF	K h6)i-`ag`h+ii)		K 	Ks   2A44A=c                 2   d}d}d| d|z   }d|z   }t        j                         5 }t        |||       t        |d|       t        j                  ||      }ddd       d	   d
k(  r#dj                  |d         }d|v s
J d|        yy# 1 sw Y   5xY w)u.   WARN 시 details에 유사한 파일명 포함r   a  X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X r   r   r_   r`   rP   Nr-   r.   r   u4   유사 파일명이 details에 포함되어야 함: )r"   r#   r   r   r$   r   )r'   r   ra   rS   rb   r(   r)   r*   s           r   1test_high_similarity_details_mention_similar_filezRTestDuplicateCheckHighSimilarity.test_high_similarity_details_mention_similar_file  s    !wir*\9(<7((* 	Kg'7O<':?$++G'JF	K
 (v%))F9$56K,r0depdq.rr, &	K 	Ks   2BBc                     d}d}d| d|z   }d|z   }t        j                         5 }t        |||       t        |d|       t        j                  ||      }ddd       d	   d
k(  sJ y# 1 sw Y   xY w)u(   80% 이상이면 WARN, 미만이면 PASSr   uR  동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 동일한 내용 r   r   z# task-other
z
task-otherrP   Nr-   r.   rR   )r'   r   identical_contentrS   other_contentr(   r)   s          r   $test_similarity_threshold_exactly_80zETestDuplicateCheckHighSimilarity.test_similarity_threshold_exactly_80&  s    4wir*->>(+<<((* 	Kg'7O<'<?$++G'JF	K h6)))		K 	Ks   2A,,A5N)r2   r3   r4   r5   rc   re   ri   r6   r7   r   r]   r]      s    ?j.s *r7   r]   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestDuplicateCheckNoReportu-   현재 task_id의 보고서가 없으면 SKIPc                     t        j                         5 }t        |dd       t        j                  d|      }ddd       d   dk(  s
J d|        y# 1 sw Y   xY w)	u(   현재 task_id 보고서 없음 → SKIPrO   u   # task-100
내용
task-nonexistent-99999rP   Nr-   SKIPu'   보고서 없음 → SKIP 기대, got: rR   r'   r(   r)   s      r    test_current_report_missing_skipz;TestDuplicateCheckNoReport.test_current_report_missing_skip=  sn    ((* 	\g':/EF$++,DSZ[F	\ h6)]-TU[T\+]])		\ 	\s   %AAc                     t        j                         5 }t        j                  d|      }ddd       d   dk(  sJ y# 1 sw Y   xY w)u,   reports 디렉토리가 비어있으면 SKIPr   rP   Nr-   rn   )r"   r#   r   r$   ro   s      r   test_empty_reports_dir_skipz6TestDuplicateCheckNoReport.test_empty_reports_dir_skipE  sN    ((* 	Ng$++JWMF	Nh6)))	N 	Ns   A  A	c                     d}d| d}t        j                         5 }t        |||       t        j                  ||      }ddd       d   dv sJ y# 1 sw Y   xY w)uc   현재 보고서만 있고 비교 대상 없음 → PASS (비교 대상 없으므로 중복 없음)r   r   rX   rP   Nr-   )rQ   rn   rR   rA   s        r   #test_no_other_reports_pass_not_skipz>TestDuplicateCheckNoReport.test_no_other_reports_pass_not_skipK  sp    wiz*((* 	Kg'7G4$++G'JF	K h#3333		K 	Ks   %AAc                     t        j                         5 }t        j                  d|      }ddd       d   dk(  sJ t	        |d         dkD  sJ y# 1 sw Y   'xY w)u!   SKIP 시 details에 이유 포함rm   rP   Nr-   rn   r   r   )r"   r#   r   r$   lenro   s      r    test_skip_details_mention_reasonz;TestDuplicateCheckNoReport.test_skip_details_mention_reasonU  sh    ((* 	\g$++,DSZ[F	\h6)))6)$%)))	\ 	\s   AAc                 F    t        j                  dd      }|d   dk(  sJ y)u-   reports 디렉토리 자체가 없으면 SKIPr   z /tmp/nonexistent_dir_vulcan_testrP   r-   rn   N)r   r$   )r'   r)   s     r   test_reports_dir_not_exist_skipz:TestDuplicateCheckNoReport.test_reports_dir_not_exist_skip\  s(     ''
Acdh6)))r7   N)	r2   r3   r4   r5   rp   rr   rt   rw   ry   r6   r7   r   rk   rk   :  s    7^*4**r7   rk   )r5   r   sysr"   pathlibr   pytest__file__parent_QC_DIRstrr   insert	verifiersr   r   r   r   r9   rM   r]   rk   r6   r7   r   <module>r      s    
 
    x.


&
&w<sxxHHOOAs7|$ 1s S 3 3 2M 2Mt]* ]*J'3 '3^6* 6*|%* %*r7   