
    j                     l   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
mZ ddlmZ ddlZddlmZ ddlmZ ddlmZmZ  ee      j/                         j0                  j0                  j0                  Zed	z  d
z  dz  ZdZddZddZddZddZddZ ejB                  jE                  de      d        Z#y)uy  tests.regression.test_owner_gemini_trigger_router_fixture_parametrized — task-2641 Track A.

회장 verbatim §12 (2026-05-23) 1:1 정합 — OWNER_GEMINI_TRIGGER_UI_FALLBACK_MISROUTE
재발 방지 fixture 6 시나리오 parametrized PASS 회귀.

본 회귀는 Layer A / NO-CRON: subprocess / cokacdir / merge / cron / live gh 호출 0.
모든 시나리오는 fixtures/owner_gemini_trigger_router/<scenario>/evidence.json 의 입력으로
router 를 호출하고 expected.json 의 final_state / freshness_state / nudge_attempted
/ permission_header_diagnostics whitelist + redact / token_value_logged=False / audit
schema 단언.
    )annotationsN)Path)Any)check_gemini_evidence_fresh)OwnerGeminiTriggerRouter)AUDIT_SCHEMAOwnerGeminiTriggerRouterAudittestsfixturesowner_gemini_trigger_router)#pr_review_empty_body_misroute_block(issue_comment_exact_body_trigger_success!permission_403_diagnostics_recordnudge_limit_exceeded_dedupe#fresh_review_arrives_within_timeout"stale_after_nudge_timeout_classifyscenarioc                    t         | z  }t        j                  |dz  j                  d            }t        j                  |dz  j                  d            }||fS )Nzevidence.jsonutf-8encodingzexpected.json)FIXTURE_ROOTjsonloads	read_text)r   fdirevidenceexpecteds       ]/home/jay/workspace/tests/regression/test_owner_gemini_trigger_router_fixture_parametrized.py_load_fixturer    .   sY    ("Dzz4/1<<g<NOHzz4/1<<g<NOHX    c                j    | j                  dg       | j                  d      ddidfd}|S )uJ   github_api mock — 호출 횟수에 따라 pre/post nudge payload 분리.github_api_payloadpost_nudge_github_api_payloadcallsr   c                4    d   }|dz   d<   |dk(  sS S )Nr%      r    )_method_pathidxcounterinitialpost_payloads      r   _apiz#_build_github_api_for.<locals>._api;   s2    g7!8|+Nr!   )r)   strr*   r0   returnr   get)r   r/   r,   r-   r.   s     @@@r   _build_github_api_forr4   5   s8    ll/4G<< ?@LlG Kr!   c                J    | j                  d      g fd}|_        |S )Ninvoke_status_simulatedc                 *    j                  |        S N)append)kwargscapturedstatuss    r   _invokez_make_invoke.<locals>._invokeI   s    r!   )r3   r;   )r   r=   r;   r<   s     @@r   _make_invoker>   E   s+    \\34FH  GNr!   c                4    | j                  d      fd}|S )N permission_diagnostics_simulatedc                      S r8   r(   )payloads   r   	_providerz&_make_diag_provider.<locals>._providerT   s    r!   r2   )r   rC   rB   s     @r   _make_diag_providerrD   Q   s    ll=>G r!   c                    |D ]f  }t        |      }|j                  dd       |j                  dd       |j                  dd        |j                  dd       | j                  |       h y )Ntoken_presentFtoken_hash_prefix permission_header_diagnosticsnudge_attempted)dict
setdefaultr9   )auditrecordsrecrec_to_writes       r   _seed_prior_audit_recordsrQ   Z   si     #Cy7 3R8 ?F 159\"#r!   c                :   t        |      \  }}t        |       }|j                  d      rt        ||d          t	        |      }t        |      }t        |      }t        | t        ||||      }|j                  d      rdnd }	|j                  |d   |d   |d   |d   |j                  d	d
      |	|j                  d      t        |j                  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  }t        j$                  d| d|d   d|
