
    jG                    J   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mZ ddlZ ee      j)                         j*                  d   Z ee      e
j0                  vr"e
j0                  j3                  d ee             ddlmZmZmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z% dd	l&m'Z' dd
l(m)Z) dZ*dZ+dZ,dZ-dZ.dZ/dZ0e.e*ddddddde/dd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d&dZ1d'd(dZ2e0fd)dZ3de0d	 	 	 	 	 	 	 d*dZ4d Z5d Z6d Z7d  Z8d! Z9d" Z:d# Z;d$ Z<d% Z=y)+u  anu_v2.tests.test_owner_trigger_http_post_wiring_2699 — 검증 8 시나리오 (task-2699).

아르고스(QA 테스터) 작성. 불칸 구현:
  - anu_v2/owner_trigger_http_post.py  (make_owner_trigger_token_provider, make_production_http_post)
  - anu_v2/owner_trigger_entry.py      (build_runner, run_single, build_scheduler, run_scheduler_cycle)

★ 실제 OWNER PAT 로 live POST 절대 금지 — mock/dry-run/주입 callable 만 사용.
    )annotationsN)Path)Callable   )GITHUB_API_BASEOwnerTriggerHttpError!make_owner_trigger_token_providermake_production_http_post)COMMENT_BODYTOKEN_ENV_NAMEForbiddenEndpointErrorOwnerTriggerOnlyTokenBoundaryViolationinvoke_from_scheduler)OwnerTriggerAudit)owner_trigger_entry(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbzJeon-Jonghyukdev_workspace*   z	task-2699(ghp_TESTONLY_ARGOS_MUST_NOT_LEAK_2699abcTF"POST_GEMINI_REVIEW_TRIGGER_COMMENT/gemini reviewzdecision.json)prhead
queue_headcurrent_head_confirmedgemini_evidence_freshnudge_count_for_pr_headallowed_actioncomment_bodyallowedtask_idfilenamec               x    d|
|||||||||	d}| |z  }|j                  t        j                  |      d       |S )uM   유효 decision JSON v1 파일 생성 (validate_decision PASS 조건 충족).z anu_v2.owner_trigger_decision.v1)schemar#   r   current_headr   r   r   r   r    r!   r"   utf-8encoding)
write_textjsondumps)tmp_pathr   r   r   r   r   r   r    r!   r"   r#   r$   decisionpaths                 W/home/jay/workspace/scripts/../anu_v2/tests/test_owner_trigger_http_post_wiring_2699.py_write_decisionr2   7   sV    " 5 "8!6#:($H hDOODJJx(7O;K    c                       g  d fd} |fS )u7   호출 기록 mock http_post. (posts, callable) 반환.c                :    j                  | |||d       dddS )Nmethodr0   bodyheaders   i'  )statusid)append)r7   r0   r8   r9   postss       r1   	http_postz'_make_mock_http_post.<locals>.http_post^   s#    dwWXT**r3   )
r7   strr0   r@   r8   dictr9   rA   returnrA    )r>   r?   s   ` r1   _make_mock_http_postrD   Y   s    }+ )r3   c                     d fd}|S )Nc                      S NrC   )tokens   r1   	_providerz-_make_fixed_token_provider.<locals>._providerf   s    r3   )rB   r@   rC   )rH   rI   s   ` r1   _make_fixed_token_providerrJ   e   s    r3   )r>   rH   c               v    |g }t        |      \  }}t        |       }t        | |t        |      |      }||fS )uU   OwnerTriggerOnly + posts 리스트 반환 (기존 테스트 패턴 동일 스타일).workspace_rootrM   r?   token_provideraudit)rD   r   r   rJ   )r.   r>   rH   _r?   rP   runners          r1   _build_runnerrS   k   sM     }'.LAyX6E1%8	F 5=r3   c                   t        |       }g }t        |      \  }}t        |       }t        | |t	               |      }|j                  |t        t        t              }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                  |      rt        j                  |      ndt        j                  |      t        j                  |	      d	z  }t        j                   d
t        |             dz   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i}||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         dt         dt&         d}|d   }||k(  }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                   d|d         d z   d!|iz  }t#        t        j$                  |            d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*                  }|t&        k(  }|st        j                  d|fd(|t&        f      d$t        j                         v st        j                  |      rt        j                  |      nd$t        j                  |      d)t        j                         v st        j                  t&              rt        j                  t&              nd)d*z  }dd|iz  }t#        t        j$                  |            dx}}|j,                  }|t        k(  }|st        j                  d|fd+|t        f      d$t        j                         v st        j                  |      rt        j                  |      nd$t        j                  |      d,t        j                         v st        j                  t              rt        j                  t              nd,d*z  }dd|iz  }t#        t        j$                  |            dx}}y)-uo   decision 8조건 충족 → mock http_post로 trigger → POST 정확히 1회, 인자 검증, status=="POSTED".rL   rN   decision_pathownerrepocurrent_head_actual   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr>   py0py1py3py6z!POST call count should be 1, got 
>assert %(py8)spy8Nr   r7   POSTz%(py1)s == %(py4)sra   py4assert %(py6)src   r8   r   z/repos///issues/	/commentsr0   )z%(py1)s == %(py3)sexpected_endpointra   rb   zendpoint mismatch: 
>assert %(py5)spy5POSTEDz.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sresultr`   py2rq   assert %(py7)spy7)z*%(py2)s
{%(py2)s = %(py0)s.pr
} == %(py4)s_PR)r`   rv   ri   )z,%(py2)s
{%(py2)s = %(py0)s.head
} == %(py4)s_HEAD_A)r2   rD   r   r   rJ   trigger_gemini_review_OWNER_REPOrz   r^   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationry   r;   r   r   )r.   rV   r>   rQ   r?   rP   rR   rt   @py_assert2@py_assert5@py_assert4@py_format7@py_format9call@py_assert0@py_assert3@py_format5rn   @py_format4@py_format6@py_assert1@py_format8s                         r1   test_mock_http_post_posts_oncer      s   #H-ME'.LAyX6E13	F ))##	 * F u:LL:?LLL:LLLLLL3LLL3LLLLLLuLLLuLLL:LLLLLL?E
|LLLLLLLL8D>#V#>V####>V###>###V#######<5F$455<55555<5555<55555555555!&5'#iH<T<,,TTT<,TTT<TTTTTT,TTT,TTTT0CDLCS.TTTTTTT ==$H$=H$$$$=H$$$$$$6$$$6$$$=$$$H$$$$$$$9999669;;!;'!!!!;'!!!!!!6!!!6!!!;!!!!!!'!!!'!!!!!!!r3   c                   d }|j                  t        j                  d|       t        d      } |ddddii       }|j                  }d	} ||      }d}||u }	|	st        j                  d
|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }
t        j                  d      dz   d|
iz  }t        t        j                  |            dx}x}x}x}	}|j                  }d} ||      }d}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }
t        j                  d|j	                  d             dz   d|
iz  }t        t        j                  |            dx}x}x}x}	}y)uV   make_production_http_post(dry_run=True) → dry_run dict, status==0, urlopen 호출 0.c                     t        d      )Nz*urlopen must NOT be called in dry_run moder   argskwargss     r1   _forbidden_urlopenz7test_dry_run_no_actual_post.<locals>._forbidden_urlopen   s    IJJr3   urlopenT)dry_runrf   /repos/o/r/issues/1/commentsr8   r   r   )is)zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} is %(py9)srt   )r`   rv   ri   rc   py9zdry_run flag should be Truez
>assert %(py11)spy11Nr;   r   r[   )zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)sz dry_run status should be 0, got )setattrurllibrequestr
   getr~   r   r   r   r   r   r   r   r   )r.   monkeypatchr   r?   rt   r   r   r   @py_assert8@py_assert7@py_format10@py_format12s               r1   test_dry_run_no_actual_postr      s   K 	3EF)$7I&	!"
	F ::GiG:i GDG D(GGG DGGGGGG6GGG6GGG:GGGiGGG GGGDGGG*GGGGGGGG::_h_:h_1_1$___1______6___6___:___h______1___(HT\I]H^&________r3   c                   t        |       }g }t        | |      \  }}|j                  |t        t        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}}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                  |      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}}|j                  |t        t        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}}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                  |      rt        j                  |      ndt        j                  |
      t        j                  |      dz  }t        j                   dt        |             dz   d|iz  }t        t        j                  |            d
x}
x}}y
)u`   동일 (pr, head) decision 2회 trigger → 1회차 POSTED, 2회차 DEDUPED, mock POST 총 1회.)r>   rU   rr   r[   rs   r1ru   rw   rx   NrZ   r]   r^   r>   r_   z1st trigger: 1 POST expectedrd   re   DEDUPEDr2z32nd trigger must NOT call POST again, total calls: )r2   rS   r{   r|   r}   rz   r;   r~   r   r   r   r   r   r   r   r^   r   )r.   rV   r>   rR   r   r   r   r   r   r   r   r   r   r   r   s                  r1   'test_dedupe_same_pr_head_second_dedupedr      s   #H-ME!(%8MFE 
	%	%##	 
