
     jG                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZmZ ddlZej                  j                  d e e	e      j%                         j&                  d                ddlmZmZmZmZmZmZmZmZ dd	Zd
ddd
d
dd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZddZ ddZ!ddZ"ddZ#ddZ$ddZ%ddZ&ddZ'ddZ(ddZ)ddZ*ddZ+ddZ,y)u"  tests/regression/test_repository_policy_adapter_2519.py

회귀 테스트 14건 — repository_policy_adapter.py
작성자: 헤임달(테스터), 개발2팀 QA 엔지니어
task-2519 회귀 테스트 고정 fixture

모듈 본체 수정 금지. gh api 실호출 금지. 모두 runner mock.
    )annotationsN)fields)Path)AnyDict   )BlockedReasonMergePathPlanRepositoryCapabilityassert_no_admin_overrideclassify_blocked_reasoninvoke_triage_hookprobe_capabilityselect_merge_pathc                     ddd fd}|S )uA   gh api endpoint별로 mock 응답을 반환하는 runner factory.N)cwdc                   ~t        |       dkD  r| d   nd}|v r0t        j                  |         }t        j                  | d|d      S t        j                  | ddd      S )Nr    r      z	Not Found)lenjsondumps
subprocessCompletedProcess)cmdr   endpointstdout	responsess       K/home/jay/workspace/tests/regression/test_repository_policy_adapter_2519.pyrunnerz make_mock_runner.<locals>.runner,   sd     X\3q6ry ZZ	( 34F..sAvrBB**32{CC    )r   z	list[str]r   r   returnz subprocess.CompletedProcess[str] )r   r    s   ` r   make_mock_runnerr$   )   s     .2 D Mr!   TFcan_squash_mergerequires_approvalrequires_thread_resolutionauto_merge_enabledbot_can_mergeadmin_override_requiredc                $    t        | |||||      S )Nr%   )r   r%   s         r   _capr-   ;   s#      )+#=-# 7 r!   c                 4   d\  } }}d|  d| d| }d|  d| d| d}d|  d| }d|  d| d}|}|dd	d
dg dg|d
d
d|ddii}t        | ||t        |            }	t        |	      D 
ch c]  }
|
j                   }}
d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ t	        |      dk(  sJ |	j
                  d
u sJ |	j                  d
u sJ |	j                  d
u sJ |	j                  d
u sJ |	j                  d
u sJ |	j                  du sJ yc c}
w )uL   (1) probe_capability에 mock runner 주입 → 6 field 모두 정확 매칭.)z
test-ownerz	test-repomainrepos///rules/branches/z
/branches/z/protection-/collaborators/github-actions[bot]/permissionpull_requestr   Trequired_approving_review_count!required_review_thread_resolutiontype
parametersbypass_actorsallow_squash_mergeallow_auto_merge
permissionwriter    r&   r'   r(   r)   r*   r+      FN)r   r$   r   namer   r&   r'   r(   r)   r*   r+   )ownerrepobranchruleset_endpointprotection_endpointrepo_endpointperm_endpoint_mock_responsescapffield_namess               r   *test_repository_capability_six_field_proberP   S   s   ;E4wav-=fXF"5'4&
6(+NUG1TF+MUG1TF*WXM 	A&789= "$	
 	"& $
 	g.&N$ 5$7G7W
XC $*#;/a166/K/,,,+---';666;...k)))$333{q    4'''  D((())T111!!T)))$$$&&%/// 0s   +Dc                     d\  } }}d|  d| d| }d|  d| }d|  d| d}|dddd	g d
g|ddd|ddii}t        | ||t        |            }|j                  du sJ y)um   (2) ruleset 응답 mock에 required_review_thread_resolution=true 포함 시 requires_thread_resolution=True.orgmyrepor/   r0   r1   r2   r3   r4   r   Tr5   r8   Fr<   r?   r@   rA   N)r   r$   r(   rD   rE   rF   rG   rI   rJ   rL   rM   s           r   3test_ruleset_required_review_thread_resolution_truerV      s    1E4wav-=fXFUG1TF+MUG1TF*WXM 	&789= "$	
 	dNg.&N 5$7G7W
XC))T111r!   c                     d\  } }}d|  d| d| }d|  d| }d|  d| d}|dddd	g d
g|ddd|ddii}t        | ||t        |            }|j                  du sJ y)uM   (3) ruleset의 required_approving_review_count=0 → requires_approval=False.rR   r0   r1   r2   r3   r4   r   Fr5   r8   Tr<   r?   r@   rA   N)r   r$   r'   rU   s           r   )test_required_approving_review_count_zerorX      s    1E4wav-=fXFUG1TF+MUG1TF*WXM 	&789> "$	
 	dMg.&N 5$7G7W
XC  E)))r!   c            
        d\  } }}d|  d| d| d|  d| d|  d| ddfd}t        | ||t         |d                  }|j                  d	u sJ t        | ||t         |d
                  }|j                  du sJ y)u]   (4) collaborators permission mock 응답이 'write' → bot_can_merge=True. 'read' → False.rR   r0   r1   r2   r3   c                    g dddd| iiS )NTr<   r?   r#   )
perm_valuerJ   rI   rG   s    r   responses_forz0test_bot_permission_probe.<locals>.responses_for   s&    b$DQL*5
 	
r!   r@   rA   TreadFN)r[   strr"   Dict[str, Any])r   r$   r*   )	rD   rE   rF   r\   	cap_writecap_readrJ   rI   rG   s	         @@@r   test_bot_permission_proberb      s    1E4wav-=fXFUG1TF+MUG1TF*WXM
 !f=Mm\cNd=efI""d***tV<L][aMb<cdH!!U***r!   c                     ddddiddiddiddiddigdddid} t        d	d	d	
      }t        | |      }|t        j                  k(  sJ y)ul   (5) PR #61 fixture (5 unresolved threads + ruleset requires_thread_resolution) → UNRESOLVED_REVIEW_THREAD.=   BLOCKED
isResolvedFAPPROVEDstateSUCCESSnumbermergeStateStatusreviewThreadsreviewDecisionstatusCheckRollupTr(   r*   r)   N)r-   r   r	   UNRESOLVED_REVIEW_THREAD)pr61rM   results      r   3test_classify_unresolved_review_thread_pr61_fixturert      s|     %5!5!5!5!5!
 %%y1D $dW[
\C$T3/F];;;;;r!   c                 x    ddg dddid} t        dddd	      }t        | |      }|t        j                  k(  sJ y
)uo   (6) 합성 fixture (capability.requires_approval=True, reviewDecision='REVIEW_REQUIRED') → REQUIRED_APPROVAL.d   re   REVIEW_REQUIREDrh   ri   rj   TF)r'   r(   r*   r)   N)r-   r   r	   REQUIRED_APPROVALprrM   rs   s      r   test_classify_required_approvalr{      sS     %+%y1B %W[pt
uC$R-F]44444r!   c                 x    ddg dddid} t        dddd	      }t        | |      }|t        j                  k(  sJ y
)u>   (7) PR #67 fixture (mergeStateStatus='BEHIND') → STALE_BASE.C   BEHINDrg   rh   ri   rj   FTr(   r'   r*   r)   N)r-   r   r	   
STALE_BASE)pr67rM   rs   s      r   %test_classify_stale_base_pr67_fixturer      sS     $$%y1D %5X\qu
vC$T3/F]-----r!   c                 x    ddg dddid} t        dddd	      }t        | |      }|t        j                  k(  sJ y
)uD   (8) 합성 (statusCheckRollup state='PENDING') → MISSING_CI_CHECK.   re   rg   rh   PENDINGrj   FTr   N)r-   r   r	   MISSING_CI_CHECKry   s      r   test_classify_missing_ci_checkr     sY     %$%y1B #(	C %R-F]33333r!   c                 x    ddg dddid} t        dddd	      }t        | |      }|t        j                  k(  sJ y
)u   (9) 합성 (mergeStateStatus='BLOCKED', capability에 추가 차단요소 없음, bot_can_merge=True, auto_merge_enabled=True) → BRANCH_PROTECTION.i,  re   rg   rh   ri   rj   FTr   N)r-   r   r	   BRANCH_PROTECTIONry   s      r   test_classify_branch_protectionr     sY     %$%y1B #(	C %R-F]44444r!   c                 x    ddg dddid} t        dddd	      }t        | |      }|t        j                  k(  sJ y
)uB   (10) 합성 (capability.bot_can_merge=False) → PERMISSION_ISSUE.i  re   rg   rh   ri   rj   FTr   N)r-   r   r	   PERMISSION_ISSUEry   s      r   test_classify_permission_issuer   )  sY     %$%y1B #(	C %R-F]33333r!   c                 x    ddg dddid} t        dddd	      }t        | |      }|t        j                  k(  sJ y
)ua   (11) 합성 (capability.auto_merge_enabled=False, bot_can_merge=True) → AUTO_MERGE_UNSUPPORTED.i  re   rg   rh   ri   rj   FTr   N)r-   r   r	   AUTO_MERGE_UNSUPPORTEDry   s      r   $test_classify_auto_merge_unsupportedr   <  sY     %$%y1B #( 	C %R-F]99999r!   c                    ddddiddiddiddiddigdddid} t        d	d	d	
      }t        | |      }|t        j                  k(  sJ t	        | ||      }t        |t              sJ |j                  dk(  sJ |j                  dk(  sJ t        d      }|d   dk(  sJ |d   dk(  sJ t        |d         sJ ddg dddid}t        d	d	d	      }t        ||      }|t        j                  k(  sJ t	        |||      }|j                  du sJ d       ddg dddid}	t        ddd	d	      }
t        |	|
      }|t        j                  k(  sJ t	        |	|
|      }|j                  d	u sJ ddg dddid}t        dd	      }t        ||      }|t        j                  k(  sJ t	        |||      }|j                  d	u sJ t!        j"                  t$              5  t'        g d       ddd       t'        g d       y# 1 sw Y   xY w)u  (12) PR #61 replay → UNRESOLVED_REVIEW_THREAD → MergePathPlan(action='auto_gemini_triage', triage_hook='auto_gemini_triage.triage_pr').

    추가 검증:
    - REQUIRED_APPROVAL 분류 시 plan.requires_chair=False (회장 직접 머지 fallback 없음)
    - assert_no_admin_override(['gh', 'pr', 'merge', '--admin']) → RuntimeError
    - assert_no_admin_override(['gh', 'pr', 'merge', '--squash']) → no error
    - BRANCH_PROTECTION → capability_gap=True
    - PERMISSION_ISSUE → capability_gap=True
    rd   re   rf   Frg   rh   ri   rj   Trp   auto_gemini_triagezauto_gemini_triage.triage_prhook	pr_numbercallablerw   )r'   r*   r)   u7   REQUIRED_APPROVAL: 회장 직접 머지 fallback 없음r   )r*   r)   )ghrz   mergez--adminN)r   rz   r   z--squash)r-   r   r	   rq   r   
isinstancer
   actiontriage_hookr   r   rx   requires_chairr   capability_gapr   pytestraisesRuntimeErrorr   )rr   rM   blockedplanr   pr_reqcap_reqblocked_reqplan_reqpr_bpcap_bp
blocked_bpplan_bppr_picap_pi
blocked_piplan_pis                    r   %test_pr61_replay_unresolved_to_triager   T  s    %5!5!5!5!5!
 %%y1D $dW[
\C%dC0Gm<<<<<T30DdM***;;....==== b!D<9999"""D$%%% %+%y1F TRVWG)&':K-99999 +>H""e+f-ff+ %$%y1E Ue[_txyF(7J88888vz:G!!T))) %$%y1E $?F(7J77777vz:G!!T))) 
|	$ C !ABC >?	C Cs   G==Hc                    ddg dddid} t        dddd	      }t        | |      }|t        j                  k(  sJ t	        | ||      }|j
                  d
k(  sJ |j                  dk(  sJ |j                  J d|j                  j                         vsJ d|j                  vsJ d|j                  j                         vsJ d|j                  j                         vsJ y)u   (13) PR #67 replay → STALE_BASE → MergePathPlan(action='base_sync', base_sync_command='git merge origin/main'). force push 명령 미포함 검증.r}   r~   rg   rh   ri   rj   FTr   	base_synczgit merge origin/mainNforcez--forcez-fpush)	r-   r   r	   r   r   r   base_sync_commandlowersplit)r   rM   r   r   s       r   #test_pr67_replay_stale_to_base_syncr     s    $$%y1D %5X\qu
vC%dC0Gm.....T30D;;+%%%!!%<<<< !!---$00668888D22222t--335555//557777r!   c                     ddg dddid} t        dddddd	      }t        | |      }|J t        | ||      }|j                  dk(  sJ |j                  du sJ |j
                  du sJ y
)u   (14) PR #68 fixture (task-2517 정상 머지 capability — 모든 필드 충족) → classify=None → MergePathPlan(action='squash_merge', capability_gap=False).D   CLEANrg   rh   ri   rj   TFr%   Nsquash_merge)r-   r   r   r   r   r   )pr68rM   r   r   s       r   $test_pr68_replay_normal_squash_merger     s     #$%y1D #( %C &dC0G??T30D;;.(((%'''%'''r!   )r   r_   )r&   boolr'   r   r(   r   r)   r   r*   r   r+   r   r"   r   )r"   None)-__doc__
__future__r   r   r   sysdataclassesr   pathlibr   typingr   r   r   pathinsertr^   __file__resolveparentsutils.repository_policy_adapterr	   r
   r   r   r   r   r   r   r$   r-   rP   rV   rX   rb   rt   r{   r   r   r   r   r   r   r   r   r#   r!   r   <module>r      s   #   
    
 3tH~--/77:; <	 	 	 ( "#',#$)  !%	
   " 0/0d24*4+4<(5.4&5&4&:0V@r84(r!   