
    Siv#                     v   d Z ddlZddlZddlmZ ddlmZmZ ddlZej                  j                  d e ee      j                         j                  j                               ddlZdededefdZ G d	 d
      Z eedd      Zej,                  j/                  edu d      ZdeddfdZ G d d      Zy)uU   test_affected_files_overlap.py — affected_files 겹침 감지 테스트 (task-1905)    N)Path)patch	MagicMocktmp_pathtasksreturnc                     | dz  }|j                  dd       |dz  }|j                  t        j                  d|i      d       |S )uI   tmp_path/memory/task-timers.json 을 생성하고 경로를 반환한다.memoryTparentsexist_oktask-timers.jsonr   utf-8encoding)mkdir
write_textjsondumps)r   r   
memory_dir
timer_files       R/home/jay/workspace/.worktrees/task-2117-dev1/tests/test_affected_files_overlap.py_make_timer_jsonr      sQ    H$JTD100J$**gu%56I    c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestCheckAffectedFilesOverlapu-   _check_affected_files_overlap() 동작 검증c                     t        |ddddgdi       |j                  t        d|       t        j                  ddgd      }t	        |      d	k(  sJ d|d
   v sJ d|d
   v sJ d|d
   v sJ y)uU   running 상태 task와 affected_files가 겹칠 때 경고 메시지를 반환한다.	task-9001running
