
     jG                       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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      j1                         j2                  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Z0ddZ1ddZ2y)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                 <   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 }|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}||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}}t        |      }d}||k(  }|st	        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  }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}}|	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}}|	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d0||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c c}
w )1uL   (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&   )in)z%(py1)s in %(py3)sfield_names)py1py3assert %(py5)spy5Nr'   r(   r)   r*   r+      ==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   )py0rD   rE   py6zassert %(py8)spy8is)z8%(py2)s
{%(py2)s = %(py0)s.can_squash_merge
} is %(py5)scaprK   py2rG   assert %(py7)spy7z9%(py2)s
{%(py2)s = %(py0)s.requires_approval
} is %(py5)szB%(py2)s
{%(py2)s = %(py0)s.requires_thread_resolution
} is %(py5)s)z:%(py2)s
{%(py2)s = %(py0)s.auto_merge_enabled
} is %(py5)sz5%(py2)s
{%(py2)s = %(py0)s.bot_can_merge
} is %(py5)sF)z?%(py2)s
{%(py2)s = %(py0)s.admin_override_required
} is %(py5)s)r   r$   r   name
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationr   r&   r'   r(   r)   r*   r+   )ownerrepobranchruleset_endpointprotection_endpointrepo_endpointperm_endpoint_mock_responsesrP   frC   @py_assert0@py_assert2@py_format4@py_format6@py_assert5@py_assert4@py_format7@py_format9@py_assert1@py_assert3@py_format8s                          r   *test_repository_capability_six_field_proberv   S   sQ   ;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66';666'666666;666;6666666.;....;.........;...;.......)?k))))?k)))?))))))k)))k)))))))$3$3333$333$3333333333333333{ q q    q      3   3      {   {      q        '4'4''''4''''''3'''3''''''4'''''''  (D( D(((( D((((((3(((3((( (((D((((((())1T1)T1111)T11111131113111)111T1111111!!)T)!T))))!T))))))3)))3)))!)))T)))))))$$$$$$$$$$$$3$$$3$$$$$$$$$$$$$&&/%/&%////&%//////3///3///&///%/////// 0s   +hc                 0   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 }
|
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)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   rN   rV   rP   rQ   rS   rT   N)r   r$   r(   rY   rZ   r\   r]   r^   r[   r_   r`   ra   rb   rc   rd   rf   rg   ri   rP   rs   rp   rt   rn   ru   s                r   3test_ruleset_required_review_thread_resolution_truer|      s   1E4wav-=fXFUG1TF+MUG1TF*WXM 	&789= "$	
 	dNg.&N 5$7G7W
XC))1T1)T1111)T11111131113111)111T1111111r!   c                 0   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 }
|
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)uM   (3) ruleset의 required_approving_review_count=0 → requires_approval=False.rx   r0   r1   r2   r3   r4   r   Fr5   r8   Tr<   r?   r@   rA   rN   rU   rP   rQ   rS   rT   N)r   r$   r'   rY   rZ   r\   r]   r^   r[   r_   r`   r{   s                r   )test_required_approving_review_count_zeror~      s   1E4wav-=fXFUG1TF+MUG1TF*WXM 	&789> "$	
 	dMg.&N 5$7G7W
XC  )E) E)))) E))))))3)))3))) )))E)))))))r!   c            
        d\  } }}d|  d| d| d|  d| d|  d| ddfd}t        | ||t         |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        | ||t         |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)u]   (4) collaborators permission mock 응답이 'write' → bot_can_merge=True. 'read' → False.rx   r0   r1   r2   r3   c                    g dddd| iiS )NTr<   r?   r#   )
perm_valuerg   rf   rd   s    r   responses_forz0test_bot_permission_probe.<locals>.responses_for   s&    b$DQL*5
 	
