
     i                        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
Z
ddlmZmZ ddlmZ ddlZ e
j                          Zeej$                  d<   e	j&                  j)                  d e ee      j.                  j.                                ed      Z G d d      Z G d	 d
      Z G d d      Z G d d      Zedk(  r ej>                  edg       yy)u#   done-watcher.py 테스트 스위트    N)datetimetimezone)PathWORKSPACE_ROOTzdone-watcherc                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestExtractTeamFromDoneFileu)   done 파일명에서 팀 추출 테스트c                    |dz  }t         j                  |      }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-648.1.dev1.done → dev1task-648.1.dev1.donedev1==z%(py0)s == %(py3)sresultpy0py3assert %(py5)spy5N
dwextract_team_from_done_file
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselftmp_path	done_filer   @py_assert2@py_assert1@py_format4@py_format6s           6/home/jay/workspace/scripts/tests/test_done_watcher.pytest_extract_dev1_teamz2TestExtractTeamFromDoneFile.test_extract_dev1_team   v    55	//	:vvvv    c                    |dz  }t         j                  |      }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-648.1.dev2.done → dev2ztask-648.1.dev2.donedev2r   r   r   r   r   r   Nr   r    s           r(   test_extract_dev2_teamz2TestExtractTeamFromDoneFile.test_extract_dev2_team    r*   r+   c                    |dz  }t         j                  |      }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-648.1.dev3.done → dev3ztask-648.1.dev3.donedev3r   r   r   r   r   r   Nr   r    s           r(   test_extract_dev3_teamz2TestExtractTeamFromDoneFile.test_extract_dev3_team&   r*   r+   c                 H   |dz  dz  }|j                   j                  d       |j                  t        j                  ddddiii             t        |      t        _        |d	z  }t        j                  |      }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-timers.json 조회memoryztask-timers.jsonTparentstasksz
task-648.1team_idz	dev3-teamtask-648.1.doner   r   r   r   r   r   N)parentmkdir
write_textjsondumpsstrr   r   r   r   r   r   r   r   r   r   r   )	r!   r"   
timer_filer#   r   r$   r%   r&   r'   s	            r(   -test_no_team_in_filename_falls_back_to_timerszITestExtractTeamFromDoneFile.test_no_team_in_filename_falls_back_to_timers,   s     (+==
-djj'L9kBZ3[)\]^M00	//	:$$v$$$$v$$$$$$v$$$v$$$$$$$$$$r+   c                    t        |      t        _        |dz  }t        j                  |      }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}}y)	u*   팀 정보 없고 timers도 없으면 Noner8   Nisz%(py0)s is %(py3)sr   r   r   r   )r>   r   r   r   r   r   r   r   r   r   r   r   r    s           r(   #test_no_team_no_timers_returns_nonez?TestExtractTeamFromDoneFile.test_no_team_no_timers_returns_none8   s    M00	//	:v~vvvr+   N)	__name__
__module____qualname____doc__r)   r.   r1   r@   rE    r+   r(   r   r      s    3   
%r+   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestSetBotIdleu    봇 상태 idle 전환 테스트c           	      z   |dz  }|j                   j                  dd       |j                  t        j                  dddddii             |t
        _        t
        j                  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  }dd|iz  }t        t        j                  |            dx}}t        j                   |j#                               }|d   d   d   }	d}
