
    i#                       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                  d   Zdddddd	Z e
j                   d
      d        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)ue  tests/regression/test_done_hard_gate.py — task-2471 회귀 테스트.

토르가 commit 4795c5e2 에서 ``cmd_done`` 안에 통합한
``verify_done_preconditions`` (silent_corruption_guard) 의 hard-gate 동작을
영구 차단한다.

- 시그니처 검증 (3 check 호출 확인)
- 한 check 라도 FAIL 이면 ``ok=False``
- ``detail["failed_check"]`` 에 어느 check 가 실패했는지 명시

상위 ``cmd_done`` 자체는 다른 의존성이 많아 별도 e2e 테스트로 다룬다. 본 파일은
``verify_done_preconditions`` 의 boundary behavior 만 검증.

헤임달(개발2팀 테스터) 작성.
    )annotationsN)Path   Tokr   reasondetailc                &    | ||xs i dfd}|S )zReturn a callable that ignores its args and returns the canned dict.

    Pyright in strict mode flags lambda parameters as unused; this helper
    encapsulates the cast and keeps the test bodies declarative.
    r   c                     ~ ~S N )argskwargspayloads     ;/home/jay/workspace/tests/regression/test_done_hard_gate.py_innerz_stub.<locals>._inner%   s    &    r   )r   r   r	   r   r   s       @r   _stubr      s!     6V\rBG Mr   module)scopec                 b   t         dz  dz  } | j                         sJ t        j                  j	                  dt        |             }||j                  J t        j                  j                  |      }|t        j                  |j                  <   |j                  j                  |       |S )Nutilszsilent_corruption_guard.pyscg_done_hard_gate_test_alias)	WORKSPACEexists	importlibutilspec_from_file_locationstrloadermodule_from_specsysmodulesnameexec_module)	file_pathspecmods      r   scgr)   ,   s    G#&BBI>>11'YD  777
..
)
)$
/C CKK		KKC Jr   c                    t        j                  | j                        }|j                  }d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ |d   j                  dk(  sJ y)u}   ``verify_done_preconditions(pr_number, repo, *, base_branch="main",
    gh_cmd=None, cwd=None) -> dict`` 시그니처 보존.	pr_numberrepobase_branchgh_cmdcwdmainN)inspect	signatureverify_done_preconditions