& 
B 99  9    9      2   2   9          u::::?::::::::::3:::3::::::u:::u:::::::::::::::::: 
	%	%##	 
& 
B 99!	!9	!!!!9	!!!!!!2!!!2!!!9!!!	!!!!!!!u:^^:?^^^:^^^^^^3^^^3^^^^^^u^^^u^^^:^^^^^^QRUV[R\Q]^^^^^^^^r3   c                (   d }|j                  t        j                  d|       t               }t	        j
                  t              5   |ddi i        ddd       t	        j
                  t              5   |ddi i        ddd       t	        j
                  t              5   |ddi i        ddd       t	        j
                  t              5   |d	di i        ddd       y# 1 sw Y   xY w# 1 sw Y   pxY w# 1 sw Y   OxY w# 1 sw Y   yxY w)
uc   make_production_http_post() callable에 merge/pulls endpoint/GET method → ForbiddenEndpointError.c                     t        d      )Nz:urlopen should NOT be reached after ForbiddenEndpointErrorr   r   s     r1   r   z:test_forbidden_endpoint_raises.<locals>._forbidden_urlopen   s    YZZr3   r   rf   z/repos/o/r/pulls/1/mergeNz/repos/o/r/pulls/1/reviewsGETr   DELETE)r   r   r   r
   pytestraisesr   )r.   r   r   r?   s       r1   test_forbidden_endpoint_raisesr      s   [ 	3EF)+I 