|	|
k(  }|slt        j                  d|fd|	|
f      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}	x}}
y)u!   processing → idle 전환 성공bot-activity.jsonTr5   exist_okbots	dev1-team
processing2026-03-17T00:00:00ZstatussincerB   rD   r   r   r   r   NrV   idler   z%(py1)s == %(py4)spy1py4assert %(py6)spy6)r9   r:   r;   r<   r=   r   BOT_ACTIVITY_FILEset_bot_idler   r   r   r   r   r   r   r   loads	read_text)r!   r"   bot_filer   r$   r%   r&   r'   saved@py_assert0@py_assert3@py_format5@py_format7s                r(   test_set_idle_from_processingz,TestSetBotIdle.test_set_idle_from_processingC   s0   11dT:JJPf.g hij	
  (-v~vvv

8--/0V}[)(3=v=3v====3v===3===v=======r+   c           	      (   |dz  }|j                   j                  dd       |j                  t        j                  dddddii             |t
        _        t
        j                  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  }dd|iz  }t        t        j                  |            dx}}y)u-   이미 idle이면 True 반환 (변경 없음)rN   TrO   rQ   rR   rX   rT   rU   rB   rD   r   r   r   r   N)r9   r:   r;   r<   r=   r   r_   r`   r   r   r   r   r   r   r   r   r!   r"   rc   r   r$   r%   r&   r'   s           r(   test_already_idle_returns_truez-TestSetBotIdle.test_already_idle_returns_trueR   s    11dT:DJJZp>q0r'stu'-v~vvvr+   c                 :   |dz  }|j                   j                  dd       |j                  t        j                  di i             |t
        _        |dz  t
        _        t
        j                  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  }dd|iz  }t        t        j                   |            dx}}y)u!   존재하지 않는 팀 → FalserN   TrO   rQ   log.logzunknown-teamFrB   rD   r   r   r   r   N)r9   r:   r;   r<   r=   r   r_   DONE_PROTOCOL_LOGr`   r   r   r   r   r   r   r   r   rk   s           r(   test_unknown_team_returns_falsez.TestSetBotIdle.test_unknown_team_returns_false\   s    11dT:DJJ|45'')30vvvvr+   c           	      ~   |dz  }|j                   j                  dd       |j                  t        j                  dddddii             |t
        _        |d	z  t
        _        t
        j                  d       t        j                  |j                               }|d   d   d
   }|j                  }d} ||      }|stdt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}x}}y)u)   idle 전환 시 since 필드 업데이트rN   TrO   rQ   r-   rS   z2026-01-01T00:00:00ZrU   rn   rW   z2026-03zLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})r[   r   r   py7N)r9   r:   r;   r<   r=   r   r_   ro   r`   ra   rb   
startswithr   r   r   r   )	r!   r"   rc   rd   re   r$   @py_assert4@py_assert6@py_format8s	            r(   test_idle_timestamp_updatedz*TestSetBotIdle.test_idle_timestamp_updatedg   s    11dT:DJJL[q9r0s'tuv'')3


8--/0V}V$W-C-88CC8CCCCC-CCC8CCCCCCCCCCCCCr+   N)rF   rG   rH   rI   ri   rl   rp   rw   rJ   r+   r(   rL   rL   @   s    *>	Dr+   rL   c                   "    e Zd ZdZd Zd Zd Zy)TestScanDoneFilesu   done 파일 스캔 테스트c                    |dz  dz  }|j                  d       |dz  j                  d       |dz  j                  d       |t        _        t        j	                         }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}}y)u"   처리 안 된 .done 파일 찾기r3   eventsTr4   r8   {}ztask-648.2.done   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr   )r   r[   r   r^   zassert %(py8)spy8N)r:   r;   r   
EVENTS_DIRscan_done_filesr~   r   r   r   r   r   r   r   r   )	r!   r"   
events_dirr   r$   @py_assert5rt   rh   @py_format9s	            r(   test_scan_finds_done_filesz,TestScanDoneFiles.test_scan_finds_done_filesy   s    (83
&	'	'33D9	'	'33D9"##%6{a{a{ass66{ar+   c                    |dz  dz  }|j                  d       |t        _        t        j                         }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#   done 파일 없으면 빈 리스트r3   r{   Tr4   r   r   r   r   r   r   N)r:   r   r   r   r   r   r   r   r   r   r   r   r!   r"   r   r   r$   r%   r&   r'   s           r(   test_scan_empty_dirz%TestScanDoneFiles.test_scan_empty_dir   s    (83
&"##%v|vvvr+   c                    |dz  dz  }|j                  d       |dz  j                  d       |dz  j                  d       |t        _        t        j	                         }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   done이 아닌 파일은 제외r3   r{   Tr4   ztask-648.1.failedr|   zsome-file.jsonr   r   r   r   r   r   N)r:   r;   r   r   r   r   r   r   r   r   r   r   r   r   s           r(    test_scan_ignores_non_done_filesz2TestScanDoneFiles.test_scan_ignores_non_done_files   s    (83
&	)	)55d;	&	&2248"##%v|vvvr+   N)rF   rG   rH   rI   r   r   r   rJ   r+   r(   ry   ry   v   s    &	 	r+   ry   c                       e Zd ZdZd Zd Zy)TestProcessDoneFilesu#   done 파일 처리 통합 테스트c           	         |dz  dz  }|j                  d       |dz  j                  d       |dz  }|j                  t        j                  dd	d
ddii             |t        _        |t        _        |dz  t        _        t        j                         }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}}t        j"                  |j%                               }	|	d   d	   d   }
d}|
|k(  }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                   |            dx}
x}}y)u&   done 파일 감지 → 봇 idle 전환r3   r{   Tr4   r
   r|   rN   rQ   r   rS   rT   rU   rn      r   r   	processedr   r   r   NrV   rX   rY   rZ   r]   r^   )r:   r;   r<   r=   r   r   r_   ro   process_done_filesr   r   r   r   r   r   r   r   ra   rb   )r!   r"   r   rc   r   r$   r%   r&   r'   rd   re   rf   rg   rh   s                 r(   $test_process_done_file_sets_bot_idlez9TestProcessDoneFiles.test_process_done_file_sets_bot_idle   s`   (83
& 
,	,88>  33DJJL[q9r0s'tuv"'')3))+	yA~yAyyA

8--/0V}V$X.8&8.&8888.&888.888&8888888r+   c                    |dz  dz  }|j                  d       |t        _        |dz  t        _        t        j	                         }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   done 파일 없으면 0 반환r3   r{   Tr4   rn   r   r   r   r   r   r   r   N)r:   r   r   ro   r   r   r   r   r   r   r   r   r   )r!   r"   r   r   r$   r%   r&   r'   s           r(   test_process_no_done_filesz/TestProcessDoneFiles.test_process_no_done_files   s    (83
&"')3))+	yA~yAyyAr+   N)rF   rG   rH   rI   r   r   rJ   r+   r(   r   r      s    -9,r+   r   __main__z-v) rI   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r<   ossystempfiler   r   pathlibr   pytestmkdtemp_TEMP_WORKSPACEenvironpathinsertr>   __file__r9   
__import__r   r   rL   ry   r   rF   mainrJ   r+   r(   <module>r      s    )    	 
  '   #(""$.

  3tH~,,334 5 & &R3D 3Dl   F! !H zFKK4 ! r+   