
    Aie                        d Z ddl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 ddl	Z	 ee
      j                  Z ee      ej                  vr"ej                  j                  d ee             ddlmZmZmZmZ ddlmZmZmZmZmZ  eedz        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" G d d      Z# G d d      Z$ G d d      Z% G d d      Z& G d d      Z'y) u  
test_qc_verify.py - qc_verify.py 단위 테스트 (아르고스 작성)

테스트 항목:
1. data_integrity - 정상 케이스 (task-31.1: completed + .done.clear 파일)
2. data_integrity - 비정상 케이스 (task-4.4: completed but no .done file)
3. file_check - 존재하는 파일 → PASS
4. file_check - 없는 파일 → FAIL
5. api_health - --skip api_health 시 SKIP
6. test_runner - --skip test_runner 시 FAIL (MANDATORY)
7. CLI 출력 JSON 형식 검증
8. overall 판정 로직: FAIL 항목 있으면 overall=FAIL
9. critical_gap verifier 테스트
10. MANDATORY blocklist 테스트
11. Skip 로그 추적 테스트
12. .done 파일에 skip 정보 기록 테스트
    N)datetime)Path)_determine_overall
_summarizebuild_result	run_check)
api_healthcritical_gapdata_integrity
file_checktest_runnerzqc_verify.pyc                   "    e Zd ZdZd Zd Zd Zy)TestDataIntegrityNormaluQ   task-31.1: completed 상태이고 .done.clear 파일이 실제로 존재 → PASSc                 R    t        j                  d      }|d   dk(  s
J d|        y )N	task-31.1statusPASSuB   task-31.1은 completed + .done.clear 존재 → PASS 기대, got: r   verifyselfresults     3/home/jay/workspace/teams/dev1/qc/test_qc_verify.py"test_completed_with_done_file_passz:TestDataIntegrityNormal.test_completed_with_done_file_pass0   s4    &&{3h6)x-opvow+xx)    c                 p    t        j                  d      }d|v sJ d|v sJ t        |d   t              sJ y )Nr   r   details)r   r   
isinstancelistr   s     r   test_result_has_required_keysz5TestDataIntegrityNormal.test_result_has_required_keys4   sC    &&{36!!!F"""&+T222r   c                 x    t        j                  d      }dj                  |d         }d|v sJ d|v sd|v sJ y y )Nr   
r   	completedzstatus=r   r   joinr   r   details_strs      r    test_details_contain_status_infoz8TestDataIntegrityNormal.test_details_contain_status_info:   sN    &&{3iiy 12k)))k)Y+-EEE-E)r   N)__name__
__module____qualname____doc__r   r    r(    r   r   r   r   -   s    [y3Fr   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestDataIntegrityAbnormalu=   task-4.4: completed 상태지만 .done 파일 없음 → FAILc                 R    t        j                  d      }|d   dk(  s
J d|        y )Ntask-4.4r   FAILuI   task-4.4는 completed이지만 .done 파일 없음 → FAIL 기대, got: r   r   s     r   %test_completed_without_done_file_failz?TestDataIntegrityAbnormal.test_completed_without_done_file_failI   s4    &&z2h6)-vw}v~+)r   c                 l    t        j                  d      }dj                  |d         }d|v sd|v sJ y y )Nr1   r"   r   r2   z	NOT FOUNDr$   r&   s      r   &test_fail_details_mention_no_done_filez@TestDataIntegrityAbnormal.test_fail_details_mention_no_done_fileM   s@    &&z2iiy 12${(BBB(B$r   c                 B    t        j                  d      }|d   dk(  sJ y)u$   존재하지 않는 task_id → FAILztask-99999.9r   r2   Nr   r   s     r   test_nonexistent_task_failz4TestDataIntegrityAbnormal.test_nonexistent_task_failS   s%    &&~6h6)))r   c                 B    t        j                  d      }|d   dk(  sJ y)u   빈 task_id → SKIP r   SKIPNr   r   s     r   test_empty_task_id_skipz1TestDataIntegrityAbnormal.test_empty_task_id_skipX   s%    &&r*h6)))r   N)r)   r*   r+   r,   r3   r5   r7   r;   r-   r   r   r/   r/   F   s    G@C*
*r   r/   c                   "    e Zd ZdZd Zd Zd Zy)TestFileCheckExistingFileu*   실제 존재하는 파일 경로 → PASSc                 n    t        j                  dt        g      }|d   dk(  sJ dt         d|        y )Nr9   task_id
file_pathsr   r   u   존재하는 파일 u    → PASS 기대, got: )r   r   _QC_VERIFY_PATHr   s     r   test_existing_file_passz1TestFileCheckExistingFile.test_existing_file_passf   sA    ""2?:KLh6)r-A/ARRijpiq+rr)r   c                 p    t        j                  dt        g      }dj                  |d         }d|v sJ y )Nr9   r?   r"   r   OK)r   r   rB   r%   r&   s      r   "test_existing_file_details_show_okz<TestFileCheckExistingFile.test_existing_file_details_show_okj   s8    ""2?:KLiiy 12{"""r   c                 F    t        j                  dg       }|d   dk(  sJ y)u*   파일도 없고 task_id도 없으면 SKIPr9   r?   r   r:   Nr   r   r   s     r   test_no_files_no_task_skipz4TestFileCheckExistingFile.test_no_files_no_task_skipo   s'    ""2"=h6)))r   N)r)   r*   r+   r,   rC   rF   rI   r-   r   r   r=   r=   c   s    4s#
*r   r=   c                       e Zd ZdZd Zd Zy)TestFileCheckMissingFileu*   존재하지 않는 파일 경로 → FAILc                 X    t        j                  ddg      }|d   dk(  s
J d|        y )Nr9   #/tmp/nonexistent_argos_test_file.pyr?   r   r2   u+   없는 파일 경로 → FAIL 기대, got: rH   r   s     r   test_missing_file_failz/TestFileCheckMissingFile.test_missing_file_fail}   s:    ""2;`:abh6)a-XY_X`+aa)r   c                 h    t        j                  ddg      }dj                  |d         }d|v sJ y )Nr9   rM   r?   r"   r   MISSING)r   r   r%   r&   s      r   &test_missing_file_details_show_missingz?TestFileCheckMissingFile.test_missing_file_details_show_missing   s9    ""2;`:abiiy 12K'''r   N)r)   r*   r+   r,   rN   rQ   r-   r   r   rK   rK   z   s    4b(r   rK   c                   "    e Zd ZdZd Zd Zd Zy)TestApiHealthSkipu+   --skip api_health 플래그 시 SKIP 반환c           	      >    t        ddgddg dg       }|d   dk(  sJ y )Nr	   r1   r9   name	skip_listr@   api_baseapi_endpointstest_dirrA   r   r:   r   r   s     r   "test_api_health_skip_via_run_checkz4TestApiHealthSkip.test_api_health_skip_via_run_check   s8    #n
 h6)))r   c                 F    t        j                  ddg      }|d   dk(  sJ y)u.   base_url 없으면 SKIP (직접 verify 호출)r9   z/api/statusr   r:   Nr	   r   r   s     r    test_api_health_no_base_url_skipz2TestApiHealthSkip.test_api_health_no_base_url_skip   s)    ""27h6)))r   c                 D    t        j                  dg       }|d   dk(  sJ y)u   endpoints 없으면 SKIPzhttp://localhost:8000r   r:   Nr^   r   s     r   !test_api_health_no_endpoints_skipz3TestApiHealthSkip.test_api_health_no_endpoints_skip   s(    ""#:B?h6)))r   N)r)   r*   r+   r,   r\   r_   ra   r-   r   r   rS   rS      s    5
