
    Pi)                       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Z ee      j#                         j$                  j$                  Zedz  dz  Ze
j*                  j-                  de      Zg ZeZerej4                  ZeZesdd	d
 ej8                         v s ej:                  e      r ej<                  e      nd
iz  ZejA                  e       er`dd
 ej8                         v s ej:                  e      r ej<                  e      nd
 ej<                  e      dz  Z!ejA                  e!        ejD                  ed      i z  Z# ejH                  d      dz   de#iz  Z% e& ejN                  e%            dxZxZZe
j*                  jQ                  e      Z)e)ejT                  d<   ej4                  jW                  e)       d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d Z8d Z9d Z:d Z; ejx                  d !      d.d"       Z=d# Z>d$ Z?d% Z@d& ZAd' ZBd( ZCd) ZDd* ZEd+ ZFd, ZGd- ZHy)/u  task-2450 — Multi-Repo Enforcement Phase A1 unit tests.

회장 절대 기준
--------------
- "task.md 수정 금지. 중간 정정 = 100% 무효."
- "taskctl을 거치지 않고는 main을 절대 변경할 수 없다 — 모든 회장 리포에서 동일하게."

본 테스트는 외부 GitHub 호출 없이 순수 단위 검증만 수행합니다.
실제 PR 생성/ruleset 등록은 `python3 scripts/multi_repo_enforcement_setup.py
--create-prs` / `--register-rulesets` 로 수동 실행됩니다.
    )annotationsN)Pathscriptsmulti_repo_enforcement_setup.pymulti_repo_enforcement_setupz%(py2)spy2_specz#%(py6)s
{%(py6)s = %(py4)s.loader
})py4py6z-spec for multi_repo_enforcement_setup missingz
>assert %(py9)spy9c                    t         j                  } 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                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}}y	)
u1   ruleset 8 required checks (회장 절대 기준).   ==)zU%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.REQUIRED_CHECKS
})
} == %(py8)slensetuppy0py1py3py5py8assert %(py10)spy10N)r   REQUIRED_CHECKSr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation@py_assert2@py_assert4@py_assert7@py_assert6@py_format9@py_format11s         8/home/jay/workspace/tests/test_multi_repo_enforcement.py#test_required_checks_count_is_eightr,   #   s    $$*3$%**%****%******3***3******u***u***$***%**********    c                    h d} t         j                  }t        |      }|| 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                  t               rt        j                  t               ndt        j                  |      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}x}}y
)u&   dev_workspace ruleset 15896715 정합.>   ci/guardqc-checklock-in-checkhidden-path-auditcancel-kill-switchgemini-review-gatemerge-safety-checkguardr   )zU%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.REQUIRED_CHECKS
})
} == %(py7)ssetr   expected)r   r   r   r   py7assert %(py9)sr   N)r   r   r7   r   r   r   r   r    r!   r"   r#   )r8   r%   r&   r(   @py_format8@py_format10s         r+   9test_required_checks_match_dev_workspace_ruleset_15896715r=   (   s    	H $$13$%1%1111%11111131113111111u111u111$111%1111111111111111r-   c                    t         j                  } 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                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}}y	)
u$   7개 회장 리포 정확히 등록.   r   )zK%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.REPOS
})
} == %(py8)sr   r   r   r   r   N)r   REPOSr   r   r   r   r   r    r!   r"   r#   r$   s         r+   test_repos_count_is_sevenrA   :   s    {{ 3{ q q    q      3   3      u   u   {      q       r-   c            
        t         j                  D  cg c]  } | j                   }} t        |      }||k(  }|s#t	        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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}}d}d	}t        ||      }t        |      }||k(  }|sgt	        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dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            d x}x}x}x}}y c c} w )Nr   )z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}
prioritiessorted)r   r   r   r   assert %(py7)sr9      r   )zY%(py0)s == %(py11)s
{%(py11)s = %(py2)s(%(py9)s
{%(py9)s = %(py3)s(%(py5)s, %(py7)s)
})
}listrange)r   r   r   r   r9   r   py11zassert %(py13)spy13)r   r@   priorityrD   r   r   r   r   r    r!   r"   r#   rH   rG   )rrC   r&   @py_assert1@py_format6r;   r(   @py_assert8@py_assert10@py_format12@py_format14s              r+   +test_repos_priorities_unique_and_sequentialrS   ?   s   &+kk2!**2J2
++:+++++:+++++++:+++:+++++++++++++++
+++
+++++++++++$%*q*eAqk*k**:*****:*******:***:***************e***e***A***q***k************ 3s   K7c                    t        d 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}}y	)
uF   회장 명시: InsuRo 우선순위 1번 (사이트 사고 발생 중).c              3  @   K   | ]  }|j                   d k(  s|  ywInsuRoNname.0rL   s     r+   	<genexpr>z,test_insuro_is_priority_1.<locals>.<genexpr>G        ?AFFh,>!?   rF   r   )z0%(py2)s
{%(py2)s = %(py0)s.priority
} == %(py5)sinsuror   r   r   rE   r9   N)nextr   r@   rK   r   r   r   r   r    r!   r"   r#   r_   rM   r&   @py_assert3rN   r;   s         r+   test_insuro_is_priority_1rd   E   s    ?U[[??F??a?a?a66?ar-   c                    t        d 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}}y	)
u1   InsuRo 기존 ci.yml 보호 — 별도 파일명.c              3  @   K   | ]  }|j                   d k(  s|  ywrV   rX   rZ   s     r+   r\   z7test_insuro_uses_taskctl_ci_filename.<locals>.<genexpr>M   r]   r^   ztaskctl-ci.ymlr   z9%(py2)s
{%(py2)s = %(py0)s.workflow_filename
} == %(py5)sr_   r`   rE   r9   N)ra   r   r@   workflow_filenamer   r   r   r   r    r!   r"   r#   rb   s         r+   $test_insuro_uses_taskctl_ci_filenameri   K   s    ?U[[??F##7'77#'77777#'777777767776777#777'77777777r-   c                    t         j                  D ]  } | j                  dk(  r| 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                  | j                        dz   d|iz  }t        t	        j                  |            d	x}x}} y	)
u(   InsuRo 외 6개 리포는 신규 ci.yml.rW   zci.ymlr   rg   repor`   z
>assert %(py7)sr9   N)r   r@   rY   rh   r   r   r   r   r    r!   _format_assertmsgr"   r#   )rk   rM   r&   rc   rN   r;   s         r+   $test_other_repos_use_ci_yml_filenamerm   Q   s     =99 %%<<%1<<<%<<<<<<t<<<t<<<%<<<<<<499<<<<<<<=r-   c                    t        d 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}}y	)
u   empty repo bootstrap 플래그.c              3  @   K   | ]  }|j                   d k(  s|  yw)my-asset-managerNrX   rZ   s     r+   r\   z=test_my_asset_manager_needs_initial_commit.<locals>.<genexpr>[   s     IAFF6H,H!Ir^   Tis)z<%(py2)s
{%(py2)s = %(py0)s.needs_initial_commit
} is %(py5)stargetr`   rE   r9   N)ra   r   r@   needs_initial_commitr   r   r   r   r    r!   r"   r#   )rs   rM   r&   rc   rN   r;   s         r+   *test_my_asset_manager_needs_initial_commitru   Y   s    IU[[IIF&&.$.&$....&$......6...6...&...$.......r-   c                    t         j                  D  cg c]  } | j                  s|  }} |D  cg c]  } | j                   }} dg}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}y c c} w c c} w )Nrp   r   z%(py1)s == %(py4)sr   r
   assert %(py6)sr   )	r   r@   rt   rY   r   r   r!   r"   r#   )rL   
