
     jH                    (   d Z ddlmZ ddlZddlmc 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 Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7y)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t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }t        j                  dt        |              dz   d	|iz  }t        t        j                  |            d x}x}}| D ch c]  }|j                   }}|t        k(  }|st        j                  d|fd
|t        f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              nddz  }	t        j                  d|t        z         dz   d|	iz  }
t        t        j                  |
            d }y c c}w )N   ==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenmembers)py0py1py3py6zExpected 7 members, got z
>assert %(py8)spy8)z%(py0)s == %(py2)sactual_namesEXPECTED_CRITICAL_MEMBERS)rF   py2zMember name mismatch: z
>assert %(py4)spy4)listr   rD   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationnamerL   )rE   @py_assert2@py_assert5@py_assert4@py_format7@py_format9mrK   @py_assert1@py_format3@py_format5s              r    1test_critical_escalation_type_exact_seven_membersrc   q   s   )*Gw<G1G<1GGG<1GGGGGG3GGG3GGGGGGwGGGwGGG<GGG1GGG 8WGGGGGGGG$+,qAFF,L,44  <4                5    5    !0I!I JK     -s   I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_membersrh   ~   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 ]B  }t        j                  |      }t        j                  |      }t!        |t"              }|s7t%        j&                  t)        |      j*                   d      dz   dt-        j.                         v st%        j0                  t               rt%        j2                  t               nddt-        j.                         v st%        j0                  |      rt%        j2                  |      nddt-        j.                         v st%        j0                  t"              rt%        j2                  t"              ndt%        j2                  |      dz  }t5        t%        j6                  |            d }t        j8                  |      }	t!        |	t:              }|sddt-        j.                         v st%        j0                  t               rt%        j2                  t               nddt-        j.                         v st%        j0                  |	      rt%        j2                  |	      nddt-        j.                         v st%        j0                  t:              rt%        j2                  t:              ndt%        j2                  |      dz  }t5        t%        j6                  |            d }t=        |      }
t        j8                  } ||
      }||	k(  }|sct%        j>                  d|fd||	f      dt-        j.                         v st%        j0                  t              rt%        j2                  t              ndt%        j2                  |      dt-        j.                         v st%        j0                  |
      rt%        j2                  |
      ndt%        j2                  |      dt-        j.                         v st%        j0                  |	      rt%        j2                  |	      nddz  }t%        j&                  t)        |      j*                   d      dz   d |iz  }t5        t%        j6                  |            d x}x}}E 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   rl   review_gatesmokecritical_escalation	timestampmergedmerge_commitsmoke_resultfollowing_prs_recheckedr   u    JSON 직렬화 실패z7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstance
