
    :iu                      .   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
mZ ej                  j                  d e ee      j                   j                   j                                ddlmZ  G d d      Z G d d      Z G d	 d
      Z G d d      Zy)u   test_worktree_resolver.py — resolve_worktree_target_dir 단위 테스트.

쿠쿨칸(개발7팀): task-2355 worktree 인식 수정 구현의 일부.
    N)Path)resolve_worktree_target_dirc                       e Zd Zd Zd Zy)TestEmptyTaskIdc                    t        dt        |dz        t        |dz              \  }}d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}}d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}}y)u    task_id=None → (None, "none").Nnonexistent.jsonprojectstask_timers_pathprojects_rootisz%(py0)s is %(py3)spathpy0py3assert %(py5)spy5none==z%(py0)s == %(py3)ssource
r   str
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselftmp_pathr   r   @py_assert2@py_assert1@py_format4@py_format6s           ;/home/jay/workspace/scripts/tests/test_worktree_resolver.py"test_returns_none_for_none_task_idz2TestEmptyTaskId.test_returns_none_for_none_task_id   s    2 ,>!>?h34
f
 tt|tttttvvvv    c                    t        dt        |dz        t        |dz              \  }}d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}}d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}}y)u   task_id="" → (None, "none"). r   r	   r
   Nr   r   r   r   r   r   r   r   r   r   r   r%   s           r,   #test_returns_none_for_empty_task_idz3TestEmptyTaskId.test_returns_none_for_empty_task_id    s    2 ,>!>?h34
f
 tt|tttttvvvvr.   N)__name__
__module____qualname__r-   r1    r.   r,   r   r      s      r.   r   c                       e Zd Zd Zd Zd Zy)TestTaskTimersResolutionc                    |dz  dz  dz  dz  }|j                  d       ddd	t        |      iii}|d
z  }|j                  t        j                  |             t        dt        |      t        |dz              \  }}t        |      }||k(  }|s#t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}}y)u9   task-timers.json에 worktree_path가 명시되면 반환.r	   InsuRo
.worktreesztask-9999-fixTparentstasksz	task-9999worktree_pathtask-timers.jsonr
   r   z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}r   r   wt_dirr   py2r   r   assert %(py7)spy7Ntask_timersr   r   r   r   r   mkdirr   
write_textjsondumpsr   r   r   r   r    r!   r"   r#   r$   )r&   r'   rA   timers_datatimers_filer   r   @py_assert4r)   r+   @py_format8r(   r*   s                r,   "test_returns_path_from_task_timersz;TestTaskTimersResolution.test_returns_path_from_task_timers/   s    J&1L@?RT" #S[
 !33tzz+672 -h34