j                  d|
j&                        dz   d|iz  }t)        t        j*                  |            d x}x}}|j                  d      dk7  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$                  d| d|d   d|
j,                        dz   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  }t        j$                  d| d"|d    d|
j.                         dz   d|iz  }t)        t        j*                  |            d x}x}}|
j0                  }|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$                  d| d%|d#   d|
j0                        dz   d|iz  }t)        t        j*                  |            d x}x}}d&|v r|
j2                  }|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$                  d| d(|d&   d|
j2                        dz   d|iz  }t)        t        j*                  |            d x}x}}|j4                  j7                  d)*      }t9        j:                  |j=                         j?                         d+         }|d,   }|t@        k(  }|st        j                  d|fd-|t@        f      t        j"                  |      d.t        j                         v st        j                   t@              rt        j"                  t@              nd.d/z  }d0d1|iz  }t)        t        j*                  |            d x}}|d2   }d}||u }|slt        j                  d |fd3||f      t        j"                  |      t        j"                  |      d4z  }d5d6|iz  }t)        t        j*                  |            d x}x}}|d   }|d   }||k(  }|slt        j                  d|fd7||f      t        j"                  |      t        j"                  |      d4z  }d5d6|iz  }t)        t        j*                  |            d x}x}}|j                  d8g       D ]  }|
j&                  }||v }|st        j                  d9|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t        j"                  |      d<z  }t        j$                  d| d=|
j&                  d>|      d?z   d6|iz  }t)        t        j*                  |            d x}}  |j                  d@      }|C|
jB                  }tE        |tF              }|s%t        j$                  d| dA      dBz   dCt        j                         v st        j                   tD              rt        j"                  tD              ndCdDt        j                         v st        j                   |      rt        j"                  |      ndDdEt        j                         v st        j                   tF              rt        j"                  tF              ndEt        j"                  |      dFz  }t)        t        j*                  |            d }|D ]  }||v }|st        j                  d9|fdG||f      dHt        j                         v st        j                   |      rt        j"                  |      ndHdDt        j                         v st        j                   |      rt        j"                  |      ndDdIz  }t        j$                  d| dJ|dKtI        |             dLz   dM|iz  }t)        t        j*                  |            d } |j                  dN      }||
jB                  xs i }|D ]  }||v}|st        j                  dO|fdP||f      dHt        j                         v st        j                   |      rt        j"                  |      ndHdDt        j                         v st        j                   |      rt        j"                  |      ndDdIz  }t        j$                  d| dQ|      dLz   dM|iz  }t)        t        j*                  |            d } |j                  dR      }|r|
jB                  xs i }t9        jJ                  |      }|D ]  }||v}|st        j                  dO|fdP||f      d;t        j                         v st        j                   |      rt        j"                  |      nd;dSt        j                         v st        j                   |      rt        j"                  |      ndSdIz  }t        j$                  d| dT|dU      dLz   dM|iz  }t)        t        j*                  |            d }||v}|st        j                  dO|fdP||f      d;t        j                         v st        j                   |      rt        j"                  |      nd;dVt        j                         v st        j                   |      rt        j"                  |      ndVdIz  }t        j$                  d| dT|dW      dLz   dM|iz  }t)        t        j*                  |            d } y y )XNprior_audit_records)workspace_rootfreshness_checkerinvoke_schedulerpermission_diagnostics_providerrM   
github_apidecision_path_presentzdecision.json	pr_numbercurrent_head_shaownerrepotask_idrH   observed_commentfresh_review_arrived_post_nudgeF)rZ   r[   r\   r]   r^   decision_pathr_   r`   final_state)==)z3%(py2)s
{%(py2)s = %(py0)s.final_state
} == %(py5)sresult)py0py2py5[z] expected final_state=z, got z	; reason=z
>assert %(py7)spy7freshness_statezN/A)z7%(py2)s
{%(py2)s = %(py0)s.freshness_state
} == %(py5)sz%] freshness_state mismatch: expected=z, got=rJ   )is)z7%(py2)s
{%(py2)s = %(py0)s.nudge_attempted
} is %(py5)sz%] nudge_attempted mismatch: expected=nudge_result)z4%(py2)s
{%(py2)s = %(py0)s.nudge_result
} == %(py5)sz"] nudge_result mismatch: expected=gemini_commit_id_observed)zA%(py2)s
{%(py2)s = %(py0)s.gemini_commit_id_observed
} == %(py5)sz/] gemini_commit_id_observed mismatch: expected=r   r   schema)z%(py1)s == %(py3)sr   )py1py3zassert %(py5)srg   token_value_logged)z%(py1)s is %(py4)s)rp   py4zassert %(py6)spy6)z%(py1)s == %(py4)sreason_must_contain)in)z.%(py0)s in %(py4)s
{%(py4)s = %(py2)s.reason
}needle)re   rf   rs   z	] reason z missing needle z
>assert %(py6)s/permission_header_diagnostics_must_contain_keysz,] permission_header_diagnostics must be dictz7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancediagrK   )re   rp   rf   rs   )z%(py0)s in %(py2)skey)re   rf   z] missing 403 header key u	    — got z
>assert %(py4)srs   3permission_header_diagnostics_must_not_contain_keys)not in)z%(py0)s not in %(py2)sz] unexpected 403 header key 5permission_header_diagnostics_must_not_contain_values
serialisedz] raw token sentinel z leaked into diagnostics
audit_textz leaked into audit)&r    r	   r3   rQ   r>   r4   rD   r   r   route_for_prboolrb   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgreasonAssertionError_format_explanationrj   rJ   rl   rm   pathr   r   r   strip
splitlinesr   rI   ry   rK   sorteddumps)tmp_pathr   r   r   rM   invokerX   diag_providerrouterra   rd   @py_assert1@py_assert4@py_assert3@py_format6@py_format8r   last_record@py_assert0@py_assert2@py_format4@py_format5@py_format7rw   must_contain_keysrz   r{   @py_format3must_not_contain_keysmust_not_contain_valuesr   s                                  r   Gtest_fixture_scenario_runs_router_state_machine_to_expected_final_stater   e   s    'x0Hh)(3E||)*!%2G)HI(#F&x0J'1M%5(5F (0||4K'LORVM  ;'!"45wfY+#!&89(,LL:EB)
 ! F  -!8 !88  !8                  "9    H:,Xm-D,G H!!$Ifmm->	@     ||%&%/%% 	
2C)D 	
%)DD 	
 		
%)D 	
 	
 
6		
 	
 	  	
 	
 
		  	
 	
 
		 & 	
 	
 
		 *E 	
 	
  z  !236 7)),.	
 	
 	
 		
 	
 !! X.?%@ !%@@  	!%@   	  	    	    	 "   	 &A    H: ./0 1%%&	(   	   (>": "::  ":                  #;    H: ^,/vf6I6I5L	N     #h.,,	
34	
,45	
 	
,4	
 	
 
6	
 	
  	
 	
 
	 	
 	
 
	 -	
 	
 
	 5	
 	
  z  !<=@ A3368		
 	
 	
 	
 	
 %%w%7J**Z--/::<R@AKx 0 L0000 L000 000000L000L0000000+,55,5555,555,5555555555}%@-)@@%)@@@@@%)@@@@%@@@)@@@@@@@@ ,,4b9 
 	
v& 	
 	
 	
v 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
    	
 	
 		   	
 	
 		 ' 	
 	
  z6=="33CF:N	
 	
 	
 	
 	

 !9 $33$% 	
% 	
  zEF	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
  !% 	
 	
 		 !% 	
 	
 		 & 	
 	
 	
 	
 	
 % 	C$;  3$  v     I   v     I     H:6sgYvd|nU    	
 %LL= (339r( 	Cd?  3d  v     I   v   #  I #    H:9#A    	
 'll? 339rZZ%
- 	F+  6  v     I   v   ",  I ",    H:26*<TU     +  6  v     I   v   ",  I ",    H:26*<NO    	 r!   )r   r0   r1   ztuple[dict, dict])r   rK   )rM   r	   rN   list)$__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r   pathlibr   typingr   pytest(anu_v2.gemini_evidence_freshness_checkerr   "anu_v2.owner_gemini_trigger_routerr   (anu_v2.owner_gemini_trigger_router_auditr   r	   __file__resolveparent	WORKSPACEr   	SCENARIOSr    r4   r>   rD   rQ   markparametrizer   r(   r!   r   <module>r      s   
 #       N""$++2299	7"Z/2OO	 	# Y/} 0}r!   