serializedstr)rF   rG   rM   rN   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}reparsedr   rB   )zK%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.loads
}(%(py3)s)
} == %(py7)sjsonhelper_serialized)rF   rM   rH   py5py7z4 to_json mismatch with dataclasses.asdict+json.dumpsz
>assert %(py9)spy9) r!   r-   r8   r	   r   LOWr   r   r
   r,   r   r   dataclassesasdictr   dumpsr   r   rP   rV   type__name__rR   rS   rT   rU   rW   rX   loadsr   r   rQ   )r   gater   	instancesobjdr   @py_assert3rb   r   r   r`   r\   @py_assert6@py_format8@py_format10s                   r    &test_all_dataclasses_json_serializabler      s   (*H#%D E 	 }}	
 	"&!#		
 	00!"!""#	
 	 $,	
 	$& $	
W2Ih  
s#ZZ]
*c* 	
* 	
  Cy!!""89	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
  % 	
 	
 		 % 	
 	
	6	
 	
  '* 	
 	
 		 '* 	
 	
 		 + 	
 	
 	
 	
 	
 ::j)(D))))))))z)))z))))))()))())))))D)))D))))))))))#CLzz 	
z+, 	
,8 	
 	
 	
, 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
	6	
 	
  , 	
 	
 		 , 	
 	
 		 - 	
 	
	6	
 	
  19 	
 	
 		 19 	
 	
  Cy!!""VW	
 	
 	
 	
 	
 	

r"   c                    t        j                  t              5  t        t        j
                  d       d d d        t        t        j
                  d      } | j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}| j                  }t        j
                  }||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y # 1 sw Y   xY w)NFr   r   Tisz6%(py2)s
{%(py2)s = %(py0)s.requires_chair
} is %(py5)sr   rF   rM   r   assert %(py7)sr   rB   )zn%(py2)s
{%(py2)s = %(py0)s.critical_escalation_type
} == %(py6)s
{%(py6)s = %(py4)s.FORBIDDEN_PATH_INTRUSION
}r   rF   rM   rN   rI   assert %(py8)srJ   )r/   rf   rg   r!   r   r;   r   rP   rQ   rR   rS   rT   rU   rW   rX   r   )	r   r`   r\   r   @py_format6r   r[   r]   r^   s	            r    5test_automation_decision_critical_requires_chair_truer      s`   	z	" 
!%;%T%T 	

 $!7!P!PC %%%%%%%%%%%%3%%%3%%%%%%%%%%%%%''Z+A+Z+ZZ'+ZZZZZ'+ZZZZZZZ3ZZZ3ZZZ'ZZZZZZ+AZZZ+AZZZ+ZZZZZZZZ
 
s   I  I
c                 :   t        d d      } | j                  }d }||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}| j                  }d}||u }|st        j                  d|fd	||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )
NFr   r   )z@%(py2)s
{%(py2)s = %(py0)s.critical_escalation_type
} is %(py5)sr   r   r   r   r   )r!   r   rP   rQ   rR   rS   rT   rU   rW   rX   r   )r   r`   r\   r   r   r   s         r    7test_automation_decision_no_critical_allows_chair_falser      s    
#!%C ''/4/'4////'4//////3///3///'///4///////&&&&&&&&&&&&3&&&3&&&&&&&&&&&&&r"   c                 v   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(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |       rt        j                  |       nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}t        dddg g g dd       }|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}y # 1 sw Y   xY w# 1 sw Y   xY w)Nrm   TFrn   r0   zdiff contaminationrB   )z6%(py2)s
{%(py2)s = %(py0)s.failure_reason
} == %(py5)sr   r   r   r      r   )z/%(py2)s
{%(py2)s = %(py0)s.success
} is %(py5)sobj2)r/   rf   rg   r   r7   rP   rQ   rR   rS   rT   rU   rW   rX   ru   r   r`   r\   r   r   r   r   s          r    /test_replacement_result_failure_requires_reasonr      s   	z	" 

"&!#		


 
z	" 

"&!#		


 "+	C 5!55!55555!555555535553555555!55555555 "	D <<4<4<444<4c

 



 

s   H!H.!H+.H8c                    t        t        j                  ddddd      } | j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      d	z  }d
d|iz  }t        t	        j                  |            d x}x}}| j                  }d}||u }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}| j                  }d}||u }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}y )Nr   Tzfallback used due to quotar%   rB   )zc%(py2)s
{%(py2)s = %(py0)s.gemini_status
} == %(py6)s
{%(py6)s = %(py4)s.GEMINI_UNAVAILABLE_QUOTA
}r   r
   r   r   rJ   r   )z>%(py2)s
{%(py2)s = %(py0)s.fallback_review_passed
} is %(py5)sr   r   r   )z:%(py2)s
{%(py2)s = %(py0)s.review_gate_passed
} is %(py5)s)r   r
   GEMINI_UNAVAILABLE_QUOTAr&   rP   rQ   rR   rS   rT   rU   rW   rX   r)   r*   )	r   r`   r[   r   r]   r^   r\   r   r   s	            r    +test_review_gate_quota_with_fallback_passedr   0  s   ";;!#+D F!F!FF!FFFFF!FFFFFFF4FFF4FFFFFFFFFFFFFFF!FFFFFFFF&&.$.&$....&$......4...4...&...$.......""*d*"d****"d******4***4***"***d*******r"   c                 ,   t         j                  } | j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}t        dd	t         j                  d
