
    Ji                         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 ej                  j                  dd       de
deddfd	Zd
 Zd Zd Zd Zd Zd Zd Zd Zy)u}   
통합 테스트: dispatch.py - _check_affected_files_overlap, _send_overlap_telegram_warning
task-1837_5.1 - 엔키 작성
    N)Path)	MagicMockpatchz/home/jay/workspacetmp_pathdatareturnc                     | dz  }|j                  dd       |dz  j                  t        j                  |      d       y)u0   task-timers.json을 tmp_path/memory/ 에 작성.memoryTparentsexist_okztask-timers.jsonzutf-8)encodingN)mkdir
write_textjsondumps)r   r   r
   s      D/home/jay/workspace/tests/integration/test_affected_files_overlap.py_write_timersr      s>     F
LLL-  ,,TZZ-=,P    c                    ddddgdii}t        | |       ddl}|j                  |d|        |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   running 상태 task가 없으면 빈 리스트를 반환해야 한다.tasksztask-100donedispatch.pystatusaffected_filesr   N	WORKSPACEztask-200==z%(py0)s == %(py3)sresultpy0py3assert %(py5)spy5r   dispatchsetattr_check_affected_files_overlap
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation	r   monkeypatchr   _dr!   @py_assert2@py_assert1@py_format4@py_format6s	            r   +test_overlap_no_running_tasks_returns_emptyr:      s     	6m_M
D
 (D!K2--}ozJF6R<6R66Rr   c                    dddddgdii}t        | |       ddl}|j                  |d	|        |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}}y)ue   running 상태 task와 affected_files가 겹치면 경고 메시지 리스트를 반환해야 한다.r   ztask-101runningr   zutils/logger.pyr   r   Nr   z	server.pyztask-202   r   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenwarningsr#   py1r$   py6assert %(py8)spy8inz%(py1)s in %(py4)srB   py4assert %(py6)srC   r   r(   r)   r*   r?   r+   r,   r-   r.   r/   r0   r1   r2   r   r4   r   r5   r@   r6   @py_assert5@py_assert4@py_format7@py_format9@py_assert0@py_assert3@py_format5s                r   8test_overlap_running_task_with_same_file_returns_warningrU   '   s    	##02C"D
D (D!K2//0LjYHx=A=A=A33xx=A$!$:$$$$:$$$:$$$$$$$$$$'HQK'=K''''=K'''='''K'''''''r   c                    ddddgdii}t        | |       ddl}|j                  |d|        |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)uM   자기 자신(current_task_id)은 겹침 검사에서 제외되어야 한다.r   ztask-999r<   r   r   r   Nr   r   r    r!   r"   r%   r&   r'   r3   s	            r   %test_overlap_excludes_current_task_idrW   <   s     	##0/
D (D!K2 --}ozJF6R<6R66Rr   c                    | dz  j                  dd       ddl}|j                  |d|        |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)uC   task-timers.json이 없으면 빈 리스트를 반환해야 한다.r
   Tr   r   Nr   zany_file.pyztask-300r   r    r!   r"   r%   r&   )r   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   )r   r4   r5   r!   r6   r7   r8   r9   s           r   )test_overlap_no_timers_file_returns_emptyrY   P   s     t<K2--}ozJF6R<6R66Rr   c                    dddgdddgddddgddi}t        | |       dd	l}|j                  |d
|        |j                  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}}y	)uJ   여러 running task 중 겹치는 것만 경고에 포함되어야 한다.r   r<   za.pyr   zb.pyr   )task-110task-111ztask-112r   Nr   ztask-500r=   r   r>   r?   r@   rA   rD   rE   r[   rF   rH   rI   rK   rC   r\   )not in)z%(py1)s not in %(py4)srL   rM   s                r   #test_overlap_multiple_running_tasksr^   \   s    	##)(
 $#)(
 !#)6"2
D  (D!K2//*EHx=A=A=A33xx=A$!$:$$$$:$$$:$$$$$$$$$$(Xa[(:[((((:[(((:((([(((((((r   c                      ddl } t        d      5 }| j                  g        |j                          ddd       y# 1 sw Y   yxY w)uT   warnings가 비어있으면 urllib.request.urlopen을 호출하지 않아야 한다.r   Nurllib.request.urlopen)r(   r   _send_overlap_telegram_warningassert_not_called)r5   mock_urlopens     r   :test_send_overlap_warning_empty_list_does_not_call_urlopenrd   {   s?    	'	( )L
))"-&&() ) )s	   ";Ac                     ddl }| j                  dd       t        d      5 }|j                  dg       |j	                          ddd       y# 1 sw Y   yxY w)uO   ANU_BOT_TOKEN이 설정되지 않으면 Telegram 호출을 스킵해야 한다.r   NANU_BOT_TOKENF)raisingr`   F   [파일 충돌 경고] task-101(running)와 파일 겹침: dispatch.py)r(   delenvr   ra   rb   )r4   r5   rc   s      r   ,test_send_overlap_warning_no_bot_token_skipsrj      sV    6	'	( )L
))+s*tu&&() ) )s   #AAc                     ddl }| j                  dd       t               }t        d|      5 }|j	                  dg       |j                          ddd       y# 1 sw Y   yxY w)u:   ANU_BOT_TOKEN이 있으면 urlopen을 호출해야 한다.r   Nrf   ztest-token-123r`   )return_valuerh   )r(   setenvr   r   ra   assert_called_once)r4   r5   	mock_resprc   s       r   2test_send_overlap_warning_with_token_calls_urlopenrp      s]    (89I	'i	@ *L
))+s*tu'')* * *s   #AA#)__doc__builtinsr-   _pytest.assertion.rewrite	assertionrewriter+   r   syspathlibr   unittest.mockr   r   pathinsertdictr   r:   rU   rW   rY   r^   rd   rj   rp    r   r   <module>r}      su   
   
  * ( )QD Q Q Q (*(	)>))	*r   