src/foo.py
src/bar.pystatusaffected_files	WORKSPACE
src/baz.py	task-9999   r   u   [파일 충돌 경고]N)r   setattrmod_check_affected_files_overlaplenselfr   monkeypatchresults       r   test_overlap_detectedz3TestCheckAffectedFilesOverlap.test_overlap_detected"   s    ##/">$
 	 	Ch722L,3OQ\]6{afQi'''vay((('6!9444r   c                     t        |dddgdi       |j                  t        d|       t        j                  ddgd      }|g k(  sJ y	)
u[   affected_files가 다른 running task와 겹치지 않으면 빈 리스트를 반환한다.r   r   zsrc/other.pyr"   r%   r    r&   r'   Nr   r)   r*   r+   r-   s       r   test_no_overlapz-TestCheckAffectedFilesOverlap.test_no_overlap4   sZ    ##1"2$
 	 	Ch722L,3OQ\]||r   c                     t        |dddgdi       |j                  t        d|       t        j                  g d      }|g k(  sJ y)u7   affected_files=[] 이면 빈 리스트를 반환한다.r   r   r    r"   r%   r'   Nr3   r-   s       r   test_empty_affected_filesz7TestCheckAffectedFilesOverlap.test_empty_affected_filesC   sS    ##/.$
 	 	Ch7222{C||r   c                     t        |dddgdi       |j                  t        d|       t        j                  dgd      }|g k(  sJ y)uF   current_task_id와 동일한 task는 겹침 검사에서 제외된다.r'   r   r    r"   r%   Nr3   r-   s       r   test_self_excludedz0TestCheckAffectedFilesOverlap.test_self_excludedR   sU    ##/.$
 	 	Ch722L>;O||r   c                     t        |ddgdddgdd       |j                  t        d|       t        j                  dgd      }|g k(  sJ y)	uO   status가 'done' 또는 'reserved'인 task는 겹침 검사에서 무시된다.doner    r"   reserved)z	task-doneztask-reservedr%   r'   Nr3   r-   s       r   test_non_running_tasks_excludedz=TestCheckAffectedFilesOverlap.test_non_running_tasks_excludeda   sa     #/.
 %#/.	$
 		 	Ch722L>;O||r   c                 n    |j                  t        d|       t        j                  dgd      }|g k(  sJ y)uD   task-timers.json 파일이 없을 때 빈 리스트를 반환한다.r%   r    r'   N)r)   r*   r+   r-   s       r   test_timer_file_not_existsz8TestCheckAffectedFilesOverlap.test_timer_file_not_existst   s6    Ch7 22L>;O||r   c                 (   t        |ddgdddgdd       |j                  t        d|       t        j                  ddgd      }t	        |      dk(  sJ |D cg c]  }| }}t        d	 |D              sJ t        d
 |D              sJ yc c}w )uJ   여러 running task와 겹칠 때 각각 경고 메시지가 반환된다.r   r    r"   r!   )task-Atask-Br%   r'      c              3   $   K   | ]  }d |v  
 yw)r@   N .0ws     r   	<genexpr>zPTestCheckAffectedFilesOverlap.test_multiple_overlapping_tasks.<locals>.<genexpr>        ?Q8q=?   c              3   $   K   | ]  }d |v  
 yw)rA   NrD   rE   s     r   rH   zPTestCheckAffectedFilesOverlap.test_multiple_overlapping_tasks.<locals>.<genexpr>   rI   rJ   N)r   r)   r*   r+   r,   any)r.   r   r/   r0   rG   task_ids_in_warningss         r   test_multiple_overlapping_tasksz=TestCheckAffectedFilesOverlap.test_multiple_overlapping_tasks~   s    ##/.
 $#/.	$
 		 	Ch722L,3OQ\]6{a+12a22?*>?????*>????  3s   	Bc                     |dz  }|j                  dd       |dz  j                  dd       |j                  t        d|       t        j                  d	gd
      }|g k(  sJ y)u\   손상된 task-timers.json 파일이 있을 때 예외 없이 빈 리스트를 반환한다.r
   Tr   r   zNOT VALID JSONr   r   r%   r    r'   N)r   r   r)   r*   r+   )r.   r   r/   r   r0   s        r   test_corrupted_timer_filez7TestCheckAffectedFilesOverlap.test_corrupted_timer_file   sl    (
5	(	(445EPW4XCh722L>;O||r   N)__name__
__module____qualname____doc__r1   r4   r6   r8   r<   r>   rN   rP   rD   r   r   r   r      s.    75$&@,	r   r   _send_overlap_telegram_warninguE   _send_overlap_telegram_warning 함수가 dispatch.py에 아직 없음)reasonwarningsc                 H    t        t        dd      }|J d        ||        y)uL   _send_fn을 안전하게 호출하는 래퍼 (pyright optional-call 방지).rU   NuG   _send_overlap_telegram_warning이 dispatch.py에 존재해야 합니다)getattrr*   )rW   fns     r   _call_send_fnr[      s(    	6	=B>ddd>xLr   c                   P    e Zd ZdZed        Zed        Zed        Zed        Zy)TestSendOverlapTelegramWarninguI   _send_overlap_telegram_warning() 동작 검증 (함수가 없으면 skip)c                     |j                  dd       t               }t        d|      5  t        dg       ddd       |j	                          y# 1 sw Y   xY w)ub   warnings가 있고 ANU_BOT_TOKEN이 설정되어 있으면 urllib.request.urlopen을 호출한다.ANU_BOT_TOKENfake-token-12345urllib.request.urlopenC   [파일 충돌 경고] task-A(running)와 파일 겹침: src/foo.pyN)setenvr   r   r[   assert_called_oncer.   r/   mock_urlopens      r   +test_sends_telegram_when_warnings_and_tokenzJTestSendOverlapTelegramWarning.test_sends_telegram_when_warnings_and_token   sZ     	?,>? {+\: 	c`ab	c 	'')	c 	cs   AAc                     |j                  dd       t               }t        d|      5  t        dg       ddd       |j	                          y# 1 sw Y   xY w)u>   ANU_BOT_TOKEN 미설정 시 urlopen을 호출하지 않는다.r_   F)raisingra   rb   N)delenvr   r   r[   assert_not_calledre   s      r   test_skips_when_no_tokenz7TestSendOverlapTelegramWarning.test_skips_when_no_token   s\     	?E: {+\: 	c`ab	c 	&&(	c 	cs   AAc                     |j                  dd       t               }t        d|      5  t        g        ddd       |j	                          y# 1 sw Y   xY w)u>   warnings가 비어있으면 urlopen을 호출하지 않는다.r_   r`   ra   N)rc   r   r   r[   rk   re   s      r   test_skips_when_empty_warningsz=TestSendOverlapTelegramWarning.test_skips_when_empty_warnings   sR     	?,>? {+\: 	"	 	&&(	 	s   AAc                     |j                  dd       t        dt        d            5  t        dg       ddd       y# 1 sw Y   yxY w)uq   urllib.request.urlopen이 예외를 던져도 _send_overlap_telegram_warning은 예외를 전파하지 않는다.r_   r`   ra   znetwork error)side_effectrb   N)rc   r   	Exceptionr[   )r.   r/   s     r   $test_no_exception_on_urlopen_failurezCTestSendOverlapTelegramWarning.test_no_exception_on_urlopen_failure   sJ     	?,>?+?9ST 	c`ab	c 	c 	cs	   ?AN)	rQ   rR   rS   rT   _skip_if_absentrg   rl   rn   rr   rD   r   r   r]   r]      sW    S * * ) ) ) ) c cr   r]   )rT   r   syspathlibr   unittest.mockr   r   pytestpathinsertstr__file__resolveparentdispatchr*   dictr   r   rY   _send_fnmarkskipifrs   listr[   r]   rD   r   r   <module>r      s    [  
  *  3tH~--/66==> ? t D T  L 38$?++$$R % D T /c /cr   