
     j.                     4   d Z ddlZddlZddlZddlZddlZ ej                  e      j                         j                  d   Z
ej                  j                  d ee
             ddlZdej                   vrDe
dz  dz  dz  dz  Z ej$                  d      Z ee      ge_        de_        eej                   d<   ej,                  d        Zej,                  d	        Z	 	 dd
ej                  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#y)uK  
test_git_evidence_worktree_2507.py — task-2507 회귀 테스트

5 false-positive (fix 후 PASS) + 5 true-positive (기존 룰 유지 FAIL/SKIP)

Note: `teams.shared.verifiers.git_evidence` 는 sys.path 동적 추가로 로드된다.
pyright는 이를 정적 분석으로 해결할 수 없으므로 파일 단위 ignore 처리.
    N   	verifiersteamsdev1qcc                     | dz  }|dz  dz  j                  d       |dz  dz  j                  d       |dz  dz  j                  d       |S )	uA   임시 workspace + task-timers.json + memory/events/ 디렉토리	workspacememorytasksT)parentseventstask-timers.jsonz{"tasks": {}})mkdir
write_text)tmp_pathr	   s     G/home/jay/workspace/tests/regression/test_git_evidence_worktree_2507.pytmp_workspacer   $   sc     ;&IG#**4*8H$++D+9..::?K    c                 :   | }t        j                  g d|dd       t        j                  g d|d       t        j                  g d|d       |dz  j                  d       t        j                  g d	|d       t        j                  g d
|dd       |S )u   workspace 내부에 git init)gitinitz-bmainTcwdcheckcapture_output)r   configz
user.emailz	test@testr   r   )r   r   z	user.nametestz	README.mdr   r   add.)r   commit-mr   )
subprocessrunr   )r   r	   s     r   tmp_git_repor'   .   s     INN%T$ NN4T NN.T
 ((0NN&ITBNN'T$ r   repomsg	file_namecontentreturnc                    | |z  j                  |       t        j                  g d| d       t        j                  ddd|g| dd       t        j                  g d| dd	      j                  j	                         }|S )
Nr    Tr   r   r#   r$   r   )r   z	rev-parseHEADr   r   text)r   r%   r&   stdoutstrip)r(   r)   r*   r+   shas        r   _make_commitr4   H   sx     
I!!'*NN&D=NN	$$T ..$D fUUW  Jr   c                 8   | }|dz  dz  dz  j                  d       ddddiii}|dz  dz  j                  t        j                  |             d	d
lm}  |dt        |            }|d   dk(  s
J d|        t        d |d   D              sJ d|d           y)u_   task-2503 시나리오: git log 검색 0건이지만 task-timers의 merge_commit 필드로 PASSr
   r   ztask-2503.mdu*   # task-2503

## 레벨
Lv.3 코드 작업
z	task-2503merge_commit(fc49a9fdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   r   verifystatusPASS   기대 PASS, 실제 c              3   0   K   | ]  }d |v xs d|v   yw)mergeCommitzPASS COMMIT_EXISTSN ).0ds     r   	<genexpr>z8test_fp1_squash_merge_timers_evidence.<locals>.<genexpr>t   s+       	72a77s   detailsu'   mergeCommit evidence 메시지 없음: N)r   jsondumps#teams.shared.verifiers.git_evidencer9   strany)r'   r	   timersr9   results        r   %test_fp1_squash_merge_timers_evidencerK   _   s    IG#n4@@8
 	 J
F ..::4::f;MN ;KY0F(v%F)=fX'FF% 	"  E 
1	1B0CDE r   c                     | }|dz  dz  dz  j                  d       t        |d       ddlm} t	        j
                  g d|d	d	
      }|j                  j                         sJ d        |dt        |            }|d   dk(  s
J d|        y)u   task-2487+1: '+' 메타문자가 git grep에서 리터럴로 처리되어야 함

    --fixed-strings 플래그 적용으로 task ID의 '+', '.' 등 메타문자가
    literal로 처리되어야 한다.
    r
   r   ztask-2487+1.mdu   # task-2487+1

