
    iW                        d Z ddlZddlZddlZddl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)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                 F    |dz  }t         j                  |      }|dk(  sJ y)u   task-648.1.dev1.done → dev1task-648.1.dev1.donedev1Ndwextract_team_from_done_fileselftmp_path	done_fileresults       P/home/jay/workspace/.worktrees/task-2464-dev6/scripts/tests/test_done_watcher.pytest_extract_dev1_teamz2TestExtractTeamFromDoneFile.test_extract_dev1_team   +    55	//	:    c                 F    |dz  }t         j                  |      }|dk(  sJ y)u   task-648.1.dev2.done → dev2ztask-648.1.dev2.donedev2Nr
   r   s       r   test_extract_dev2_teamz2TestExtractTeamFromDoneFile.test_extract_dev2_team   r   r   c                 F    |dz  }t         j                  |      }|dk(  sJ y)u   task-648.1.dev3.done → dev3ztask-648.1.dev3.donedev3Nr
   r   s       r   test_extract_dev3_teamz2TestExtractTeamFromDoneFile.test_extract_dev3_team%   r   r   c                 
   |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(  sJ y
)u,   팀 정보 없으면 task-timers.json 조회memoryztask-timers.jsonTparentstasksz
task-648.1team_idz	dev3-teamtask-648.1.doneN)	parentmkdir
write_textjsondumpsstrr   r   r   )r   r   
timer_filer   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	//	:$$$r   c                 h    t        |      t        _        |dz  }t        j                  |      }|J y)u*   팀 정보 없고 timers도 없으면 Noner"   N)r(   r   r   r   r   s       r   #test_no_team_no_timers_returns_nonez?TestExtractTeamFromDoneFile.test_no_team_no_timers_returns_none7   s3    M00	//	:~~r   N)	__name__
__module____qualname____doc__r   r   r   r*   r,    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           	      P   |dz  }|j                   j                  dd       |j                  t        j                  dddddii             |t
        _        t
        j                  d      }|du sJ t        j                  |j                               }|d   d   d	   d
k(  sJ y)u!   processing → idle 전환 성공bot-activity.jsonTr   exist_okbots	dev1-team
processing2026-03-17T00:00:00Zstatussincer=   idleN)
r#   r$   r%   r&   r'   r   BOT_ACTIVITY_FILEset_bot_idleloads	read_text)r   r   bot_filer   saveds        r   test_set_idle_from_processingz,TestSetBotIdle.test_set_idle_from_processingB   s    11dT:JJPf.g hij	
  (-~~

8--/0V}[)(3v===r   c           	          |dz  }|j                   j                  dd       |j                  t        j                  dddddii             |t
        _        t
        j                  d      }|du sJ y	)
u-   이미 idle이면 True 반환 (변경 없음)r5   Tr6   r8   r9   r?   r;   r<   N)r#   r$   r%   r&   r'   r   r@   rA   r   r   rD   r   s       r   test_already_idle_returns_truez-TestSetBotIdle.test_already_idle_returns_trueQ   sm    11dT:DJJZp>q0r'stu'-~~r   c                     |dz  }|j                   j                  dd       |j                  t        j                  di i             |t
        _        |dz  t
        _        t
        j                  d      }|du sJ y)	u!   존재하지 않는 팀 → Falser5   Tr6   r8   log.logzunknown-teamFN)	r#   r$   r%   r&   r'   r   r@   DONE_PROTOCOL_LOGrA   rH   s       r   test_unknown_team_returns_falsez.TestSetBotIdle.test_unknown_team_returns_false[   sn    11dT:DJJ|45'')30r   c           	         |dz  }|j                   j                  dd       d}|j                  t        j                  ddd|dii             |t
        _        |d	z  t
        _        t
        j                  d       t        j                  |j                               }|d   d   d
   |k7  sJ |d   d   d
   j                  d      sJ d|d   d   d
   v sJ y)u)   idle 전환 시 since 필드 업데이트r5   Tr6   z2026-01-01T00:00:00Zr8   r   r:   r<   rK   r>   ZTN)r#   r$   r%   r&   r'   r   r@   rL   rA   rB   rC   endswith)r   r   rD   initial_sincerE   s        r   test_idle_timestamp_updatedz*TestSetBotIdle.test_idle_timestamp_updatedf   s    11dT:.DJJL[h9i0j'klm'')3


8--/0V}V$W->>>V}V$W-66s;;;eFmF+G4444r   N)r-   r.   r/   r0   rF   rI   rM   rS   r1   r   r   r3   r3   ?   s    *>	5r   r3   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(  sJ y	)
u"   처리 안 된 .done 파일 찾기r   eventsTr   r"   {}ztask-648.2.done   N)r$   r%   r   
EVENTS_DIRscan_done_fileslenr   r   
events_dirr   s       r   test_scan_finds_done_filesz,TestScanDoneFiles.test_scan_finds_done_files|   sq    (83
&	'	'33D9	'	'33D9"##%6{ar   c                     |dz  dz  }|j                  d       |t        _        t        j                         }|g k(  sJ y)u#   done 파일 없으면 빈 리스트r   rW   Tr   N)r$   r   rZ   r[   r]   s       r   test_scan_empty_dirz%TestScanDoneFiles.test_scan_empty_dir   sC    (83
&"##%||r   c                     |dz  dz  }|j                  d       |dz  j                  d       |dz  j                  d       |t        _        t        j	                         }|g k(  sJ y)	u   done이 아닌 파일은 제외r   rW   Tr   ztask-648.1.failedrX   zsome-file.jsonN)r$   r%   r   rZ   r[   r]   s       r    test_scan_ignores_non_done_filesz2TestScanDoneFiles.test_scan_ignores_non_done_files   sk    (83
&	)	)55d;	&	&2248"##%||r   N)r-   r.   r/   r0   r_   ra   rc   r1   r   r   rU   rU   y   s    &	 	r   rU   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(  sJ t        j                  |j                               }|d   d	   d   dk(  sJ y)u&   done 파일 감지 → 봇 idle 전환r   rW   Tr   r   rX   r5   r8   r	   r:   r;   r<   rK      r=   r?   N)r$   r%   r&   r'   r   rZ   r@   rL   process_done_filesrB   rC   )r   r   r^   rD   	processedrE   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))+	A~~

8--/0V}V$X.&888r   c                     |dz  dz  }|j                  d       |t        _        |dz  t        _        t        j	                         }|dk(  sJ y)u   done 파일 없으면 0 반환r   rW   Tr   rK   r   N)r$   r   rZ   rL   rh   )r   r   r^   ri   s       r   test_process_no_done_filesz/TestProcessDoneFiles.test_process_no_done_files   sP    (83
&"')3))+	A~~r   N)r-   r.   r/   r0   rj   rl   r1   r   r   re   re      s    -9,r   re   __main__z-v)r0   r&   ossystempfilepathlibr   pytestmkdtemp_TEMP_WORKSPACEenvironpathinsertr(   __file__r#   
__import__r   r   r3   rU   re   r-   mainr1   r   r   <module>r{      s    )  	 
    #(""$.

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