-	. >&4b"=> 
-	. @&6B?@ 
-	. A%7R@A 
-	. D(:BCD D> >@ @A AD Ds0   C$5C0"C<D$C-0C9<DDc                
   t        i       }t        j                  t              5   |        ddd       t        ddi      }t        j                  t              5   |        ddd       t        ddi      }t        j                  t              5   |        ddd       t	        |       }g }t        |      \  }}t        |       }t        | |||      }	t        j                  t              5  |	j                  |t        t        t        	       ddd       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"                  |      rt        j$                  |      ndt        j$                  |
      t        j$                  |      dz  }t        j&                  dt        |             dz   d|iz  }t)        t        j*                  |            dx}
x}}y# 1 sw Y   %xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   exY w)u   make_owner_trigger_token_provider(env={}) → TokenBoundaryViolation.
    OwnerTriggerOnly 에 주입 시 trigger → POST 0 (fail-closed).
    BOT_GITHUB_TOKEN 이 env 에 있어도 fallback 안 함.
    )envNBOT_GITHUB_TOKENxGH_TOKENyrL   rN   rU   r   r[   r]   r^   r>   r_   z4POST must not be called when token unavailable, got rd   re   )r	   r   r   r   r2   rD   r   r   r{   r|   r}   rz   r^   r~   r   r   r   r   r   r   r   r   )r.   provider_emptyprovider_bot_onlyprovider_gh_onlyrV   r>   rQ   r?   rP   rR   r   r   r   r   r   s                  r1   "test_token_unavailable_fail_closedr      s    72>N	-	.  :?QSV>WX	-	.  9j#=NO	-	.  $H-ME'.LAyX6E%	F 