**
*r   rS   c                       e Zd ZdZd Zd Zy)TestTestRunnerSkipuX   --skip test_runner 플래그 시 MANUAL_SKIP 반환 (MANDATORY 아님, 하지만 경고)c           	      >    t        ddgddg dg       }|d   dk(  sJ y )Nr   r1   r9   rU   r   MANUAL_SKIPr[   r   s     r   #test_test_runner_skip_via_run_checkz6TestTestRunnerSkip.test_test_runner_skip_via_run_check   s8    $o
 h=000r   c                 B    t        j                  d      }|d   dk(  sJ y)u.   test_dir 없으면 SKIP (직접 verify 호출)r9   r   r:   N)r   r   r   s     r   test_test_runner_no_dir_skipz/TestTestRunnerSkip.test_test_runner_no_dir_skip   s%    ##B'h6)))r   N)r)   r*   r+   r,   rf   rh   r-   r   r   rc   rc      s    b1*r   rc   c                   "    e Zd ZdZd Zd Zd Zy)TestCLIJsonOutputu^   qc_verify.py --task-id task-4.4 --skip api_health,test_runner 실행 시 유효한 JSON 출력c           	      |   t        j                  dt        ddddgddd      }|j                  j	                         }|sJ d	|j
                  d d
         	 t        j                  |      }t        t              sJ y # t        j                  $ r(}t        j                  d| d|d d         Y d }~Id }~ww xY w)Npython3	--task-idr1   --skipapi_health,test_runnerT   capture_outputtexttimeoutu   stdout 비어있음. stderr: i,  u   JSON 파싱 실패: z	
