
    [i:)                        d Z ddlZddlZddlZddlZddlmZ  ed      Z e	e      ej                  vr"ej                  j                  d e	e             de	defdZ eded	z  d
z  dz  dz        Z eded	z  d
z  dz  dz        Z ededz  dz        ZdededefdZd Zd Zd Zd Zd Zd Zdede	defdZdede	defdZd  Zd! Zd" Zy)#u  
test_verifier_fix_pack.py — task-2381 verifier 3건 통합 fix 회귀 테스트

대상 fix:
- Fix 1: teams.shared.verifiers.git_evidence — _resolve_project_dir nested lookup
- Fix 2: teams.shared.verifiers.critical_gap — 정규식 + 마커 패턴
- Fix 3: scripts.auto_merge — _sync_task_timers helper

작성: 모리건 (dev3 테스터)
원칙: TDD RED-first. 루의 구현이 끝난 뒤 GREEN 검증.
    N)Pathz-/home/jay/workspace/.worktrees/task-2381-dev3name	file_pathc                 0   t         j                  j                  | t        |            }||j                  t        d|  d|       t         j                  j                  |      }|t        j                  | <   |j                  j                  |       |S )NzCannot load z from )
	importlibutilspec_from_file_locationstrloaderImportErrormodule_from_specsysmodulesexec_module)r   r   specmodules       R/home/jay/workspace/.worktrees/task-2520-dev4/tests/dev3/test_verifier_fix_pack.py_load_moduler      s{    >>11$IGD|t{{*LfYK@AA^^,,T2FCKKKKF#M    git_evidence_t2381teamsshared	verifierszgit_evidence.pycritical_gap_t2381zcritical_gap.pyauto_merge_t2381scriptszauto_merge.py	workspacepayloadreturnc                     | dz  }|j                  dd       |dz  }|j                  t        j                  |dd      d	       |S )
NmemoryT)parentsexist_oktask-timers.jsonF   )ensure_asciiindentutf-8encoding)mkdir
write_textjsondumps)r   r   
memory_dirtimerss       r   _write_timersr1   8   sP    X%JTD1,,F
djjuQGRYZMr   c                 8    dD ]  }| j                  |d        y )N)PROJECT_PATHWORKTREE_PATHF)raising)delenv)monkeypatchenv_vars     r   
_clear_envr9   @   s$    4 37E23r   c           	         t        |       | dz  }|j                          |dz  j                          t        | dddt        |      iii       t        j                  dt        |             }|t        |      k(  sJ d| d|        y	)
uK   timers.json의 tasks.<task_id>.worktree_path를 정상 발견해야 한다.worktree_target.gittasks	task-2400worktree_pathworkspace_rootu   nested lookup 실패: expected=, got=N)r9   r+   r1   r
   git_evidence_resolve_project_dirtmp_pathr7   tmp_dirresults       r   test_git_evidence_nested_lookuprI   I   s    { **GMMOv	;#g, ?@A
 ..CM / F S\! 
)'&A!r   c                 >   t        |       | dz  }|j                          |dz  j                          t        | ddt        |      ii       t        j                  dt        |             }|t        |      k7  s
J d|        t        |t              r|sJ d       y)	u_   legacy top-level 구조({task_id: {...}})는 매칭되지 않고 fallback (D)로 가야 한다.legacy_targetr<   r>   r?   r@   u-   legacy top-level이 잘못 매칭됨: result=u   fallback 결과가 비어있음N)r9   r+   r1   r
   rC   rD   
