
     jH                       d Z ddlm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e
      j                         j                  j                  j                  Z ee      ej                  v r!ej                  j!                   ee             ej                  j#                  d ee             ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ ddZ ddZ!ddZ"h d	Z#d
 Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1y)u/  tests/regression/test_automation_contracts_2509_plus_2.py — task-2509+2 회귀 테스트.

루(Lugh, 개발3팀 백엔드) 작성.
대상: utils/automation_contracts.py

14건:
  1  CriticalEscalationType 멤버 정확히 7개 + 이름 검증
  2  CriticalEscalationType 알 수 없는 값 → ValueError
  3  dataclass 8종 모두 JSON 직렬화 가능
  4  AutomationDecision: critical 있으면 requires_chair=True 강제
  5  AutomationDecision: critical=None + requires_chair=False 정상
  6  ReplacementResult: success=False 시 failure_reason 필수
  7  ReviewGateStatus: quota + fallback_passed 조합 보존
  8  GeminiStatus.GEMINI_SCOPE_EXPANSION → EscalationPacket 연결 가능
  9  SmokeResult 실패 → EscalationPacket.POST_MERGE_SMOKE_FAILED evidence 정상
  10 QueueAuditRecord 필수 필드 asdict 후 보존
  11 AutoMergeResult: merged=True 시 merge_commit 필수
  12 EscalationPacket: string 입력 자동 변환 / 알 수 없는 string → ValueError
  13 merge_queue_executor import 호환성 (subprocess)
  14 import smoke (subprocess)
    )annotationsN)Path)AutoMergeResultAutomationDecisionCriticalEscalationTypeEscalationPacketFallbackReviewResultGeminiStatusGeminiTriageResultQueueAuditRecordReplacementResultReviewGateStatus	RiskLevelSmokeResultto_jsonc                 \    t        dg d ddi       }|j                  |        t        di |S )NAUTO_MERGE_ALLOWEDTF)decisionreason_codescritical_escalation_typeauto_handledrequires_chairaudit )dictupdater   kwdefaultss     M/home/jay/workspace/tests/regression/test_automation_contracts_2509_plus_2.py_make_automation_decisionr!   ;   s:    %!%H OOB)))    c                 x    t        t        j                  ddddd      }|j                  |        t	        di |S )Nr   FTokgemini_statusunresolved_threadsfallback_review_usedfallback_review_passedreview_gate_passedreasonr   )r   r
   GEMINI_COMPLETEDr   r   r   s     r    _make_review_gate_statusr-   H   s@    "33"$H OOB'h''r"   c                 \    t        dddddd       }|j                  |        t        di |S )NpytestTr    commandpassed	exit_codestdout_tailstderr_tailfailure_reasonr   )r   r   r   r   s     r    _make_smoke_resultr8   U   s:    H OOB"""r"   >   REPLACEMENT_PR_FAILEDPOST_MERGE_SMOKE_FAILEDFORBIDDEN_PATH_INTRUSION(GEMINI_REAL_BUG_REQUIRES_SCOPE_EXPANSION)DEPENDENCY_CYCLE_OR_SERIAL_ONLY_COLLISION.BLOCK_OVERRIDE_REQUIRED_OR_REASON_INSUFFICIENT9REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFFc                     t        t              } t        |       dk(  sJ dt        |               | D ch c]  }|j                   }}|t        k(  sJ d|t        z          y c c}w )N   zExpected 7 members, got zMember name mismatch: )listr   lennameEXPECTED_CRITICAL_MEMBERS)membersmactual_namess      r    1test_critical_escalation_type_exact_seven_membersrI   q   ss    )*Gw<1G 8WGG$+,qAFF,L,44 
 0I!I JK4 -s   A%c                 v    t        j                  t              5  t        d       d d d        y # 1 sw Y   y xY w)NUNKNOWN_CRITICAL)r/   raises
ValueErrorr   r   r"   r    .test_critical_escalation_type_no_extra_membersrN   ~   s,    	z	" 3123 3 3s   /8c                    t               } t               }t               }| |t        ddt        j
                  i d      t        dd dg g g dd       t        t        j                  dddddg       |t        d	d