## 레벨
Lv.2
z[task-2487+1] verifier fixr   r8   )r   logz	--onelinez--allz--fixed-stringsz--greptask-2487+1Tr/   u5   커밋 자체가 존재하지 않음 (fixture 문제)rN   r:   r;   r<   N)	r   r4   rF   r9   r%   r&   r1   r2   rG   )r'   r	   r9   rawrJ   s        r   test_fp2_regex_escape_plusrP   z   s     IG#&66BB, 89: ..XdC ::VVV M3y>2F(v%F)=fX'FF%r   c                    | }|dz  dz  dz  j                  d       t        |d       ddddiii}|dz  d	z  j                  t        j                  |             |j	                  d
t        |             |j                  dd       |j                  dd       ddlm}  |dt        |            }|d   dk(  s
J d|        y)uZ   task-2502: worktree_path가 존재하지 않는 경우 workspace_root로 폴백하여 PASSr
   r   ztask-2502.mdu   # task-2502

## 레벨
Lv.3
z[task-2502] essence passz	task-2502worktree_pathz%/nonexistent/path/that/does/not/existr   WORKSPACE_ROOT_FALLBACKPROJECT_PATHF)raisingWORKTREE_PATHr   r8   r:   r;   r<   N)	r   r4   rD   rE   setenvrG   delenvrF   r9   )r'   monkeypatchmain_workspacerI   r9   rJ   s         r   "test_fp3_worktree_to_main_fallbackr[      s    !Nh(>9EE* !;< 	!H
F h!33??

6
 0#n2EF~u56:K^!45F(v%F)=fX'FF%r   c                     | }|dz  dz  dz  j                  d       t        |d       ddlm}  |dt	        |            }|d	   d
k(  s
J d|        y)uV   _ensure_origin_main_fetched가 호출되어도 fetch 실패 시 silent — PASS 유지r
   r   ztask-2485.mdu   # task-2485

## 레벨
Lv.2
z[task-2485] fix fetch silentr   r8   z	task-2485r:   r;   u0   기대 PASS (fetch silent 실패해도), 실제 N)r   r4   rF   r9   rG   r'   r	   r9   rJ   s       r   test_fp4_fetch_calledr^      sm    IG#n4@@* :; ;KY0F(v% 
:6(C%r   c                     | }|dz  dz  dz  j                  d       ddddd	}|dz  d
z  dz  j                  t        j                  |             ddlm}  |dt        |            }|d   dk(  s
J d|        y)uQ   git log에 task ID 없고 events 파일의 merge_evidence.merge_commit으로 PASSr
   r   ztask-9999.mdu   # task-9999

## 레벨
Lv.2
z	task-9999(deadbeef00000000000000000000000000000000z2026-05-08T11:10:13+09:00)r6   	merged_at)task_idmerge_evidencer   z4task-9999.essence-pass-escalated-verifier-limitationr   r8   r:   r;   r<   N)r   rD   rE   rF   r9   rG   )r'   r	   events_datar9   rJ   s        r   #test_fp5_merge_commit_evidence_onlyre      s    IG#n4@@*
 14
K 	Hx'
@	AjK():KY0F(v%F)=fX'FF%r   c                     | }|dz  dz  dz  j                  d       ddlm}  |dt        |            }|d   d	k(  s
J d
|        d|j	                  dg       v s
J d|        y)u'   커밋 0건 + mergeCommit 0건 → FAILr
   r   ztask-7777.mdu   # task-7777

## 레벨
Lv.2
r   r8   z	task-7777r:   FAIL   기대 FAIL, 실제 COMMIT_EXISTSfailed_checksu'   failed_checks에 COMMIT_EXISTS 없음: N)r   rF   r9   rG   getr]   s       r   $test_tp1_no_commit_no_evidence_failsrl      s    IG#n4@@*
 ;KY0F(v%F)=fX'FF%fjj"== 
