
    i="                        d Z ddlZddlZddlZddlmZmZmZ ddlmZ ddl	m
Z
  eej                  j                  dd            Z ee      ej                  vr"ej                  j!                  d ee             edz  Z ee      ej                  vr"ej                  j!                  d ee             dd	lmZ d
ededefdZd
efdZd
efdZd
efdZd
efdZd
efdZy)u   
test_auto_merge_ttl.py

task-1942: BatchWatchdog.check_batch_ttl() 및 cleanup_expired_batches() 테스트
작성자: 하누만 (개발4팀 테스터)
    N)datetime	timedeltatimezone)Path)patchWORKSPACE_ROOTz/home/jay/workspacescripts)BatchWatchdogtmp_pathtasksreturnc                     | dz  }|j                  dd       |dz  }|j                  t        j                  d|idd      d	
       |S )u[   tmp_path/memory/task-timers.json에 tasks 데이터를 기록하고 경로를 반환한다.memoryTparentsexist_oktask-timers.jsonr   F   )ensure_asciiindentutf-8encoding)mkdir
write_textjsondumps)r   r   
memory_dir
timer_files       J/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_auto_merge_ttl.py_write_timer_filer!       s]    H$JTD100J

GU#%B       c                 "   t        j                  t        j                        }|t	        d      z
  j                         }dd|ddd|dd}t        | |       t        t        |             }|j                  d	      }|g k(  s
J d
|        y)u>   batch 생성 후 1시간만 경과한 경우 → expired 0건.   hoursz	batch-001runningbatch_idstatus
start_time)ztask-100ztask-101workspace_path      8@batch_ttl_hoursu#   만료 없어야 하는데 결과: N)
r   nowr   utcr   	isoformatr!   r
   strcheck_batch_ttlr   r1   r+   r   wdresults         r    test_check_batch_ttl_no_expiryr9   1   s    
,,x||
$C	**557J $$
 $$
E h&	c(m	4B5FR<G>vhGG<r"   c                    t        j                  t        j                        }|t	        d      z
  j                         }dd|ddd|ddd|dd}t        | |       t        t        |             }|j                  d	
      }t        |      dk(  s
J d|        |d   }|d   dk(  sJ t        |d         dk(  sJ d|d           d|d   v sJ d|d   v sJ d|d   vsJ d       | dz  }t        j                  |dz  j                  d            }|d   d   d   dk(  sJ |d   d   d   dk(  sJ |d   d   d   dk(  sJ d       y)uO   batch 생성 후 25시간 경과 → running 2개 expired, done 1개는 유지.   r%   z	batch-002r'   r(   done)task-200task-201task-202r,   r.   r/   r$   u#   batch 1개가 만료되어야 함: r   r)   expired_tasksr   u'   running 2개만 expired 되어야 함: r=   r>   r?   u$   done 상태는 expired 대상 아님r   r   r   r   r   r*   expiredu   done 상태는 그대로 유지N)r   r1   r   r2   r   r3   r!   r
   r4   r5   lenr   loads	read_text)	r   r1   r+   r   r7   r8   expired_entryr   updateds	            r    test_check_batch_ttl_expiredrG   P   s   
,,x||
$C	++668J $$
 $$
 $$
E" h&	c(m	4B5Fv;!KB6(KK1IM$333}_-.!3 
1-2P1QR3 77777777]?;;c=cc; H$Jjj*'99DDgDVWG7J'1Y>>>7J'1Y>>>7J'1V;^=^^;r"   c                 v   t        j                  t        j                        }|t	        d      z
  j                         }ddd|di}t        | |       t        t        |             }|j                  d	      }t        |      d