bootstraps@py_assert0rc   r%   @py_format5@py_format7s          r+   /test_only_my_asset_manager_needs_initial_commitr~   _   s    "[[CA,B,B!CJC&'qAFF'?',>+??'+?????'+????'???+???????? D's   CCCc                 ,   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}}y )NrY   zmain-protectionr   rw   rx   ry   r   r   build_ruleset_payloadr   r   r!   r"   r#   payloadr{   rc   r%   r|   r}   s         r+   /test_ruleset_payload_name_matches_dev_workspacer   g   sb    ))+G6?///?/////?////?///////////r-   c                 ,   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}}y )Nenforcementactiver   rw   rx   ry   r   r   r   s         r+   'test_ruleset_payload_enforcement_activer   l   sb    ))+G=!-X-!X----!X---!---X-------r-   c                 ,   t         j                         } | d   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u9   admin bypass 절대 등록 금지 (회장 직접 명시).bypass_actorsr   rw   rx   ry   r   Nr   r   s         r+   (test_ruleset_payload_bypass_actors_emptyr   q   sb    ))+G?#)r)#r))))#r)))#)))r)))))))r-   c                 :   t         j                         } | d   d   d   }dg}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}y
)u   main / master 자동 매칭.
conditionsref_nameincludez~DEFAULT_BRANCHr   rw   rx   ry   r   Nr   r   s         r+   +test_ruleset_payload_targets_default_branchr   w   ss    ))+G< ,Y7N<M;NN7;NNNNN7;NNNN7NNN;NNNNNNNNr-   c                 `   t         j                         } t        d | d   D              }|d   d   D ch c]  }|d   	 }}t         j                  }t	        |      }||k(  }|s?t        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	d
t        j                         v st        j                  t               rt        j                  t               nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y c c}w )Nc              3  2   K   | ]  }|d    dk(  s|  ywtyperequired_status_checksN rZ   s     r+   r\   zGtest_ruleset_payload_includes_required_status_checks.<locals>.<genexpr>        Uaqy<T/TU   rules
parametersr   contextr   )zU%(py0)s == %(py7)s
{%(py7)s = %(py2)s(%(py5)s
{%(py5)s = %(py3)s.REQUIRED_CHECKS
})
}contextsr7   r   )r   r   r   r   r9   r:   r   )r   r   ra   r   r7   r   r   r   r   r    r!   r"   r#   )	r   rulecr   r&   r(   rM   r;   r<   s	            r+   4test_ruleset_payload_includes_required_status_checksr   }   s   ))+GU77+UUD&*<&89Q&RS)SHS 001s0118111118111111181118111111s111s11111151115111011111111111 Ts   F+c                    t         j                         } | d   D ch c]  }|d   	 }}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}}y c c}w )Nr   r   non_fast_forwardinz%(py1)s in %(py3)stypes_r   r   assert %(py5)sr   deletion)
r   r   r   r   r!   r   r   r    r"   r#   )r   rL   r   r{   r%   @py_format4rN   s          r+   ;test_ruleset_payload_includes_non_fast_forward_and_deletionr      s    ))+G!(!12Aai2F2''''''''''''''''''''''''::: 3s   E5c                 Z   t         j                         } t        d | 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}}y )Nc              3  2   K   | ]  }|d    dk(  s|  ywr   r   rZ   s     r+   r\   zLtest_ruleset_payload_strict_required_status_checks_policy.<locals>.<genexpr>   r   r   r   r   $strict_required_status_checks_policyTrq   z%(py1)s is %(py4)srx   ry   r   )r   r   ra   r   r   r!   r"   r#   )r   r   r{   rc   r%   r|   r}   s          r+   9test_ruleset_payload_strict_required_status_checks_policyr      s}    ))+GU77+UUDDEMMEMMMMEMMMEMMMMMMMMMMr-   module)scopec                     t        d      } | j                         st        j                  d       | j	                  d      S )Nz,/tmp/multi-repo-enforcement/templates/ci.ymlu9   workflow template 미배포 — task-2450 setup 미실행utf-8encoding)r   is_filepytestskip	read_text)paths    r+   workflow_template_textr      s4    >?D<<>OP>>7>++r-   c                b   t         j                  D ]  }g }d| }|| v }|}|sd| d}|| v }|}|snt        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  }	|j                  |	       |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  }|j                  |       t        j                  |d      i z  }t        j                  |      dz   d|iz  }t        t        j                  |            dx}x}x}x}x}} y)uA   ruleset의 8 required checks 이름이 workflow에 모두 존재.zname: zname: ""r   )z%(py3)s in %(py5)sr   )r   r   z%(py7)sr9   )z%(py10)s in %(py12)s)r   py12z%(py14)spy14rF   z
>assert %(py17)spy17N)r   r   r   r   r!   r   r   r    append_format_booloprl   r"   r#   )r   ctxrM   r%   r&   r{   @py_assert9@py_assert11rN   r;   @py_format13@py_format15@py_format16@py_format18s                 r+   ,test_workflow_template_has_all_8_check_namesr      s   $$ kju~j~!77jWSE;Kj;KOe;ejjjj~!7jjj~jjjjjj!7jjj!7jjjjjjj;KOejjj;KjjjjjjOejjjOejjjjjjjjjjgjjjjjjjjjkr-   c                N   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}}y )Nzbranches: [main, master]r   r   r   r   r   r   )r   r   r!   r   r   r    r"   r#   )r   r{   r%   r   rN   s        r+   -test_workflow_template_targets_main_or_masterr      sb    %?%)?????%)????%??????)????)????????r-   c                    t        d      } | j                  } |       }|st        j                  d      dz   dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )N=/tmp/multi-repo-enforcement/templates/qc_report_guard_stub.pyu   qc stub template 미배포zD
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_file
}()
}r   )r   r   r
   )
r   r   r   rl   r   r   r    r!   r"   r#   )r   rM   rc   r|   s       r+   test_qc_stub_template_existsr      sp    OPD<<7<>7>77777777747774777<777>777777r-   c                   t        d      }|j                         st        j                  d       ddl}|j                  t        j                  t        |      dt        |       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%        j&                  |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}}y)u+   task-id 없으면 graceful skip → exit 0.r      qc stub 미배포r   N--workspaceTcapture_outputtextr   z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sresultr`   rE   r9   r   rw   rx   ry   r   reasonz
no-task-idr   r   r   r   
subprocessrunsys
executablestr
returncoder   r   r   r   r    r!   r"   r#   jsonloadsstdout)tmp_pathmonkeypatchstubr   r   rM   r&   rc   rN   r;   r   r{   r%   r|   r}   s                  r+   test_qc_stub_default_skipr      s   OPD<<>'(^^	TM3x=A  F
 !!!!!!!!!!!!6!!!6!!!!!!!!!!!!!jj'G8&&&&&&&&&&&&&&&&&&&8,,,,,,,,,,,,,,,,,,,r-   c           
        t        d      }|j                         st        j                  d       dd l}|j                  t        j                  t        |      dddt        |       d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%        j&                  |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}}y )Nr   r   r   	--task-idz	task-testr   z--strictTr   rF   r   r   r   r`   rE   r9   failrw   rx   ry   r   r   )r   r   r   r   rM   r&   rc   rN   r;   r   r{   r%   r|   r}   s                 r+   5test_qc_stub_strict_mode_fails_when_qc_result_missingr      s?   OPD<<>'(^^NNIM	
   F !!!!!!!!!!!!6!!!6!!!!!!!!!!!!!jj'G8&&&&&&&&&&&&&&&&&&&r-   c           
        t        d      }|j                         st        j                  d       | dz  dz  }|j	                  dd       |dz  j                  dd	
       dd l}|j                  t        j                  t        |      dddt        |       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)        j*                  |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}}y )Nr   r   memoryeventsTparentsexist_oktask-2450.qc-resultzPASS
r   r   r   r   	task-2450r   r   r   r   r   r`   rE   r9   passrw   rx   ry   r   r   r   r   r   mkdir
write_textr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r   r   r   r   r   r   r   r   rM   r&   rc   rN   r;   r   r{   r%   r|   r}   s                  r+   #test_qc_stub_pass_when_qc_result_okr      st   OPD<<>'( 8+F
LLL-##//7/K^^NNIM	
   F !!!!!!!!!!!!6!!!6!!!!!!!!!!!!!jj'G8&&&&&&&&&&&&&&&&&&&r-   c           
        t        d      }|j                         st        j                  d       | dz  dz  }|j	                  dd       |dz  j                  dd	
       dd l}|j                  t        j                  t        |      dddt        |       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)        j*                  |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}}y )Nr   r   r   r   Tr   r   z FAIL: forbidden_paths violation
