
    i`                    4   d Z ddlmZ ddlZddlmZ ddlZddlmZm	Z	m
Z
  ee      j                         j                  d   dz  dz  d	z  d
z  Zg dZddZej"                  j%                  de      dd       Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)u   tests/poc/test_termination_classifier.py

Phase B 종료 분류 classifier 회귀 테스트.

⚠️ Dry-run only. 마커 파일 생성/dispatch 호출 검증 안 함 (classifier가 안 한다는 사실 자체를 테스트).
    )annotationsN)Path)TaskEvidenceTerminationClassificationclassify   memorypoctermination_classifierfixtures)ztask-2466.jsonztask-2481.jsonztask-2472+1.jsonztask-2483.jsonztask-2485.jsonc                    t         | z  }|j                         s
J d|        |j                         5 }t        j                  |      cd d d        S # 1 sw Y   y xY w)Nzfixture not found: )FIXTURES_DIRexistsopenjsonload)filenamepathfs      </home/jay/workspace/tests/poc/test_termination_classifier.py_load_fixturer   !   sR    ("D;;=6/v66=	 yy|  s   AAfixture_namec           	        t        |       }|j                  d      }t        j                  j	                         }|j                         D ci c]  \  }}||v s|| }}}t        di |}t        |      }|j                  j                  |k(  s1J |  d| d|j                  j                   d|j                   d       yc c}}w )uQ   각 회귀 fixture의 expected_classification과 classifier 출력 일치 확인.expected_classificationz: expected z, got z (rule=)N )
r   popr   __dataclass_fields__keysitemsr   classificationvaluematched_rule)	r   dataexpected
valid_keyskvevidence_kwargsevidenceresults	            r   $test_classification_matches_expectedr,   (   s     &Dxx12H22779J(,

H1Zq!tHOH.o.HhF  &&(2 .H:VF4I4I4O4O3P Q$$%Q	(2 Is   CCc                     t        dddddd      } t        |       }|j                  t        j                  k(  sJ |j
                  dk(  sJ y	)
u   직접 입력 케이스: DONE.z	test-doneMERGED2026-05-06T10:00:00ZCLEANPASSr   )task_idpr_statepr_merged_atclose_lifecycle_stateessence_verdictforbidden_violations.doneN)r   r   r!   r   DONEmarker_fileevrs     r   test_done_evidencer>   :   sV    	+%
B 	A8=======G###    c                     t        d      } t        |       }|j                  t        j                  k(  sJ |j
                  dk(  sJ y)u&   모든 룰 미해당 시 UNCLASSIFIED.ztest-unknown)r2   g        N)r   r   r!   r   UNCLASSIFIED
confidencer;   s     r   test_unclassified_when_no_matchrC   I   sB    	n	-BA8EEEEE<<3r?   c                     t        ddddddddd	      } t        |       }|j                  t        j                  k(  sJ y	)
u:   DONE이 DOGFOODING_PENDING보다 우선 (close clean 시).ztest-priorityr.   r/   r0   r1   r   T)	r2   r3   r4   r5   r6   	ci_rollup	qc_resultr7   dogfooding_external_dependencyN)r   r   r!   r   r9   r;   s     r   "test_priority_done_over_dogfoodingrH   Q   sM    	+%'+

B 	A8=====r?   c                    |j                  |        t        ddd      }t        |       t        | j	                               g k(  sJ d       y)u:   Classifier가 마커 파일 생성하지 않음을 보장.ztest-side-effectsr.   r0   )r2   r3   r5   u7   classifier가 부수효과 발생시킴 (파일 생성)N)chdirr   r   listiterdir)tmp_pathmonkeypatchr<   s      r   test_dry_run_no_side_effectsrO   b   sP     h	#%
B
 RL  "#r)d+dd)r?   c            	         t        ddddddd      } t        |       }|j                  t        j                  k(  sJ d|j
                  d	   v sJ y
)uO   MERGE_PENDING_DEPENDENCY 직접 케이스: PR OPEN + essence PASS + dependency.ztest-merge-pendingOPENr1   ztask-2472+2FAIL      )r2   r3   r6   dependency_task_idrE   retry_count	retry_maxr   N)r   r   r!   r   MERGE_PENDING_DEPENDENCYfollowup_conditionsr;   s     r   $test_merge_pending_dependency_directrZ   t   s`    	$(
B 	A8QQQQQA11!4444r?   c                     t        ddddddddd		      } t        |       }|j                  t        j                  k(  sJ |j
                  d
k(  sJ d|j                  v sJ d|j                  v sJ y)uZ   MERGED_CLOSE_BLOCKED_EXTERNAL 직접 케이스: PR MERGED + close FAIL + external blocker.ztest-close-blockedr.   z2026-05-07T13:54:33Zr1   rR   externalr   F)	r2   r3   r4   rE   r5   close_blocker_ownerr7   admin_override_usedbranch_protection_bypassz.close-blocked-externalr8   	.escalateN)r   r   r!   r   MERGED_CLOSE_BLOCKED_EXTERNALr:   preserve_markersr;   s     r   )test_merged_close_blocked_external_directrc      s    	$+$&!!&

B 	A8VVVVV==5555a(((((!,,,,,r?   c            	         t        ddddddd      } t        |       }|j                  t        j                  k(  sJ |j
                  dk(  sJ t        |j                        d	k(  sJ y
)uY   DOGFOODING_PENDING 직접 케이스: PR MERGED + essence PASS + dogfooding 외부 의존.ztest-dogfoodingr.   r1   WARNNOT_RUNT)r2   r3   r6   rE   rF   r5   rG   z.dogfooding-pendingrS   N)r   r   r!   r   DOGFOODING_PENDINGr:   lenrY   r;   s     r   test_dogfooding_pending_directri      ss    	!''+
B 	A8KKKKK==1111q$$%***r?   c                 v    t        dddd      } t        |       }|j                  t        j                  k7  sJ y)uH   PR OPEN이지만 essence PASS 없으면 MERGE_PENDING_DEPENDENCY 아님.ztest-open-no-passrQ   Nz	task-9999)r2   r3   r6   rU   )r   r   r!   r   rX   r;   s     r   6test_merge_pending_open_no_essence_pass_not_classifiedrk      s>    	#&	
B 	A8QQQQQr?   c                 z    t        dddddd      } t        |       }|j                  t        j                  k7  sJ y)	uP   close_blocker_owner == 'internal'이면 MERGED_CLOSE_BLOCKED_EXTERNAL 미해당.ztest-internal-blockerr.   z2026-05-07T00:00:00ZrR   internalr   )r2   r3   r4   r5   r]   r7   N)r   r   r!   r   ra   r;   s     r   =test_merged_close_blocked_not_triggered_with_internal_blockerrn      sD    	'+$&
B 	A8VVVVVr?   c                     t        dddd      } t        |       }|j                  t        j                  k(  sJ |j
                  dk(  sJ y)u'   ESCALATED: retry 초과 + essence FAIL.ztest-escalated   rT   rR   )r2   rV   rW   r6   r`   N)r   r   r!   r   	ESCALATEDr:   r;   s     r   test_escalated_rulerr      sP    	 	
B 	A8BBBBB==K'''r?   )r   strreturndict)r   rs   )__doc__
__future__r   r   pathlibr   pytest tools.poc.termination_classifierr   r   r   __file__resolveparentsr   FIXTURE_FILESr   markparametrizer,   r>   rC   rH   rO   rZ   rc   ri   rk   rn   rr   r   r?   r   <module>r      s    #     H~%%'//2X=EH``cmm 7 8"$>"e$5 -(+"	RW
(r?   