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

task-2466 surgical fix 회귀 테스트:
- Fix A: bot_status_resolver.py 수정 검증
- Fix B: task-timer.py _write_event_file acked guard 검증
    N)Pathscriptszbot_status_resolver.pymemoryztask-timer.pyunique_namepathc                 4   | t         j                  v rt         j                  | = t        j                  j	                  | |      }|
J d|        t        j                  j                  |      }|j                  J |j                  j                  |       |S )uO   특정 경로의 파일을 unique_name으로 로드 (sys.modules 캐시 독립)u$   모듈 스펙을 찾을 수 없음: )sysmodules	importlibutilspec_from_file_locationmodule_from_specloaderexec_module)r   r   specmodules       T/home/jay/workspace/.worktrees/task-2466-dev1/tests/test_whisper_data_consistency.py_load_module_from_pathr      s    ckk!KK$>>11+tDDJCD6JJ^^,,T2F;;"""KKF#M    bot_status_resolver_2466task_timer_2466c                 
   | dz  dz  }|j                  d       d}|| dz  }|j                  d       |j                  t        dt	        |              t        j                  |      }d	|v sJ d
       |d	   du sJ d       y)ud   start-guard-fail.json 파일 만들고 _check_markers 호출 → markers["start_guard_fail"] == Truer   eventsTparentsz	task-9999.start-guard-fail.jsonz{}WORKSPACE_ROOTstart_guard_failu0   _check_markers에 start_guard_fail 키가 없음u/   start-guard-fail.json 존재 시 True여야 함N)mkdir
write_textsetattr_resolver_modstr_check_markers)tmp_pathmonkeypatch
events_dirtask_idmarker_filemarkerss         r   ,test_check_markers_includes_start_guard_failr+   0   s    H$x/JT"G'*@AAK4 '7XG**73G(\*\\(%&$.a0aa.r   c                     | dz  dz  }|j                  d       |j                  t        dt        |              t        j	                  d      }|d   du sJ y	)
u9   start-guard-fail.json 없으면 start_guard_fail == Falser   r   Tr   r   z	task-0000r   FN)r   r!   r"   r#   r$   )r%   r&   r'   r*   s       r   5test_check_markers_start_guard_fail_false_when_absentr-   @   s]    H$x/JT"'7XG**;7G%&%///r   c                  B    t        ddddd      } | dk(  s
J d|         y)uE   classify_status(True, 1, None, None, start_guard_fail=True) → STALET   Nr   STALEu3   start_guard_fail=True일 때 STALE 기대, 실제: classify_statusresults    r   3test_classify_status_start_guard_fail_returns_staler6   O   s1    T1dD4HFW\ STZS[\\r   c                  2    t        ddddd      } | dk(  sJ y)uV   start_guard_fail=False이면 기존 로직 동작 (ps_alive + recent commit → ALIVE)Tr/   NFr0   ALIVEr2   r4   s    r   8test_classify_status_start_guard_fail_false_normal_aliver9   U   s"    T1dD5IFWr   c                  2    t        ddddd      } | dk(  sJ y)u<   pr_merged_at가 있으면 start_guard_fail 무시 → MERGEDFNz2026-05-01T00:00:00Z*   Tr0   MERGEDr2   r4   s    r   6test_classify_status_merged_overrides_start_guard_failr=   [   s$    UD*@"W[\FXr   c                 l   | dz  dz  }|j                  d       | dz  }|j                  dd       d}|| dz  }|j                  t        j                  dd	i             |d
z  j                  t        j                  di i             |j	                  t
        dt        |              |j	                  t
        dd        |j	                  t
        dd        |j	                  t
        dd        t
        j                  |d      }|d   dk(  sJ d|d           |d   dk(  sJ |d   d   du sJ y)u?   start-guard-fail.json 존재 + ps 없음 → verdict == stalledr   r   Tr   )r   exist_ok	task-2464r   retry_count   ztask-timers.jsontasksr   	_check_psc                  
    dg fS )NF _as    r   <lambda>zLtest_resolve_with_start_guard_fail_returns_stalled_verdict.<locals>.<lambda>v   s
     r   _get_last_commitc                       y)N)NNrF   rG   s    r   rI   zLtest_resolve_with_start_guard_fail_returns_stalled_verdict.<locals>.<lambda>w       r   _get_pr_infoc                       y)N)NNNrF   rG   s    r   rI   zLtest_resolve_with_start_guard_fail_returns_stalled_verdict.<locals>.<lambda>x   rL   r   dev6verdictstalledu<   start_guard_fail 존재 시 verdict=stalled 기대, 실제: 
bot_statusr1   r*   r   N)r   r    jsondumpsr!   r"   r#   resolve)r%   r&   r'   
timers_dirr(   r)   r5   s          r   :test_resolve_with_start_guard_fail_returns_stalled_verdictrW   e   sN   H$x/JT"H$JTD1G'*@AAK4::}a&89: $$00WbM1JK'7XG {4KL'9;ST~7UV""7F3F)	)}-ijpqzj{i|+}}),7***)/0D888r   c                 &   ddl }|j                         }|j                         }| d| dfd}| j                  t        d|       t        j                  dd      \  }}||vsJ d	| d
       ||vsJ d| d
       d|v sJ d       |du sJ y)uZ   ps 호출 시 현재 프로세스 PID와 부모 PID가 결과에서 제외되는지 확인r   Nz python3 test_script task-2464
z6 bash -c task-2464
99999 claude --team dev6 task-2464
c                      dfS )Nr   rF   )rH   _kwfake_stdouts     r   fake_runz-test_check_ps_excludes_self.<locals>.fake_run   s    A~r   _runr@   rO   u   자기 PID(u   )가 결과에 포함됨u   부모 PID(i u2   유효한 외부 PID(99999)는 포함되어야 함T)osgetpidgetppidr!   r"   rD   )r&   _osself_pidppidr\   ps_alivepidsr[   s          @r   test_check_ps_excludes_selfrf      s    zz|H;;=D J>tfD|}K vx8",,[&ANHd4Q;xj8P!QQtI{4&0HIID=NNN=tr   c                 x   t        t        |             }| dz  dz  }|j                  d       d}|| dz  }|j                  t	        j
                  dd	i             d
dlm}m} |j                  |j                        }ddd}|j                  |||d       || dz  }	|	j                         rJ d       y)uJ   .done.acked가 있으면 _write_event_file 호출 시 .done 생성 안 됨workspace_pathr   r   Tr   z	task-2421z.done.ackedend_timez2026-05-01T15:19:00+00:00r   datetimetimezonedev1PASSteam_id	qc_resultg      @.doneu4   .done.acked 존재 시 .done이 생성되면 안 됨N)	TaskTimerr#   r   r    rS   rT   rl   rm   nowutc_write_event_fileexists)
r%   timerr'   r(   
acked_filerl   rm   ru   	task_data	done_files
             r   -test_write_event_file_skips_when_acked_existsr}      s    S]3EH$x/JT"G	55J$**j2M%NOP+
,,x||
$C"8I	GYV<y..I!Y#YY!!r   c                    t        t        |             }| dz  dz  }|j                  d       d}ddlm}m} |j                  |j                        }d	d
d}|j                  |||d       || dz  }|j                         sJ d       t        j                  |j                               }	|	d   |k(  sJ |	d   d
k(  sJ y)u2   .done.acked 없으면 정상적으로 .done 생성rh   r   r   Tr   z	task-2499r   rk   rn   ro   rp   g      @rs   u2   .done.acked 없으면 .done이 생성되어야 함r(   rr   N)rt   r#   r   rl   rm   ru   rv   rw   rx   rS   loads	read_text)
r%   ry   r'   r(   rl   rm   ru   r{   r|   datas
             r   *test_write_event_file_writes_when_no_ackedr      s    S]3EH$x/JT"G+
,,x||
$C"8I	GYV<y..ISSS::i))+,D	?g%%%&&&r   )__doc__importlib.utilr   rS   r	   pathlibr   __file__parent_WORKTREE_ROOT_RESOLVER_PATH_TIMER_PATHr#   r   r"   
_timer_modr3   rt   r+   r-   r6   r9   r=   rW   rf   r}   r   rF   r   r   <module>r      s      
  h&&--)+.FFx'/9	 	4 	 ''A>R#$5{C
//  	b 0]9@6Z('r   