isinstancerE   s       r   +test_git_evidence_legacy_top_level_no_matchrM   `   s    {(GMMOv 	G56
 ..CM / F
 S\! 
7x@!
 fc"vP/PP-vr   c                     d}| dz  }|j                  |d       t        j                  dt        |            }|d   dk(  sJ d	|d    d
|j	                  d              y)uW   이슈 마커 형식이 아닌 본문 평문에서 'critical' 단어가 나와도 PASS.um   이 영역은 critical 한 영역이라 신중하게 처리합니다.
작업이 정상 완료되었습니다.	task-X.mdr(   r)   task-Xreport_pathstatusPASSu   평문 false positive: status=
, details=detailsNr,   critical_gapverifyr
   getrF   bodyreportrH   s       r   !test_critical_gap_plain_text_passr^      s    	2 	 #F
dW-  s6{ CF(v% 
()9(:*VZZPYEZD[\%r   c                     d}| dz  }|j                  |d       t        j                  dt        |            }|d   dk(  sJ d	|d    d
|j	                  d              y)u4   이슈 마커(- CRITICAL: ...) + 미해결 → FAIL.uC   ## 발견 이슈
- CRITICAL: token storage 누락
해결 미완료.rO   r(   r)   rP   rQ   rS   FAILu   마커 미감지: status=rU   rV   NrW   r[   s       r   !test_critical_gap_marker_detectedra      s~    	 	
 #F
dW-  s6{ CF(v% 
#F8$4#5Z

9@U?VW%r   c                     d}| dz  }|j                  |d       t        j                  dt        |            }|d   dk(  sJ d	|d    d
|j	                  d              y)u3   마커 발견 + 후행 RESOLVED 키워드 → PASS.uu   ## 발견 이슈
- CRITICAL: token storage 누락

## 해결
**[Codex 위험 5건 모두 해결됨]**
수정 완료.
rO   r(   r)   rP   rQ   rS   rT   u   resolved 인식 실패: status=rU   rV   NrW   r[   s       r   !test_critical_gap_marker_resolvedrc      s    	 	 #F
dW-  s6{ CF(v% 
)&*:);:fjjQZF[E\]%r   task_id
base_entryc                 &    d||ii}t        | |      S )u8   workspace/memory/task-timers.json 에 task entry 작성.r=   )r1   )r   rd   re   r   s       r   _setup_taskrg      s    *-.GG,,r   c                     | dz  dz  }t        j                  |j                  d            }|j                  di       j                  |i       S )Nr!   r$   r(   r)   r=   )r-   loads	read_textrZ   )r   rd   r0   datas       r   
_read_taskrl      sL    !$66F::f&&&89D88GR $$Wb11r   c                    d}t        | |ddd       t        j                  | |dd      }|du s
J d|        t        | |      }|j	                  d	      d
k(  sJ d|j	                  d	              |j	                  d      s
J d|        |j	                  d      dk(  sJ d|j	                  d              |j	                  dd      }|j                  d      s
J d|        y)uM   _sync_task_timers 호출 후 status=completed, end_time/sha/closed_by 기록.r>   running2026-05-02T00:00:00+00:00rS   
start_timeabc1234auto_mergedTu   반환값 불일치: rS   	completedzstatus: end_timeu   end_time 누락: merge_commit_shazmerge_commit_sha: 	closed_by zauto_merge:u   closed_by prefix 불일치: N)rg   
auto_merge_sync_task_timersrl   rZ   
startswith)rF   rd   retentryrw   s        r   test_auto_merge_sync_statusr~      s   G,GH 
&
&'9mC $;5/u55;x)E99X+-O%))H:M9N/OO-99Z =$5eW"== 99'(I5 
UYY'9:;<5 		+r*I. 
&yk2.r   c                 t   
 d}t         |ddd       t        j                   |dd      }t        j                   |dd      }|du s
J d|        |d	u sJ d
| d       dt         ddd       g t        j                         

 fd}t        d      D cg c]  }t        j                  |       }}|D ]  }|j                           |D ]  }|j                           t        d D              }|dk(  sJ d| d        t               }	|	j                  d      dk(  sJ yc c}w )uU   동일 task에 대한 중복 호출은 두 번째가 False (이미 completed) 반환.r>   rn   ro   rp   rr   rs   Tu   첫 호출 반환값: Fu   두 번째 호출 반환값: u&    (이미 completed면 False여야 함)z	task-2401c                      t         j                  dd      } 5  j                  |        d d d        y # 1 sw Y   y xY w)Ndeadbeefrs   )ry   rz   append)rlockresultstask_id2rF   s    r   workerz+test_auto_merge_sync_atomic.<locals>.worker   sB    ((h
M
  	NN1	 	 	s	   7A r%   )targetc              3   *   K   | ]  }|d u sd  yw)T   N ).0r   s     r   	<genexpr>z.test_auto_merge_sync_atomic.<locals>.<genexpr>
  s     5119Q5s   	r   u   race condition: True 반환 u   회 (1회여야 함), results=rS   rt   N)rg   ry   rz   	threadingLockrangeThreadstartjoinsumrl   rZ   )rF   rd   ret1ret2r   _threadst
true_countentry2r   r   r   s   `         @@@r   test_auto_merge_sync_atomicr      sy   G,GH '''9mD '''9mD 4<81$88<5=f9$?eff= H,GH G>>D 9>aA1yv.AGA 		 	 555J? 
&zl2PQXPYZ? (+F::h;... Bs   !D5c           	          d}d}t        | |dd|dd       t        j                  | |dd      }|d	u s
J d
|        t        | |      }|j	                  d      |k(  sJ d| d|j	                  d              y)uF   이미 completed인 task의 end_time을 덮어쓰지 않아야 한다.r>   z2026-01-01T00:00:00+00:00rt   z2025-12-31T00:00:00+00:00preexisting)rS   rq   ru   rv   newsha99rs   Fu&   이미 completed일 때 False 기대: ru   u#   end_time이 덮어써짐: expected=rB   N)rg   ry   rz   rl   rZ   )rF   rd   original_end_timer|   r}   s        r   test_auto_merge_sync_no_clobberr     s    G3!5) -		
	 
&
&':}C %<GA#GG<x)E99Z $55 
-.?-@uyyQ[G\F]^5r   )__doc__importlib.utilr   r-   r   r   pathlibr   	WORKSPACEr
   pathinsertr   rC   rX   ry   dictr1   r9   rI   rM   r^   ra   rc   rg   rl   r~   r   r   r   r   r   <module>r      sF  
   
  @A	y>!HHOOAs9~&s t  ("[03DD ("[03DD 	O+
T D T 3.Q> "0-4 -# -4 -2$ 2 2 260/fr   