-	. 
$$' '	 	% 	

 u:__:?___:______3___3______u___u___:______RSVW\S]R^________A 
 
 
 
s/   III+3"I8II(+I58Jc                   t         }g }d }t        |       }t        | |t        |      |      }t	        |       }d}	 |j                  |t        t        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  }t        j                   d
      dz   d|iz  }t#        t        j$                  |            dx}}
t'        |      }||v}|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                  |      rt        j                  |      nddz  }t        j                   d|      dz   d|iz  }t#        t        j$                  |            d}|j(                  j+                         r|j(                  j-                  d      }||v}|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                  |      rt        j                  |      nddz  }t        j                   d|dd       dz   d|iz  }t#        t        j$                  |            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  }t        j                   d      dz   d|iz  }t#        t        j$                  |            dx}}
d>d G fdd       }t/         |       !      }d}	  |d"d#d$d%id&d'| i       d}
||
u}|st        j                  d|fd||
f      d(t        j                         v st        j                  |      rt        j                  |      nd(t        j                  |
      d	z  }t        j                   d)      dz   d|iz  }t#        t        j$                  |            dx}}
t'        |      }||v}|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                  |      rt        j                  |      nd*dz  }t        j                   d+|      dz   d|iz  }t#        t        j$                  |            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  }t        j                   d,|      dz   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  }t        j                   d.|      dz   d|iz  }t#        t        j$                  |            dx}}
g }d/}
|
|v }|}|sd0}||v }|}|sqt        j                  d1|fd2|
|f      t        j                  |
      d*t        j                         v st        j                  |      rt        j                  |      nd*d3z  }d4d5|iz  }|j3                  |       |st        j                  d1fd6|f      t        j                  |      d*t        j                         v st        j                  |      rt        j                  |      nd*d7z  }d8d9|iz  }|j3                  |       t        j4                  |d:      i z  }t        j                   d;|      d<z   d=|iz  }t#        t        j$                  |            dx}x}x}
x}x}}y# t        $ r}	|	}Y d}	~	d}	~	ww xY w# t0        $ r}	|	}Y d}	~	d}	~	ww xY w)?u   mock http_post 예외 시 audit JSONL + 예외 메시지에 token raw value 0건.
    make_production_http_post 로 HTTPError → OwnerTriggerHttpError 메시지에 token/Auth/Bearer raw value 미포함.
    c                    t        d      )Nznetwork error (simulated))RuntimeErrorr6   s       r1   raising_http_postzAtest_no_token_leak_in_audit_and_errors.<locals>.raising_http_post0  s    677r3   rL   rN   NrU   )is not)z%(py0)s is not %(py3)s
raised_excr`   rb   z(Exception expected when http_post raisesrp   rq   )not in)z%(py0)s not in %(py2)s	raw_tokenexc_message)r`   rv   z#Token leaked in exception message: z
>assert %(py4)sri   r(   r)   audit_contentzToken leaked in audit JSONL:    MUST_NOT_LEAK)z%(py1)s not in %(py3)sro   z$Token sentinel leaked in audit JSONLc                ^    t         j                  j                  | j                  ddi d       )Ni  	Forbidden)urlcodemsghdrsfp)r   error	HTTPErrorfull_url)reqtimeouts     r1   _mock_opener_that_raiseszHtest_no_token_leak_in_audit_and_errors.<locals>._mock_opener_that_raises]  s1    ll$$ % 
 	
