
    i-              	          d Z ddl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ej                  j                  ej                  j                  e      ddd             ddlZ G d dej                        Z G d d	ej                        Z G d
 dej                        Z G d dej                        Z G d dej                        Zedk(  r ej,                  d       yy)u   
test_bot_status_resolver.py — 봇 상태 라벨링 시스템 테스트
task-2375 (dev3/루)

5개 라벨 시나리오 + task-2373 실제 케이스 테스트
    N)patch..scriptsc                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestClassifyStatusuA   classify_status 순수 함수 5개 라벨 시나리오 테스트.c                 Z    t        j                  dddd      }| j                  |d       y)u.   ps_alive=True, last_commit_age_min=2 → ALIVET   Nps_alivelast_commit_age_minpr_merged_at	pr_numberALIVEbsrclassify_statusassertEqualselfresults     T/home/jay/workspace/.worktrees/task-2460-dev6/tests/dev3/test_bot_status_resolver.py
test_alivezTestClassifyStatus.test_alive   0    $$ !	
 	)    c                 Z    t        j                  dddd      }| j                  |d       y)u.   ps_alive=True, last_commit_age_min=17 → IDLET   Nr
   IDLEr   r   s     r   	test_idlezTestClassifyStatus.test_idle&   s0    $$ "	
 	(r   c                 Z    t        j                  dddd      }| j                  |d       y)u5   pr_merged_at 있음 → MERGED (다른 조건 무시)Fd   2026-05-02T19:00:00Z*   r
   MERGEDNr   r   s     r   test_mergedzTestClassifyStatus.test_merged0   s0    $$ #/	
 	*r   c                 Z    t        j                  dddd      }| j                  |d       y)u@   ps_alive=False, last_commit_age_min=45, pr_number=None → STALEF-   Nr
   STALEr   r   s     r   
test_stalezTestClassifyStatus.test_stale:   s0    $$ "	
 	)r   c                 Z    t        j                  dddd      }| j                  |d       y)u   ps_alive=False, last_commit_age_min=10, pr_number=None → UNKNOWN
        (dead + 10분 경과 + pr없음 → STALE 조건 age>30 불충족 → UNKNOWN)
        F
   Nr
   UNKNOWNr   r   s     r   test_unknownzTestClassifyStatus.test_unknownD   s2     $$ "	
 	+r   c                 Z    t        j                  dddd      }| j                  |d       y)uJ   MERGED는 ALIVE/IDLE보다 우선: ps_alive=True, age=2, merged → MERGEDTr	   r!   c   r
   r#   Nr   r   s     r   %test_merged_takes_priority_over_alivez8TestClassifyStatus.test_merged_takes_priority_over_aliveP   s0    $$ !/	
 	*r   c                 Z    t        j                  dddd      }| j                  |d       y)u6   경계값: last_commit_age_min=5 (< 5 아님) → IDLET   Nr
   r   r   r   s     r   test_alive_boundary_exact_5z.TestClassifyStatus.test_alive_boundary_exact_5Z   s0    $$ !	
 	(r   c                 Z    t        j                  dddd      }| j                  |d       y)u0   경계값: last_commit_age_min=4 (< 5) → ALIVET   Nr
   r   r   r   s     r   test_alive_boundary_4z(TestClassifyStatus.test_alive_boundary_4d   r   r   N)__name__
__module____qualname____doc__r   r   r$   r(   r,   r/   r2   r5    r   r   r   r      s-    K*)+*
,+)*r   r   c                       e Zd Zd Zy)TestVerdictMapc                     dddddd}|j                         D ]-  \  }}| j                  t        j                  |   |d| d       / y )N	completedin_progressstalledunknownr#   r   r   r'   r+   zVERDICT_MAP[u   ] 불일치)itemsr   r   VERDICT_MAP)r   expectedstatusverdicts       r   test_all_verdictsz TestVerdictMap.test_all_verdictst   s^    !"! 
  (~~/ 	AOFGS__V4g+F8;?A	Ar   N)r6   r7   r8   rH   r:   r   r   r<   r<   s   s    
Ar   r<   c                   8    e Zd ZdZ	 d	dZd Zd Zd Zd Zd Z	y)
TestResolveMockeduD   resolve()의 helper 함수들을 mock해서 통합 흐름 테스트.Nc	           
         |ddddd}t        j                  t        d||f      5  t        j                  t        d||f      5  t        j                  t        d|||f      5  t        j                  t        d|      5  t        j                  t        d	d
      5  t        j                  dd
      cddd       cddd       cddd       cddd       cddd       S # 1 sw Y   nxY wddd       n# 1 sw Y   nxY wddd       n# 1 sw Y   nxY wddd       n# 1 sw Y   nxY wddd       y# 1 sw Y   yxY w)u   공통 mock 패치 유틸.NFdone	work_donemergedmerge_failed	_check_psreturn_value_get_last_commit_get_pr_info_check_markers_infer_team_from_timersdev3z	task-test)r   objectr   resolve)	r   r   ps_pidsage_minshar   pr_stater   markerss	            r   _mock_resolvezTestResolveMocked._mock_resolve   s    ?$5!&?G\\#{(G9LM 	4\\#1#O	4\\#~YR^<_`	4 \\#/gF	4 \\#8vN		4
 ;;{F3	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s}   D9 D$'DC:	!C%7	C:	 	D		D$	D9%C.*C:	1	D:D?D	D$DD$	D9$D-	)D99Ec           	          | j                  ddgddd d d       }| j                  |d   d       | j                  |d   d	       | j                  |d
          y )NT90  r	   abc1234r   r[   r\   r]   r   r^   r   