r!   r@   rA   TrN   rW   	cap_writerQ   rS   rT   NreadFcap_read)r   strr"   Dict[str, Any])r   r$   r*   rY   rZ   r\   r]   r^   r[   r_   r`   )ra   rb   rc   r   r   rs   rp   rt   rn   ru   r   rg   rf   rd   s              @@@r   test_bot_permission_prober      ss   1E4wav-=fXFUG1TF+MUG1TF*WXM
 !f=Mm\cNd=efI""*d*"d****"d******9***9***"***d*******tV<L][aMb<cdH!!*U*!U****!U******8***8***!***U*******r!   c                 d   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(  }|st	        j
                  d|fd||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t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}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)   rI   z@%(py0)s == %(py4)s
{%(py4)s = %(py2)s.UNRESOLVED_REVIEW_THREAD
}resultr	   rK   rR   py4assert %(py6)srL   N)r-   r   r	   UNRESOLVED_REVIEW_THREADrY   rZ   r\   r]   r^   r[   r_   r`   )pr61rP   r   rt   rs   @py_format5rq   s          r   3test_classify_unresolved_review_thread_pr61_fixturer      s     %5!5!5!5!5!
 %%y1D $dW[
\C$T3/F";;;6;;;;;6;;;;;;;6;;;6;;;;;;];;;];;;;;;;;;;;r!   c                 H   ddg dddid} t        dddd	      }t        | |      }t        j                  }||k(  }|st	        j
                  d
|fd||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t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}y)uo   (6) 합성 fixture (capability.requires_approval=True, reviewDecision='REVIEW_REQUIRED') → REQUIRED_APPROVAL.d   r   REVIEW_REQUIREDr   r   r   TF)r'   r(   r*   r)   rI   z9%(py0)s == %(py4)s
{%(py4)s = %(py2)s.REQUIRED_APPROVAL
}r   r	   r   r   rL   N)r-   r   r	   REQUIRED_APPROVALrY   rZ   r\   r]   r^   r[   r_   r`   prrP   r   rt   rs   r   rq   s          r   test_classify_required_approvalr      s     %+%y1B %W[pt
uC$R-F"4446444446444444464446444444]444]44444444444r!   c                 H   ddg dddid} t        dddd	      }t        | |      }t        j                  }||k(  }|st	        j
                  d
|fd||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t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}y)u>   (7) PR #67 fixture (mergeStateStatus='BEHIND') → STALE_BASE.C   BEHINDr   r   r   r   FTr(   r'   r*   r)   rI   z2%(py0)s == %(py4)s
{%(py4)s = %(py2)s.STALE_BASE
}r   r	   r   r   rL   N)r-   r   r	   
STALE_BASErY   rZ   r\   r]   r^   r[   r_   r`   )pr67rP   r   rt   rs   r   rq   s          r   %test_classify_stale_base_pr67_fixturer      s     $$%y1D %5X\qu
vC$T3/F"---6-----6-------6---6------]---]-----------r!   c                 H   ddg dddid} t        dddd	      }t        | |      }t        j                  }||k(  }|st	        j
                  d
|fd||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t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}y)uD   (8) 합성 (statusCheckRollup state='PENDING') → MISSING_CI_CHECK.   r   r   r   PENDINGr   FTr   rI   )z8%(py0)s == %(py4)s
{%(py4)s = %(py2)s.MISSING_CI_CHECK
}r   r	   r   r   rL   N)r-   r   r	   MISSING_CI_CHECKrY   rZ   r\   r]   r^   r[   r_   r`   r   s          r   test_classify_missing_ci_checkr     s     %$%y1B #(	C %R-F"3336333336333333363336333333]333]33333333333r!   c                 H   ddg dddid} t        dddd	      }t        | |      }t        j                  }||k(  }|st	        j
                  d
|fd||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t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}y)u   (9) 합성 (mergeStateStatus='BLOCKED', capability에 추가 차단요소 없음, bot_can_merge=True, auto_merge_enabled=True) → BRANCH_PROTECTION.i,  r   r   r   r   r   FTr   rI   z9%(py0)s == %(py4)s
{%(py4)s = %(py2)s.BRANCH_PROTECTION
}r   r	   r   r   rL   N)r-   r   r	   BRANCH_PROTECTIONrY   rZ   r\   r]   r^   r[   r_   r`   r   s          r   test_classify_branch_protectionr     s     %$%y1B #(	C %R-F"4446444446444444464446444444]444]44444444444r!   c                 H   ddg dddid} t        dddd	      }t        | |      }t        j                  }||k(  }|st	        j
                  d
|fd||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t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}y)uB   (10) 합성 (capability.bot_can_merge=False) → PERMISSION_ISSUE.i  r   r   r   r   r   FTr   rI   z8%(py0)s == %(py4)s
{%(py4)s = %(py2)s.PERMISSION_ISSUE
}r   r	   r   r   rL   N)r-   r   r	   PERMISSION_ISSUErY   rZ   r\   r]   r^   r[   r_   r`   r   s          r   test_classify_permission_issuer   )  s     %$%y1B #(	C %R-F"3336333336333333363336333333]333]33333333333r!   c                 H   ddg dddid} t        dddd	      }t        | |      }t        j                  }||k(  }|st	        j
                  d