ddd| i |d d d      t        dd d g d       g}|D ]  }t        j                  |      }t        j                  |      }t!        |t"              sJ t%        |      j&                   d       t        j(                  |      }t!        |t*              sJ t-        |      }t        j(                  |      |k(  rJ t%        |      j&                   d        y )NFr$   )usedr3   
risk_levelchecksr+      T	source_prreplacement_proriginal_pr_preservedexpected_fileseffective_diff_filesforbidden_pathssuccessr7   r   )statusfalse_positive_countstyle_only_countreal_bug_small_countscope_expansion_countunresolved_countactions_takenzT-001*   abc123def456z2026-05-08T00:00:00Ztask_id	pr_numberqueue_positionhead_shabase_shar   rR   review_gatesmokecritical_escalation	timestampmergedmerge_commitsmoke_resultfollowing_prs_recheckedrn   u    JSON 직렬화 실패z4 to_json mismatch with dataclasses.asdict+json.dumps)r!   r-   r8   r	   r   LOWr   r   r
   r,   r   r   dataclassesasdictjsondumps
isinstancestrtype__name__loadsr   r   )	r   gaterm   	instancesobjd
serializedreparsedhelper_serializeds	            r    &test_all_dataclasses_json_serializabler      s   (*H#%D E 	 }}	
 	"&!#		
 	00!"!""#	
 	 $,	
 	$& $	
W2Ih  
s#ZZ]
*c* 	
Cy!!""89	
* ::j)(D)))#CLzz+,8 	
Cy!!""VW	
8
r"   c                 *   t        j                  t              5  t        t        j
                  d       d d d        t        t        j
                  d      } | j                  du sJ | j                  t        j
                  k(  sJ y # 1 sw Y   TxY w)NFr   r   T)r/   rL   rM   r!   r   r;   r   r   r   s    r    5test_automation_decision_critical_requires_chair_truer      s    	z	" 
!%;%T%T 	

 $!7!P!PC %%%''+A+Z+ZZZZ
 
s   B		Bc                 Z    t        d d      } | j                  J | j                  du sJ y )NFr   )r!   r   r   r   s    r    7test_automation_decision_no_critical_allows_chair_falser      s:    
#!%C ''///&&&r"   c                    t        j                  t              5  t        dd dg g g dd        d d d        t        j                  t              5  t        dd dg g g dd       d d d        t        dd dg g g dd      } | j                  dk(  sJ t        dddg g g dd       }|j
                  du sJ y # 1 sw Y   xY w# 1 sw Y   ]xY w)NrS   TFrT   r0   zdiff contamination   )r/   rL   rM   r   r7   r[   r   obj2s     r    /test_replacement_result_failure_requires_reasonr      s    	z	" 

"&!#		


 
z	" 

"&!#		


 "+	C !5555 "	D <<4c

 



 

s   B3B?3B<?Cc                     t        t        j                  ddddd      } | j                  t        j                  k(  sJ | j                  du sJ | j
                  du sJ y )Nr   Tzfallback used due to quotar%   )r   r
   GEMINI_UNAVAILABLE_QUOTAr&   r)   r*   )r   s    r    +test_review_gate_quota_with_fallback_passedr   0  sh    ";;!#+D !F!FFFF&&$...""d***r"   c                     t         j                  } | j                  dk(  sJ t        ddt         j                  ddddgddt        j
                  i	      }|j                  t         j                  k(  sJ |j                  j                  dk(  sJ y )
Nr<   zT-002d   zGemini detected scope expansionzscope beyond original PRrejectzexpand scope manuallyr&   rg   rh   escalation_typer+   why_auto_cannot_continuesafe_optionsrecommended_optionevidence)r   r<   valuer   r
   GEMINI_SCOPE_EXPANSIONr   )r   packets     r    )test_gemini_scope_expansion_to_critical_3r   B  s    ,UUO  $NNNN.WW0!; 782!<#F#FG	F !!%;%d%dddd!!''+UUUUr"   c                 >   t        dddddd      } | j                  du sJ t        dd	t        j                  d
