
    i                        U d 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	m
Z
 ddlmZmZ ddlZej                  j!                  d ee      j$                  j$                  dz        Zeej(                  J ej                  j+                  e      Ze
ed	<   ej(                  j1                  e        G d
 d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)uR   
tests for canary-test.py

[task-794.1] P6-1 canary 테스트 스크립트 검증
    N)datetime	timedelta)Path)Any)	MagicMockpatchcanary_testzcanary-test.pyctc                   0    e Zd ZdZdeddfdZdeddfdZy)TestSaveCanaryStatusu#   save_canary_status 함수 테스트tmp_pathreturnNc                    ddddddddg}t        j                  t        d|d	z        5  t        j                  t        d
|      5  t        j                  |d       ddd       ddd       t	        j
                  |d	z  j                               }|d   du sJ |d   dk(  sJ |d   dk(  sJ t        |d         dk(  sJ d|v sJ y# 1 sw Y   nxY w# 1 sw Y   rxY w)u3   결과가 올바른 필드로 JSON에 저장된다.test1Toktestpasseddetailtest2Fzfail reasonCANARY_STATUS_JSONcanary-status.json
MEMORY_DIR
all_passedNr   
pass_count   
fail_countresults   last_run)r   objectr
   save_canary_statusjsonloads	read_textlenselfr   r   saveds       O/home/jay/workspace/.worktrees/task-2116-dev1/scripts/tests/test_canary_test.py#test_saves_json_with_correct_fieldsz8TestSaveCanaryStatus.test_saves_json_with_correct_fields   s    =G
 \\"2H?S4ST 	Ab,9 A%%g%%@A	A 

H';;FFHI\"e+++\"a'''\"a'''5#$)))U"""A A	A 	As#   CCCC	CC!c                 x   ddddg}t        j                  t        d|dz        5  t        j                  t        d|      5  t        j                  |d       d	d	d	       d	d	d	       t	        j
                  |dz  j                               }|d
   du sJ |d   dk(  sJ y	# 1 sw Y   KxY w# 1 sw Y   OxY w)u+   모든 테스트 통과 시 all_passed=Truet1Tr   r   r   r   r   r   Nr   r   r   )r   r"   r
   r#   r$   r%   r&   r(   s       r+   %test_all_passed_true_when_no_failuresz:TestSaveCanaryStatus.test_all_passed_true_when_no_failures/   s     TT:
 \\"2H?S4ST 	@b,9 @%%g$%?@	@ 

H';;FFHI\"d***\"a'''@ @	@ 	@s#   B0B$B0$B-	)B00B9)__name__
__module____qualname____doc__r   r,   r/        r+   r   r      s+    -#D #T #"(d (t (r5   r   c                   0    e Zd ZdZdeddfdZdeddfdZy)TestWriteLogu   write_log 함수 테스트r   r   Nc                 D   |dz  }t        j                  t        d|      5  t        j                  t        d|      5  t        j                  d       ddd       ddd       |j	                         sJ d|j                         v sJ y# 1 sw Y   8xY w# 1 sw Y   <xY w)u(   로그 파일이 없으면 생성한다.canary-test.log
CANARY_LOGLOGS_DIRz[TEST] test messageN)r   r"   r
   	write_logexistsr&   )r)   r   log_paths      r+   test_creates_log_filez"TestWriteLog.test_creates_log_file@   s    //\\"lH5 	4b*h7 4234	4    $(:(:(<<<<	4 4	4 	4s"   BB
B
B	BBc                    |dz  }t        j                  t        d|      5  t        j                  t        d|      5  t        j                  t        dd      5  t        d      D ]  }t        j	                  d|         	 ddd       ddd       ddd       |j                         j                         }t        |      dk  sJ y# 1 sw Y   HxY w# 1 sw Y   LxY w# 1 sw Y   PxY w)	u9   LOG_KEEP_LINES 초과 시 마지막 N줄만 유지한다.r9   r:   r;   LOG_KEEP_LINES   
   zline N)r   r"   r
   ranger<   r&   
splitlinesr'   )r)   r   r>   iliness        r+   test_trims_to_max_linesz$TestWriteLog.test_trims_to_max_linesJ   s    //\\"lH5 	2b*h7 2\\"&6: 2"2Y 2uQC[1222	2 ""$//15zQ2 22 2	2 	2s:   C"C)C
CC"
CCC	C""C+)r0   r1   r2   r3   r   r?   rH   r4   r5   r+   r7   r7   =   s+    $=d =t =
 
 
r5   r7   c                   0    e Zd ZdZdeddfdZdeddfdZy)TestTaskTimersJsonRwu)   test_task_timers_json_rw 함수 테스트r   r   Nc                     |dz  }|j                  t        j                  di i             t        j                  t
        d|      5  t
        j                         \  }}ddd       du sJ dv sJ y# 1 sw Y   xY w)u9   task-timers.json이 존재하고 쓰기 가능하면 PASSztask-timers.jsontasksTASK_TIMERS_JSONNTu   정상)
