
    i#                    "   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&                  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                    t         dz  dz  } | j                  } |       }|sddt        j                         v st	        j
                  |       rt	        j                  |       ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}}t        j                  j                  dt        |             }g }d }||u}|}|r|j                  }d }||u}	|	}|slt	        j                  d|fd||f      d	t        j                         v st	        j
                  |      rt	        j                  |      nd	t	        j                  |      d
z  }
dd|
iz  }|j                  |       |rt	        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  }|j                  |       t	        j                   |d      i z  }dd|iz  }t        t	        j                  |            d x}x}x}x}x}x}	}t        j                  j#                  |      }|t$        j&                  |j(                  <   |j                  j+                  |       |S )Nutilszsilent_corruption_guard.pyzAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}	file_path)py0py2py4scg_done_hard_gate_test_alias)is not)z%(py2)s is not %(py5)sspec)r   py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16r   zassert %(py19)spy19)	WORKSPACEexists@py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanation	importlibutilspec_from_file_locationstrloader_call_reprcompareappend_format_boolopmodule_from_specsysmodulesnameexec_module)r   @py_assert1@py_assert3@py_format5r   @py_assert4@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                    r   scgrL   ,   s   G#&BBI99>>11'YD 8t74t77474 777774t77777747774777t77777774777777777777777477777777777777
..
)
)$
/C CKK		KKC Jr   c                   t        j                  | j                        }|j                  }d}||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}d	}||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}d
}||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}d}||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}d}||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}|d
   }|j                  }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            dx}x}x}}y)u}   ``verify_done_preconditions(pr_number, repo, *, base_branch="main",
    gh_cmd=None, cwd=None) -> dict`` 시그니처 보존.	pr_numberin)z%(py1)s in %(py3)sparams)py1py3assert %(py5)sr    Nrepobase_branchgh_cmdcwdmain==)z/%(py3)s
{%(py3)s = %(py1)s.default
} == %(py6)s)rR   rS   py6zassert %(py8)spy8)inspect	signatureverify_done_preconditions
parametersr+   r5   r-   r)   r*   r,   r.   r/   default)rL   sigrQ   rA   @py_assert2@py_format4rE   @py_assert5r@   @py_format7@py_format9s              r   (test_verify_done_preconditions_signatureri   ?   sI    

C99
:C^^F ;&    ;&   ;      &   &       6V6V6VV"=F""""=F"""=""""""F"""F"""""""8v8v8vv5F?5F5FF- 2 ((2F2(F2222(F222 222(222F2222222r   c           
     l   dD ]  }t        | |      }|st        j                  | d      dz   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dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d}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
                  t              rt        j                  t              nddt        j                         v st        j
                  |       rt        j                  |       nddt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}} y)u(   3 check 함수 모두 존재 + callable.)check_pr_merged_atcheck_pr_merge_commit_oidcheck_origin_main_ancestryu
    미정의z7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}hasattrrL   r;   )r   rR   r   r   NzSassert %(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py2)s, %(py3)s)
})
}callablegetattr)r   rR   r   rS   r    r!   )rn   r+   _format_assertmsgr)   r*   r,   r-   r.   r/   rp   ro   )rL   r;   r>   r?   r@   @py_assert6rF   s          r   test_three_checks_callablers   M   sm    ,
 sD!6!66dV:#6666666w666w666666s666s666666D666D666!666666T*+x*++++++++x+++x++++++++++++++++++++++++T+++T+++*++++++++++,r   c                   g fd}fd}fd}|j                  | d|       |j                  | d|       |j                  | d|       | j                  d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}}g d}|k(  }|st        j                  d|fd|f      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}}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   r6   _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   ry   rz   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   ry   rz   s     r   _fake_ancestryz=test_verify_done_invokes_three_checks.<locals>._fake_ancestrym   s!    z"db99r   rk   rl   rm      
owner/repor   Tisz%(py1)s is %(py4)srR   r   assert %(py6)sr\   N)rv   r   r   rZ   )z%(py0)s == %(py3)sr}   )r   rS   rT   r    )
setattrr`   r+   r5   r-   r.   r/   r)   r*   r,   )rL   monkeypatchr~   r   r   resultrA   r>   rd   r?   rg   r=   re   rE   r}   s                 @r   %test_verify_done_invokes_three_checksr   ]   s   G@::
 1?C8)D9>J**1l;F$<4<4<4<4CC7CCCCC7CCCCCCC7CCC7CCCCCCC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 }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   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 )Nrk   FzmergedAt nullr   r   rl   r   yr	   rm   r   r   r   r   r   r   r   r\   r	   failed_checkrv   rZ   z%(py1)s == %(py4)sr   r   r`   r+   r5   r-   r.   r/   rL   r   r   rA   r>   rd   r?   rg   s           r   ,test_one_check_fail_blocks_done_at_merged_atr      s   !/
 ((#./ )
 **1l;F$< 5 <5    <5   <   5       (N+:{:+{::::+{:::+:::{:::::::r   c                   |j                  | dt        ddi             |j                  | dt        dd             |j                  | d	t                      | j                  d
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}}|d   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 )Nrk   rw   Tr   rl   Fzoid nullr   rm   r   r   r   r   r   r   r   r\   r	   r   r   rZ   r   r   r   s           r   &test_one_check_fail_blocks_done_at_oidr      s   !j#&' (z* )
 **1l;F$< 5 <5    <5   <   5       (N+A/AA+/AAAAA+/AAAA+AAA/AAAA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 }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   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 )Nrk   rw   r   r   rl   r   abcrm   Fznot ancestorr      r   r   r   r   r   r   r\   r	   r   r   rZ   r   r   r   s           r   +test_one_check_fail_blocks_done_at_ancestryr      s    !j#&' ((%01 )~.
 **1l;F$< 5 <5    <5   <   5       (N+9z9+z9999+z999+999z9999999r   c                   |j                  | dt        ddi             |j                  | dt        dd             | j                  d	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}}d}|d   }||v }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }|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}}|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)uK   검증 실패 시 detail['checks'] 에 실행된 check 결과들이 보존.rk   rw   r   r   rl   Fzoid missingr      r   r   r   r   r   r   r\   Nchecksr	   rO   )z%(py1)s in %(py4)srv   Tr   r   )	rL   r   r   rA   r>   rd   r?   rg   r   s	            r   (test_failure_detail_includes_checks_dictr      s   !j#&' (}-
 **1l;F$< 5 <5    <5   <   5       'vh''8'''''8''''8'''''''''''Hh'F+t$,,$,,,,$,,,$,,,,,,,,,,$%d+4u4+u4444+u444+444u4444444r   c                <   |j                  | dt        ddi             |j                  | dt        ddi             |j                  | dt        d	
             | j                  dd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}}|d   d   }d}d}||z  }	||	k(  }|st        j                  d|fd||	f      t        j
                  |      t        j
                  |      t        j
                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}x}x}}	|d   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   }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    }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!   }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 )"Nrk   rw   rx   r   rl   r   (deadbeefdeadbeefdeadbeefdeadbeefdeadbeefrm   zancestry ok)r      r   rY   )rV   r   Tr   r   r   r   r\   r	   deadbeefrZ   )z%(py1)s == (%(py4)s * %(py6)s))rR   r   r\   zassert %(py9)sr"   rv   r   rV   rN   rU   r   )rL   r   r   rA   r>   rd   r?   rg   rf   @py_assert7rF   @py_format10s               r   7test_success_detail_includes_merge_commit_and_merged_atr      s   !j"89: ((.9: )]#
 **1l*OF$<4<4<4<4(./A:AA:>A/>AAAA/>AAA/AAA:AAAAAAAAAA(K(B,BB(,BBBBB(,BBBB(BBB,BBBBBBBB(M*4f4*f4444*f444*444f4444444(K(-A-(A----(A---(---A-------(F#3|3#|3333#|333#333|3333333r   c           	     @	   t        j                  ddd      fd}|j                  | d|       |j                  | j                  dd        | j	                  dd      }|j
                  } |       }t        |      }h 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                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}|d   }t        |t               }|sddt        j                         v st        j                  t              rt        j                  t              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}}|d   }t        |t"              }|sddt        j                         v st        j                  t              rt        j                  t              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}}|d   }t        |t$              }|sddt        j                         v st        j                  t              rt        j                  t              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}}y)uG   verify_done_preconditions 는 항상 {ok, reason, detail} 3 key 보장.N)rw   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   r   >   r   r	   r   )>=)zb%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.keys
}()
})
} >= %(py10)ssetr   )r   rR   rS   r    r!   py10zassert %(py12)spy12r   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancebool)r   r   rS   r    r   r3   r	   dict)jsondumpsr   timer`   keysr   r+   r5   r)   r*   r,   r-   r.   r/   r   r   r3   r   )rL   r   r   r   rd   r@   rr   @py_assert9@py_assert8@py_format11@py_format13r=   rE   r   s                @r   test_return_value_contractr      s   jjd4@AG  VY/'>:**1l;F{{;{};3};!;;!;;;;;!;;;;;;;3;;;3;;;;;;v;;;v;;;{;;;};;;;;;!;;;;;;;;Tl):lD)))))))):))):)))l))))))D)))D))))))))))X&,:&,,,,,,,,:,,,:,,,&,,,,,,,,,,,,,,,,,,,X&-:&--------:---:---&-------------------r   )r   r   r   r3   r	   zdict | None)!__doc__
__future__r   builtinsr)   _pytest.assertion.rewrite	assertionrewriter+   importlib.utilr0   r^   r   r9   pathlibr   pytest__file__resolveparentsr'   r   fixturerL   ri   rs   r   r   r   r   r   r   r   r   r   r   <module>r      s    #       
  N""$,,Q/	 D  h
  
$3, DH;(B&:05448.r   