
    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mZmZmZmZmZmZmZmZmZmZmZmZmZmZ dZdZd Zd Zd	 Zd
 Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4y) uk  tests.regression.test_owner_gemini_trigger_router_audit — task-2641 Track A.

회장 verbatim §6 / §8 (2026-05-23) 1:1 정합 — audit JSONL + redaction + 403
header 화이트리스트 + nudge_count_for_pr_head dedupe helper 회귀.

본 회귀는 Layer A / NO-CRON: subprocess / cokacdir / merge / cron 호출 0.
audit 파일은 pytest tmp_path 로 격리.
    )annotationsN)
ALL_STATESALLOWED_AUDIT_KEYSAUDIT_SCHEMAOwnerGeminiTriggerRouterAuditRECORDED_403_HEADERSREDACTED_PLACEHOLDERRouterAuditRedactionError STATE_CHAIR_UI_FALLBACK_REQUIREDSTATE_FRESH#STATE_GEMINI_EXTERNAL_TRIGGER_STALESTATE_NUDGE_POSTEDextract_403_headersredact_diagnosticstoken_hash_prefix(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc                    dddddddd} t        |       }t        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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  }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        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}}y )Nz!issues=write; pull_requests=writezrepo, write:discussionpublic_repo4321z	ABCD:1234zBearer ghp_REDACT_ME_NEVER_LOGzhttps://docs.github.com/)X-Accepted-GitHub-PermissionszX-Accepted-OAuth-ScopeszX-OAuth-ScopeszX-RateLimit-RemainingzX-GitHub-Request-IdAuthorizationzDocumentation-URLinz%(py0)s in %(py2)srequired_keyresultpy0py2zmissing whitelist key z
>assert %(py4)spy4zx-github-request-id)not in)z%(py1)s not in %(py3)spy1py3assert %(py5)spy5authorizationzdocumentation-urlghp_
serialisedzBearer )r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationjsondumps)headersr   r   @py_assert1@py_format3@py_format5@py_assert0@py_assert2@py_format4@py_format6r*   s              N/home/jay/workspace/tests/regression/test_owner_gemini_trigger_router_audit.py'test_extract_403_headers_whitelist_onlyr?   )   s   )L#;'!'*97G !)F, Qv%PPP|vPPPPPP|PPP|PPPPPPvPPPvPPPP)??O'PPPPPPPQ !. .... ... ................(?&((((?&(((?((((((&(((&(((((((,f,,,,f,,,,,,,,,f,,,f,,,,,,,F#J#6####6###6################&9J&&&&9J&&&9&&&&&&J&&&J&&&&&&&    c                    i } t        |       }i }||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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}y )N==z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   r   r    r!   py7assert %(py9)spy9	r   r+   r,   r-   r.   r/   r0   r2   r3   r7   @py_assert3@py_assert6@py_assert5@py_format8@py_format10s         r>   1test_extract_403_headers_empty_dict_returns_emptyrP   A   s    !(r"(b("b(((("b((((((((((((r((("(((b(((((((r@   c                 r   d } t        |       }i }||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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}d} t        |       }i }||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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}g d} t        |       }i }||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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}y )	NrB   rD   r   rE   rG   rH   string)         rI   rJ   s         r>   /test_extract_403_headers_non_dict_returns_emptyrV   E   s   #*t$**$****$************t***$**********'.x(.B.(B....(B............x...(...B.......(/y)/R/)R////)R////////////y///)///R///////r@   c                    ddi} t        |       }|j                  }d} ||      }|t        k(  }|st        j                  d|fd|t        f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}x}x}}y)u`   defense in depth — 만약 화이트리스트 key 의 value 에 Bearer 가 들어와도 redact.r   zBearer ghp_LEAKED_TOKEN_VALUEzx-accepted-github-permissionsrB   )zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py8)sr   r	   )r   r    r!   py6py8zassert %(py10)spy10N)r   getr	   r+   r,   r-   r.   r/   r0   r2   r3   )r6   r   r7   rK   rM   @py_assert7@py_format9@py_format11s           r>   @test_extract_403_headers_handles_bearer_value_in_whitelisted_keyr_   K   s     	()HG !)F::N5N:56N6:NNNNN6:NNNNNNN6NNN6NNN:NNN5NNN6NNNNNN:NNNN:NNNNNNNNNr@   c                 ~   ddd} t        |       }t        dd}||k(  }|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}}y )
N
ghp_AAA111ok)tokenotherrB   )z%(py0)s == %(py3)sredacted)r   r%   r&   r'   )
r   r	   r+   r,   r-   r.   r/   r0   r2   r3   )datare   r;   r7   r<   r=   s         r>   'test_redact_diagnostics_masks_token_keyrg   X   sw    !D1D!$'H!5EE8EEEEE8EEEEEEE8EEE8EEEEEEEEEEEr@   c                    ddi} t        |       }|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  }dd|iz  }t        t        j                  |            d x}}y )	NheaderBearer ghp_LEAKrB   z%(py1)s == %(py3)sr	   r#   r&   r'   
r   r	   r+   r,   r0   r-   r.   r/   r2   r3   )rf   re   r:   r;   r<   r=   s         r>   1test_redact_diagnostics_masks_authorization_valuerm   ^   s|    '(D!$'HH5!55555!5555555555!5555!55555555r@   c                    ddddiddgdi} t        |       }|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  }dd|iz  }t        t        j                  |            d x}}|d   d   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  }dd|iz  }t        t        j                  |            d x}}|d   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  }dd|iz  }t        t        j                  |            d x}}|d   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}}y )Noutersecretpasswordprj   rb   )api_keylistrs   rB   rk   r	   r#   r&   r'   rt   r   rS   rT   z%(py1)s == %(py4)sr$   r!   assert %(py6)srX   rl   )	rf   re   r:   r;   r<   r=   rK   r9   @py_format7s	            r>   1test_redact_diagnostics_handles_nested_structuresry   d   s    #&(94@
D "$'HGY'?'+?????'+????'??????+????+????????GV$Q'
3K37KKKKK37KKKK3KKKKKK7KKKK7KKKKKKKKGV$Q'?'+?????'+????'??????+????+????????GV$Q'/4/'4////'4///'///4///////r@   c                    t        d      } 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}}d
 | 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}}y )Nzany-token-value   rB   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenprefixr   r$   r%   rX   assert %(py8)srY   c              3  $   K   | ]  }|d v  
 yw)0123456789abcdefN ).0cs     r>   	<genexpr>z>test_token_hash_prefix_default_length_is_12.<locals>.<genexpr>x   s     71q&&7s   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}all)r   r    r!   )r   r}   r+   r,   r-   r.   r/   r0   r2   r3   r   )	r~   r;   rM   @py_assert4rx   r]   r7   rK   r9   s	            r>   +test_token_hash_prefix_default_length_is_12r   u   s    01Fv;";";"33vv;"77737777777773777377777777777777r@   c                    t        d      } t        d      }| |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
                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d }y )	NxxrB   )z%(py0)s == %(py2)sabr   assert %(py4)sr!   )	r   r+   r,   r-   r.   r/   r0   r2   r3   )r   r   r7   r8   r9   s        r>   $test_token_hash_prefix_deterministicr   {   sa    $A$A6MMM1MMMMMM1MMM1MMMMMMMMMMMMMMMMr@   c                 v    t        j                  t              5  t        d       d d d        y # 1 sw Y   y xY w)N )pytestraises
ValueErrorr   r   r@   r>   )test_token_hash_prefix_empty_token_raisesr      s+    	z	" "  s   /8c                 `    ddt         dt        ddd dddt        dd	}|j                  |        |S )
Nz	task-test   STALETPOSTED0123456789abFztest record)task_id	pr_numbercurrent_head_shafreshness_stategemini_commit_id_observednudge_attemptednudge_resultpermission_header_diagnosticstoken_presentr   token_value_loggedfinal_statereason)HEAD_AHEAD_Br   update)overridebases     r>   _valid_recordr      sC    ""%+ )-+#)D 	KKKr@   c                   t        |       }|j                  t                      |j                  j	                  d      }|j
                  }d} ||      }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            d x}x}}t        j                  |j                               }|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  }
dd|
iz  }t        t        j                  |            d 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$        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  }
dd|
iz  }t        t        j                  |            d x}}	|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  }
dd|
iz  }t        t        j                  |            d 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 )Nutf-8encoding
zJassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.endswith
}(%(py4)s)
}text)r   r    r!   rX   schemarB   rk   r   r#   r&   r'   r   r   ru   rv   rw   rX   r   r   r   r   r   F)is)z%(py1)s is %(py4)s)r   appendr   path	read_textendswithr-   r.   r+   r/   r0   r2   r3   r4   loadsstripr   r,   r   r   )tmp_pathauditr   r7   rK   rM   rx   rowr:   r;   r<   r=   r9   s                r>   +test_append_writes_valid_record_with_schemar      sz   )(3E	LL!::1D===44=
**TZZ\
"Cx=(=L((((=L(((=((((((L(((L((((((({"s"s""""s""""""s"""""""!","f,,,,"f,,,",,,,,,f,,,f,,,,,,,}3!33333!3333333333!3333!33333333#$--$----$---$----------r@   c                `   t        |       }|j                  t        t        j	                                      t        j                  |j                  j                  d      j                               }|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  }d	d
|iz  }t!        t        j"                  |            d x}}y )Nr   r   r   r   rB   rk   r   r#   r&   r'   )r   r   r   r   upperr4   r   r   r   r   r+   r,   r0   r-   r.   r/   r2   r3   )r   r   r   r:   r;   r<   r=   s          r>   %test_append_normalises_uppercase_headr      s    )(3E	LL?@
**UZZ))7);AAC
DC!","f,,,,"f,,,",,,,,,f,,,f,,,,,,,r@   c                    t        |       }t               }d|d<   t        j                  t              5  |j                  |       d d d        y # 1 sw Y   y xY w)Nno	extra_keyr   r   r   r   r
   r   r   r   bads      r>   test_append_rejects_unknown_keyr      sK    )(3E
/CC	0	1 S  s   AAc                    t        |       }t        d      }t        j                  t              5  |j                  |       d d d        y # 1 sw Y   y xY w)NT)r   r   r   s      r>   +test_append_rejects_token_value_logged_truer      sD    )(3E
4
0C	0	1 S     AAc                    t        |       }t        d      }t        j                  t              5  |j                  |       d d d        y # 1 sw Y   y xY w)NWHATEVER)r   r   r   s      r>   'test_append_rejects_invalid_final_stater      sD    )(3E
J
/C	0	1 S  r   c                    t        |       }t        d      }t        j                  t              5  |j                  |       d d d        y # 1 sw Y   y xY w)Nzoops Bearer ghp_LEAKr   r   r   s      r>   2test_append_rejects_record_with_raw_token_sentinelr      sE    )(3E
5
6C	0	1 S  r   c                    h d} t        |       }t        |k(  }|s/t        j                  d|fdt        |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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}}y
)uM   allowed_audit_keys 가 schema-stable. 키 집합 미세 변경 회귀 차단.>   r   r   ts_utcr   r   r   r   r   r   r   r   r   r   r   r   rB   )z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}r   	frozensetexpected)r   r    r%   r'   zassert %(py7)srF   N)
r   r   r+   r,   r-   r.   r/   r0   r2   r3   )r   r   r7   r=   rN   s        r>   2test_allowed_audit_keys_contains_all_record_fieldsr      s    H" "+8!44!44444!444444444444444444444444484448444!44444444r@   c                    t         t        v } | st        j                  d| fdt         t        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dz  }dd|iz  }t        t        j                  |            d } t        t        v } | st        j                  d| fdt        t        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dz  }dd|iz  }t        t        j                  |            d } t        t        v } | st        j                  d| fdt        t        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dz  }dd|iz  }t        t        j                  |            d } y )
Nr   r   r   r   r   r   r!   r   r   )r   r   r+   r,   r-   r.   r/   r0   r2   r3   r   r   )r7   r8   r9   s      r>   test_all_states_set_immutabler      s@   *$$$$;*$$$$$$;$$$;$$$$$$*$$$*$$$$$$$.*<<<<.*<<<<<<.<<<.<<<<<<*<<<*<<<<<<<+z9999+z999999+999+999999z999z9999999r@   c           	        t        |       }|j                  }d} ||t              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}x}x}}y )Nr   r   headr   rB   zv%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.nudge_count_for_pr_head
}(pr_number=%(py4)s, head=%(py5)s)
} == %(py10)sr   r   r   r    r!   r'   rF   rZ   assert %(py12)spy12)r   nudge_count_for_pr_headr   r+   r,   r-   r.   r/   r0   r2   r3   	r   r   r7   rK   rL   @py_assert9@py_assert8r^   @py_format13s	            r>   +test_nudge_count_zero_when_no_prior_recordsr      s    )(3E((I3I(3VDIIDIIIIDIIIIII5III5III(III3IIIIIIVIIIVIIIDIIIIIIIIIIIr@   c           	        t        |       }|j                  t        t        dd              |j                  }d} ||t
              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}x}x}}y )NF)r   r   r   r   r   r   rB   r   r   r   r   r   r   )r   r   r   r   r   r   r+   r,   r-   r.   r/   r0   r2   r3   r   s	            r>   :test_nudge_count_only_increments_when_nudge_attempted_truer      s    )(3E	LL#!	
 ((I3I(3VDIIDIIIIDIIIIII5III5III(III3IIIIIIVIIIVIIIDIIIIIIIIIIIr@   c           	     0   t        |       }|j                  t        dd             |j                  t        ddt                     |j                  }d} ||t
              }d}||k(  }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}x}x}}y )NTr   )r   r   DEDUPED)r   r   r   r   r   rT   rB   r   r   r   r   r   r   )r   r   r   r   r   r   r+   r,   r-   r.   r/   r0   r2   r3   r   s	            r>   0test_nudge_count_increments_for_matching_pr_headr      s    )(3E	LLt(KL	LL "*	
 ((I3I(3VDIIDIIIIDIIIIII5III5III(III3IIIIIIVIIIVIIIDIIIIIIIIIIIr@   c           	        t        |       }|j                  t        t                     |j                  t        t                     |j
                  }d} ||t              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}x}x}}|j
                  }d} ||t              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}x}x}}y )Nr   r   r   rS   rB   r   r   r   r   r   r   r   )r   r   r   r   r   r   r+   r,   r-   r.   r/   r0   r2   r3   r   s	            r>   "test_nudge_count_isolated_per_headr     s   )(3E	LL78	LL78((I3I(3VDIIDIIIIDIIIIII5III5III(III3IIIIIIVIIIVIIIDIIIIIIIIII((I3I(3VDIIDIIIIDIIIIII5III5III(III3IIIIIIVIIIVIIIDIIIIIIIIIIIr@   c           	        t        |       }|j                  t        d             |j                  t        d             |j                  }d} ||t              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}x}x}}|j                  }d} ||t              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}x}x}}y )Nr   )r      r   rS   rB   r   r   r   r   r   r   )r   r   r   r   r   r+   r,   r-   r.   r/   r0   r2   r3   r   s	            r>    test_nudge_count_isolated_per_prr     s   )(3E	LL-.	LL-.((I3I(3VDIIDIIIIDIIIIII5III5III(III3IIIIIIVIIIVIIIDIIIIIIIIII((I3I(3VDIIDIIIIDIIIIII5III5III(III3IIIIIIVIIIVIIIDIIIIIIIIIIIr@   c                B   t        |       }|j                  t                      |j                  t        d             |j                  j	                  d      j                         j                         }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}}t!        j"                  |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}}
y )Nsecondr   r   r   rT   rB   r|   r}   linesr   r   rY   rS   r   ru   rv   rw   rX   )r   r   r   r   r   r   
splitlinesr}   r+   r,   r-   r.   r/   r0   r2   r3   r4   r   )r   r   r   r;   rM   r   rx   r]   r   r:   rK   r9   s               r>   /test_audit_records_are_appended_not_overwrittenr     sC   )(3E	LL!	LLh/0JJ  ' 288:EEGEu::?:33uu:ZZa!F('x'x''''x''''''x'''''''r@   )5__doc__
__future__r   builtinsr-   _pytest.assertion.rewrite	assertionrewriter+   r4   r   (anu_v2.owner_gemini_trigger_router_auditr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r?   rP   rV   r_   rg   rm   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r@   r>   <module>r      s    #       $ 
	'0)0OF60"8(
.-5,:J

J
JJJ(r@   