
    iH                     H   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  ed      Z	 e
e	      ej                  vr"ej                  j                  d e
e	             ddlZ e ed            Z edd	d
dde      Zefdede
dededef
dZd Zd Zd Zd Zd Zd Zd Zy)u  task-2395 회귀 테스트.

검증 대상:
1. archive_old_done_clear: 90일 이상 파일만 이동 (dummy 10개 검증)
2. archive_old_done_clear: 90일 미만 파일은 원위치 유지
3. check_phase_progress: 6개 중 N개 .done 진행률 정확
4. run_completion_checks: 6/6 도착 시 보고서 파일 존재 확인 분기
5. watch_once: 자동 dispatch.py 호출 시도 차단 (mock 검증)
6. archive: 삭제 함수 부재 확인 (history 보존 의무)
    N)datetime	timedeltatimezone)Pathz/home/jay/workspace/scripts	   )hoursi           )tzinfodir_namedays_agonowreturnc                     | | dz  }|j                  dd       |t        |      z
  j                         }t        j                  |||f       |S )Nz.done.clear zutf-8)encoding)days)
write_textr   	timestamposutime)r   r   r   r   ptargets         \/home/jay/workspace/.worktrees/task-2514-dev3/tests/dev7/test_side_issues_cleanup_monitor.py_make_done_clearr      sS    ${##ALLgL&I8,,779FHHQ !H    c           	         | dz  }|dz  }|j                          t        d      D cg c]  }t        |d| dt               }}t        d      D cg c]  }t        |d| dt               }}t	        j
                  ||dt        	      }|d
   dk(  sJ |d   dk(  sJ t        |d   j                               dk(  sJ |D ]  }|j                         sJ | d        |D ]  }|j                         rJ | d        d}|j                         D ]7  }	|	j                         s|t        d |	j                  d      D              z  }9 |dk(  sJ y c c}w c c}w )Neventsarchiver	   z	task-old-[   z	task-new-   Z   age_daysr   movedskippedby_monthz should have been movedz should remainr   c              3       K   | ]  }d   yw)   N ).0_s     r   	<genexpr>z>test_archive_moves_files_older_than_90_days.<locals>.<genexpr>;   s     IQqIs   *.done.clear)mkdirranger   NOWmonitorarchive_old_done_clearsumvaluesexistsiterdiris_dirglob)
tmp_path
events_dirarchive_rooti	old_files	new_filesresultr   moved_count	month_dirs
             r   +test_archive_moves_files_older_than_90_daysrE   $   s   H$J	)LQVWXQYZA!*	!or3GZIZQVWXQYZA!*	!or3GZIZ++JrWZ[F'?a)!!!vj!((*+q000 =88:<!$;<<~=  0xxz/aS//z0 K!))+ J	3I)..*HIIIKJ !' [Zs   EEc           	         | dz  }|dz  }|j                          t        d      D cg c]  }t        |d| dt               }}t	        j
                  ||dt              }|d   d	k(  sJ |d
   dk(  sJ |d   i k(  sJ |D ]  }|j                         rJ  |j                         rt        |j                  d            rJ y y c c}w )Nr    r!   r	   ztask-P   r$   r%   r'   r   r(   r)   r0   )	r1   r2   r   r3   r4   r5   r8   anyrglob)r<   r=   r>   r?   filesrB   r   s          r   *test_archive_preserves_files_under_90_daysrK   ?   s    H$J	)LINqRAjE!+r3?RER++JrWZ[F'?a)!!!*### xxzz |)).9::::  Ss   Cc                 N   | dz  }|j                          |dz  j                  d       |dz  j                  d       |dz  j                  d       t        j                  |      }|d   dk(  sJ |d   d	k(  sJ |d
   dk(  sJ |d   du sJ t	        |d         g dk(  sJ t	        |d         g dk(  sJ |dz  j                  d       |dz  j                  d       |dz  j                  d       t        j                  |      }|d   du sJ |d
   dk(  sJ |d   d	k(  sJ y )Nr    ztask-2389.doner   ztask-2390.dev1.doneztask-2391.dev2.donen_doner
   n_total   ratioz3/6completeFdone)	task-2389	task-2390	task-2391pending)	task-2392	task-2393	task-2394ztask-2392.doneztask-2393.dev3.doneztask-2394.doneTz6/6)r1   r   r4   check_phase_progresssorted)r<   r=   rB   result2s       r   .test_check_phase_progress_partial_and_completer]   S   se   H$J""..r2''33B7''33B7))*5F(q   )!!!'?e###*&&&&.!%LLLL&#$(OOOO""..r2''33B7""..r2**:6G:$&&&7u$$$8!!!r   c                     | dz  }|j                          |dz  j                  d       t        j                  |      }|d   dk(  sJ d|d   v sJ y )Nr    ztask-2389.done.clearr   rM   r   rS   rV   )r1   r   r4   rZ   )r<   r=   rB   s      r   ,test_check_phase_progress_ignores_done_clearr_   n   sb    H$J((44R8))*5F(q   &++++r   c                 <   | dz  }|j                          | dz  }|j                          dD ]  }|| dz  j                  d| d        t        j                  ||      }t	        |d         dk(  sJ |d	   d