|fd||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t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}y)ua   (11) 합성 (capability.auto_merge_enabled=False, bot_can_merge=True) → AUTO_MERGE_UNSUPPORTED.i  r   r   r   r   r   FTr   rI   )z>%(py0)s == %(py4)s
{%(py4)s = %(py2)s.AUTO_MERGE_UNSUPPORTED
}r   r	   r   r   rL   N)r-   r   r	   AUTO_MERGE_UNSUPPORTEDrY   rZ   r\   r]   r^   r[   r_   r`   r   s          r   $test_classify_auto_merge_unsupportedr   <  s     %$%y1B #( 	C %R-F"9996999996999999969996999999]999]999999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(  }|st	        j
                  d|fd||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t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}t        | ||      }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dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }t        t	        j                  |            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}}|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}||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#   }t%        |      }|sd$d#t        j                         v st	        j                  t$              rt	        j                  t$              nd#t	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}}ddg d%ddid}t        d	d	d	&      }t        ||      }t        j&                  }||k(  }|st	        j
                  d|fd'||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t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}t        |||      }|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  }	t	        j*                  d,      d-z   d|	iz  }
t        t	        j                  |
            dx}x}}ddg dddid}t        ddd	d	.      }t        ||      }t        j,                  }||k(  }|st	        j
                  d|fd/||f      d0t        j                         v st	        j                  |      rt	        j                  |      nd0d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}}t        |||      }|j.                  }d	}||u }|st	        j
                  d)|fd1||f      d2t        j                         v st	        j                  |      rt	        j                  |      nd2t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            dx}x}}ddg dddid}t        dd	3      }t        ||      }t        j0                  }||k(  }|st	        j
                  d|fd4||f      d5t        j                         v st	        j                  |      rt	        j                  |      nd5d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}}t        |||      }|j.                  }d	}||u }|st	        j
                  d)|fd1||f      d6t        j                         v st	        j                  |      rt	        j                  |      nd6t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            dx}x}}t3        j4                  t6              5  t9        g d7       ddd       t9        g d8       y# 1 sw Y   xY w)9u  (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
    r   r   r   Fr   r   r   r   Tr   rI   r   blockedr	   r   r   rL   Nz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceplanr
   )rK   rD   rR   r   auto_gemini_triagez.%(py2)s
{%(py2)s = %(py0)s.action
} == %(py5)srQ   rS   rT   zauto_gemini_triage.triage_pr)z3%(py2)s
{%(py2)s = %(py0)s.triage_hook
} == %(py5)shook)z%(py1)s == %(py4)s)rD   r   	pr_numbercallablez,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}r   )r'   r*   r)   r   blocked_reqrN   z6%(py2)s
{%(py2)s = %(py0)s.requires_chair
} is %(py5)splan_requ7   REQUIRED_APPROVAL: 회장 직접 머지 fallback 없음z
>assert %(py7)sr   r   
blocked_bpz6%(py2)s
{%(py2)s = %(py0)s.capability_gap
} is %(py5)splan_bp)r*   r)   r   
blocked_piplan_pi)ghr   mergez--admin)r   r   r   z--squash)r-   r   r	   r   rY   rZ   r\   r]   r^   r[   r_   r`   r   r   r
   actiontriage_hookr   r   r   requires_chair_format_assertmsgr   capability_gapr   pytestraisesRuntimeErrorr   )r   rP   r   rt   rs   r   rq   r   rp   rn   ru   r   rk   rl   pr_reqcap_reqr   r   pr_bpcap_bpr   r   pr_picap_pir   r   s                             r   %test_pr61_replay_unresolved_to_triager   T  sm    %5!5!5!5!5!
 %%y1D $dW[
\C%dC0G#<<<7<<<<<7<<<<<<<7<<<7<<<<<<m<<<m<<<<<<<<<<<T30DdM********:***:******d***d******M***M**********;;...;.....;.......4...4...;...........===============4===4============== b!D<999<99999<9999<99999999999"""""""""""""""""""$%8$%%%%%%%%8%%%8%%%$%%%%%%%%%% %+%y1F TRVWG)&':K'999;99999;9999999;999;999999-999-99999999999 +>H""fef"e+fff"effffff8fff8fff"fffefff-ffffffff %$%y1E Ue[_txyF(7J&888:88888:8888888:888:88888888888888888888vz:G!!)T)!T))))!T))))))7)))7)))!)))T))))))) %$%y1E $?F(7J&777:77777:7777777:777:77777777777777777777vz:G!!)T)!T))))!T))))))7)))7)))!)))T))))))) 
|	$ C !ABC >?	C Cs   2ooc                    ddg dddid} t        dddd	      }t        | |      }t        j                  }||k(  }|st	        j
                  d