k(  s
J d|        |d   d   dk(  sJ d|d   d   v sJ |d   d   dk\  sJ y)uD   batch_ttl_hours=2.0으로 설정, 3시간 경과 → expired 발생.   r%   ztask-300z	batch-003r'   r(   r,   g       @r/   r$   u;   TTL 2h 기준 3h 경과이므로 만료 1건이어야 함: r   r)   r@   elapsed_hoursN)r   r1   r   r2   r   r3   r!   r
   r4   r5   rB   r6   s         r    !test_check_batch_ttl_custom_hoursrK      s    
,,x||
$C	**557J 	#$
E h&	c(m	4B4Fv;!cZ[aZbcc!9Z K///?3333!9_%,,,r"   c                    t        j                  t        j                        }|t	        d      z
  j                         }dd|ddd|dd}t        | |       | dz  dz  }|j                  d	d	
       |dz  }|j                  t        j                  ddd      d       |dz  }|j                  t        j                  ddd      d       t        t        |             }t        j                  |d      5 }|j                  d      }	ddd       	d   dk(  sJ d|	d   v sJ |dz  j!                         sJ d       |dz  j!                         sJ d       t        j"                  |dz  j%                  d            }
|
d   dk(  sJ |
d   dk(  sJ d |
v sJ d!|
v sJ j'                          |j(                  }|d"   d"   dk(  s
J d#|        |d"   d   }|D cg c]  }|d   	 }}d|v sJ d|v sJ y# 1 sw Y   xY wc c}w )$u   만료된 batch가 있는 경우:
    - .done 파일이 있는 만료 task → .done.expired 파일 생성 확인
    - send_ttl_warning이 호출되었는지 확인 (mock)
    r;   r%   z	batch-004r'   r(   )task-400task-401r   eventsTr   ztask-400.donerM   )task_idr)   r   r   ztask-401.donerN   r,   send_ttl_warningr.   r/   Nexpired_countr$   expired_batchesztask-400.done.expiredu&   task-400.done.expired 파일이 없음ztask-401.done.expiredu&   task-401.done.expired 파일이 없음r)   rP   rJ   
expired_atr   u   batch_id 불일치: )r   r1   r   r2   r   r3   r!   r   r   r   r   r
   r4   r   objectcleanup_expired_batchesexistsrC   rD   assert_called_once	call_args)r   r1   r+   r   
events_dirdone_400done_401r7   	mock_warnr8   expired_datarY   stale_tasks_argttask_ids_warneds                  r    test_cleanup_expired_batchesrb      s   
 ,,x||
$C	++668J $$
 $$
E h& H$x/JTD1O+H

z{CD   O+H

z{CD  
 
c(m	4B	b,	- B++D+AB /"a'''&!23333 0088:d<dd:0088:d<dd: ::z,CCNNX_N`aL
#{222	"j000l***<'''   "##IQ<?k)M-A)+MM)l1oO-<=q|=O=((((((3B B. >s   <G>#H
>Hc                    t        j                  t        j                        }|t	        d      z
  j                         }ddd|di}t        | |       t        t        |             }t        j                  |d      5 }|j                  d	
      }ddd       d   dk(  sJ |d   g k(  sJ j                          y# 1 sw Y   .xY w)u5   만료된 batch가 없는 경우 → expired_count=0.r$   r%   ztask-500z	batch-005r'   r(   r,   rQ   r.   r/   NrR   r   rS   )r   r1   r   r2   r   r3   r!   r
   r4   r   rU   rV   assert_not_called)r   r1   r+   r   r7   r]   r8   s          r    'test_cleanup_expired_batches_no_expiredre      s    
,,x||
$C	**557J 	#$
E h&	c(m	4B	b,	- B++D+AB /"a'''#$***!B Bs    C  C	)__doc__r   ossysr   r   r   pathlibr   unittest.mockr   environget	WORKSPACEr4   pathinsertSCRIPTS
auto_merger
   dictr!   r9   rG   rK   rb   re    r"   r    <module>rt      s     	 
 2 2    02GHI	y>!HHOOAs9~& i
w<sxxHHOOAs7|$ $	 	T 	d 	"HT H>*_4 *_d- -8?)4 ?)N"d "r"   