stdout:    )
subprocessrunrB   stdoutstripstderrjsonloadsJSONDecodeErrorpytestfailr   dict)r   procrx   parsedes        r   test_cli_outputs_valid_jsonz-TestCLIJsonOutput.test_cli_outputs_valid_json   s    ~~(  
 ""$J6t{{4C7H6IJJv	LZZ'F &$''' ## 	LKK.qcF4CL>JKK	Ls   B   B;B66B;c                     t        j                  dt        ddddgddd      }t        j                  |j
                  j                               }d	D ]  }||v rJ d
| d        y )Nrl   rm   r1   rn   ro   Trp   rq   )r@   overallcheckssummaryverified_atu   필드 'u   ' 누락rv   rw   rB   r{   r|   rx   ry   )r   r   r   fields       r   !test_cli_json_has_required_fieldsz3TestCLIJsonOutput.test_cli_json_has_required_fields   sx    ~~(  
 DKK--/0O 	?EF?>hugX$>>?	?r   c                     t        j                  dt        ddddgddd      }t        j                  |j
                  j                               }|d	   dk(  sJ y )
Nrl   rm   r1   rn   ro   Trp   rq   r@   r   r   r   r   s      r   test_cli_task_id_matchesz*TestCLIJsonOutput.test_cli_task_id_matches   sb    ~~(  
 DKK--/0i J...r   N)r)   r*   r+   r,   r   r   r   r-   r   r   rj   rj      s    h(,?$/r   rj   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestOverallDeterminationu%   FAIL 항목이 있으면 overall=FAILc                 N    dg dddgddg ddg dd}t        |g       dk(  sJ y )Nr:   r   r   r2   zMISSING: /tmp/xr   r	   r   r   r   r   r   r   s     r    test_fail_in_checks_overall_failz9TestOverallDetermination.test_fail_in_checks_overall_fail  sD    %+;%+9J8KL)/B?&,<	
 "&"-777r   c                 L    dg ddg ddg ddg dd}t        |g       dk(  sJ y )Nr:   r   r   r   r   r   s     r   test_all_pass_overall_passz3TestOverallDetermination.test_all_pass_overall_pass  s@    %+;%+;)/B?&,<	
 "&"-777r   c                 <    dg ddg dd}t        |g       dk(  sJ y )NWARNr   r   )r   r   r   r   s     r   test_warn_only_overall_warnz4TestOverallDetermination.test_warn_only_overall_warn  s0    )/B?%+;
 "&"-777r   c                 H    ddgddg dd}t        d|      }|d   dk(  sJ y )Nr2   xr   r   )r   r   	task-testr   )r   )r   r   r   s      r   ,test_build_result_overall_fail_when_has_failzETestOverallDetermination.test_build_result_overall_fail_when_has_fail$  s<    %+>)/B?
 k62i F***r   c                     t        j                  dt        ddddgddd      }t        j                  |j
                  j                               }|d	   d
