
    aiv#                        d Z ddlZddlmc m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j8                  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       8/home/jay/workspace/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(  }|st        j                  d
|fd||f      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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}d}	|d   }
|	|
v }|slt        j                  d|fd|	|
f      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}	x}}
d}	|d   }
|	|
v }|slt        j                  d|fd|	|
f      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}	x}}
d}	|d   }
|	|
v }|slt        j                  d|fd|	|
f      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}	x}}
y)uU   running 상태 task와 affected_files가 겹칠 때 경고 메시지를 반환한다.	task-9001running
src/foo.py
src/bar.pystatusaffected_files	WORKSPACE
src/baz.py	task-9999   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenresultpy0py1py3py6assert %(py8)spy8Nr   )in)z%(py1)s in %(py4)s)r0   py4zassert %(py6)sr2   u   [파일 충돌 경고])r   setattrmod_check_affected_files_overlapr,   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)selfr   monkeypatchr-   @py_assert2@py_assert5@py_assert4@py_format7@py_format9@py_assert0@py_assert3@py_format5s               r   test_overlap_detectedz3TestCheckAffectedFilesOverlap.test_overlap_detected"   s   ##/">$
 	 	Ch722L,3OQ\]6{a{a{ass66{a'fQi'{i''''{i'''{'''i'''''''(vay(|y((((|y(((|(((y((((((('46!94'94444'9444'44494444444r   c                    t        |dddgdi       |j                  t        d|       t        j                  ddgd      }g }||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[   affected_files가 다른 running task와 겹치지 않으면 빈 리스트를 반환한다.r   r   zsrc/other.pyr"   r%   r    r&   r'   r)   z%(py0)s == %(py3)sr-   r/   r1   assert %(py5)spy5Nr   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   r   rC   r-   rD   @py_assert1@py_format4@py_format6s           r   test_no_overlapz-TestCheckAffectedFilesOverlap.test_no_overlap4   s    ##1"2$
 	 	Ch722L,3OQ\]v|vvvr   c                    t        |dddgdi       |j                  t        d|       t        j                  g d      }g }||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   affected_files=[] 이면 빈 리스트를 반환한다.r   r   r    r"   r%   r'   r)   rN   r-   rO   rP   rQ   NrR   rS   s           r   test_empty_affected_filesz7TestCheckAffectedFilesOverlap.test_empty_affected_filesC   s    ##/.$
 	 	Ch7222{Cv|vvvr   c                    t        |dddgdi       |j                  t        d|       t        j                  dgd      }g }||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)uF   current_task_id와 동일한 task는 겹침 검사에서 제외된다.r'   r   r    r"   r%   r)   rN   r-   rO   rP   rQ   NrR   rS   s           r   test_self_excludedz0TestCheckAffectedFilesOverlap.test_self_excludedR   s    ##/.$
 	 	Ch722L>;Ov|vvvr   c                    t        |ddgdddgdd       |j                  t        d|       t        j                  dgd      }g }||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   status가 'done' 또는 'reserved'인 task는 겹침 검사에서 무시된다.doner    r"   reserved)z	task-doneztask-reservedr%   r'   r)   rN   r-   rO   rP   rQ   NrR   rS   s           r   test_non_running_tasks_excludedz=TestCheckAffectedFilesOverlap.test_non_running_tasks_excludeda   s     #/.
 %#/.	$
 		 	Ch722L>;Ov|vvvr   c                    |j                  t        d|       t        j                  dgd      }g }||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
)uD   task-timers.json 파일이 없을 때 빈 리스트를 반환한다.r%   r    r'   r)   rN   r-   rO   rP   rQ   N)r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rS   s           r   test_timer_file_not_existsz8TestCheckAffectedFilesOverlap.test_timer_file_not_existst   s    Ch7 22L>;Ov|vvvr   c                    t        |ddgdddgdd       |j                  t        d|       t        j                  ddgd      }t	        |      }d}||k(  }|st        j                  d	|fd
||f      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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|D 	cg c]  }	|	 }
}	d |
D        }t        |      }|sd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}}d |
D        }t        |      }|sd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c c}	w )uJ   여러 running task와 겹칠 때 각각 경고 메시지가 반환된다.r   r    r"   r!   )task-Atask-Br%   r'      r)   r+   r,   r-   r.   r3   r4   Nc              3   $   K   | ]  }d |v  
 yw)rc   N .0ws     r   	<genexpr>zPTestCheckAffectedFilesOverlap.test_multiple_overlapping_tasks.<locals>.<genexpr>        ?Q8q=?   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r/   py2r6   c              3   $   K   | ]  }d |v  
 yw)rd   Nrg   rh   s     r   rk   zPTestCheckAffectedFilesOverlap.test_multiple_overlapping_tasks.<locals>.<genexpr>   rl   rm   )r   r7   r8   r9   r,   r:   r;   r<   r=   r>   r?   r@   rA   rn   )rB   r   rC   r-   rD   rE   rF   rG   rH   rj   task_ids_in_warningsrT   rJ   rK   s                 r   test_multiple_overlapping_tasksz=TestCheckAffectedFilesOverlap.test_multiple_overlapping_tasks~   s   ##/.
 $#/.	$
 		 	Ch722L,3OQ\]6{a{a{ass66{a+12a22?*>??s?????????s???s???????????????*>??s?????????s???s??????????????  3s   	Kc                    |dz  }|j                  dd       |dz  j                  dd       |j                  t        d|       t        j                  d	gd
      }g }||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-timers.json 파일이 있을 때 예외 없이 빈 리스트를 반환한다.r
   Tr   r   zNOT VALID JSONr   r   r%   r    r'   r)   rN   r-   rO   rP   rQ   N)r   r   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   )	rB   r   rC   r   r-   rD   rT   rU   rV   s	            r   test_corrupted_timer_filez7TestCheckAffectedFilesOverlap.test_corrupted_timer_file   s    (
5	(	(445EPW4XCh722L>;Ov|vvvr   N)__name__
__module____qualname____doc__rL   rW   rY   r[   r_   ra   rr   rt   rg   r   r   r   r      s.    75$&@,	r   r   _send_overlap_telegram_warninguE   _send_overlap_telegram_warning 함수가 dispatch.py에 아직 없음)reasonwarningsc                    t        t        dd      }d}||u}|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d      dz   d	|iz  }t        t        j                  |            dx}} ||        y)
uL   _send_fn을 안전하게 호출하는 래퍼 (pyright optional-call 방지).ry   N)is not)z%(py0)s is not %(py3)sfnrO   uG   _send_overlap_telegram_warning이 dispatch.py에 존재해야 합니다z
>assert %(py5)srQ   )getattrr8   r:   r;   r<   r=   r>   r?   _format_assertmsgr@   rA   )r{   r~   rD   rT   rU   rV   s         r   _call_send_fnr      sy    	6	=Bd2T>ddd2Tdddddd2ddd2dddTddddddd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rB   rC   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)raisingr   r   N)delenvr   r   r   assert_not_calledr   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   r   N)r   r   r   r   r   r   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   r   znetwork error)side_effectr   N)r   r   	Exceptionr   )rB   rC   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)	ru   rv   rw   rx   _skip_if_absentr   r   r   r   rg   r   r   r   r      sW    S * * ) ) ) ) c cr   r   )"rx   builtinsr<   _pytest.assertion.rewrite	assertionrewriter:   r   syspathlibr   unittest.mockr   r   pytestpathinsertstr__file__resolveparentdispatchr8   dictr   r   r   _send_fnmarkskipifr   listr   r   rg   r   r   <module>r      s    [    
  *  3tH~--/66==> ? t D T  L 38$?++$$R % D T /c /cr   