bot_statusr   rG   r?   r   )r`   r   
assertTruer   s     r   test_resolve_alive_statusz+TestResolveMocked.test_resolve_alive_status   sg    ##E79T $ 

 	-w7	*M:z*+r   c           	          | j                  ddgddd d d       }| j                  |d   d       | j                  |d   d	       y )
NTrb   r   f8e9778rd   re   r   rG   r?   r`   r   r   s     r   test_resolve_idle_statusz*TestResolveMocked.test_resolve_idle_status   sV    ##E7IT $ 

 	-v6	*M:r   c           	          | j                  dg ddddd      }| j                  |d   d       | j                  |d	   d
       | j                  |d   d       y )NFr    aabbcc1r"   r#   r!   rd   re   rG   r>   r   rj   r   s     r   test_resolve_merged_statusz,TestResolveMocked.test_resolve_merged_status   sk    ##BY8:P $ 

 	-x8	*K8/1GHr   c           	          | j                  dg ddd d d       }| j                  |d   d       | j                  |d   d       y )	NFr&   deadbeefrd   re   r'   rG   r@   rj   r   s     r   test_resolve_stale_statusz+TestResolveMocked.test_resolve_stale_status   sT    ##BJT $ 

 	-w7	*I6r   c           	          | j                  dg ddd d d       }| j                  |d   d       | j                  |d   d       y )	NFr*   cafe123rd   re   r+   rG   rA   rj   r   s     r   test_resolve_unknown_statusz-TestResolveMocked.test_resolve_unknown_status   sT    ##BIT $ 

 	-y9	*I6r   )N)
r6   r7   r8   r9   r`   rg   rk   rn   rq   rt   r:   r   r   rJ   rJ      s+    N BF4,;I77r   rJ   c                       e Zd ZdZd Zy)TestTask2373Simulationu   2026-05-02 사고 케이스: 페룬(dev6), ps_alive=True (2 PIDs),
    last_commit_age_min=17, pr_number=None → IDLE + evidence에 no_pr_yet 포함.c           
      0   ddddd}t        j                  t        ddddgf      5  t        j                  t        dd	      5  t        j                  t        d
d      5  t        j                  t        d|      5  t        j                  t        dd      5  t        j                  dd      }d d d        d d d        d d d        d d d        d d d        | j	                  d   d       | j	                  |d   d       | j	                  |d   dd       | j	                  |d   d       | j	                  t        |d         d       | j                  d|d          | j                  d|d          dj                  |d         }| j                  d|v xs d|v d|d           | j	                  |d   d       | j	                  |d    d!       y # 1 sw Y   &xY w# 1 sw Y   +xY w# 1 sw Y   0xY w# 1 sw Y   5xY w# 1 sw Y   :xY w)"NFrL   rQ   Ti iN rR   rT   )r   ri   rU   )NNNrV   rW   dev6z	task-2373task_idteam_idre   r   u>   ps가 살아있고 commit이 17분 전이면 IDLE이어야 함rG   r?   r[   r	    evidence	no_pr_yetu   PR 생성 중u   evidence에 no_pr_yet 없음: r   r   last_commit_shari   )	r   rY   r   rZ   r   lenassertInjoinrf   )r   r_   r   evidence_strs       r   test_task_2373_simulationz0TestTask2373Simulation.test_task_2373_simulation   s    u"E; \\#{$'@R9ST 	6\\#1P	6\\#~<NO	6 \\#/gF	6 \\#8vN		6
 [[f5F	6 	6 	6 	6 	6 		*K8	*F3-vY	[	*M: 	VI./3gvi01gvi01 xxz 23<'J?l+J,VJ-?,@A	
 	 56; 12I>9	6 	6 	6 	6 	6 	6 	6 	6 	6 	6sk   HG>"G1?G$	G3G$	;G1G>HG!G$	$G.)G11G;6G>>H	HHN)r6   r7   r8   r9   r   r:   r   r   rv   rv      s    W ?r   rv   c                       e Zd ZdZd Zy)TestJsonOutputValiduD   CLI를 subprocess로 호출해서 stdout이 valid JSON인지 확인.c                    t         j                  j                  t         j                  j                  t              dddd      }t         j                  j                  |      }t        j                  t        j                  |ddddgddd	
      }| j                  |j                  dd|j                          	 t        j                  |j                        }g d}|D ]  }| j%                  |d| d        | j%                  d   g d       | j                  |d   d       y # t        j                   $ r+}| j#                  d| d|j                          Y d }~d }~ww xY w)Nr   r   zbot_status_resolver.pyz	--task-idz	task-2375z--formatjsonT   )capture_outputtexttimeoutr   u$   CLI 종료 코드 비정상: stderr=u   JSON 파싱 실패: z
stdout=)ry   rz   re   r   r[   r   r~   r   r^   r   r_   rG   r|   u	   JSON에 'u   ' 키 없음re   rB   ry   )ospathr   dirname__file__abspath
subprocessrunsys
executabler   
returncodestderrr   loadsstdoutJSONDecodeErrorfailr   )r   scriptr   dataerequired_keyskeys          r   test_json_output_validz*TestJsonOutputValid.test_json_output_valid   sE   GGOOH%tT9>V
 (^^V[+z6RdB
 	**A?O	Q	J::fmm,D


 ! 	DCMM#ty\%BC	D 	d<(*YZ 	i+6! ## 	JII,QCyHII	Js   <D* *E(=!E##E(N)r6   r7   r8   r9   r   r:   r   r   r   r      s
    N7r   r   __main__r	   )	verbosity)r9   r   r   r   unittestunittest.mockr   r   r   insertr   r   r   bot_status_resolverr   TestCaser   r<   rJ   rv   r   r6   mainr:   r   r   <module>r      s      
   
 277<< 94yQ R !S*** S*tAX&& A$=7)) =7H$?X.. $?V 7(++  7J zHMMA r   