k(  r$|j                  dk(  sJ d|j                          yy)u!   FAIL인 경우 CLI 종료코드 1rl   rm   r1   rn   ro   Trp   rq   r   r2      u!   FAIL 시 exit code 1 기대, got N)rv   rw   rB   r{   r|   rx   ry   
returncoder   s      r   "test_cli_exit_code_nonzero_on_failz;TestOverallDetermination.test_cli_exit_code_nonzero_on_fail,  s    ~~(  
 DKK--/0)&??a'^+LT__L])^^' 'r   N)	r)   r*   r+   r,   r   r   r   r   r   r-   r   r   r   r     s    /888+_r   r   c                   p    e Zd ZdZdedededefdZd Zd Zd	 Zd
 Z	d Z
d Zd Zd Zd Zd Zd Zd Zy)TestCriticalGapu8   critical_gap.verify() - CRITICAL 이슈 미수정 탐지tmp_dirr@   contentreturnc                     t         j                  j                  || d      }t        |dd      5 }|j	                  |       ddd       |S # 1 sw Y   |S xY w)uA   임시 디렉토리에 보고서 파일 생성 후 경로 반환.z.mdwzutf-8)encodingN)ospathr%   openwrite)r   r   r@   r   r   fs         r   _write_reportzTestCriticalGap._write_reportH  sP    ww||Gy_5$g. 	!GGG		s   AAc                    d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   dk(  s
J d|        dj                  |d	         }d
|v sJ y# 1 sw Y   6xY w)u0   CRITICAL 이슈 있고 수정 미확인 → FAILuF   ## 이슈
- CRITICAL: DB 연결 실패
## 기타
아무 수정 없음
ztask-test-failreport_pathNr   r2   u)   CRITICAL 미수정 → FAIL 기대, got: r"   r   
UNRESOLVEDtempfileTemporaryDirectoryr   r
   r   r%   r   r   r   r   r   r'   s         r   test_critical_unresolved_failz-TestCriticalGap.test_critical_unresolved_failO  s    ^((* 	Mg%%g/?ID!(()9tLF	M h6)_-VW]V^+__)iiy 12{***	M 	M   +A77B c                    d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   dk(  s
J d|        dj                  |d	         }d
|v sJ y# 1 sw Y   6xY w)u-   CRITICAL 이슈 있고 수정 확인 → PASSuf   ## 이슈
- CRITICAL: API 응답 오류
## 수정 결과
- 수정 완료: 오류 처리 로직 추가
ztask-test-passr   Nr   r   u-   CRITICAL 수정 확인 → PASS 기대, got: r"   r   RESOLVEDr   r   s         r   test_critical_resolved_passz+TestCriticalGap.test_critical_resolved_passY  s     H((* 	Mg%%g/?ID!(()9tLF	M h6)c-Z[aZb+cc)iiy 12[(((	M 	Mr   c                     d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   dk(  s
J d|        y# 1 sw Y   xY w)u   CRITICAL 이슈 없음 → PASSuW   ## 완료 보고서
정상적으로 구현 완료.
- 마이너 개선 사항만 있음
ztask-test-no-criticalr   Nr   r   u&   CRITICAL 없음 → PASS 기대, got: r   r   r   r
   r   r   r   r   r   r   s        r   test_no_critical_passz%TestCriticalGap.test_no_critical_passc  sz    n((* 	Tg%%g/FPD!(()@dSF	T h6)\-STZS[+\\)	T 	Ts   +AA&c                     t        j                  d      }|d   dk(  s
J d|        dj                  |d         }d|j                         v sd|v sJ y	y	)
u    보고서 파일 없음 → SKIPtask-nonexistent-99999r   r:   u$   파일 없음 → SKIP 기대, got: r"   r   z	not foundzReport not foundN)r
   r   r%   lowerr&   s      r   test_report_not_found_skipz*TestCriticalGap.test_report_not_found_skipk  sm    $$%=>h6)Z-QRXQY+ZZ)iiy 12k//115G;5VVV5V1r   c                     t        j                         5 }| j                  |dd      }t        j                  d|      }ddd       d   dk(  s
