
     j.                     N   d Z ddlZddlmc m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j0                  d      Z ee      ge_        de_        ee
j,                  d<   ej8                  d        Zej8                  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                    | }|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(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            dx}x}}d |d   D        }
t        |
      }|st        j                  d|d          dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            dx}
}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==z%(py1)s == %(py4)spy1py4   기대 PASS, 실제 
>assert %(py6)spy6Nc              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 메시지 없음: z.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)py0py2rA   )r   jsondumps#teams.shared.verifiers.git_evidencer9   str
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanationrL   @py_builtinslocals_should_repr_global_name)r'   r	   timersr9   result@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1s              r   %test_fp1_squash_merge_timers_evidencerd   _   s   IG#n4@@8
 	 J
F ..::4::f;MN ;KY0F(FvFv%FFFvFFFFFFvFFF)=fX'FFFFFFFF	" E3   E  E 4E3D	0	1B0CDE E ?EfE E -E,D  E E <E9  E E <E9 E E <E9 E E E 2E1DE 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                  } |       }|st        j                  d      dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}} |dt!        |            }|d   }	d}|	|k(  }
|
st        j"                  d|
fd|	|f      t        j                  |	      t        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}	x}
}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 문제)z^
>assert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.stdout
}.strip
}()
}raw)rM   rN   rA   rD   Nrg   r:   r;   r<   r>   r?   rB   rC   rD   )r   r4   rQ   r9   r%   r&   r1   r2   rS   rV   rY   rZ   r[   rU   rW   rX   rR   rT   )r'   r	   r9   rh   rc   r_   @py_assert5rb   r]   r^   r`   ra   s               r   test_fp2_regex_escape_plusrj   z   sK    IG#&66BB, 89: ..XdC ::V:VVVVVVVVVVV3VVV3VVV:VVVVVVVVVVVV M3y>2F(FvFv%FFFvFFFFFFvFFF)=fX'FFFFFFFFr   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(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	t        j                  d|       dz   d|	iz  }
t        t        j                  |
            dx}x}}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<   r>   r?   rB   rC   rD   N)r   r4   rO   rP   setenvrR   delenvrQ   r9   rS   rT   rU   rV   rW   rX   )r'   monkeypatchmain_workspacer\   r9   r]   r^   r_   r`   ra   rb   s              r   "test_fp3_worktree_to_main_fallbackru      s1   !Nh(>9EE* !;< 	!H
F h!33??

6
 0#n2EF~u56:K^!45F(FvFv%FFFvFFFFFFvFFF)=fX'FFFFFFFFr   c                    | }|dz  dz  dz  j                  d       t        |d       ddlm}  |dt	        |            }|d	   }d
}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}x}}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;   r<   r>   r?   u0   기대 PASS (fetch silent 실패해도), 실제 rC   rD   N)r   r4   rQ   r9   rR   rS   rT   rU   rV   rW   rX   	r'   r	   r9   r]   r^   r_   r`   ra   rb   s	            r   test_fp4_fetch_calledrx      s    IG#n4@@* :; ;KY0F( v v%  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(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            dx}x}}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<   r>   r?   rB   rC   rD   N)r   rO   rP   rQ   r9   rR   rS   rT   rU   rV   rW   rX   )
r'   r	   events_datar9   r]   r^   r_   r`   ra   rb   s
             r   #test_fp5_merge_commit_evidence_onlyr      s    IG#n4@@*
 14
K 	Hx'
@	AjK():KY0F(FvFv%FFFvFFFFFFvFFF)=fX'FFFFFFFFr   c           	         | }|dz  dz  dz  j                  d       ddlm}  |dt        |            }|d   }d	}||k(  }|st	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|       dz   d|iz  }t        t	        j                  |            dx}x}}d}|j                  }	d}
g } |	|
|      }||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |	      t	        j                  |
      t	        j                  |      t	        j                  |      dz  }t	        j                  d|       dz   d|iz  }t        t	        j                  |            dx}x}x}	x}
x}}y)u'   커밋 0건 + mergeCommit 0건 → FAILr
   r   ztask-7777.mdu   # task-7777

