
    i                     ~   d Z ddlZddlmc mZ ddlZddlZej                  j                  dej                  j                  ej                  j                  e      dd             ddlmZmZ ddlmZm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_false_positive_fix.py - task-2072 오탐 수정 검증 테스트

tdd_check.py의 _is_non_code_file() / _verify_by_check_files() 수정과
git_evidence.py의 _is_system_auto_file() / SYSTEM_AUTO_FILES 수정을 검증합니다.
    Nz..)_is_non_code_fileverify)_is_system_auto_fileSYSTEM_AUTO_FILESc                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestIsNonCodeFileu%   _is_non_code_file() 함수 테스트.c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   .md 파일은 비코드 파일	report.mdTisz0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)sr   py0py2py4py7assert %(py9)spy9N	r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationself@py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10s          O/home/jay/workspace/teams/dev1/qc/verifiers/tests/test_qc_false_positive_fix.pytest_md_is_non_codez%TestIsNonCodeFile.test_md_is_non_code!       !,5 -55-5555-555555 555 555555-5555555555    c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u    .json 파일은 비코드 파일config.jsonTr   r   r   r   r   r   Nr   r   s          r&   test_json_is_non_codez'TestIsNonCodeFile.test_json_is_non_code%   s    !.7 /747/47777/4777777 777 777777/77747777777r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u    .yaml 파일은 비코드 파일zsettings.yamlTr   r   r   r   r   r   Nr   r   s          r&   test_yaml_is_non_codez'TestIsNonCodeFile.test_yaml_is_non_code)   s    !09 19T91T99991T999999 999 9999991999T9999999r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   .py 파일은 코드 파일main.pyFr   r   r   r   r   r   Nr   r   s          r&   test_py_is_codez!TestIsNonCodeFile.test_py_is_code-       !*4 +4u4+u4444+u444444 444 444444+444u4444444r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   .ts 파일은 코드 파일zapp.tsFr   r   r   r   r   r   Nr   r   s          r&   test_ts_is_codez!TestIsNonCodeFile.test_ts_is_code1   s    !)3 *3e3*e3333*e333333 333 333333*333e3333333r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   .go 파일은 코드 파일z	server.goFr   r   r   r   r   r   Nr   r   s          r&   test_go_is_codez!TestIsNonCodeFile.test_go_is_code5   s    !,6 -66-6666-666666 666 666666-6666666666r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u    경로 포함 report.md → Truer
   Tr   r   r   r   r   r   Nr   r   s          r&   test_full_path_report_mdz*TestIsNonCodeFile.test_full_path_report_md9   r(   r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   경로 포함 main.py → Falser0   Fr   r   r   r   r   r   Nr   r   s          r&   test_full_path_main_pyz(TestIsNonCodeFile.test_full_path_main_py=   r2   r)   N)__name__
__module____qualname____doc__r'   r,   r.   r1   r4   r6   r8   r:    r)   r&   r   r      s-    /68:54765r)   r   c                       e Zd ZdZd Zy)TestVerifyCheckFilesOnlyMdJsonu=   check_files에 .md/.json만 있을 때 SKIP 반환 테스트.c                    t        dddgd      }|d   }d}||k(  }|st        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }t        j                  d|d    d|j                  d             dz   d|iz  }t        t        j                  |            dx}x}}y)u1   check_files에 비코드 파일만 있으면 SKIPztask-test-noncoder
   r+   /tmp/nonexistent-audit.jsonlcheck_filesaudit_trail_pathstatusSKIP==z%(py1)s == %(py4)spy1r   zExpected SKIP but got : details
>assert %(py6)spy6N
tdd_verifyr   r   r   _format_assertmsggetr   r   r   result@py_assert0r!   @py_assert2@py_format5@py_format7s          r&   test_only_md_json_returns_skipz=TestVerifyCheckFilesOnlyMdJson.test_only_md_json_returns_skipE   s    $m4;

 h 	
6 	
6) 	
 	
6 	
 	
 		   	
 	
 		 $* 	
 	
  %VH%5$6bI9N8OP	
 	
 	
 	
 	
 	
r)   N)r;   r<   r=   r>   r\   r?   r)   r&   rA   rA   B   s
    G	
r)   rA   c                       e Zd ZdZd Zy)TestVerifyCheckFilesWithCodeuQ   check_files에 코드 파일이 있으면 기존대로 동작하는지 테스트.c                 ~   t        ddgd      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }t        j                  d
|d    d|j                  d             dz   d|iz  }t        t        j                  |            dx}x}}y)u7   테스트 파일 없이 구현 파일만 있으면 FAILztask-test-codesrc/main.pyrC   rD   rG   FAILrI   rK   rL   zExpected FAIL but got rN   rO   rP   rQ   NrR   rV   s          r&   test_code_only_returns_failz8TestVerifyCheckFilesWithCode.test_code_only_returns_failT   s    &;

 h 	