dddgddt        j                  i      }|j                  }t         j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}}|j                  }|j                  }d}
||
k(  }|st        j                  d|fd||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}x}}
y )Nr<   rB   )z-%(py2)s
{%(py2)s = %(py0)s.value
} == %(py5)sescalation_typer   r   r   zT-002d   zGemini detected scope expansionzscope beyond original PRrejectzexpand scope manuallyr&   r   r   r   r+   why_auto_cannot_continuesafe_optionsrecommended_optionevidence)zu%(py2)s
{%(py2)s = %(py0)s.escalation_type
} == %(py6)s
{%(py6)s = %(py4)s.GEMINI_REAL_BUG_REQUIRES_SCOPE_EXPANSION
}packetr   r   r   rJ   )zR%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.escalation_type
}.value
} == %(py7)s)rF   rM   rN   r   zassert %(py9)sr   )r   r<   valuerP   rQ   rR   rS   rT   rU   rW   rX   r   r
   GEMINI_SCOPE_EXPANSIONr   )r   r`   r\   r   r   r   r   r[   r]   r^   r   r   s               r    )test_gemini_scope_expansion_to_critical_3r   B  s   ,UUO  N$NN $NNNNN $NNNNNNN?NNN?NNN NNN$NNNNNNNN.WW0!; 782!<#F#FG	F !!d%;%d%dd!%ddddd!%ddddddd6ddd6ddd!dddddd%;ddd%;ddd%dddddddd!!U!''U+UU'+UUUUU'+UUUUUUU6UUU6UUU!UUU'UUU+UUUUUUUUr"   c                    t        dddddd      } | j                  }d}||u }|st        j                  d|fd	||f      d
t	        j
                         v st        j                  |       rt        j                  |       nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}t        ddt        j                  dddgddt        j                  |       i      }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}}d}
|j                   }|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}
x}}|j                   d   d   }
d}|
|u }|slt        j                  d|fd |
|f      t        j                  |
      t        j                  |      d!z  }d"d#|iz  }t        t        j                  |            d x}
x}}y )$Nzpytest tests/Frm   zFAILED tests/test_foo.pyr0   zsmoke test exit code 1r1   r   )z.%(py2)s
{%(py2)s = %(py0)s.passed
} is %(py5)sr   r   r   r   zT-003   zPost-merge smoke failedzsmoke failure after mergezrevert merger   r   rB   zd%(py2)s
{%(py2)s = %(py0)s.escalation_type
} == %(py6)s
{%(py6)s = %(py4)s.POST_MERGE_SMOKE_FAILED
}r   r   r   r   rJ   in)z0%(py1)s in %(py5)s
{%(py5)s = %(py3)s.evidence
}rG   rH   r   r3   )z%(py1)s is %(py4)srG   rN   assert %(py6)srI   )r   r3   rP   rQ   rR   rS   rT   rU   rW   rX   r   r   r:   r   r   r   r   )r   r`   r\   r   r   r   r   r[   r]   r^   @py_assert0rZ   rb   s                r    )test_smoke_failure_to_post_merge_criticalr   Y  s/   ./E << 5 <5    <5      5   5   <   5       .FF(!<$%) +"4"4U";<	F !!S%;%S%SS!%SSSSS!%SSSSSSS6SSS6SSS!SSSSSS%;SSS%;SSS%SSSSSSSS,V__,>_,,,,>_,,,>,,,,,,V,,,V,,,_,,,,,,,??>*84==4====4===4==========r"   c                    t               } t               }t        ddddd| ddi|d d d	      }t        j                  |      }|d
   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )NzT-007i     deadbeefcafebabecipassz2026-05-08T12:00:00Zr   r   rB   )z%(py1)s == %(py4)sr   r   rI   r   r   r   )