gk(  sJ |d   dk(  sJ d|d   v sJ d|d   v sJ y )Nreportsproj)rS   rT   rU   rW   rX   z.mdz# 

reports_okr	   reports_missingrY   
git_statuszno-gitpytestpytest_recommendationzbatch-ids-master.mdbatch_report_target)r1   r   r4   run_completion_checkslen)r<   reports_dirproject_roottidrB   s        r   2test_run_completion_checks_detects_missing_reportsro   x   s    Y&Kf$LP =	#c{	"..C5|<= **;EFvl#$)))#$555,8+++v56666 F+@$AAAAr   c                    | dz  }|j                          | dz  }|j                          | dz  }|j                          | dz  }dd lg j                  j                  fd}fd}fd}|j	                  d	|       |j	                  d
|       |j	                  d|       |j	                  t
        dd        t        j                  ||||d       D ]V  \  }	}
t        |
t        t        f      rdj                  t        t        |
            n
t        |
      }d|vrKJ d|	 d|
         t        j                  t
              }d|vsJ d|vsJ y )Nr    ra   rb   z
state.jsonr   c                     j                  d| f       t        | t              r!dt        |       v rj	                  | ddd      S  | g|i |S )Nrundispatch.pyr   r   )append
isinstanceliststrCompletedProcess)argsakw_spcallsreal_runs      r   spy_runz9test_watch_once_does_not_invoke_dispatch.<locals>.spy_run   sT    eT]#dD!ms4y&@''aR88'q'B''r   c                 B    j                  d| f        | g|i |S )Npopenrt   )ry   rz   r{   r}   
real_popens      r   	spy_popenz;test_watch_once_does_not_invoke_dispatch.<locals>.spy_popen   s(    gt_%$))b))r   c                 ,    j                  d| f       y)Ncallr   r   )ry   _a_kwr}   s      r   spy_callz:test_watch_once_does_not_invoke_dispatch.<locals>.spy_call   s    fd^$r   rr   Popenr   send_telegram_notificationc                       y)NTr,   )r   r   s     r   <lambda>z:test_watch_once_does_not_invoke_dispatch.<locals>.<lambda>   s    r   F)r=   rl   rm   
state_filenotify rs   zdispatch.py invoked via z: zimport dispatchzfrom dispatch)r1   
subprocessrr   r   setattrr4   
watch_onceru   rv   tuplejoinmaprw   inspect	getsource)r<   monkeypatchr=   rl   rm   r   r   r   r   kindry   ssrcr|   r}   r   r~   s                @@@@r   (test_watch_once_does_not_invoke_dispatchr      so   H$JY&Kf$LL(JEwwHJ(* UG,Wi0VX.!=?VW!  Q
d(24$(GCHHSd^$SQUYA%P)A$r$'PP%Q 

G
$CC'''#%%%r   c                  H   t        j                  t              } g d}|D ]  }|| vrJ d|         t        t              D cg c]  }|j	                  d      r| }}|D ]8  }|j	                  d      r
J d|        |j	                  d      s0J d|         y c c}w )N)z
os.remove(z
os.unlink(z	.unlink()zshutil.rmtree(z Forbidden delete pattern found: r.   delete_zdelete_* function found: remove_zremove_* function found: )r   r   r4   dir
startswith)r   forbidden_patternspatternnpublic_namesr   s         r   #test_module_has_no_delete_functionsr      s    


G
$C & Pc!O%EgY#OO!P  #7|E!1<<3DAELE R??9-Q1J4&/QQ-??9-Q1J4&/QQ-R Fs   BB)__doc__r   sysr   r   r   r   pathlibr   SCRIPTS_DIRrw   pathinsertids_phase_monitorr4   KSTr3   intr   rE   rK   r]   r_   ro   r   r   r,   r   r   <module>r      s   	 
 
  2 2 01{388#HHOOAs;'( #yq!"tQ2q- LO 4 s c  SW 6;("6,B$0&fRr   