|fd||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t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}t        | ||      }|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}}|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}}|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}}d}|j                  }|j                  } |       }||v}|st	        j
                  d|fd||f      t	        j                  |      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}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}}d%}|j                  }|j                   } |       }||v}|st	        j
                  d|fd&||f      t	        j                  |      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}x}}d'}|j                  }|j                  } |       }||v}|st	        j
                  d|fd||f      t	        j                  |      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}x}}y)(u   (13) PR #67 replay → STALE_BASE → MergePathPlan(action='base_sync', base_sync_command='git merge origin/main'). force push 명령 미포함 검증.r   r   r   r   r   r   FTr   rI   r   r   r	   r   r   rL   N	base_syncr   r   rQ   rS   rT   zgit merge origin/main)z9%(py2)s
{%(py2)s = %(py0)s.base_sync_command
} == %(py5)s)is not)z=%(py2)s
{%(py2)s = %(py0)s.base_sync_command
} is not %(py5)sforce)not in)zo%(py1)s not in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.base_sync_command
}.lower
}()
})rD   rE   rG   rT   py9zassert %(py11)spy11z--force)z=%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.base_sync_command
})rD   rE   rG   z-f)zo%(py1)s not in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.base_sync_command
}.split
}()
}push)r-   r   r	   r   rY   rZ   r\   r]   r^   r[   r_   r`   r   r   base_sync_commandlowersplit)r   rP   r   rt   rs   r   rq   r   rp   rn   ru   rk   @py_assert6@py_assert8rl   @py_format10@py_format12s                    r   #test_pr67_replay_stale_to_base_syncr     sw    $$%y1D %5X\qu
vC%dC0G#...7.....7.......7...7......m...m...........T30D;;%+%;+%%%%;+%%%%%%4%%%4%%%;%%%+%%%%%%%!!<%<<!%<<<<<!%<<<<<<<4<<<4<<<!<<<%<<<<<<<< !!--!----!------4---4---!----------8$0080668688788888788887888888$888$88808886888888888882D222922222922229222222D222D222222222225t--5-335355455555455554555555t555t555-5553555555555557//7/557577677777677776777777777777/7775777777777777r!   c                 b   ddg dddid} t        dddddd	      }t        | |      }d
}||u }|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}}t        | ||      }|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}	}|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
)u   (14) PR #68 fixture (task-2517 정상 머지 capability — 모든 필드 충족) → classify=None → MergePathPlan(action='squash_merge', capability_gap=False).D   CLEANr   r   r   r   TFr%   NrN   )z%(py0)s is %(py3)sr   )rK   rE   rF   rG   squash_mergerI   r   r   rQ   rS   rT   r   r   )r-   r   rY   rZ   r\   r]   r^   r[   r_   r`   r   r   r   r   )pr68rP   r   rl   rs   rm   rn   r   rp   rt   ru   s              r   $test_pr68_replay_normal_squash_merger     s    #$%y1D #( %C &dC0G7d?7d77dT30D;;(.(;.((((;.((((((4(((4(((;(((.((((((('%'%''''%''''''4'''4''''''%''''''''%'%''''%''''''4'''4''''''%'''''''r!   )r   r   )r&   boolr'   r   r(   r   r)   r   r*   r   r+   r   r"   r   )r"   None)3__doc__
__future__r   builtinsr\   _pytest.assertion.rewrite	assertionrewriterY   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-   rv   r|   r~   r   r   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!   