
    iv(                     P   d Z ddlZddlZddlZddlmZ ddlZej                  j                  dd        ej                  d      Z
 G d d      Z G d d	      Z G d
 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 테스트

테스트 항목:
1. extract_team_from_done_file() - .done 파일에서 팀 추출
2. set_bot_idle() - 봇 idle 전환
3. scan_done_files() - .done 파일 스캔
4. process_done_files() - .done 파일 처리
    N)Pathz/home/jay/workspace/scriptszdone-watcherc                   "    e Zd ZdZd Zd Zd Zy)TestExtractTeamFromDoneFileu'   extract_team_from_done_file() 테스트c                     |j                  t        dt        |             |dz  }|j                          t        j	                  |      }|dk(  sJ y)u:   파일명에서 팀 추출 (task-648.1.dev1.done → dev1)WORKSPACE_ROOTtask-648.1.dev1.donedev1Nsetattrdone_watcherstrtouchextract_team_from_done_fileselftmp_pathmonkeypatch	done_fileresults        H/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_done_watcher.pytest_extract_from_filenamez6TestExtractTeamFromDoneFile.test_extract_from_filename   L    L*:CMJ55	99)D    c                     |j                  t        dt        |             |dz  }|j                          t        j	                  |      }|dk(  sJ y)u:   파일명에서 팀 추출 (task-648.1.dev2.done → dev2)r   ztask-648.1.dev2.donedev2Nr
   r   s        r   test_extract_from_filename_dev2z;TestExtractTeamFromDoneFile.test_extract_from_filename_dev2$   r   r   c                 B   |j                  t        dt        |             ddddddii}|dz  j                  d	d	
       |dz  dz  j	                  t        j                  |d      d       |dz  }|j                          t        j                  |      }|dk(  sJ y)u@   팀 정보가 없는 파일명 → task-timers.json에서 조회r   tasksz
task-648.1dev3
processingz2026-03-17T07:00:00Z)team_idstatus
started_atmemoryT)parentsexist_okztask-timers.json   indentutf-8encodingztask-648.1.doneN)	r   r   r   mkdir
write_textjsondumpsr   r   )r   r   r   
timer_datar   r   s         r   %test_extract_without_team_in_filenamezATestExtractTeamFromDoneFile.test_extract_without_team_in_filename.   s    L*:CMJ l,^t$uv

 
H	##D4#@	H	1	1==djj\]>^ip=q 00	99)Dr   N)__name__
__module____qualname____doc__r   r   r2    r   r   r   r      s    1   r   r   c                   "    e Zd ZdZd Zd Zd Zy)TestSetBotIdleu   set_bot_idle() 테스트c                 z   |j                  t        d|dz         |j                  t        d|dz         ddddd	ii}|dz  j                  t        j                  |d
      d       t        j                  d      }|du sJ t        j                  |dz  j                  d            }|d   d   d   dk(  sJ y)u   idle 전환 성공BOT_ACTIVITY_FILEbot-activity.jsonDONE_PROTOCOL_LOGdone-protocol.logbotsr	   r    2026-03-17T06:54:35Zr"   sincer'   r(   r*   r+   Tr"   idleN)r   r   r.   r/   r0   set_bot_idleloads	read_text)r   r   r   datar   updateds         r   test_set_idle_successz$TestSetBotIdle.test_set_idle_successD   s    L*=xJ]?]^L*=xJ]?]^ LCY!Z[\	'	'33DJJtA4NY`3a**62~~ **h)<<GGQXGYZvv&x0F:::r   c                 
   |j                  t        d|dz         |j                  t        d|dz         ddddd	ii}|dz  j                  t        j                  |d
      d       t        j                  d      }|du sJ y)u   이미 idle인 경우 스킵r;   r<   r=   r>   r?   r	   rC   r@   rA   r'   r(   r*   r+   TNr   r   r.   r/   r0   rD   r   r   r   rG   r   s        r   test_set_idle_already_idlez)TestSetBotIdle.test_set_idle_already_idleT   s    L*=xJ]?]^L*=xJ]?]^ F=S!TUV	'	'33DJJtA4NY`3a**62~~r   c                 
   |j                  t        d|dz         |j                  t        d|dz         ddddd	ii}|dz  j                  t        j                  |d
      d       t        j                  d      }|du sJ y)u   알 수 없는 팀r;   r<   r=   r>   r?   r	   r    r@   rA   r'   r(   r*   r+   unknown_teamFNrK   rL   s        r   test_set_idle_unknown_teamz)TestSetBotIdle.test_set_idle_unknown_team`   s    L*=xJ]?]^L*=xJ]?]^LCY!Z[\	'	'33DJJtA4NY`3a**>:r   N)r3   r4   r5   r6   rI   rM   rP   r7   r   r   r9   r9   A   s    "; 
	r   r9   c                       e Zd ZdZd Zd Zy)TestScanDoneFilesu   scan_done_files() 테스트c                    |j                  t        d|       |dz  j                          |dz  j                          |dz  j                          |dz  j                          t        j                         }t	        |      dk(  sJ y)u   .done 파일 스캔