6 	
6) 	
 	
6 	
 	
 		   	
 	
 		 $* 	
 	
  %VH%5$6bI9N8OP	
 	
 	
 	
 	
 	
r)   N)r;   r<   r=   r>   rb   r?   r)   r&   r^   r^   Q   s
    [	
r)   r^   c                       e Zd ZdZd Zy)TestVerifyCheckFilesCodeAndTestu:   코드 + 테스트 파일 모두 있으면 PASS 테스트.c                    t        dddgd      }|d   }d}||k(  }|st        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }t        j                  d|d    d|j                  d             dz   d|iz  }t        t        j                  |            dx}x}}y)u:   구현 파일과 테스트 파일이 모두 있으면 PASSztask-test-bothr`   tests/test_main.pyrC   rD   rG   PASSrI   rK   rL   Expected PASS but got rN   rO   rP   rQ   NrR   rV   s          r&   test_code_and_test_returns_passz?TestVerifyCheckFilesCodeAndTest.test_code_and_test_returns_passc   s    &(<=;

 h 	
6 	
6) 	
 	
6 	
 	
 		   	
 	
 		 $* 	
 	
  %VH%5$6bI9N8OP	
 	
 	
 	
 	
 	
r)   N)r;   r<   r=   r>   ri   r?   r)   r&   rd   rd   `   s
    D	
r)   rd   c                       e Zd ZdZd Zy)TestVerifyCheckFilesMdAndTestu8   .md + 테스트만 있으면 PASS (impl 0건) 테스트.c                    t        dddgd      }|d   }d}||k(  }|st        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }t        j                  d|d    d|j                  d             dz   d|iz  }t        t        j                  |            dx}x}}y)uB   .md와 테스트 파일만 있으면 구현 파일 0건으로 PASSztask-test-md-testz	README.mdrf   rC   rD   rG   rg   rI   rK   rL   rh   rN   rO   rP   rQ   NrR   rV   s          r&   test_md_and_test_returns_passz;TestVerifyCheckFilesMdAndTest.test_md_and_test_returns_passr   s    $&:;;

 h 	
6 	
6) 	
 	
6 	
 	
 		   	
 	
 		 $* 	
 	
  %VH%5$6bI9N8OP	
 	
 	
 	
 	
 	
r)   N)r;   r<   r=   r>   rm   r?   r)   r&   rk   rk   o   s
    B	