r   r   r   r   r   r   r   rF   r   r   r   r`   rE   r9   r   rw   rx   ry   r   r   r   s                  r+   1test_qc_stub_fail_when_qc_result_starts_with_FAILr      sv   OPD<<>'( 8+F
LLL-##//0S^e/f^^NNIM	
   F !!!!!!!!!!!!6!!!6!!!!!!!!!!!!!jj'G8&&&&&&&&&&&&&&&&&&&r-   c                 @   t        t              j                         j                  j                  dz  dz  } | j	                  d      }d}|D ]M  }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}}P y)uO   dev_workspace .github/workflows/{ci,auto-merge,guard}.yml 절대 수정 금지.r   r   r   r   )z.github/workflows/ci.ymlz .github/workflows/auto-merge.ymlz.github/workflows/guard.ymlzREPO_ROOT / '.githubnot in)z%(py1)s not in %(py3)sr   r   r   r   NzREPO_ROOT / ".github)r   __file__resolveparentr   r   r   r!   r   r   r    r"   r#   )srcr   	forbiddenpath_strr{   r%   r   rN   s           r+   1test_setup_does_not_touch_dev_workspace_workflowsr    s   
x.
 
 
"
)
)
0
09
<?`
`C=='=*DI  3 &2&d2222&d222&222222d222d2222222%2&d2222&d222&222222d222d2222222	3r-   c                    t         j                  } d}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            dx} x}}d	}t         j                  g}||v}|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u_   dev_workspace ruleset id 15896715 회귀 보호 — 본 스크립트는 외부 OWNER만 다룸.JonghyukJeonr   )z-%(py2)s
{%(py2)s = %(py0)s.OWNER
} == %(py5)sr   r`   rE   r9   NzJeon-Jonghyukr   )z%(py1)s not in %(py4)srx   ry   r   )
r   OWNERr   r   r   r   r    r!   r"   r#   )	rM   r&   rc   rN   r;   r{   r%   r|   r}   s	            r+   3test_setup_constants_immutable_for_dev_workspace_idr  !  s    ;;(.(;.((((;.((((((5(((5(((;(((.(((((((/5;;-/?-////?-///?///-///////r-   c                 R   t         j                  } d}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}}d}t         j                  }||v }|st        j                  d|fd	||f      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 )Nr   r   )z/%(py2)s
{%(py2)s = %(py0)s.TASK_ID
} == %(py5)sr   r`   rE   r9   r   )z3%(py1)s in %(py5)s
{%(py5)s = %(py3)s.BRANCH_NAME
}r   r   r   )r   TASK_IDr   r   r   r   r    r!   r"   r#   BRANCH_NAME)rM   r&   rc   rN   r;   r{   r%   s          r+   'test_setup_branch_name_includes_task_idr  '  s    =='K'=K''''=K''''''5'''5'''='''K'''''''+%+++;+++++;++++;++++++%+++%+++++++++++r-   c                t   t         j                  d   }| j                  t         dd        | j                  t         dd        | j                  t         dd        t         j                  |      }|d   }|j                  }||k(  }|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   }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}||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}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}y)u7   verify_acceptance 가 합격조건 A/B/C 키를 반환.r   workflow_presentc                     yNTr   rL   s    r+   <lambda>z-test_verify_acceptance_keys.<locals>.<lambda>3      r-   qc_stub_presentc                     yr  r   r  s    r+   r  z-test_verify_acceptance_keys.<locals>.<lambda>4  r  r-   fetch_ruleset_summaryc                    dddS )Nzblocked-pro403)statusmessager   r  s    r+   r  z-test_verify_acceptance_keys.<locals>.<lambda>8  s    ]u= r-   rk   r   )z,%(py1)s == %(py5)s
{%(py5)s = %(py3)s.name
}r
  rE   r9   NA_workflow_presentTrq   r   rx   ry   r   B_ruleset_activeFC_8_checks_present)r   r@   setattrverify_acceptancerY   r   r   r!   r   r   r    r"   r#   )r   rk   summaryr{   r&   r%   rN   r;   rc   r|   r}   s              r+   test_verify_acceptance_keysr"  /  s   ;;q>D1>B0.A= %%d+G6?'dii'?i''''?i'''?''''''d'''d'''i''''''''(0D0(D0000(D000(000D0000000%&/%/&%////&%///&///%///////'(1E1(E1111(E111(111E1111111r-   )returnr   )I__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   importlib.util	importlibr   r   pathlibr   r   r   r   r   	REPO_ROOT_SETUP_PATHutilspec_from_file_locationr	   rM   r{   loader@py_assert5r   r    r!   @py_format3r   r}   r   r;   rl   r<   r"   r#   module_from_specr   modulesexec_moduler,   r=   rA   rS   rd   ri   rm   ru   r~   r   r   r   r   r   r   r   fixturer   r   r   r   r   r   r   r   r  r  r  r"  r   r-   r+   <module>r8     s  
 #      
  N""$++22	)#&GG.."K	 Ou Nu N N N N N Nu N N Nu N N N Nu 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''..3* +    +
2$!
+ 8=/@0
.
*O2 N h,  ,k@8
-&'0'4':3"0,2r-   