ddgddt        j                  |       i      }|j                  t        j                  k(  sJ d|j                  v sJ |j                  d   d   du sJ y )Nzpytest tests/FrS   zFAILED tests/test_foo.pyr0   zsmoke test exit code 1r1   zT-003   zPost-merge smoke failedzsmoke failure after mergezrevert mergers   r   r3   )	r   r3   r   r   r:   rv   rw   r   r   )rm   r   s     r    )test_smoke_failure_to_post_merge_criticalr   Y  s    ./E <<5   .FF(!<$%) +"4"4U";<	F !!%;%S%SSSSV__,,,??>*84===r"   c                     t               } t               }t        ddddd| ddi|d d d	      }t        j                  |      }|d
   dk(  sJ |d   dk(  sJ |d   dk(  sJ |d   dk(  sJ y )NzT-007i     deadbeefcafebabecipassz2026-05-08T12:00:00Zrf   rg   rh   rj   ro   )r!   r-   r   rv   rw   )r   r   recordr   s       r    1test_queue_audit_record_required_fields_preservedr   w  s    (*H#%Df~ (F 	6"AY<7"""[>S   Z=J&&&[>3333r"   c                 ~   t        j                  t              5  t        dd d g d        d d d        t        j                  t              5  t        ddd g d        d d d        t        ddd g d       } | j                  dk(  sJ t        dd d g d       }|j
                  du sJ y # 1 sw Y   }xY w# 1 sw Y   WxY w)NTrp   r0   rd   F)r/   rL   rM   r   rr   rq   r   s     r    3test_auto_merge_result_merged_requires_merge_commitr     s    	z	" 
$& $	

 
z	" 
$& $	

  " C x'''  " D ;;%K
 

 
s   B'B3'B03B<c                    t        dddddg di       } t        | j                  t              sJ | j                  t        j                  k(  sJ t        j                  t              5  t        dd	d
ddg di        d d d        t        ddt        j                  ddg di       }|j                  t        j                  k(  sJ y # 1 sw Y   JxY w)NzT-0102   r;   zstring inputtestnoner   zT-0113   UNKNOWN_STRINGz	bad inputzT-0124   z
enum input)	r   rz   r   r   r;   r/   rL   rM   r:   )r   packet2s     r    )test_escalation_packet_only_critical_enumr     s    2!'!	F f,,.DEEE!!%;%T%TTTT 
z	" 

,%+%		


 .FF!'!	G ""&<&T&TTTT/

 

s   (CCc                     t        t              } t        j                  dd|  dg}t	        j
                  |dd      }|j                  dk(  s!J d|j                   d|j                          d	|j                  v sJ y )
N-c import sys; sys.path.insert(0, 'zx'); from utils.automation_contracts import CriticalEscalationType; from utils.merge_queue_executor import *; print('ok')Tcapture_outputtextr   zsubprocess failed:
stdout=
stderr=r$   	r{   	WORKSPACEsys
executable
subprocessrun
returncodestdoutstderr	repo_rootcmdresults      r    .test_merge_queue_executor_can_import_contractsr     s    II.yk : 		C ^^C4@F! 
%fmm_Ifmm_M! 6==   r"   c                     t        t              } t        j                  dd|  dg}t	        j
                  |dd      }|j                  dk(  s!J d|j                   d|j                          d	|j                  v sJ y )
Nr   r   a  '); from utils.automation_contracts import (CriticalEscalationType, RiskLevel, GeminiStatus, AutomationDecision, ReviewGateStatus, FallbackReviewResult, ReplacementResult, GeminiTriageResult, SmokeResult, QueueAuditRecord, AutoMergeResult, EscalationPacket, to_json); print('ok')Tr   r   zimport smoke failed:
stdout=r   r$   r   r   s      r    test_pyright_or_import_smoker     s    II.yk : 	C ^^C4@F! 
'iO! 6==   r"   )returnr   )r   r   )r   r   )2__doc__
__future__r   rv   rx   r   r   pathlibr   r/   __file__resolveparentr   r{   pathremoveinsertutils.automation_contractsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r!   r-   r8   rE   rI   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r    <module>r      s   * #    
   N""$++2299	y>SXXHHOOC	N# 3y> "   *
*
(
#" 3F
Z[*'3 t+$V.><4:' \'U\!.!r"   