EVENTS_DIRr   task-648.2.dev2.doneztask-648.3.doneztask-648.4.dev3.done.acked   N)r   r   r   scan_done_fileslenr   r   r   r   s       r   test_scan_done_filesz&TestScanDoneFiles.test_scan_done_fileso   s    L,A 
*	*113	*	*113	%	%,,. 
0	0779--/6{ar   c                 z    |j                  t        d|       t        j                         }t        |      dk(  sJ y)u   .done 파일이 없는 경우rT   r   N)r   r   rW   rX   rY   s       r   test_scan_no_done_filesz)TestScanDoneFiles.test_scan_no_done_files~   s4    L,A--/6{ar   N)r3   r4   r5   r6   rZ   r\   r7   r   r   rR   rR   l   s    %  r   rR   c                       e Zd ZdZd Zy)TestProcessDoneFilesu   process_done_files() 테스트c                 \   |j                  t        d|       |j                  t        d|dz         |j                  t        d|dz         |j                  t        dt        |             ddd	d
ddd
di}|dz  j                  t	        j
                  |d      d       |dz  j                          |dz  j                          t        j                         }|dk(  sJ t	        j                  |dz  j                  d            }|d   d   d   dk(  sJ |d   d   d   dk(  sJ y)u'   .done 파일 처리 → bot idle 전환rT   r;   r<   r=   r>   r   r?   r    r@   rA   z2026-03-17T06:54:36Z)r	   r   r'   r(   r*   r+   r   rU   r	   r"   rC   r   N)
r   r   r   r.   r/   r0   r   process_done_filesrE   rF   )r   r   r   rG   	processedrH   s         r   test_process_done_filesz,TestProcessDoneFiles.test_process_done_files   sF   L,AL*=xJ]?]^L*=xJ]?]^L*:CMJ #/:PQ#/:PQ
 