## 레벨
Lv.2
r   r8   z	task-7777r:   FAILr<   r>   r?      기대 FAIL, 실제 rC   rD   NCOMMIT_EXISTSfailed_checksinzT%(py1)s in %(py11)s
{%(py11)s = %(py5)s
{%(py5)s = %(py3)s.get
}(%(py7)s, %(py9)s)
}r]   r@   py3py5py7py9py11u'   failed_checks에 COMMIT_EXISTS 없음: 
>assert %(py13)spy13)r   rQ   r9   rR   rS   rT   rU   rV   rW   rX   getrY   rZ   r[   r'   r	   r9   r]   r^   r_   r`   ra   rb   @py_assert4@py_assert6@py_assert8@py_assert10@py_format12@py_format14s                  r   $test_tp1_no_commit_no_evidence_failsr      s   IG#n4@@*
 ;KY0F(FvFv%FFFvFFFFFFvFFF)=fX'FFFFFFFF fjj  " j"= ?==   ?=          %    %    )    *9    ;=    >    2&:     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(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            dx}x}}d}|j                  }
d}g } |
||      }||v }|st        j                  d|fd||f      t        j                  |      dt        j                          v st        j"                  |      rt        j                  |      ndt        j                  |
      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|       d z   d!|iz  }t        t        j                  |            dx}x}x}
x}x}}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:   r   r<   r>   r?   r   rC   rD   NNO_UNCOMMITTEDr   r   r   r]   r   u(   failed_checks에 NO_UNCOMMITTED 없음: r   r   )r   r4   r   r%   r&   rQ   r9   rR   rS   rT   rU   rV   rW   rX   r   rY   rZ   r[   )r'   r	   	scope_dirr9   r]   r^   r_   r`   ra   rb   r   r   r   r   r   r   s                   r   "test_tp2_uncommitted_changes_failsr      s    IG#n4@@* 56H$w.8;FIOOD4O0''(GHNN&ITB:KY0F(FvFv%FFFvFFFFFFvFFF)=fX'FFFFFFFF vzz / 2 z/2> >>   >           &     &     *    +:    <>     ?    36(;     r   c           	      4   | }|dz  dz  dz  j                  d       t        j                  g d|dd       dd	lm}  |d
t        |            }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}x}}d}|j                  }	d}
g } |	|
|      }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}x}x}	x}
x}}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:   r   r<   r>   r?   r   rC   rD   NNON_EMPTY_COMMITr   r   r   r]   r   u*   failed_checks에 NON_EMPTY_COMMIT 없음: r   r   )r   r%   r&   rQ   r9   rR   rS   rT   rU   rV   rW   rX   r   rY   rZ   r[   r   s                  r   test_tp3_empty_commit_failsr   	  s   IG#n4@@* NNET$
 ;KY0F(FvFv%FFFvFFFFFFvFFF)=fX'FFFFFFFF  O R OR!@ !@@   !@          "(    "(    ",    -<    >@    "A    5VH=     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(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}x}}y)uM   시스템 자동 파일만 uncommitted → uncommitted 검사 통과 → PASSr
   r   ztask-7780.mdu   # task-7780

## 레벨
Lv.2
z[task-7780] real fix
heartbeatsTr   zx.heartbeathr   r8   z	task-7780r:   r;   r<   r>   r?   rB   rC   rD   N)r   r4   r   rQ   r9   rR   rS   rT   rU   rV   rW   rX   rw   s	            r   &test_tp4_system_auto_files_only_passesr     s    IG#n4@@* 23L(//t/LL(=8DDSI:KY0F(FvFv%FFFvFFFFFFvFFF)=fX'FFFFFFFFr   c                    | }|dz  dz  dz  j                  d       ddlm}  |dt        |            }|d   }d	}||k(  }|st	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|       dz   d|iz  }t        t	        j                  |            dx}x}}y)u"   non-code task (문서만) → SKIPr
   r   ztask-7781.mdu8   # task-7781

## 레벨
코드 수정 없음 (문서만)
r   r8   z	task-7781r:   SKIPr<   r>   r?   u   기대 SKIP, 실제 rC   rD   N)
r   rQ   r9   rR   rS   rT   rU   rV   rW   rX   rw   s	            r   test_tp5_non_code_task_skipsr   -  s    IG#n4@@F ;KY0F(FvFv%FFFvFFFFFFvFFF)=fX'FFFFFFFFr   )zf.txtx)*__doc__builtinsrY   _pytest.assertion.rewrite	assertionrewriterS   rO   pathlibr%   syspytestPath__file__resolver   ROOTpathinsertrR   types_typesmodules_verifiers_path
ModuleType
_dummy_pkg__path____package__fixturer   r'   r4   rd   rj   ru   rx   r   r   r   r   r   r   rG   r   r   <module>r      sc       
  w||H%%'//2 3t9  ckk!Wnv-4{BO""";/J/0J(J)CKK    8 	
,,	  	
 	.E6G6G> G8 2(G 	Gr   