write_textr$   dumpsr   r"   r
   test_task_timers_json_rw)r)   r   timers_pathr   r   s        r+   'test_pass_when_file_exists_and_writablez<TestTaskTimersJsonRw.test_pass_when_file_exists_and_writableZ   s|    !33tzz7B-89\\"0+> 	;88:NFF	; ~~6!!!		; 	;s   A44A=c                     |dz  }t        j                  t        d|      5  t        j                         \  }}ddd       du sJ y# 1 sw Y   xY w)u   파일이 없으면 FAILzmissing.jsonrM   NF)r   r"   r
   rP   )r)   r   missingr   r   s        r+   test_fail_when_file_missingz0TestTaskTimersJsonRw.test_fail_when_file_missinge   sR    ^+\\"0': 	;88:NFF	; 	; 	;s   AA)r0   r1   r2   r3   r   rR   rU   r4   r5   r+   rJ   rJ   W   s+    3	" 	" 	"D T r5   rJ   c                   0    e Zd ZdZdeddfdZdeddfdZy)TestEventsDirWritableu)   test_events_dir_writable 함수 테스트r   r   Nc                     t        j                  t        d|dz        5  t        j                         \  }}ddd       du sJ y# 1 sw Y   xY w)u%   쓰기 가능한 디렉토리면 PASS
EVENTS_DIReventsNT)r   r"   r
   test_events_dir_writable)r)   r   r   r   s       r+   test_pass_when_dir_writablez1TestEventsDirWritable.test_pass_when_dir_writableq   sL    \\"lHx,?@ 	;88:NFF	; ~~	; 	;s   AAc                     |dz  dz  }t        j                  t        d|      5  t        j                         \  }}ddd       du sJ |j	                         sJ y# 1 sw Y   "xY w)u0   디렉토리가 없어도 자동 생성 후 PASSnonexistentrZ   rY   NT)r   r"   r
   r[   r=   )r)   r   
events_dirr   r   s        r+    test_pass_creates_dir_if_missingz6TestEventsDirWritable.test_pass_creates_dir_if_missingx   sh    -8
\\"lJ7 	;88:NFF	; ~~  """		; 	;s   AA&)r0   r1   r2   r3   r   r\   r`   r4   r5   r+   rW   rW   n   s+    3D T # #$ #r5   rW   c                   (    e Zd ZdZddZddZddZy)TestStaleRunningTasksu)   test_stale_running_tasks 함수 테스트Nc                     t               }d|_        t        j                  dg d      |_        d|_        t        d|      5  t        j                         \  }}ddd       du sJ y# 1 sw Y   xY w)u$   실행 중인 task가 없으면 PASSr   totalrL    subprocess.runreturn_valueNT)	r   
returncoder$   rO   stdoutstderrr   r
   test_stale_running_tasksr)   mock_resultr   r   s       r+   test_returns_pass_on_no_tasksz3TestStaleRunningTasks.test_returns_pass_on_no_tasks   so    k!"!ZZ!b(AB#+> 	;88:NFF	; ~~	; 	;s   A**A3c                 ^   t        j                         t        d      z
  j                         }t	               }d|_        t        j                  dd|dgd      |_        d|_	        t        d	|
      5  t        j                         \  }}ddd       du sJ dv sJ y# 1 sw Y   xY w)uT   24시간 이상 running인 작업이 있으면 stale로 감지 (PASS, 감지 성공)   )hoursr   r   ztask-9999.1)task_id
start_timerd   rf   rg   rh   NTstale)r   nowr   	isoformatr   rj   r$   rO   rk   rl   r   r
   rm   )r)   old_timero   r   r   s        r+   test_detects_stale_taskz-TestStaleRunningTasks.test_detects_stale_task   s    LLNYR%88CCEk!"!ZZ!=hp?q>r(st#+> 	;88:NFF	; ~~&   		; 	;s   6B##B,c                     t               }d|_        d|_        d|_        t	        d|      5  t
        j                         \  }}ddd       du sJ y# 1 sw Y   xY w)u   task-timer.py 오류 시 FAILr   rf   zerror messagerg   rh   NF)r   rj   rk   rl   r   r
   rm   rn   s       r+   test_fail_on_timer_errorz.TestStaleRunningTasks.test_fail_on_timer_error   sa    k!",#+> 	;88:NFF	; 	; 	;s   AA)r   N)r0   r1   r2   r3   rp   rz   r|   r4   r5   r+   rb   rb      s    3
!
r5   rb   )r3   importlib.util	importlibr$   sysr   r   pathlibr   typingr   unittest.mockr   r   pytestutilspec_from_file_location__file__parent_specloadermodule_from_specr
   __annotations__exec_moduler   r7   rJ   rW   rb   r4   r5   r+   <module>r      s      
 (   *  	..N  #33	 U\\5 55
..
)
)%
0C 0    ( (D 4 .# #(' 'r5   