parametersdefault)r)   sigparamss      r   (test_verify_done_preconditions_signaturer8   ?   s     

C99
:C^^F&   VF"""vF??- ((F222r   c                l    dD ]/  }t        | |      s
J | d       t        t        | |            r/J  y)u(   3 check 함수 모두 존재 + callable.)check_pr_merged_atcheck_pr_merge_commit_oidcheck_origin_main_ancestryu
    미정의N)hasattrcallablegetattr)r)   r$   s     r   test_three_checks_callabler@   M   sF     ,
 sD!6dV:#66!T*+++,r   c                    g fd}fd}fd}|j                  | d|       |j                  | d|       |j                  | d|       | j                  dd      }|d	   d
u sJ g dk(  sJ y)uR   verify_done_preconditions 가 mergedAt -> oid -> ancestry 순으로 모두 호출.c                 :    ~ ~j                  d       ddddidS )N	merged_atTr   mergedAt2026-05-07T00:00:00Zr   append_a_kwinvokeds     r   _fake_merged_atz>test_verify_done_invokes_three_checks.<locals>._fake_merged_ata   s.    {#d%'=>@ 	@r   c                 :    ~ ~j                  d       ddddidS )Nmerge_commit_oidTr   merge_commit_shaabc123r   rF   rH   s     r   	_fake_oidz8test_verify_done_invokes_three_checks.<locals>._fake_oidg   s,    )*d-x8: 	:r   c                 6    ~ ~j                  d       ddi dS )NancestryTr   r   rF   rH   s     r   _fake_ancestryz=test_verify_done_invokes_three_checks.<locals>._fake_ancestrym   s!    z"db99r   r:   r;   r<      
owner/repor   T)rC   rN   rS   N)setattrr3   )r)   monkeypatchrL   rQ   rT   resultrK   s         @r   %test_verify_done_invokes_three_checksrZ   ]   s    G@::
 1?C8)D9>J**1l;F$<4CCCCr   c                   |j                  | dt        dd             |j                  | dt        ddi             |j                  | d	t                      | j                  d
d      }|d   du sJ |d   d   dk(  sJ y )Nr:   FzmergedAt nullr   r   r;   rO   yr	   r<   rU   rV   r   r	   failed_checkrC   rW   r   r3   r)   rX   rY   s      r   ,test_one_check_fail_blocks_done_at_merged_atrb      s    !/
 ((#./ )
 **1l;F$<5   (N+{:::r   c                   |j                  | dt        ddi             |j                  | dt        dd             |j                  | d	t                      | j                  d
d      }|d   du sJ |d   d   dk(  sJ y )Nr:   rD   Tr^   r;   Fzoid nullr\   r<   r   rV   r   r	   r_   rN   r`   ra   s      r   &test_one_check_fail_blocks_done_at_oidre      s    !j#&' (z* )
 **1l;F$<5   (N+/AAAAr   c                   |j                  | dt        ddi             |j                  | dt        ddi             |j                  | dt        d	d
             | j                  dd      }|d   d	u sJ |d   d   dk(  sJ y )Nr:   rD   rd   r^   r;   rO   abcr<   Fznot ancestorr\      rV   r   r	   r_   rS   r`   ra   s      r   +test_one_check_fail_blocks_done_at_ancestryri      s    !j#&' ((%01 )~.
 **1l;F$<5   (N+z999r   c                   |j                  | dt        ddi             |j                  | dt        dd             | j                  d	d
      }|d   du sJ d|d   v sJ |d   d   }|d   d   du sJ |d   d   du sJ y)uK   검증 실패 시 detail['checks'] 에 실행된 check 결과들이 보존.r:   rD   rd   r^   r;   Fzoid missingr\      rV   r   checksr	   rC   TrN   Nr`   )r)   rX   rY   rl   s       r   (test_failure_detail_includes_checks_dictrm      s    !j#&' (}-
 **1l;F$<5   vh''''Hh'F+t$,,,$%d+u444r   c                v   |j                  | dt        ddi             |j                  | dt        ddi             |j                  | dt        d	
             | j                  ddd      }|d   du sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ y )Nr:   rD   rE   r^   r;   rO   (deadbeefdeadbeefdeadbeefdeadbeefdeadbeefr<   zancestry ok)r      rV   r0   )r-   r   Tr	   rC   r-   r+   r,   r`   ra   s      r   7test_success_detail_includes_merge_commit_and_merged_atrq      s   !j"89: ((.9: )]#
 **1l*OF$<4(./>AAA(K(,BBBB(M*f444(K(A---(F#|333r   c                   t        j                  ddd      fd}|j                  | d|       |j                  | j                  dd        | j	                  dd      }t        |j                               h d	k\  sJ t        |d
   t              sJ t        |d   t              sJ t        |d   t              sJ y)uG   verify_done_preconditions 는 항상 {ok, reason, detail} 3 key 보장.N)rD   mergeCommitc                    ~ ~ddfS )Nr    r   )_cmd_kwargsr   s     r   	_fake_runz-test_return_value_contract.<locals>._fake_run   s    '7Br   _runsleepc                     y r   r   )_s    r   <lambda>z,test_return_value_contract.<locals>.<lambda>   s    r   r   rV   >   r   r	   r   r   r   r	   )jsondumpsrW   timer3   setkeys
isinstanceboolr   dict)r)   rX   rx   rY   r   s       @r   test_return_value_contractr      s    jjd4@AG  VY/'>:**1l;Fv{{}!;;;;fTlD)))fX&,,,fX&---r   )r   r   r   r   r	   zdict | None)__doc__
__future__r   importlib.utilr   r1   r~   r"   pathlibr   pytest__file__resolveparentsr   r   fixturer)   r8   r@   rZ   rb   re   ri   rm   rq   r   r   r   r   <module>r      s    #    
  N""$,,Q/	 D  h
  
$3, DH;(B&:05448.r   