r!   r-   r   r   r   rP   rQ   rU   rW   rX   )	r   r   recordr   r   r   rZ   rb   r]   s	            r    1test_queue_audit_record_required_fields_preservedr   w  s   (*H#%Df~ (F 	6"AY<"7"<7""""<7"""<"""7"""""""[> S >S    >S   >   S       Z=&J&=J&&&&=J&&&=&&&J&&&&&&&[>333>33333>3333>3333333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(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}}t        dd d g d       }|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}}y # 1 sw Y   xY w# 1 sw Y   xY w)NTr   r0   r~   rB   )z4%(py2)s
{%(py2)s = %(py0)s.merge_commit
} == %(py5)sr   r   r   r   Fr   )z.%(py2)s
{%(py2)s = %(py0)s.merged
} is %(py5)sr   )r/   rf   rg   r   r   rP   rQ   rR   rS   rT   rU   rW   rX   r   r   s          r    3test_auto_merge_result_merged_requires_merge_commitr     s   	z	" 
$& $	

 
z	" 
$& $	

  " C 'x'x''''x''''''3'''3''''''x'''''''  " D ;;%;%;%44;%K
 

 
s   HH"H"H,c                    t        dddddg di       } | j                  }t        |t              }|sdd	t	        j
                         v st        j                  t              rt        j                  t              nd	d
t	        j
                         v st        j                  |       rt        j                  |       nd
t        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d x}}| j                  }t        j                  }||k(  }|st        j                  d|fd||f      d
t	        j
                         v st        j                  |       rt        j                  |       nd
t        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}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(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y # 1 sw Y   KxY w)NzT-0102   r;   zstring inputtestnoner   zZassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.escalation_type
}, %(py4)s)
}r   r   r   )rF   rG   rH   rN   rI   rB   )ze%(py2)s
{%(py2)s = %(py0)s.escalation_type
} == %(py6)s
{%(py6)s = %(py4)s.FORBIDDEN_PATH_INTRUSION
}r   r   rJ   zT-0113   UNKNOWN_STRINGz	bad inputzT-0124   z
enum inputr   packet2)r   r   r   r   rR   rS   rP   rT   rU   rW   rX   r;   rQ   r/   rf   rg   r:   )r   rZ   r[   r]   r`   r   r^   r   s           r    )test_escalation_packet_only_critical_enumr     sr   2!'!	F ,,E:,.DEEEEEEEE:EEE:EEEEEEfEEEfEEE,EEEEEE.DEEE.DEEEEEEEEEE!!T%;%T%TT!%TTTTT!%TTTTTTT6TTT6TTT!TTTTTT%;TTT%;TTT%TTTTTTTT 
z	" 

,%+%		


 .FF!'!	G ""T&<&T&TT"&TTTTT"&TTTTTTT7TTT7TTT"TTTTTT&<TTT&<TTT&TTTTTTTT/

 

s   O++O5c                    t        t              } t        j                  dd|  dg}t	        j
                  |dd      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        j                  d|j                   d|j                         dz   d|iz  }t!        t        j"                  |            d x}x}}d}|j                  }||v }	|	st        j                  d|	fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}	}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   rB   z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sresultr   zsubprocess failed:
stdout=
stderr=
>assert %(py7)sr   r$   r   z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.stdout
}r   r   r   	WORKSPACEsys
executable
subprocessrun
returncoderP   rQ   rR   rS   rT   rU   rV   stdoutstderrrW   rX   
	repo_rootcmdr   r`   r\   r   r   r   r   rZ   s
             r    .test_merge_queue_executor_can_import_contractsr     s   II.yk : 		C ^^C4@F  !                    !"    &fmm_Ifmm_M      6== 4=    4=   4      6   6   =       r"   c                    t        t              } t        j                  dd|  dg}t	        j
                  |dd      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        j                  d|j                   d|j                         dz   d|iz  }t!        t        j"                  |            d x}x}}d}|j                  }||v }	|	st        j                  d|	fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}	}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   rB   r   r   r   zimport smoke failed:
stdout=r   r   r   r$   r   r   r   r   r   r   s
             r    test_pyright_or_import_smoker     s   II.yk : 	C ^^C4@F  !                    !"    (iO      6== 4=    4=   4      6   6   =       r"   )returnr   )r  r   )r  r   )8__doc__
__future__r   builtinsrR   _pytest.assertion.rewrite	assertionrewriterP   r   r   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   rL   rc   rh   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"   