J d|        y# 1 sw Y   xY w)u   빈 보고서 → PASSztask-test-emptyr9   r   Nr   r   u$   빈 보고서 → PASS 기대, got: r   )r   r   r   r   s       r   test_empty_report_passz&TestCriticalGap.test_empty_report_passr  su    ((* 	Ng%%g/@"ED!(():MF	N h6)Z-QRXQY+ZZ)	N 	Ns   +AA$c                     d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   dk(  sJ y# 1 sw Y   xY w)u%   '블로커' 키워드 탐지 → FAILuG   ## 이슈
- 블로커: 빌드 실패
## 마무리
별도 수정 없음
ztask-test-blockerr   Nr   r2   r   r   s        r   $test_critical_korean_keyword_blockerz4TestCriticalGap.test_critical_korean_keyword_blockery  sk    _((* 	Pg%%g/BGLD!(()<$OF	P h6)))	P 	P   +AAc                     d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   dk(  sJ y# 1 sw Y   xY w)u"   '심각' 키워드 탐지 → FAILu,   ## 문제
심각한 메모리 누수 발견
ztask-test-seriousr   Nr   r2   r   r   s        r   $test_critical_korean_keyword_seriousz4TestCriticalGap.test_critical_korean_keyword_serious  sk    B((* 	Pg%%g/BGLD!(()<$OF	P h6)))	P 	Pr   c                     d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   dk(  sJ y# 1 sw Y   xY w)u2   'fixed' 영어 키워드로 수정 확인 → PASSzY## Issues
- CRITICAL: race condition detected
## Resolution
- fixed by adding mutex lock
ztask-test-fixedr   Nr   r   r   r   s        r   )test_critical_resolved_by_english_keywordz9TestCriticalGap.test_critical_resolved_by_english_keyword  ss     u 	 ((* 	Ng%%g/@'JD!(():MF	N h6)))	N 	Nr   c                 p    t        j                  d      }d|v sJ d|v sJ t        |d   t              sJ y)u)   결과 dict에 status, details 키 존재r   r   r   N)r
   r   r   r   r   s     r   r    z-TestCriticalGap.test_result_has_required_keys  sD    $$%=>6!!!F"""&+T222r   c           	      <    t        dg ddg dg       }|d   dk(  sJ y)u6   run_check()에서 critical_gap 케이스 정상 호출r
   r   r9   rU   r   r:   Nr[   r   s     r   test_critical_gap_in_run_checkz.TestCriticalGap.test_critical_gap_in_run_check  s6    ,
 h6)))r   c           	      >    t        ddgddg dg       }|d   dk(  sJ y)u-   --skip critical_gap 플래그 시 SKIP 반환r
   r1   r9   rU   r   r:   Nr[   r   s     r   $test_critical_gap_skip_via_skip_listz4TestCriticalGap.test_critical_gap_skip_via_skip_list  s9    %&
 h6)))r   c                     ddl m} d|v sJ y)uA   ALL_CHECKS 목록에 'critical_gap'이 포함되어 있어야 함r   )
ALL_CHECKSr
   N)	qc_verifyr   )r   r   s     r   test_critical_gap_in_all_checksz/TestCriticalGap.test_critical_gap_in_all_checks  s    (+++r   N)r)   r*   r+   r,   strr   r   r   r   r   r   r   r   r   r    r   r   r   r-   r   r   r   r   E  se    BS 3   +)]W[***3**,r   r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestMandatoryBlocklistu.   MANDATORY 체크는 --skip으로 우회 불가c           	      l    t        ddgddg dg       }|d   dk(  sJ t        d |d   D              sJ y	)
uV   test_runner는 더 이상 MANDATORY가 아님 → skip 시도 시 MANUAL_SKIP (경고)r   r   r9   rU   r   re   c              3   0   K   | ]  }d |v xs d|v   yw)re   u   경고Nr-   ).0ds     r   	<genexpr>zPTestMandatoryBlocklist.test_mandatory_check_cannot_be_skipped.<locals>.<genexpr>  s!     R1=A%6Q6Rs   r   N)r   anyr   s     r   &test_mandatory_check_cannot_be_skippedz=TestMandatoryBlocklist.test_mandatory_check_cannot_be_skipped  sQ    $o
 h=000Ry@QRRRRr   c           	      >    t        ddgddg dg       }|d   dk(  sJ y)u   data_integrity도 MANDATORYr   r   r9   rU   r   r2   Nr[   r   s     r   test_data_integrity_mandatoryz4TestMandatoryBlocklist.test_data_integrity_mandatory  s9    !'(
 h6)))r   c           	      >    t        ddgddg dg       }|d   dk(  sJ y)u   file_check도 MANDATORYr   r   r9   rU   r   r2   Nr[   r   s     r   test_file_check_mandatoryz0TestMandatoryBlocklist.test_file_check_mandatory  8    #n
 h6)))r   c           	      >    t        ddgddg dg       }|d   dk(  sJ y)u.   api_health는 MANDATORY 아님 → skip 가능r	   r   r9   rU   r   r:   Nr[   r   s     r   "test_non_mandatory_still_skippablez9TestMandatoryBlocklist.test_non_mandatory_still_skippable  r   r   c           	      >    t        ddgddg dg       }|d   dk(  sJ y)u/   style_check는 MANDATORY 아님 → skip 가능style_checkr   r9   rU   r   r:   Nr[   r   s     r    test_style_check_still_skippablez7TestMandatoryBlocklist.test_style_check_still_skippable  s8    $o
 h6)))r   c                 d    ddl m} t        |t              sJ d|v sJ d|v sJ d|v sJ d|vsJ y)uo   MANDATORY_CHECKS 상수가 존재하고 data_integrity, file_check, spec_compliance 포함 (test_runner 제외)r   )MANDATORY_CHECKSr   r   spec_compliancer   N)r   r   r   set)r   r   s     r   %test_mandatory_checks_constant_existsz<TestMandatoryBlocklist.test_mandatory_checks_constant_exists  sR    .*C000#3333//// $4444$4444r   N)
r)   r*   r+   r,   r   r   r   r   r   r   r-   r   r   r   r     s$    8S****5r   r   c                   "    e Zd ZdZd Zd Zd Zy)TestSkipLogTrackingu%   --skip 사용 시 JSONL 로그 기록c           
      8   d}d}t         j                  j                  |      r&t        |      5 }t	        d |D              }ddd       t        j                  dt        dddd	d
dgddd      }t         j                  j                  |      sJ d       t        |      5 }|j                         }ddd       t              |kD  sJ d       t        j                  |d         }|d   dk(  sJ d|d   v sJ |d   dk(  sJ y# 1 sw Y   xY w# 1 sw Y   `xY w)u'   skip 사용 시 로그 파일에 기록1/home/jay/workspace/memory/logs/qc-skip-log.jsonlr   c              3       K   | ]  }d   ywr   Nr-   r   _s     r   r   zBTestSkipLogTracking.test_skip_creates_log_entry.<locals>.<genexpr>        .1.   Nrl   rm   ztest-skip-logrn   pyright_check,style_check--team	dev1-teamTrp   rq   u)   Skip 로그 파일이 생성되어야 함u+   새 로그 엔트리가 추가되어야 함r@   pyright_checkskipped_checksteam)r   r   existsr   sumrv   rw   rB   	readlineslenr{   r|   )r   log_pathbefore_countr   r   lines
last_entrys          r   test_skip_creates_log_entryz/TestSkipLogTracking.test_skip_creates_log_entry  s+   F77>>(#h 11".a.01 ~~+	  
  ww~~h'T)TT'(^ 	"qKKME	"5zL(W*WW(ZZb	*
)$777*-=">>>>&![00071 1(	" 	"s   D DDDc           
         d}t        j                  dt        ddddddgd	d	d
      }t        |      5 }|j	                         }ddd       t        j                  d         }d|d   v sJ d|d   vsJ y# 1 sw Y   4xY w)uT   MANDATORY skip 시도 시 blocked_mandatory 필드에 기록 (data_integrity 사용)r   rl   rm   ztest-mandatory-logrn   zdata_integrity,style_checkr   r   Trp   rq   Nr   r   blocked_mandatoryr   )rv   rw   rB   r   r  r{   r|   )r   r  r   r   r
  r  s         r   (test_skip_log_contains_blocked_mandatoryz<TestSkipLogTracking.test_skip_log_contains_blocked_mandatory<  s    F~~$,	  
  (^ 	"qKKME	"ZZb	*
:.A#BBBBJ/B$CCCC	" 	"s   A77B c           
         d}d}t         j                  j                  |      r&t        |      5 }t	        d |D              }ddd       t        j                  dt        dddd	d
dgddd      }t         j                  j                  |      r3t        |      5 }t	        d |D              }ddd       |k(  sJ d       yy# 1 sw Y   xY w# 1 sw Y   #xY w)u$   skip 없으면 로그 추가 안 됨r   r   c              3       K   | ]  }d   ywr   r-   r   s     r   r   z:TestSkipLogTracking.test_no_skip_no_log.<locals>.<genexpr>^  r   r   Nrl   rm   ztest-no-skiprn   r9   r   r   Trp   rq   c              3       K   | ]  }d   ywr   r-   r   s     r   r   z:TestSkipLogTracking.test_no_skip_no_log.<locals>.<genexpr>r  s     !r   u-   skip 없으면 로그가 추가되면 안 됨)r   r   r  r   r  rv   rw   rB   )r   r  r	  r   r   after_counts         r   test_no_skip_no_logz'TestSkipLogTracking.test_no_skip_no_logX  s    F77>>(#h 11".a.01 ~~	  
  77>>(#h 01!Q/0,._0__. $'1 1(0 0s   CCCCN)r)   r*   r+   r,   r  r  r  r-   r   r   r   r     s    / 1DD8`r   r   c                       e Zd ZdZd Zd Zy)TestDoneFileSkipInfou,   .done 파일에 skipped_checks 정보 포함c                 z   dt        t        j                         j                                }d| d}	 t	        j
                  dt        d|dddd	d
g	ddd      }t        j                  j                  |      rFt        |      5 }t        j                  |      }ddd       dv sJ d       d|d   v sJ d|d   v sJ t        j                  j                  |      rt        j                  |       yy# 1 sw Y   \xY w# t        j                  j                  |      rt        j                  |       w w xY w)u9   --gate 모드에서 .done에 skipped_checks 필드 포함ztest-done-skip-"/home/jay/workspace/memory/events/.donerl   rm   rn   r   --gater   r   Trp   rq   Nr  u%   .done에 skipped_checks 필드 필요r  r   )intr   now	timestamprv   rw   rB   r   r   r  r   r{   loadremover   r@   	done_pathr   r   	done_datas         r   &test_done_file_contains_skipped_checksz;TestDoneFileSkipInfo.test_done_file_contains_skipped_checks~  s-   #C(@(@(B$C#DE8	G		%>>#/
  $D" ww~~i()_ - $		!I-'94]6]]4&)4D*EEEE$	2B(CCCCww~~i(		)$ )- - ww~~i(		)$ )s$   AD C7%D 7D <D 7D:c           	      p   dt        t        j                         j                                }d| d}	 t	        j
                  dt        d|dddgd	d	d
      }t        j                  j                  |      rCt        |      5 }t        j                  |      }ddd       j                  d      g k(  sd|v sJ t        j                  j                  |      rt        j                  |       yy# 1 sw Y   YxY w# t        j                  j                  |      rt        j                  |       w w xY w)u.   skip 없으면 skipped_checks는 빈 리스트ztest-done-noskip-r  r  rl   rm   r  r   r   Trp   rq   Nr  )r  r   r  r  rv   rw   rB   r   r   r  r   r{   r  getr  r   s         r   !test_done_file_no_skip_empty_listz6TestDoneFileSkipInfo.test_done_file_no_skip_empty_list  s   %c(,,.*B*B*D&E%FG8	G		%>>#  $D ww~~i()_ - $		!I- }}%56"<@PT]@]]]ww~~i(		)$ )	- - ww~~i(		)$ )s$   AC> C2"C> 2C;7C> >7D5N)r)   r*   r+   r,   r#  r&  r-   r   r   r  r  {  s    6%B%r   r  )(r,   r{   r   rv   sysr   r   pathlibr   r~   __file__parent_QC_DIRr   r   insertr   r   r   r   r   	verifiersr	   r
   r   r   r   rB   r   r/   r=   rK   rS   rc   rj   r   r   r   r   r  r-   r   r   <module>r.     s   $  	  
     x.

w<sxxHHOOAs7|$ M M W Wg./F F2* *:* *.
( 
($* *>* *6:/ :/D5_ 5_zt, t,xN5 N5l\` \`H?% ?%r   