r3   c                      e Zd Zd fd	Zy);test_no_token_leak_in_audit_and_errors.<locals>._MockOpenerNc                     ||      S )N)r   rC   )selfr   r   r   s      r1   openz@test_no_token_leak_in_audit_and_errors.<locals>._MockOpener.openg  s    +CAAr3   rG   )__name__
__module____qualname__r   )r   s   r1   _MockOpenerr   f  s	    	Br3   r   )openerrf   r   r8   r   AuthorizationzBearer owner_trigger_http_errorz+OwnerTriggerHttpError expected on HTTPErrorhttp_err_msgz/Token leaked in OwnerTriggerHttpError message: z1'Authorization' leaked in OwnerTriggerHttpError: Bearerz*'Bearer' leaked in OwnerTriggerHttpError: 403zstatus=in)z%(py3)s in %(py5)s)rb   rq   z%(py7)srx   )z%(py10)s in %(py12)s)py10py12z%(py14)spy14rZ   z'Expected status code in error message: z
>assert %(py17)spy17rG   )_SECRET_TOKENr   r   rJ   r2   r{   r|   r}   rz   	Exceptionr~   r   r   r   r   r   r   r   r   r@   r0   exists	read_textr
   r   r=   _format_boolop) r.   r   r   exc_msg_containerr   rP   rR   rV   r   excr   r   r   r   r   @py_format3r   r   r   r   http_post_prodr   r   r   @py_assert9@py_assert11r   @py_format13@py_format15@py_format16@py_format18r   s                                   @r1   &test_no_token_leak_in_audit_and_errorsr   '  sp    I $&8 X6E#1)<	F $H-MJ$$' '	 	% 	
 "M:T!MMM:TMMMMMM:MMM:MMMTMMM#MMMMMMM j/KK'  9K                (    (    .k_=    
 zz

,,g,>- 	
 	
y 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
  !. 	
 	
 		 !. 	
 	
  ,M$3,?+BC	
 	
 	
 	
 	

  	
m3 	
 	
m 	
 	
 		  	
 	
	6	
 	
  '4 	
 	
 		 '4 	
 	
  3	
 	
 	
 	
 	


B B /kmDN#'*%&	{34		
 ,0^#4/^^^#4^^^^^^#^^^#^^^4^^^1^^^^^^^/0L L(  9L                )    )    :,9IJ      ?,.  ?,          #/    #/    <L;KL    
  8<'  8<          (    (    5\4DE    