1&:=r   c                    | }|dz  dz  dz  j                  d       t        |d       |dz  dz  dz  dz  }|j                  dd	       |d
z  j                  d       t        j                  g d|d       ddlm}  |dt        |            }|d   dk(  s
J d|        d|j                  dg       v s
J d|        y)u   task scope 내 uncommitted 변경 존재 → FAIL (시스템 자동 파일 제외)

    main의 _filter_dirty_to_task_scope 로직: fallback 모드에서는 파일 경로에
    현재 task ID가 포함되어야 task scope 위반으로 인정.
    r
   r   ztask-7778.mdu   # task-7778

## 레벨
Lv.2
z[task-7778] real commitplansz	task-7778Tr   exist_okzdraft.mdzuncommitted task-7778 contentr    r   r   r8   r:   rg   rh   NO_UNCOMMITTEDrj   u(   failed_checks에 NO_UNCOMMITTED 없음: N)	r   r4   r   r%   r&   rF   r9   rG   rk   )r'   r	   	scope_dirr9   rJ   s        r   "test_tp2_uncommitted_changes_failsrs      s     IG#n4@@* 56H$w.8;FIOOD4O0''(GHNN&ITB:KY0F(v%F)=fX'FF%vzz/2>> 
26(;>r   c                    | }|dz  dz  dz  j                  d       t        j                  g d|dd       dd	lm}  |d
t        |            }|d   dk(  s
J d|        d|j                  dg       v s
J d|        y)u   빈 커밋 → FAILr
   r   ztask-7779.mdu   # task-7779

## 레벨
Lv.2
)r   r#   z--allow-emptyr$   z[task-7779] emptyTr   r   r8   z	task-7779r:   rg   rh   NON_EMPTY_COMMITrj   u*   failed_checks에 NON_EMPTY_COMMIT 없음: N)r   r%   r&   rF   r9   rG   rk   r]   s       r   test_tp3_empty_commit_failsrv   	  s    IG#n4@@* NNET$
 ;KY0F(v%F)=fX'FF%OR!@@ 
4VH=@r   c                    | }|dz  dz  dz  j                  d       t        |d       |dz  dz  j                  dd       |dz  dz  d	z  j                  d
       ddlm}  |dt        |            }|d   dk(  s
J d|        y)uM   시스템 자동 파일만 uncommitted → uncommitted 검사 통과 → PASSr
   r   ztask-7780.mdu   # task-7780

## 레벨
Lv.2
z[task-7780] real fix
heartbeatsTro   zx.heartbeathr   r8   z	task-7780r:   r;   r<   N)r   r4   r   rF   r9   rG   r]   s       r   &test_tp4_system_auto_files_only_passesrz     s    IG#n4@@* 23L(//t/LL(=8DDSI:KY0F(v%F)=fX'FF%r   c                     | }|dz  dz  dz  j                  d       ddlm}  |dt        |            }|d   d	k(  s
J d
|        y)u"   non-code task (문서만) → SKIPr
   r   ztask-7781.mdu8   # task-7781

## 레벨
코드 수정 없음 (문서만)
r   r8   z	task-7781r:   SKIPu   기대 SKIP, 실제 N)r   rF   r9   rG   r]   s       r   test_tp5_non_code_task_skipsr}   -  s\    IG#n4@@F ;KY0F(v%F)=fX'FF%r   )zf.txtx)$__doc__rD   pathlibr%   syspytestPath__file__resolver   ROOTpathinsertrG   types_typesmodules_verifiers_path
ModuleType
_dummy_pkg__path____package__fixturer   r'   r4   rK   rP   r[   r^   re   rl   rs   rv   rz   r}   r?   r   r   <module>r      s_      
  w||H%%'//2 3t9  ckk!Wnv-4{BO""";/J/0J(J)CKK    8 	
,,	  	
 	.E6G6G> G8 2(G 	Gr   