f
 6{"t{""""t{""""""t"""t""""""s"""s""""""6"""6"""{"""""""&&v&&&&v&&&&&&v&&&v&&&&&&&&&&r.   c                    |dz  dz  }|j                  d       dddt        |      iii}|dz  }|j                  t        j                  |             t        dt        |      t        |dz        	      \  }}d
}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d
x}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d
x}}y
)uS   worktree_path가 /.worktrees/를 포함하지 않으면 무시하고 glob fallback.r	   r9   Tr;   r=   z	task-8888r>   r?   r
   Nr   r   r   r   r   r   r   r   r   r   rG   )r&   r'   
non_wt_dirrL   rM   r   r   r(   r)   r*   r+   s              r,   %test_skips_non_worktree_explicit_pathz>TestTaskTimersResolution.test_skips_non_worktree_explicit_pathG   sE    
*X5
& #S_
 !33tzz+67 3 -h34
f tt|tttttvvvvr.   c                 l   dddt        |dz  dz  dz        iii}|dz  }|j                  t        j                  |             t	        dt        |      t        |dz        	      \  }}d
}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            d
x}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            d
x}}y
)u?   worktree_path가 존재하지 않는 디렉토리이면 무시.r=   z	task-7777r>   nor:   ztask-7777-fixr?   empty_projectsr
   Nr   r   r   r   r   r   r   r   r   r   )r   rI   rJ   rK   r   r   r   r   r    r!   r"   r#   r$   )
r&   r'   rL   rM   r   r   r(   r)   r*   r+   s
             r,   $test_skips_nonexistent_worktree_pathz=TestTaskTimersResolution.test_skips_nonexistent_worktree_patha   s1    #SD<)G/)Y%Z
 !33tzz+672 -h)99:
f
 tt|tttttvvvvr.   N)r2   r3   r4   rP   rS   rW   r5   r.   r,   r7   r7   .   s    '0 4 r.   r7   c                       e Zd Zd Zd Zd Zy)TestGlobFallbackc                 J   |dz  dz  dz  }|j                  d       t        dt        |dz        t        |            \  }}t        |      }||k(  }|s#t        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}d}	||	k(  }|st        j                  d	|fd||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }
dd|
iz  }t        t        j                  |            dx}}	y)u?   tmp_path에 가짜 worktree 디렉토리 → glob으로 탐지.r9   r:   ztask-1234-featTr;   z	task-1234no_timers.jsonr
   r   r@   r   r   rA   rB   rD   rE   Nglobr   r   r   r   r   rH   r   r   r   r   r   r    r!   r"   r#   r$   )r&   r'   rA   r   r   rN   r)   r+   rO   r(   r*   s              r,   test_glob_fallbackz#TestGlobFallback.test_glob_fallbackz   sC   H$|36FFT" 3 ,<!<=h-
f
 6{"t{""""t{""""""t"""t""""""s"""s""""""6"""6"""{"""""""vvvvr.   c                    |dz  dz  }|j                  d       |dz  }|j                          t        j                         dz
  }ddl}|j                  t	        |      ||f       |d	z  }|j                          t        d
t	        |dz        t	        |            \  }}t	        |      }	||	k(  }
|
s#t        j                  d|
fd||	f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}
}	d}||k(  }
|
st        j                  d|
fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
}y)uO   같은 task_id의 worktree 2개 → mtime 큰 쪽(최근 수정된 것) 반환.r9   r:   Tr;   ztask-5555-alphai  r   Nztask-5555-betaz	task-5555r[   r
   r   r@   r   r   newer_wtrB   rD   rE   r\   r   r   r   r   r   )rH   timeosutimer   r   r   r   r   r    r!   r"   r#   r$   )r&   r'   wt_rootolder_wtold_timerb   r`   r   r   rN   r)   r+   rO   r(   r*   s                  r,   test_glob_returns_most_recentz.TestGlobFallback.test_glob_returns_most_recent   s   X%4d#..99;%
X8 45-- 3 ,<!<=h-
f
 8}$t}$$$$t}$$$$$$t$$$t$$$$$$s$$$s$$$$$$8$$$8$$$}$$$$$$$vvvvr.   c                 t   |dz  }|j                          |dz  dz  dz  }|j                  d       t        dt        |dz        t        |      	      \  }}t        |      }||k(  }|s#t        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}}d}
||
k(  }|st        j                  d
|fd||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}}
y)uU   여러 프로젝트 디렉토리 중 해당 task_id worktree가 있는 것을 탐지.	project_a	project_br:   ztask-6666-implTr;   z	task-6666r[   r
   r   r@   r   r   rA   rB   rD   rE   Nr\   r   r   r   r   r   r]   )r&   r'   proj_arA   r   r   rN   r)   r+   rO   r(   r*   s               r,   (test_glob_finds_across_multiple_projectsz9TestGlobFallback.test_glob_finds_across_multiple_projects   sX    K' K',69IIT"2 ,<!<=h-
f
 6{"t{""""t{""""""t"""t""""""s"""s""""""6"""6"""{"""""""vvvvr.   N)r2   r3   r4   r^   rg   rl   r5   r.   r,   rY   rY   y   s      0 r.   rY   c                       e Zd Zd Zd Zd Zy)TestNoWorktreeFoundc                 6   |dz  }|j                          |dz  j                          t        dt        |dz        t        |            \  }}d}||u }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}}y)u7   task-timers도 없고 glob도 없으면 (None, "none").r	   empty_projectz	task-0000r[   r
   Nr   r   r   r   r   r   r   r   r   r   r]   )	r&   r'   projects_dirr   r   r(   r)   r*   r+   s	            r,   +test_returns_none_when_no_worktree_anywherez?TestNoWorktreeFound.test_returns_none_when_no_worktree_anywhere   s   *,		'..02 ,<!<=l+
f
 tt|tttttvvvvr.   c                    t        dt        |dz        t        |dz              \  }}d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}}d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}}y)u>   projects_root 디렉토리 자체가 없으면 (None, "none").z	task-1111r[   nonexistent_projectsr
   Nr   r   r   r   r   r   r   r   r   r   r   r%   s           r,   .test_returns_none_when_projects_root_not_existzBTestNoWorktreeFound.test_returns_none_when_projects_root_not_exist   s    2 ,<!<=h)??@
f
 tt|tttttvvvvr.   c                    |dz  }|j                  d       t        dt        |      t        |dz              \  }}d}||u }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}}y)uE   task-timers.json이 깨진 JSON이어도 예외 없이 glob fallback.zbad_timers.jsonz{invalid json}z	task-2222emptyr
   Nr   r   r   r   r   r   r   r   r   r   )rI   r   r   r   r   r   r    r!   r"   r#   r$   )	r&   r'   rM   r   r   r(   r)   r*   r+   s	            r,   +test_task_timers_load_failure_falls_throughz?TestNoWorktreeFound.test_task_timers_load_failure_falls_through   s    !22/02 -h01
f
 tt|tttttvvvvr.   N)r2   r3   r4   rr   ru   rx   r5   r.   r,   rn   rn      s       r.   rn   )__doc__builtinsr   _pytest.assertion.rewrite	assertionrewriter   rJ   sysra   pathlibr   r   insertr   __file__parentutils.worktree_resolverr   r   r7   rY   rn   r5   r.   r,   <module>r      sz   
   
   3tH~,,33::; < ?   2E  E V7  7 z%  % r.   