r)   rk   c                   ^    e 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d Zd Zd Zy)TestIsSystemAutoFileu(   _is_system_auto_file() 함수 테스트.c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u"   memory/heartbeats/ 경로 → Truez memory/heartbeats/dev1.heartbeatTr   r   r   r   r   r   N	r   r   r   r   r   r   r   r   r   r   s          r&   test_heartbeat_dirz'TestIsSystemAutoFile.test_heartbeat_dir   s    $FO#$FGO4OG4OOOOG4OOOOOO#OOO#OOO$FOOOGOOO4OOOOOOOr)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   memory/events/ 경로 → Truezmemory/events/task-123.doneTr   r   r   r   r   r   Nrq   r   s          r&   test_events_dirz$TestIsSystemAutoFile.test_events_dir       $AJ#$ABJdJBdJJJJBdJJJJJJ#JJJ#JJJ$AJJJBJJJdJJJJJJJr)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   logs/ 경로 → Truezlogs/app.logTr   r   r   r   r   r   Nrq   r   s          r&   test_logs_dirz"TestIsSystemAutoFile.test_logs_dir   s    $2;#N3;t;3t;;;;3t;;;;;;#;;;#;;;N;;;3;;;t;;;;;;;r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   bot-activity.json → Truezbot-activity.jsonTr   r   r   r   r   r   Nrq   r   s          r&   test_bot_activity_jsonz+TestIsSystemAutoFile.test_bot_activity_json       $7@#$78@D@8D@@@@8D@@@@@@#@@@#@@@$7@@@8@@@D@@@@@@@r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   token-ledger.json → Trueztoken-ledger.jsonTr   r   r   r   r   r   Nrq   r   s          r&   test_token_ledger_jsonz+TestIsSystemAutoFile.test_token_ledger_json   rz   r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   whisper/ 경로 → Truezwhisper/msg.txtTr   r   r   r   r   r   Nrq   r   s          r&   test_whisper_dirz%TestIsSystemAutoFile.test_whisper_dir   s    $5>#$56>$>6$>>>>6$>>>>>>#>>>#>>>$5>>>6>>>$>>>>>>>r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   memory/daily/ 경로 → Truezmemory/daily/2026-04-22.mdTr   r   r   r   r   r   Nrq   r   s          r&   test_memory_daily_dirz*TestIsSystemAutoFile.test_memory_daily_dir   s    $@I#$@AITIATIIIIATIIIIII#III#III$@IIIAIIITIIIIIIIr)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u*   dashboard/data/refine-status.json → Truez!dashboard/data/refine-status.jsonTr   r   r   r   r   r   Nrq   r   s          r&   !test_dashboard_data_refine_statusz6TestIsSystemAutoFile.test_dashboard_data_refine_status   s    $GP#$GHPDPHDPPPPHDPPPPPP#PPP#PPP$GPPPHPPPDPPPPPPPr)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u(   경로 포함 bot-activity.json → Truezsome/path/bot-activity.jsonTr   r   r   r   r   r   Nrq   r   s          r&   test_nested_bot_activity_jsonz2TestIsSystemAutoFile.test_nested_bot_activity_json   ru   r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   확장자 .heartbeat → Truezfile.heartbeatTr   r   r   r   r   r   Nrq   r   s          r&   test_heartbeat_extensionz-TestIsSystemAutoFile.test_heartbeat_extension   s    $4=#$45==5====5======#===#===$4===5==========r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u   src/main.py → Falser`   Fr   r   r   r   r   r   Nrq   r   s          r&   test_src_main_py_is_not_systemz3TestIsSystemAutoFile.test_src_main_py_is_not_system   s    $1;#M2;e;2e;;;;2e;;;;;;#;;;#;;;M;;;2;;;e;;;;;;;r)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u-   teams/shared/verifiers/tdd_check.py → Falsez#teams/shared/verifiers/tdd_check.pyFr   r   r   r   r   r   Nrq   r   s          r&   &test_verifiers_tdd_check_is_not_systemz;TestIsSystemAutoFile.test_verifiers_tdd_check_is_not_system   s    $IS#$IJSeSJeSSSSJeSSSSSS#SSS#SSS$ISSSJSSSeSSSSSSSr)   c                    d}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u#   projects/insuro/server.py → Falsezprojects/insuro/server.pyFr   r   r   r   r   r   Nrq   r   s          r&   %test_projects_server_py_is_not_systemz:TestIsSystemAutoFile.test_projects_server_py_is_not_system   s    $?I#$?@IEI@EIIII@EIIIIII#III#III$?III@IIIEIIIIIIIr)   N)r;   r<   r=   r>   rr   rt   rw   ry   r|   r~   r   r   r   r   r   r   r   r?   r)   r&   ro   ro      sO    2PK<AA?JQK><TJr)   ro   c                       e Zd ZdZd Zd Zy)TestSystemAutoFilesConstantu-   SYSTEM_AUTO_FILES 상수 유효성 테스트.c                 \   t        t        t              }|sddt        j                         v st        j                  t               rt        j                  t               nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)u%   SYSTEM_AUTO_FILES가 리스트 타입z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer   list)r   rM   r   r   N)
r   r   r   r   r   r   r   r   r   r   )r   r!   rZ   s      r&   test_is_listz(TestSystemAutoFilesConstant.test_is_list   s    +T22222222z222z222222+222+222222T222T2222222222r)   c                    t        t              }d}||k\  }|s%t        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               nddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        j                  dt        t               d      d	z   d
|iz  }t        t        j                  |            dx}x}}y)u/   SYSTEM_AUTO_FILES 항목이 최소 10개 이상
   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenr   )r   rM   py3rQ   u   SYSTEM_AUTO_FILES에 항목이 u   개뿐 (최소 10개 필요)z
>assert %(py8)spy8N)r   r   r   r   r   r   r   r   rT   r   r   )r   rY   r#   @py_assert4r[   @py_format9s         r&   test_minimum_ten_entriesz4TestSystemAutoFilesConstant.test_minimum_ten_entries   s   $% 	
 	
%+ 	
 	
 	
% 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
  % 	
 	
 		 % 	
 	
 		 & 	
 	
 		 *, 	
 	
  .c2C.D-EEab	
 	
 	
 	
 	
 	
r)   N)r;   r<   r=   r>   r   r   r?   r)   r&   r   r      s    73
r)   r   )r>   builtinsr   _pytest.assertion.rewrite	assertionrewriter   sysospathinsertjoindirname__file__verifiers.tdd_checkr   r   rS   verifiers.git_evidencer   r   r   rA   r^   rd   rk   ro   r   r?   r)   r&   <module>r      s     
 	 277<< 94F G
 H
 K!5 !5H
 

 

 

 
(5J 5Jp
 
r)   