5 5L  I I$=   5L          !    !     I    %.      2>    2>        2,1AB     M  
` ! '#& 's/   !c c6 	c3&c..c36	d?ddc           
        t        |       }g }t        |      \  }}t        j                  | |t        t
        t        |t                     }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d|      dz   d	|iz  }	t        t        j                   |	            d
x}}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                  |      rt        j                  |      ndt        j                  |      t        j                  |
      dz  }t        j                  dt#        |             dz   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i}||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$         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}}y
)!ue   owner_trigger_entry.run_single(…) — mock http_post + token_provider 주입 → POSTED, POST 1회.)rM   rV   rW   rX   rY   r?   rO   rr   r[   )z%(py0)s == %(py3)sr;   r   zExpected POSTED, got rp   rq   NrZ   r]   r^   r>   r_   zExpected 1 POST, got rd   re   r   r7   rf   rg   rh   rj   rc   r8   r   rl   rm   r0   r   )z%(py1)s in %(py4)s)r2   rD   r   
run_singler|   r}   rz   rJ   r~   r   r   r   r   r   r   r   r   r^   ry   )r.   rV   r>   rQ   r?   r;   r   r   r   r   r   r   r   r   r   r   r   r   s                     r1   *test_entry_point_run_single_with_injectionr    s\   #H-ME'.LAy ++##13F A6XAAA6XAAAAAA6AAA6AAAXAAA!6vjAAAAAAAu:@@:?@@@:@@@@@@3@@@3@@@@@@u@@@u@@@:@@@@@@3CJ<@@@@@@@@8D>#V#>V####>V###>###V#######<5F$455<55555<5555<55555555555cU)$4V4$4444$444$4444444444r3   c           
     f   ddl m} ddlm} ddlm} d }g }t        |      \  }}d }d }	d }
d	 } |||	|
|| d
z        }t        j                  | | dz  t        t        ||t               |      }t        ||      }|s/t        j                  dt        |      j                          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}y)u]   build_scheduler(…, snapshot_provider, merge_executor) — 인스턴스 생성 smoke 검증.r   )ExecutorScheduler)IdlePRSnapshot)MergeQueueExecutorc                     g S rG   rC   rC   r3   r1   _snapshot_providerzBtest_entry_point_build_scheduler_smoke.<locals>._snapshot_provider  s    	r3   c                 4    dd l }|j                  g ddd      S )Nr   z[] r   
returncodestdoutstderr
subprocessCompletedProcessr   r   r  s      r1   _noop_ghz8test_entry_point_build_scheduler_smoke.<locals>._noop_gh  s     **qVX*YYr3   c                 4    dd l }|j                  g ddd      S )Nr   r  r  r  r  s      r1   	_noop_gitz9test_entry_point_build_scheduler_smoke.<locals>._noop_git  s     **qTV*WWr3   c                      y)Nr   rC   r   s     r1   _noop_pytestz<test_entry_point_build_scheduler_smoke.<locals>._noop_pytest  s    r3   c                     y rG   rC   )records    r1   _noop_auditz;test_entry_point_build_scheduler_smoke.<locals>._noop_audit  s    r3   tasks)	gh_runner
git_runnerpytest_runneraudit_writertask_md_root	decisions)rM   decision_dirrW   rX   snapshot_providerr?   rO   merge_executorz5build_scheduler should return ExecutorScheduler, got z7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstance	schedulerr  )r`   ra   rv   ri   N)anu_v2.executor_schedulerr  anu_v2.idle_pr_diagnoserr  anu_v2.merge_queue_executorr  rD   r   build_schedulerr|   r}   rJ   r&  r~   r   typer   r   r   r   r   r   r   )r.   r  r  r  r	  r>   rQ   r?   r  r  r  r  
merge_execr'  r   r   s                   r1   &test_entry_point_build_scheduler_smoker.    s   ;7> E'.LAyZX $" 'J $33+,13!	I i!23 3   @Y@X@X?YZ                           "3    "3    4     r3   c                     d} | s8ddt        j                  |       iz  }t        t        j                  |            d} y)uc  시나리오 8: 기존 owner_trigger 테스트 회귀 확인용 placeholder.

    실제 회귀 검증은 pytest 명령으로 수행:
      python3 -m pytest anu_v2/tests/ -k "owner_trigger" -q

    본 함수는 이 사실을 기록/문서화하며, PASS 만 한다.
    신규 시나리오 1~7 PASS + 기존 owner_trigger 전체 PASS 확인 필요.
    Tzassert %(py1)sra   N)r~   r   r   r   )r   @py_format2s     r1   2test_existing_owner_trigger_regression_placeholderr1    s     K4KKK4KKKKKKr3   )r.   r   r   intr   r@   r   boolr   r3  r   r3  r   r2  r    r@   r!   r@   r"   r3  r#   r@   r$   r@   rB   r   rG   )r>   list[dict] | NonerB   ztuple[list[dict], Callable])rH   r@   rB   zCallable[[], str])r.   r   r>   r4  rH   r@   rB   z#tuple[OwnerTriggerOnly, list[dict]])>__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter~   r,   sysurllib.errorr   urllib.requestpathlibr   typingr   r   __file__resolveparentsWORKSPACE_ROOTr@   r0   insertanu_v2.owner_trigger_http_postr   r   r	   r
   anu_v2.owner_trigger_onlyr   r   r   r   r   r   anu_v2.owner_trigger_auditr   anu_v2r   rz   _HEAD_Br|   r}   ry   _TASK_IDr   r2   rD   rJ   rS   r   r   r   r   r   r   r  r.  r1  rC   r3   r1   <module>rK     s   #    
     h'')11!4~chh&HHOOAs>*+   9 &
 
	: #'"'#$>(# 	 	
  !   !      
D	 -:   $	  	
 ),#"P`._<D:'`XeT502t
r3   