'	'33DJJtA4NY`3a 
*	*113	*	*113 !335	A~~ **h)<<GGQXGYZvv&x0F:::vv&x0F:::r   N)r3   r4   r5   r6   rb   r7   r   r   r^   r^      s
    (;r   r^   c                   "    e Zd ZdZd Zd Zd Zy)TestScanFailedFilesu   scan_failed_files() 테스트c                     |j                  t        d|       |dz  j                  d       |dz  j                  d       t        j                         }t	        |      dk(  sJ y)u   .failed 파일 스캔rT   task-100.failed.{"task_id":"task-100","fail_reason":"QC FAIL"}ztask-200.failedz.{"task_id":"task-200","fail_reason":"QC FAIL"}r'   N)r   r   r.   scan_failed_filesrX   rY   s       r   test_scan_failed_filesz*TestScanFailedFiles.test_scan_failed_files   s^    L,A	%	%112bc	%	%112bc//16{ar   c                     |j                  t        d|       |dz  j                  d       |dz  j                          t        j	                         }t        |      dk(  sJ y)u(   .failed.acked 마커가 있으면 제외rT   rf   rg   task-100.failed.ackedr   N)r   r   r.   r   rh   rX   rY   s       r   test_scan_failed_excludes_ackedz3TestScanFailedFiles.test_scan_failed_excludes_acked   s[    L,A	%	%112bc	+	+224//16{ar   c                 z    |j                  t        d|       t        j                         }t        |      dk(  sJ y)u   .failed 파일이 없는 경우rT   r   N)r   r   rh   rX   rY   s       r   test_scan_no_failed_filesz-TestScanFailedFiles.test_scan_no_failed_files   s4    L,A//16{ar   N)r3   r4   r5   r6   ri   rl   rn   r7   r   r   rd   rd      s    '   r   rd   c                   "    e Zd ZdZd Zd Zd Zy)TestProcessFailedFilesu    process_failed_files() 테스트c                    |j                  t        d|       |j                  t        d|dz         |j                  dd       |dz  j                  d       t        j	                         }|d	k(  sJ |dz  j                         sJ y
)uH   .failed 파일 처리 - bot token 없으면 알림 실패, rename 안됨rT   r=   r>   ANU_BOT_TOKENFraisingrf   P{"task_id":"task-100","fail_reason":"QC FAIL","timestamp":"2026-04-20T10:00:00"}r   N)r   r   delenvr.   process_failed_filesexistsr   r   r   ra   s       r   &test_process_failed_files_no_bot_tokenz=TestProcessFailedFiles.test_process_failed_files_no_bot_token   s    L,AL*=xJ]?]^?E:	%	%11  3E  	F 557	A~~,,44666r   c                     |j                  t        d|       |j                  t        d|dz         |dz  j                  d       t        j                         }|dk(  sJ y)u/   .failed 파일 JSON 파싱 실패 시 건너뜀rT   r=   r>   rf   znot json contentr   N)r   r   r.   rw   ry   s       r   $test_process_failed_files_json_errorz;TestProcessFailedFiles.test_process_failed_files_json_error   s\    L,AL*=xJ]?]^	%	%112DE 557	A~~r   c                 f   |j                  t        d|       |j                  t        d|dz         dt        dt        fd}|j                  t        d|       |dz  j	                  d	       t        j                         }|d
k(  sJ |dz  j                         rJ |dz  j                         sJ y)u8   .failed 파일 처리 성공 시 .failed.acked로 renamerT   r=   r>   messagereturnc                     d| v sJ y)NzQC FAILTr7   )r~   s    r   	mock_sendzRTestProcessFailedFiles.test_process_failed_files_with_mock_send.<locals>.mock_send   s    '''r   send_telegram_notificationrf   ru      rk   N)r   r   r   boolr.   rw   rx   )r   r   r   r   ra   s        r   (test_process_failed_files_with_mock_sendz?TestProcessFailedFiles.test_process_failed_files_with_mock_send   s    L,AL*=xJ]?]^	s 	t 	 	L*F	R	%	%11  3E  	F 557	A~~0088:::22::<<<r   N)r3   r4   r5   r6   rz   r|   r   r7   r   r   rp   rp      s    *7=r   rp   c                       e Zd ZdZd Zy)TestSendTelegramNotificationu&   send_telegram_notification() 테스트c                     |j                  t        dt        d             |j                  dd       t        j	                  d      }|du sJ y)u    bot token 없으면 False 반환r=   z/tmp/test-done-protocol.logrr   Frs   ztest messageN)r   r   r   rv   r   )r   r   r   s      r   test_no_bot_tokenz.TestSendTelegramNotification.test_no_bot_token   sJ    L*=tDa?bc?E:88Hr   N)r3   r4   r5   r6   r   r7   r   r   r   r      s
    0r   r   __main__z-v)r6   	importlibr/   syspathlibr   pytestpathinsertimport_moduler   r   r9   rR   r^   rd   rp   r   r3   main__file__r7   r   r   <module>r      s      
   0 1&y&&~6'  ' T( (V   4; ;B   6*= *=Z  zFKK4 ! r   