
    jKj                        d dl Z d dlZd dl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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mZmZmZmZ d dlmZ  d dlm!Z" eddd	d
Z#d Z$dddZ%eeddZ&dZ'dddZ( G d d      Z) G d d      Z* G d d      Z+ G d d      Z, G d d      Z- G d d      Z. G d d       Z/ G d! d"      Z0 G d# d$      Z1 G d% d&      Z2d' Z3 e3d(d)       e3d*d+       e3d,d-       e3d.d/       e3d0d1       e3d2d3       e3d4d5       e3d6d7       e3d8d9       e3d:d;       e3d<d=       e3d>d?       e3d@dA       e3dBdC       e3dDdE       e3dFdG       e3dHdI       e3dJdK       e3dLdM       e3dNdI       e3dOdP       e3dQdR       e3dSdI       e3dTdU       e3dIdV      dWdXgZ4g dYZ5g dZZ6 G d[ d\      Z7y)]    N)	dataclass)dedent)&DEFAULT_CODE_VARIABLES_IGNORE_PATTERNS$DEFAULT_CODE_VARIABLES_MASK_PATTERNSVariableSizeLimiter_MAX_COLLECTION_ITEMS_TO_SCAN_MAX_MASK_DEPTH#_MAX_VALUE_LENGTH_FOR_PATTERN_MATCH_MaskingConfig_compile_patterns_encode_variable_is_high_entropy_secret_looks_like_secret_mask_value_pattern_matches_redact_url_credentials
_safe_repr_serialize_frame_variablesattach_code_variables_to_framesiter_stacks)CODE_VARIABLES_REDACTED_VALUE)CODE_VARIABLES_TOO_LONG_VALUE Tpatternsignore	mask_urlsc                 V    t        j                  t        |       t        |      |      S )zFBuild a masking config, defaulting to the patterns the SDK ships with.)mask_url_credentials)r   buildlistr   s      q/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/test/test_code_variables.pymake_configr#   +   s&     XV9     c                 ,    t        | t        di |      S )zHRun one value through the recursive masker and return the masked result.r   )r   r#   )valuekwargss     r"   maskr(   4   s    uk3F344r$   limiterc                F    t        | t        di ||xs
 t                     S )zIRun one top-level variable through the full wire encoder (mask + format).r   )r   r#   r   )r&   r*   r'   s      r"   encoder,   9   s'    {$V$g&F1D1F r$   )mask_patternsignore_patternsc                     t        j                  t        |       t        |      d      }t        j                  |      }t        |t               |      S )zJSerialize a frame's locals. Pass the locals you want as keyword arguments.T)f_locals)r   r    r!   typesSimpleNamespacer   r   )r-   r.   
local_varsconfigframes        r"   extractr6   @   sE     !!$}"5tO7LdSF!!:6E%e-@-BFKKr$   a:  import os
import posthog
from posthog import Posthog


def make_client(**options):
    return Posthog(
        "phc_x",
        host="https://eu.i.posthog.com",
        debug=True,
        enable_exception_autocapture=True,
        project_root=os.path.dirname(os.path.abspath(__file__)),
        **options,
    )
envc                   | j                  d      }|j                  t        dz   t        |      z          i t        j
                  |xs i }t        j                  t        j                        5 }t        j                  t        j                  t        |      gt        j                  |       ddd       j                  j                   j#                  d      S # 1 sw Y   .xY w)a  Write and run a tiny PostHog app that raises an uncaught exception.

    The app already has ``make_client(**options)`` and ``posthog`` imported; the body
    creates the client, defines the failing code, and triggers it. In debug mode the
    autocaptured payload (including ``code_variables``) is printed, which is what the
    end-to-end tests assert against. Returns the combined stdout/stderr.
    zapp.py
)stderrr8   Nzutf-8)joinwrite_APP_HEADERr   osenvironpytestraises
subprocessCalledProcessErrorcheck_outputsys
executablestrSTDOUTr&   outputdecode)tmpdirbodyr8   apprun_envexcinfos         r"   run_apprQ   ^   s     ++h
CIIkD 6$</0++	r+G	z44	5^^SX&z/@/@g	
 
6 ==&&w//	 
6	5s   1A CC'c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestPatternCompilationzQPatterns compile into a (substrings, regexes) pair; simple ones take a fast path.c                 @    t        dg      \  }}|dgk(  sJ |g k(  sJ y )N(?i)passwordpasswordr   self
substringsregexess      r"   8test_simple_case_insensitive_pattern_becomes_a_substringzOTestPatternCompilation.test_simple_case_insensitive_pattern_becomes_a_substringv   s0    /0AB
Gj\)))"}}r$   c                 P    t        dg      \  }}|g k(  sJ t        |      dk(  sJ y )Nz	^sk_live_   r   lenrX   s      r"   "test_complex_pattern_stays_a_regexz9TestPatternCompilation.test_complex_pattern_stays_a_regex|   s3    /?
GR7|q   r$   c                 T    t        ddg      \  }}|dgk(  sJ t        |      dk(  sJ y )Nz
(?i)secretz^__.*secretr^   r_   rX   s      r"   ,test_patterns_can_mix_substrings_and_regexeszCTestPatternCompilation.test_patterns_can_mix_substrings_and_regexes   s8    /0IJ
GhZ'''7|q   r$   c                     t        g       J y NrW   rY   s    r"   !test_no_patterns_compiles_to_nonez8TestPatternCompilation.test_no_patterns_compiles_to_none   s     $,,,r$   c                 \    t        dg      }t        d|      du sJ t        d|      du sJ y )NrU   MY_PASSWORDT	safe_nameFr   r   rY   r   s     r"   (test_substring_match_is_case_insensitivez?TestPatternCompilation.test_substring_match_is_case_insensitive   s9    $o%67x8D@@@X6%???r$   c                 \    t        dg      }t        d|      du sJ t        d|      du sJ y )Nz^__	__privateT
trailing__Frl   rm   s     r"   3test_regex_match_is_anchored_where_the_pattern_sayszJTestPatternCompilation.test_regex_match_is_anchored_where_the_pattern_says   s8    $fX.X6$>>>h75@@@r$   N)
__name__
__module____qualname____doc__r\   ra   rd   rh   rn   rr   r   r$   r"   rS   rS   s   s%    [!!
-@
Ar$   rS   c                       e Zd ZdZej
                  j                  dg d      d        Zd Zd Z	ej
                  j                  dg d      d	        Z
y
)TestUrlCredentialScrubbingzC`scheme://user:pass@host` credentials are stripped from any string.zurl, secret))z+postgresql://warehouse:topsecret@db:26257/x	topsecret)zredis://:p4ss@cache:6379p4ss)z mongodb://admin:hush@mongo:27017hush)z%https://admin:hush@api.example.com/v1r{   c                 :    t        |      }||vsJ t        |v sJ y rf   r   REDACTED)rY   urlrc   results       r"   %test_embedded_credentials_are_removedz@TestUrlCredentialScrubbing.test_embedded_credentials_are_removed   s*     )-V###6!!!r$   c                 .    t        d      }d|vrd|vsJ y )Nz&a=postgres://u:p1@h1 b=redis://u:p2@h2p1p2r   rY   r   s     r"   (test_every_url_in_the_string_is_scrubbedzCTestUrlCredentialScrubbing.test_every_url_in_the_string_is_scrubbed   s%    ()QR6!d&&888&8r$   c                 <    t        d      }|dt        z   dz   k(  sJ y )Nzredis://user:secret@[::1]:6379zredis://z@[::1]:6379r}   r   s     r"   test_ipv6_host_is_preservedz6TestUrlCredentialScrubbing.test_ipv6_host_is_preserved   s%    ()IJh.>>>>r$   r&   )zssh://gituser@github.com/repozhttps://api.example.com:8080/v1zjust a plain stringc                 $    t        |      |k(  sJ y rf   r   rY   r&   s     r"   3test_strings_without_credentials_are_left_untouchedzNTestUrlCredentialScrubbing.test_strings_without_credentials_are_left_untouched   s     'u-666r$   N)rs   rt   ru   rv   rA   markparametrizer   r   r   r   r   r$   r"   rx   rx      sc    M[[	
""9
?
 [[	
77r$   rx   c                       e Zd ZdZej
                  j                  dg d      d        Zej
                  j                  d ed      df ed      df ed      dfg      d	        Z	d
 Z
y)TestScalarMaskingzHSimple scalars pass through untouched; non-finite floats become strings.r&   )NTF*   Q	@z
plain textc                 $    t        |      |k(  sJ y rf   r(   r   s     r"   (test_safe_scalars_pass_through_unchangedz:TestScalarMasking.test_safe_scalars_pass_through_unchanged   s    E{e###r$   value, expectednaninf-infc                 $    t        |      |k(  sJ y rf   r   rY   r&   expecteds      r"   %test_non_finite_floats_become_stringsz7TestScalarMasking.test_non_finite_floats_become_strings   s     E{h&&&r$   c                 >    t        t        d      dg      ddgk(  sJ y )Nr   g       @)r(   floatrg   s    r"   5test_non_finite_floats_are_converted_even_when_nestedzGTestScalarMasking.test_non_finite_floats_are_converted_even_when_nested   s"    U5\3'(UCL888r$   N)rs   rt   ru   rv   rA   r   r   r   r   r   r   r   r$   r"   r   r      sz    R[[W&UV$ W$ [[
,	uu 5fv7NO'	'9r$   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestStringMaskingzMA string is redacted by content, capped by length, and scrubbed of URL creds.c                 $    t        d      dk(  sJ y Nzhello worldr   rg   s    r"    test_plain_string_passes_throughz2TestStringMasking.test_plain_string_passes_through   s    M"m333r$   c                 ,    t        d      t        k(  sJ y )Ncontains_password_herer(   r~   rg   s    r"   *test_string_matching_a_pattern_is_redactedz<TestStringMasking.test_string_matching_a_pattern_is_redacted   s    ,-999r$   c                 @    t        dt        dz   z        t        k(  sJ y )Nxr^   )r(   r
   TOO_LONGrg   s    r"   #test_overly_long_string_is_replacedz5TestStringMasking.test_overly_long_string_is_replaced   s     C>BCDPPPr$   c                 >    t        dg       }d|vsJ t        |v sJ y )Npostgresql://user:p4ss@host/db)r   rz   r   r   s     r"   <test_url_credentials_are_scrubbed_even_with_no_mask_patternszNTestStringMasking.test_url_credentials_are_scrubbed_even_with_no_mask_patterns   s+    6DV###6!!!r$   c                 .    t        dg d      }|dk(  sJ y )Nr   F)r   r   r   r   s     r"   $test_url_scrubbing_can_be_turned_offz6TestStringMasking.test_url_scrubbing_can_be_turned_off   s     6uU9999r$   N)	rs   rt   ru   rv   r   r   r   r   r   r   r$   r"   r   r      s    W4:Q":r$   r   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zej                  j                  d
d d d gg d      d        Zd Zd Zd Zd Zd Zd Zd Zy)TestCollectionMaskingzKDicts, lists and tuples are walked; size, depth and cycles are all bounded.c                 0    t        ddd      dddk(  sJ y )Ntest{   namer&   r   rg   s    r"   test_safe_dict_is_unchangedz1TestCollectionMasking.test_safe_dict_is_unchanged   s     Vc23QT7UUUUr$   c                 4    t        ddi      dt        ik(  sJ y )NrV   anythingr   rg   s    r"   2test_dict_key_matching_a_pattern_redacts_its_valuezHTestCollectionMasking.test_dict_key_matching_a_pattern_redacts_its_value   s    Z,-*h1GGGGr$   c                 4    t        ddi      dt        ik(  sJ y )Nnoter   r   rg   s    r"   .test_dict_value_matching_a_pattern_is_redactedzDTestCollectionMasking.test_dict_value_matching_a_pattern_is_redacted  s     V567FH;MMMMr$   c                 p    t        dddddii      }|d   d   d   t        k(  sJ |d   d   d   dk(  sJ y )Nl1l2xyzok)api_keysafer   r   r   rY   outs     r"   )test_nested_dict_is_masked_at_every_depthz?TestCollectionMasking.test_nested_dict_is_masked_at_every_depth  sQ    D4UD!ABCD4yy)X5554yv&$...r$   c                 6    t        g d      dt        dgk(  sJ y )N)r   r   safe2r   r   r   rg   s    r"   'test_list_items_are_masked_individuallyz=TestCollectionMasking.test_list_items_are_masked_individually  s)    ?@E
 
 	
 
r$   c                 Z    t        d      }t        |t              sJ |dt        dfk(  sJ y )N)asecret_tokenbr   r   )r(   
isinstancetupler~   r   s     r"   test_tuple_stays_a_tuplez.TestCollectionMasking.test_tuple_stays_a_tuple  s2    -.#u%%%sHc****r$   c                 P    t        ddddddg      }|dt        ddddgk(  sJ y )Nr^   r   )idrV      r   )r   r&   r   r   s     r"   test_list_of_dicts_is_maskedz2TestCollectionMasking.test_list_of_dicts_is_masked  s8    1#.q40HIJaX6q48PQQQQr$   c                 |    ddz  }t        dd|dddi      }|d   dk(  sJ ||   t        k(  sJ |d   t        k(  sJ y )Nki N  shortr   vrV   r   )r(   r   r~   )rY   long_keyr   s      r"   2test_overly_long_dict_key_replaces_only_that_entryzHTestCollectionMasking.test_overly_long_dict_key_replaces_only_that_entry  sX    ;GT8S*cBC7|t###8}(((:(***r$   r    c                 F    t        |       D ci c]  }d| |
 c}S c c}w )Nkeyrange)nis     r"   <lambda>zTestCollectionMasking.<lambda>)  s$    U1X6XQCy!|X66s   c                 *    t        t        |             S rf   )r!   r   r   s    r"   r   zTestCollectionMasking.<lambda>*  s    d58nr$   c                 *    t        t        |             S rf   )r   r   r   s    r"   r   zTestCollectionMasking.<lambda>+  s    eE!Hor$   )dictr!   r   )idsc                 z    t         |t        dz               t        k(  sJ t         |d            t        k7  sJ y )Nr^   r   )r(   r   r   )rY   r    s     r"   /test_collection_with_too_many_items_is_replacedzETestCollectionMasking.test_collection_with_too_many_items_is_replaced&  s8     E7!;<=IIIE!H~)))r$   c                 T    ddi}||d<   t        |      }|d   dk(  sJ |d   dk(  sJ y )Nr   r&   rY   <circular ref>r   )rY   dr   s      r"   (test_circular_dict_reference_is_detectedz>TestCollectionMasking.test_circular_dict_reference_is_detected4  sC    G&	1g5zW$$$6{....r$   c                 j    dg}|j                  |       t        |      }|d   dk(  sJ |d   dk(  sJ y )Nitemr   r^   r   )appendr(   )rY   itemsr   s      r"   (test_circular_list_reference_is_detectedz>TestCollectionMasking.test_circular_list_reference_is_detected<  sC    U5k1v1v))))r$   c                 ,    t        ddi      ddik(  sJ y )Nr^   r   r   (1, 2)r   rg   s    r"   8test_non_string_dict_key_is_coerced_to_stay_serializablezNTestCollectionMasking.test_non_string_dict_key_is_coerced_to_stay_serializableD  s    VTN#$'7777r$   c                 4    t        ddi      dt        ik(  sJ y )N)dbrV   r   z('db', 'password')r   rg   s    r"   2test_non_string_dict_key_still_redacts_on_its_namezHTestCollectionMasking.test_non_string_dict_key_still_redacts_on_its_nameH  s!    '-.3G2RRRRr$   c                 |     G d d      }t        d |       i      }|d   d   t        k(  sJ dt        |      vsJ y )Nc                       e Zd Zd Zd Zy)ZTestCollectionMasking.test_non_string_dict_key_does_not_defeat_value_masking.<locals>.Connc                     d| _         y Nhunter2rV   rg   s    r"   __init__zcTestCollectionMasking.test_non_string_dict_key_does_not_defeat_value_masking.<locals>.Conn.__init__P  s	     )r$   c                 "    d| j                    dS )NzConn()r  rg   s    r"   __repr__zcTestCollectionMasking.test_non_string_dict_key_does_not_defeat_value_masking.<locals>.Conn.__repr__S  s     t}}oQ//r$   N)rs   rt   ru   r  r  r   r$   r"   Connr   O  s    *0r$   r	  r   r   rV   r  r(   r~   rH   )rY   r	  r   s      r"   6test_non_string_dict_key_does_not_defeat_value_maskingzLTestCollectionMasking.test_non_string_dict_key_does_not_defeat_value_maskingL  sH    	0 	0 FDF#$8}Z(H444C(((r$   c                 \     G d dt               }t         |dd            dt        gk(  sJ y )Nc                        e Zd Z fdZ xZS )fTestCollectionMasking.test_sequence_subclass_that_cannot_be_rebuilt_falls_back_to_a_list.<locals>.Pairc                 (    t         |   | ||f      S rf   )super__new__)clsr   r   	__class__s      r"   r  znTestCollectionMasking.test_sequence_subclass_that_cannot_be_rebuilt_falls_back_to_a_list.<locals>.Pair.__new__`  s    wsQF33r$   )rs   rt   ru   r  __classcell__)r  s   @r"   Pairr  _  s    4 4r$   r  r   r   )r   r(   r~   )rY   r  s     r"   Btest_sequence_subclass_that_cannot_be_rebuilt_falls_back_to_a_listzXTestCollectionMasking.test_sequence_subclass_that_cannot_be_rebuilt_falls_back_to_a_list\  s0    	45 	4 D789dH=MMMMr$   c           	          fdt         t        j                  t         dd                  v sJ t         t        j                  t         dd                  vsJ y )Nc           	      j    |dk(  ri S t        |       D ci c]  }d|  | |dz
         c}S c c}w )Nr   r   r^   r   )widthdepthr   trees      r"   r  zRTestCollectionMasking.test_total_node_budget_caps_runaway_structures.<locals>.treeh  sA    z	=B5\J\asGT%33\JJJs   0         r   )r   jsondumpsr(   )rY   r  s    @r"   .test_total_node_budget_caps_runaway_structureszDTestCollectionMasking.test_total_node_budget_caps_runaway_structurese  sO    	K
 4::d41:&67777tzz$tAqz*:;;;;r$   N)rs   rt   ru   rv   r   r   r   r   r   r   r   r   rA   r   r   r   r   r   r   r   r  r  r!  r   r$   r"   r   r      s    UVHN/
+R
+ [[6$%	

 &  **
/*8S) N	<r$   r   c                       e Zd ZdZd Zd Zd Zd Zd Ze	j                  j                  deedz   g      d	        Zd
 Zd Zd Zd Zd Zd Zd Zd Zy)TestObjectTraversalzCustom objects are decomposed into their real fields, so a `password` attribute
    is caught by name instead of leaking through repr().c                     t          G d d             }t         |ddd            }|d   dk(  sJ |d   dk(  sJ |d   t        k(  sJ d|d	   v sJ dt        |      vsJ y )
Nc                   ,    e Zd ZU eed<   eed<   eed<   y)PTestObjectTraversal.test_dataclass_is_decomposed_into_its_fields.<locals>.ConfighostuserrV   Nrs   rt   ru   rH   __annotations__r   r$   r"   Configr&  z  s    IIMr$   r+  db.example.com	warehouseuHjH9secretr'  r(  rV   r  r   r(   r~   rH   rY   r+  r   s      r"   ,test_dataclass_is_decomposed_into_its_fieldsz@TestObjectTraversal.test_dataclass_is_decomposed_into_its_fieldsx  s    		 	 
	
 6*KGH6{....6{k))):(***3{++++CH,,,r$   c                      G d d      }t         |             }|d   dk(  sJ |d   t        k(  sJ dt        |      vsJ y )Nc                       e Zd Zd Zy)UTestObjectTraversal.test_plain_object_is_decomposed_via_its_dict.<locals>.Credentialsc                      d| _         d| _        y )Nalicesk_live_abc123)usernamer   rg   s    r"   r  z^TestObjectTraversal.test_plain_object_is_decomposed_via_its_dict.<locals>.Credentials.__init__  s     '/r$   Nrs   rt   ru   r  r   r$   r"   Credentialsr4    s    0r$   r:  r8  r6  r   r7  r
  )rY   r:  r   s      r"   ,test_plain_object_is_decomposed_via_its_dictz@TestObjectTraversal.test_plain_object_is_decomposed_via_its_dict  sP    	0 	0
 ;=!:')))9~)))s3x///r$   c                     t          G d d             }t          G d d             }t         |dd       |d      f      }|d   d	   dk(  sJ |d   d
   t        k(  sJ |d   d   dk(  sJ dt        |      vsJ y )Nc                   "    e Zd ZU eed<   eed<   y)QTestObjectTraversal.test_object_nested_in_a_tuple_is_still_masked.<locals>.Configr'  rV   Nr)  r   r$   r"   r+  r>    s    IMr$   r+  c                       e Zd ZU eed<   y)QTestObjectTraversal.test_object_nested_in_a_tuple_is_still_masked.<locals>.Inputsschema_nameNr)  r   r$   r"   Inputsr@    s    r$   rB  r   ry   trafficr   r'  rV   r^   rA  r/  )rY   r+  rB  r   s       r"   -test_object_nested_in_a_tuple_is_still_maskedzATestObjectTraversal.test_object_nested_in_a_tuple_is_still_masked  s    		 	 
	 
	 	 
	 F4-vi/@AB1vf~%%%1vj!X---1vm$	111#c(***r$   c                      G d d      }t         |t        dz               t        k(  sJ t        t         |d            t              sJ y )Nc                       e Zd Zd Zy)RTestObjectTraversal.test_object_with_too_many_attributes_is_replaced.<locals>.Widec                 D    t        |      D ]  }t        | d| |        y )Nattr)r   setattr)rY   r   r   s      r"   r  z[TestObjectTraversal.test_object_with_too_many_attributes_is_replaced.<locals>.Wide.__init__  s"    qADD*a0 "r$   Nr9  r   r$   r"   WiderG    s    1r$   rK  r^   r   )r(   r   r   r   r   )rY   rK  s     r"   0test_object_with_too_many_attributes_is_replacedzDTestObjectTraversal.test_object_with_too_many_attributes_is_replaced  sD    	1 	1
 D6:;<HHH$tAw-...r$   c                     t          G d d             }t         |d            }|d   t        k(  sJ dt        |      vsJ y )Nc                       e Zd ZU eed<   y)OTestObjectTraversal.test_shallow_object_secret_is_redacted_by_name.<locals>.BoxrV   Nr)  r   r$   r"   BoxrO    s    Mr$   rP  r  rV   r/  )rY   rP  r   s      r"   .test_shallow_object_secret_is_redacted_by_namezBTestObjectTraversal.test_shallow_object_secret_is_redacted_by_name  sM    		 	 
	 3y>":(***C(((r$   r     c                     t          G d d             } G d d      } |d      }t        |      D ]
  } ||      } dt        t        |            vsJ y )Nc                       e Zd ZU eed<   d Zy)OTestObjectTraversal.test_secret_past_the_depth_limit_does_not_leak.<locals>.BoxrV   c                 "    d| j                    dS )NBox(r  r  rg   s    r"   r  zXTestObjectTraversal.test_secret_past_the_depth_limit_does_not_leak.<locals>.Box.__repr__  s    dmm_A..r$   N)rs   rt   ru   rH   r*  r  r   r$   r"   rP  rU    s    M/r$   rP  c                       e Zd Zd Zy)PTestObjectTraversal.test_secret_past_the_depth_limit_does_not_leak.<locals>.Nodec                     || _         y rf   )child)rY   r[  s     r"   r  zYTestObjectTraversal.test_secret_past_the_depth_limit_does_not_leak.<locals>.Node.__init__  	    "
r$   Nr9  r   r$   r"   NoderY    s    #r$   r]  r  )r   r   rH   r(   )rY   r  rP  r]  r&   _s         r"   .test_secret_past_the_depth_limit_does_not_leakzBTestObjectTraversal.test_secret_past_the_depth_limit_does_not_leak  s^    
 
	/ 	/ 
	/	# 	# IuAKE DK 0000r$   c                     d}t        t        dz         D ]  }|g} t        |      }t        t	        |      v sJ dt	        |      vsJ y )Nleafr^   )r   r	   r(   r   rH   )rY   r&   r^  r   s       r"   =test_structure_past_the_depth_limit_degrades_to_a_placeholderzQTestObjectTraversal.test_structure_past_the_depth_limit_degrades_to_a_placeholder  sO    *+AGE ,5k3s8###SX%%%r$   c                     t        j                  dddg      }t         |dd            }|d   dk(  sJ |d   t        k(  sJ d|d   v sJ dt	        |      vsJ y )NCredsr(  rV   r6  r.  r  collections
namedtupler(   r~   rH   rY   rd  r   s      r"   +test_namedtuple_is_decomposed_by_field_namez?TestObjectTraversal.test_namedtuple_is_decomposed_by_field_name  ss    &&w0DE5-016{g%%%:(***#k****CH,,,r$   c           	           G d dt        j                  dddg            }t         |dd            }|d   t        k(  sJ dt	        |      vsJ y )Nc                       e Zd Zd Zy)STestObjectTraversal.test_namedtuple_field_is_caught_by_name_not_repr.<locals>.Tokenc                 "    d| j                    dS )N<>)labelrg   s    r"   r  z\TestObjectTraversal.test_namedtuple_field_is_caught_by_name_not_repr.<locals>.Token.__repr__  s    4::,a((r$   N)rs   rt   ru   r  r   r$   r"   Tokenrl    s    )r$   rq  rp  rc   prodsk_live_xyzre  )rY   rq  r   s      r"   0test_namedtuple_field_is_caught_by_name_not_reprzDTestObjectTraversal.test_namedtuple_field_is_caught_by_name_not_repr  sW    	)K**7Wh4GH 	) 5/08}(((CH,,,r$   c                      G d d      }t         |             }|d   t        k(  sJ d|d   v sJ dt        |      vsJ y )Nc                   "    e Zd Zed        Zd Zy)^TestObjectTraversal.test_sensitively_named_property_is_not_leaked_through_repr.<locals>.Configc                      yr  r   rg   s    r"   rV   zgTestObjectTraversal.test_sensitively_named_property_is_not_leaked_through_repr.<locals>.Config.password  s     r$   c                 "    d| j                    dS NzConfig(r  r  rg   s    r"   r  zgTestObjectTraversal.test_sensitively_named_property_is_not_leaked_through_repr.<locals>.Config.__repr__       q11r$   N)rs   rt   ru   propertyrV   r  r   r$   r"   r+  rw    s    ! !2r$   r+  rV   r  r  r
  r0  s      r"   :test_sensitively_named_property_is_not_leaked_through_reprzNTestObjectTraversal.test_sensitively_named_property_is_not_leaked_through_repr  sP    	2 	2 68n:(***3{++++C(((r$   c                 r     G d d      }t         |             }|d   t        k(  sJ dt        |      vsJ y )Nc                   6    e Zd Zej                  d        Zd Zy)XTestObjectTraversal.test_sensitively_named_cached_property_is_not_leaked.<locals>.Clientc                      y)Nrs  r   rg   s    r"   r   z`TestObjectTraversal.test_sensitively_named_cached_property_is_not_leaked.<locals>.Client.api_key  s    $r$   c                 "    d| j                    dS )NzClient(r  )r   rg   s    r"   r  zaTestObjectTraversal.test_sensitively_named_cached_property_is_not_leaked.<locals>.Client.__repr__  s     a00r$   N)rs   rt   ru   	functoolscached_propertyr   r  r   r$   r"   Clientr    s    &&% '%1r$   r  r   rs  r
  )rY   r  r   s      r"   4test_sensitively_named_cached_property_is_not_leakedzHTestObjectTraversal.test_sensitively_named_cached_property_is_not_leaked  s=    	1 	1 68n9~)))CH,,,r$   c                 t     G d d      }t         |d            }|d   t        k(  sJ dt        |      vsJ y )Nc                       e Zd ZdZd Zd Zy)TTestObjectTraversal.test_sensitively_named_slot_is_redacted_by_name.<locals>.Sessiontokenc                     || _         y rf   r  )rY   r  s     r"   r  z]TestObjectTraversal.test_sensitively_named_slot_is_redacted_by_name.<locals>.Session.__init__  r\  r$   c                 "    d| j                    dS )NzSession(r  r  rg   s    r"   r  z]TestObjectTraversal.test_sensitively_named_slot_is_redacted_by_name.<locals>.Session.__repr__  s    !$**Q//r$   Nrs   rt   ru   	__slots__r  r  r   r$   r"   Sessionr    s    "I#0r$   r  rs  r  r
  )rY   r  r   s      r"   /test_sensitively_named_slot_is_redacted_by_namezCTestObjectTraversal.test_sensitively_named_slot_is_redacted_by_name  sA    	0 	0 7=)*7|x'''CH,,,r$   c                 r     G d d      }t         |             }|d   t        k(  sJ dt        |      vsJ y )Nc                       e Zd ZdZd Zy)^TestObjectTraversal.test_sensitively_named_class_attribute_is_redacted_by_name.<locals>.Configr  c                 "    d| j                    dS rz  r  rg   s    r"   r  zgTestObjectTraversal.test_sensitively_named_class_attribute_is_redacted_by_name.<locals>.Config.__repr__  r{  r$   N)rs   rt   ru   rV   r  r   r$   r"   r+  r    s     H2r$   r+  rV   r  r
  r0  s      r"   :test_sensitively_named_class_attribute_is_redacted_by_namezNTestObjectTraversal.test_sensitively_named_class_attribute_is_redacted_by_name  s=    	2 	2 68n:(***C(((r$   c                 B     G d d      }t         |             dk(  sJ y )Nc                   ,    e Zd ZdZd Zed        Zd Zy)WTestObjectTraversal.test_non_sensitive_members_are_left_to_the_normal_repr.<locals>.Boxregionc                     d| _         y )Nz	us-east-1r  rg   s    r"   r  z`TestObjectTraversal.test_non_sensitive_members_are_left_to_the_normal_repr.<locals>.Box.__init__+  s	    )r$   c                      y)Nr,  r   rg   s    r"   r'  z\TestObjectTraversal.test_non_sensitive_members_are_left_to_the_normal_repr.<locals>.Box.host.  s    'r$   c                 <    d| j                    d| j                   dS )NrW  /r  )r'  r  rg   s    r"   r  z`TestObjectTraversal.test_non_sensitive_members_are_left_to_the_normal_repr.<locals>.Box.__repr__2  s    dii[$++a88r$   N)rs   rt   ru   r  r  r|  r'  r  r   r$   r"   rP  r  (  s%    #I* ( (9r$   rP  zBox(db.example.com/us-east-1)r   )rY   rP  s     r"   6test_non_sensitive_members_are_left_to_the_normal_reprzJTestObjectTraversal.test_non_sensitive_members_are_left_to_the_normal_repr%  s#    	9 	9 CE{====r$   N)rs   rt   ru   rv   r1  r;  rD  rL  rQ  rA   r   r   r	   r_  rb  ri  rt  r}  r  r  r  r  r   r$   r"   r#  r#  t  sx    <-
0+"/) [[W!8K&LM1 N1(&-	-) -- )>r$   r#  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestOpaqueReprFallbackzSlotted objects have no __dict__ to walk, so they fall back to a fail-closed
    repr: keep it only if nothing about it looks sensitive.c                 T     G d d      }t         |       t                     dk(  sJ y )Nc                       e Zd ZdZd Zy)TTestOpaqueReprFallback.test_repr_is_kept_when_nothing_looks_sensitive.<locals>.Point)r   yc                      y)NPoint(x=1, y=2)r   rg   s    r"   r  z]TestOpaqueReprFallback.test_repr_is_kept_when_nothing_looks_sensitive.<locals>.Point.__repr__C  s    (r$   Nrs   rt   ru   r  r  r   r$   r"   Pointr  @  s    "I)r$   r  r  r   r#   )rY   r  s     r"   .test_repr_is_kept_when_nothing_looks_sensitivezETestOpaqueReprFallback.test_repr_is_kept_when_nothing_looks_sensitive?  s(    	) 	) %';=15FFFFr$   c                      G d d      }t         |       t                     t        k(  sJ t         |             t        k(  sJ y )Nc                       e Zd ZdZd Zy)^TestOpaqueReprFallback.test_whole_value_is_redacted_when_repr_mentions_a_secret.<locals>.Credsr   c                      y)NzCreds(password=s3cr3t)r   rg   s    r"   r  zgTestOpaqueReprFallback.test_whole_value_is_redacted_when_repr_mentions_a_secret.<locals>.Creds.__repr__N  s    /r$   Nr  r   r$   r"   rd  r  K  s    I0r$   rd  )r   r#   r~   r(   )rY   rd  s     r"   8test_whole_value_is_redacted_when_repr_mentions_a_secretzOTestOpaqueReprFallback.test_whole_value_is_redacted_when_repr_mentions_a_secretH  s;    	0 	0 %';=1X===EG}(((r$   c                      G d d      }t         |       t                     }d|vsJ |j                  d      r|j                  d      sJ d|v sJ y )Nc                       e Zd ZdZd Zd Zy)OTestOpaqueReprFallback.test_broken_repr_yields_a_type_placeholder.<locals>.Boomrc   c                     d| _         y )Nleak123r  rg   s    r"   r  zXTestOpaqueReprFallback.test_broken_repr_yields_a_type_placeholder.<locals>.Boom.__init__Y  s	    'r$   c                     t        d      )Nboom)RuntimeErrorrg   s    r"   r  zXTestOpaqueReprFallback.test_broken_repr_yields_a_type_placeholder.<locals>.Boom.__repr__\  s    "6**r$   Nr  r   r$   r"   Boomr  V  s    #I(+r$   r  r  rn  ro  )r   r#   
startswithendswith)rY   r  r   s      r"   *test_broken_repr_yields_a_type_placeholderzATestOpaqueReprFallback.test_broken_repr_yields_a_type_placeholderT  sY    	+ 	+ DFKM2&&&  %&//#*>>>r$   c                 |     G d d      }ddt         dz   z  z   }t         ||      t                     t        k(  sJ y )Nc                       e Zd ZdZd Zd Zy)FTestOpaqueReprFallback.test_overly_long_repr_is_redacted.<locals>.Hugepayloadc                     || _         y rf   r  )rY   r  s     r"   r  zOTestOpaqueReprFallback.test_overly_long_repr_is_redacted.<locals>.Huge.__init__i  s	    &r$   c                     | j                   S rf   r  rg   s    r"   r  zOTestOpaqueReprFallback.test_overly_long_repr_is_redacted.<locals>.Huge.__repr__l  s    ||#r$   Nr  r   r$   r"   Huger  f  s    $I'$r$   r  ry   r   r^   )r
   r   r#   r~   )rY   r  r  s      r"   !test_overly_long_repr_is_redactedz8TestOpaqueReprFallback.test_overly_long_repr_is_redactedd  s>    	$ 	$ 'JQ'N OO$w-78CCCr$   c                      G d d      }dt         |       t                     vsJ dt         |       t        d            v sJ y )Nc                       e Zd ZdZd Zy)NTestOpaqueReprFallback.test_url_credentials_in_repr_are_scrubbed.<locals>.Connr   c                      y)Nz)Conn(url=postgresql://user:leakpw@db/app)r   rg   s    r"   r  zWTestOpaqueReprFallback.test_url_credentials_in_repr_are_scrubbed.<locals>.Conn.__repr__w  s    Br$   Nr  r   r$   r"   r	  r  t  s    ICr$   r	  leakpwF)r   r  )rY   r	  s     r"   )test_url_credentials_in_repr_are_scrubbedz@TestOpaqueReprFallback.test_url_credentials_in_repr_are_scrubbedr  sE    	C 	C z$&+-@@@@:dfkE.JKKKKr$   N)	rs   rt   ru   rv   r  r  r  r  r  r   r$   r"   r  r  ;  s#    ?G
)  D	Lr$   r  c                      e Zd ZdZej
                  j                  dg d      d        Zd Zej
                  j                  d e	d      df e	d      df e	d	      d	fg      d
        Z
d Zd Zd Zd Zd Zd Zd Zy)TestVariableEncodingzThe top-level encoder decides the wire format: numbers stay raw, everything else
    becomes a string, and the size budget is enforced.r&   )r   r   r   r   g      ?c                 $    t        |      |k(  sJ y rf   r,   r   s     r"   "test_numbers_stay_raw_json_numbersz7TestVariableEncoding.test_numbers_stay_raw_json_numbers  s    e}%%%r$   c                 d    t        d       dk(  sJ t        d      dk(  sJ t        d      dk(  sJ y )NNoneTTrueFFalser  rg   s    r"   %test_none_and_booleans_become_stringsz:TestVariableEncoding.test_none_and_booleans_become_strings  s8    d|v%%%d|v%%%e}'''r$   r   r   r   r   c                 $    t        |      |k(  sJ y rf   r  r   s      r"   r   z:TestVariableEncoding.test_non_finite_floats_become_strings  s    
 e}(((r$   c                 $    t        d      dk(  sJ y r   r  rg   s    r"    test_string_is_emitted_unchangedz5TestVariableEncoding.test_string_is_emitted_unchanged  s    m$555r$   c                 *    t        ddd      dk(  sJ y )Nr   r   r   z{"name": "test", "value": 123}r  rg   s    r"   test_dict_becomes_a_json_stringz4TestVariableEncoding.test_dict_becomes_a_json_string  s     FS126VV	
Vr$   c                     t        t        d      dd      }d|vrd|vsJ t        j                  |      dddk(  sJ y )Nr   g      ?)ratior   NaNInfinity)r,   r   r  loadsr   s     r"   8test_nested_non_finite_floats_keep_the_json_strict_validzMTestVariableEncoding.test_nested_non_finite_floats_keep_the_json_strict_valid  sE    uU|378CJc$999zz#E"====r$   c                 `    t        d      }t        |      dk(  sJ |j                  d      sJ y )N  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaai   z...)r,   r`   r  r   s     r"   ,test_value_is_truncated_to_the_length_budgetzATestVariableEncoding.test_value_is_truncated_to_the_length_budget  s0    Z 3x4||E"""r$   c                 ^    t        d      }t        d|      dk(  sJ t        d|      J y )Nr  )max_sizer   r)   overflow)r   r,   )rY   r*   s     r"   9test_value_is_dropped_when_the_shared_budget_is_exhaustedzNTestVariableEncoding.test_value_is_dropped_when_the_shared_budget_is_exhausted  s4    %q1dG,444j'2:::r$   c                 r    t        dddii      }t        j                  |      ddt        iik(  sJ d|vsJ y )Nr   rV   r  r   )r,   r  r  r~   r   s     r"   5test_dict_with_a_non_string_key_encodes_to_valid_jsonzJTestVariableEncoding.test_dict_with_a_non_string_key_encodes_to_valid_json  sF     fz9567zz#8j(-C"DDDD###r$   c                     t        j                  dddg      }t         |dd            }t        j                  |      d   t
        k(  sJ d|vsJ y )Nrd  r(  rV   r6  r  )rf  rg  r,   r  r  r~   rh  s      r"   %test_namedtuple_encodes_to_valid_jsonz:TestVariableEncoding.test_namedtuple_encodes_to_valid_json  sS    &&w0DEU7I./zz#z*h666###r$   N)rs   rt   ru   rv   rA   r   r   r  r  r   r   r  r  r  r  r  r  r  r   r$   r"   r  r    s    : [[W&<=& >&(
 [[
,	uu 5fv7NO)	)6
>#
;
$$r$   r  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestFrameVariableExtractionztReading a frame's locals: ignored names dropped, masked names redacted, scalars
    ordered ahead of complex values.c                 6    t        dddi      }|dddk(  sJ y )Nr  r   r^   )countdataz{"a": 1}r6   r   s     r"   -test_simple_and_complex_locals_are_serializedzITestFrameVariableExtraction.test_simple_and_complex_locals_are_serialized  s%    AS!H-:6666r$   c                 ,    t        dd      ddik(  sJ y )Nr^   r   )visible__hiddenr  r  rg   s    r"   test_ignored_names_are_skippedz:TestFrameVariableExtraction.test_ignored_names_are_skipped  s    q1-)Q???r$   c                 2    t        d      dt        ik(  sJ y )Nr   r  rV   r6   r~   rg   s    r"   ;test_variable_whose_name_matches_the_mask_is_redacted_wholezWTestFrameVariableExtraction.test_variable_whose_name_matches_the_mask_is_redacted_whole  s    
+
H/EEEEr$   c                 L    t        dddgddi      }t        |      g dk(  sJ y )Nr^   r   r   )zr   mr  )r   r  r  r  )r6   r!   r   s     r"   =test_scalars_come_first_then_complex_values_each_group_sortedzYTestFrameVariableExtraction.test_scalars_come_first_then_complex_values_each_group_sorted  s+    Q1#S!H5Cy3333r$   c                   	
 ddl m} d 

fdfd}	  |d       t        t        d               }t        |      dk\  sJ |D cg c]  }d	d
i }}dd|iig}g 	|j                  |j                  |d	fd       t        ||t        t              t        t                     t        	      dk(  sJ t        d |D              dk\  sJ y # t        $ r t        j                         }Y w xY wc c}w )Nr   )exception_utilsc                     t        |       rf   )
ValueError)r   s    r"   deepestzXTestFrameVariableExtraction.test_patterns_are_compiled_once_per_capture.<locals>.deepest  s    T""r$   c                      |        y rf   r   )r   r  s    r"   middlezWTestFrameVariableExtraction.test_patterns_are_compiled_once_per_capture.<locals>.middle  s
    DMr$   c                      |        y rf   r   )r   r  s    r"   outerzVTestFrameVariableExtraction.test_patterns_are_compiled_once_per_capture.<locals>.outer  s
    4Lr$   r  r   r  in_appT
stacktraceframesr   c                 :    j                  |       xs  |       S rf   )r   )r   compile_callsreal_compiles    r"   r   zYTestFrameVariableExtraction.test_patterns_are_compiled_once_per_capture.<locals>.<lambda>  s    ]11(;U|H?UUr$   c              3   $   K   | ]  }d |v  
 yw)code_variablesNr   ).0r5   s     r"   	<genexpr>zZTestFrameVariableExtraction.test_patterns_are_compiled_once_per_capture.<locals>.<genexpr>  s     A&#u,&s   )posthogr  r  rF   exc_infor!   r   r`   r   rJ  r   r   r   sum)rY   monkeypatchr  r  r  	tb_framesr^  r  all_exceptionsr  r  r  r  s            @@@@r"   +test_patterns_are_compiled_once_per_capturezGTestFrameVariableExtraction.test_patterns_are_compiled_once_per_capture  s    	,	#			&&M Xa[12	9~""",56Iq8T"I6'(F);<=&88U	
 	(5678		
 =!Q&&&A&AAQFFF5  	&||~H	&
 7s   C C8C54C5N)	rs   rt   ru   rv   r  r  r  r  r  r   r$   r"   r  r    s#    (7
@F4
+Gr$   r  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestEndToEndzThe whole code-variables pipeline through a real subprocess: an uncaught
    exception is autocaptured and its serialized payload (with code_variables) is
    printed in debug mode.c                     t        |d      }d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ dt        z  |v sJ dt        z  |v sJ d	|vsJ y )
Na  
            make_client(capture_exception_code_variables=True)

            def trigger_error():
                greeting = "hello world"
                count = 42
                data = {"name": "test", "value": 123}
                password = "secret123"           # name matches -> redacted
                note = "contains_password_here"  # value matches -> redacted
                __hidden = "ignored"             # dunder -> skipped
                1 / 0

            trigger_error()
            ZeroDivisionError'code_variables':z'greeting': 'hello world'z'count': 42z."data": "{\"name\": \"test\", \"value\": 123}"z'password': '%s'z'note': '%s'z
'__hidden'rQ   r~   rY   rL   rJ   s      r"   +test_code_variables_are_captured_and_maskedz8TestEndToEnd.test_code_variables_are_captured_and_masked  s     
" #f,,,"f,,,*f444&&&EOOO!H,666(F2226)))r$   c                 @    t        |d      }d|v sJ d|vsJ d|vsJ y )Nz
            make_client(capture_exception_code_variables=False)

            def trigger_error():
                value = "hello world"
                1 / 0

            trigger_error()
            r  r  z"code_variables":rQ   r   s      r"   2test_code_variables_are_not_captured_when_disabledz?TestEndToEnd.test_code_variables_are_not_captured_when_disabled-  sB    
 #f,,, #&000"&000r$   c                 N    t        |d      }d|v sJ dt        z  |v sJ d|v sJ y )Na?  
            client = make_client(capture_exception_code_variables=False)

            def process_data():
                bank = "should_be_masked"  # matched by the custom context pattern
                account = "visible"
                1 / 0

            with posthog.new_context(client=client):
                posthog.set_capture_exception_code_variables_context(True)
                posthog.set_code_variables_mask_patterns_context([r"(?i).*bank.*"])
                posthog.set_code_variables_ignore_patterns_context([])
                process_data()
            r  z'bank': '%s'z'account': 'visible'r  r   s      r"   /test_a_context_can_enable_and_customize_maskingz<TestEndToEnd.test_a_context_can_enable_and_customize_masking@  sE    
"  6)))(F222%///r$   c                 h    t        |dddi      }d|v sJ d|vsJ t        |v sJ d|v sJ d|v sJ y )Na}  
            from dataclasses import dataclass

            @dataclass
            class PostgresConfig:
                host: str
                password: str

            @dataclass
            class Inputs:
                schema_name: str

            make_client(capture_exception_code_variables=True)

            def trigger_error():
                secret = os.environ["TEST_DB_PASSWORD"]
                args = (
                    PostgresConfig(host="db.example.com", password=secret),
                    Inputs(schema_name="traffic_stats"),
                )
                1 / 0

            trigger_error()
            TEST_DB_PASSWORDuHjH9WJuEV0VT2NKoP7zpQr7   r  PostgresConfigtraffic_statsr  r   s      r"   #test_object_secret_is_never_emittedz0TestEndToEnd.test_object_secret_is_never_emittedW  si     0 $%=>5
8  6)))'v5556!!!6)))&(((r$   c                 <    t        |dddi      }d|v sJ d|v sJ y )NaW  
            make_client(
                capture_exception_code_variables=True,
                code_variables_mask_url_credentials=False,
            )

            def trigger_error():
                db_uri = "postgresql://user:" + os.environ["TEST_DB_PASSWORD"] + "@host/db"
                1 / 0

            trigger_error()
            r(  p4ssRUNTIMEr7   r  r#  r   s      r"   +test_url_credential_masking_can_be_disabledz8TestEndToEnd.test_url_credential_masking_can_be_disabled|  s>      $]3
   6)))&&&r$   N)	rs   rt   ru   rv   r!  r$  r&  r,  r/  r   r$   r"   r  r    s"    *B1&0.#)J'r$   r  c                     | |z   S rf   r   )prefixrM   s     r"   _keyr2    s    D=r$   zsk-proj-4T3BlbkFJabcd1234efgh5678ijkl9012mnop3456qrst7890wxyzzsk-8Hf8sJd72hsKbNd83jdH5sQp2T3BlbkFJabcdEFGH1234ijklMNOPqrstzsk-ant-z9api03-aBcDeFgHiJkLmNoPqRsTuVwX0123456789-AbCdEf_gHiJkLmQQAKIAIOSFODNN7EXAMPLEsk_live_4eC39HqLyjWDarjtT1zdp7dcpk_live_TYooMQauvdEDq54NiTphI7jxghp_$16C7e42F292c6912E7710c838347Ae178B4agithub_pat_511ABCDEFG0aBcDeFgHiJkL_mNoPqRsTuVwXyZ0123456789abcdefzglpat-aB1cD2eF3gH4iJ5kL6mNzxoxb-z11234567890-1234567890123-AbCdEfGhIjKlMnOpQrStUvWxAIzaz%SyD-1a2B3c4D5e6F7g8H9i0JkLmNoPqRsTuVweyJzDhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5Nhf_"aBcDeFgHiJkLmNoPqRsTuVwXyZ01234567zya29.z"a0AfH6SMBx1y2z3-_abcDEFghiJKLmnoPQzsq0atp-1a2B3c4D5e6F7g8H9i0JkLglsa_)aBcDeFgHiJkLmNoPqRsTuVwXyZ012345_a1b2c3d4SK 0123456789abcdef0123456789abcdefzSG.zBaBcDeFgHiJkLmNoPqRsTuV.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQnpm_$aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789dapizPMAK-z=0123456789abcdef01234567-0123456789abcdef0123456789abcdef0123lin_api_(0123456789abcdef0123456789abcdef01234567shpat_zNRAK-0123456789ABCDEFGHIJKLMNOPQz-us12z4-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA1234z4-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXkt)z(wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYzxK9#mP2$vL5nQ8w!zP@ssw0rd!2024#Secure$KeyxK9mP2vL5nQ8wRtZn8fK2pQ9vX7mL4wR8tY3uZ6bC1dE5gHz dGhpc2lzYVNlY3JldFRva2VuMTIzNA==)$550e8400-e29b-41d4-a716-446655440000z$F47AC10B-58CC-4372-A567-0E02B2C3D479507f1f77bcf86cd799439011(e83c5163316f89bfbde7d9ab23ca2e25604af290 d41d8cd98f00b204e9800998ecf8427e@9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 a7F2c9E1b4D8a3C6e0F5b2D9c7A1e4F8zPCheckActivityInput(proxy_record_id=UUID('019df333-e9e2-0000-fa8e-ba3dd4217c09'))zG<posthog.temporal.common._ActivityInterceptor object at 0xffff77a7a850>zEExecuteActivityInput(fn=check_status,args=[Input(id=42,name=widget)])user_authentication_handlergetUserByIdAndOrganizationgetUserById2024ApplicationConfigurationManagerPENDING_APPROVALzcreated-at-descendingzapplication/jsonzalice.smith@example.comzthe quick brown fox jumps overz9/usr/local/lib/python3.13/site-packages/posthog/client.pyzC:\Users\admin\app\config.yamlz-https://api.example.com/v2/users/12345/orders1234567890123456z3.141592653589793z2026-06-23T11:11:00.000Zzv1.2.3-beta.4activec                   $   e Zd ZdZej
                  j                  de      d        Zej
                  j                  de	      d        Z
ej
                  j                  de      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y)TestSecretDetectionzThe entropy-based last-resort detector: catches vendor keys and strong
    random secrets, while leaving ids/hashes/identifiers/paths readable.r&   c                 "    t        |      du sJ y NTr   r   s     r"   &test_known_vendor_formats_are_detectedz:TestSecretDetection.test_known_vendor_formats_are_detected      !%(D000r$   c                 "    t        |      du sJ y rb  rc  r   s     r"   &test_high_entropy_secrets_are_detectedz:TestSecretDetection.test_high_entropy_secrets_are_detected  re  r$   c                 "    t        |      du sJ y )NFrc  r   s     r"    test_non_secrets_are_not_flaggedz4TestSecretDetection.test_non_secrets_are_not_flagged   s    !%(E111r$   c                 @    t        d      du sJ t        d      du sJ y )NrR  FrS  rc  rg   s    r"   +test_uuids_and_object_ids_are_never_flaggedz?TestSecretDetection.test_uuids_and_object_ids_are_never_flagged  s*    !"HIURRR!"<=FFFr$   c                 @    t        d      du sJ t        d      du sJ y )NzxK9#mP2$F)r   r   rg   s    r"   test_short_strings_bail_cheaplyz3TestSecretDetection.test_short_strings_bail_cheaply  s(    !*-666&z2e;;;r$   c                 "    t        d      du sJ y )NrU  F)r   rg   s    r"   .test_pure_hex_is_treated_as_an_id_not_a_secretzBTestSecretDetection.test_pure_hex_is_treated_as_an_id_not_a_secret  s    &'IJeSSSr$   c                 6    t        d      }|dt        ik(  sJ y )NrQ  )api_responserq  r  r   s     r"   9test_high_entropy_value_in_a_neutral_variable_is_redactedzMTestSecretDetection.test_high_entropy_value_in_a_neutral_variable_is_redacted  s     &GH.(3333r$   c                 T    t        dt        dd      dgi      }|dt        dgik(  sJ y )Nentriesr7  r8  zplain-value)r(   r2  r~   r   s     r"   1test_secret_inside_a_nested_structure_is_redactedzETestSecretDetection.test_secret_inside_a_nested_structure_is_redacted  s;    j*DE}UV
 y8]";<<<<r$   c                 .    t        d      }|ddik(  sJ y )NrS  )order_idrw  r  r   s     r"   test_object_id_value_survivesz1TestSecretDetection.test_object_id_value_survives  s!    "<=*&@AAAAr$   c                 J     G d d      }t         |             t        k(  sJ y )Nc                       e Zd ZdZd Zy)^TestSecretDetection.test_opaque_object_whose_repr_is_a_secret_is_redacted.<locals>.OpaqueTokenr   c                      y)NrQ  r   rg   s    r"   r  zgTestSecretDetection.test_opaque_object_whose_repr_is_a_secret_is_redacted.<locals>.OpaqueToken.__repr__%  s    8r$   Nr  r   r$   r"   OpaqueTokenr{  "  s    I9r$   r}  r   )rY   r}  s     r"   5test_opaque_object_whose_repr_is_a_secret_is_redactedzITestSecretDetection.test_opaque_object_whose_repr_is_a_secret_is_redacted  s#    	9 	9 KM"h...r$   c                 B     G d d      }t         |             dk(  sJ y )Nc                       e Zd ZdZd Zy)LTestSecretDetection.test_ordinary_object_repr_is_not_redacted.<locals>.Thingr   c                      y)N<Thing alive=True count=3>r   rg   s    r"   r  zUTestSecretDetection.test_ordinary_object_repr_is_not_redacted.<locals>.Thing.__repr__.  s    3r$   Nr  r   r$   r"   Thingr  +  s    I4r$   r  r  r   )rY   r  s     r"   )test_ordinary_object_repr_is_not_redactedz=TestSecretDetection.test_ordinary_object_repr_is_not_redacted*  s#    	4 	4 EG} <<<<r$   c                 t    t        j                  t        t              g d      }d}t	        ||      |k(  sJ y )NF)detect_secretsrQ  )r   r    r!   r   r   )rY   r4   rc   s      r"   test_detection_can_be_disabledz2TestSecretDetection.test_detection_can_be_disabled3  s;    %%565
 366*f444r$   c                 `    t        j                  g g dd      }t        d|      t        k(  sJ y )NFT)r   r  rQ  )r   r    r   r~   )rY   r4   s     r"   .test_detection_is_independent_of_url_scrubbingzBTestSecretDetection.test_detection_is_independent_of_url_scrubbing:  s3    %%t
 <fEQQQr$   c                 P    t        |dddi      }d|v sJ d|vsJ t        |v sJ y )Nz
            make_client(capture_exception_code_variables=True)

            def trigger_error():
                handle = os.environ["TEST_TOKEN"]
                1 / 0

            trigger_error()
            
TEST_TOKENrQ  r7   r  r  r   s      r"   0test_end_to_end_neutral_named_secret_is_redactedzDTestSecretDetection.test_end_to_end_neutral_named_secret_is_redacted@  sK     @A
  6)))0>>>6!!!r$   c                 <    t        |dddi      }d|v sJ d|v sJ y )Na'  
            make_client(
                capture_exception_code_variables=True,
                code_variables_detect_secrets=False,
            )

            def trigger_error():
                handle = os.environ["TEST_TOKEN"]
                1 / 0

            trigger_error()
            r  rQ  r7   r  r#  r   s      r"   4test_end_to_end_detection_disabled_via_client_optionzHTestSecretDetection.test_end_to_end_detection_disabled_via_client_optionS  s=     @A
   6)))0F:::r$   N)rs   rt   ru   rv   rA   r   r   KNOWN_FORMAT_SECRETSrd  HIGH_ENTROPY_SECRETSrg  NON_SECRETSri  rk  rm  ro  rr  ru  rx  r~  r  r  r  r  r  r   r$   r"   r`  r`    s    L [[W&:;1 <1 [[W&:;1 <1 [[Wk22 32G<T
4=B	/=5R"&;r$   r`  )8rf  r  r  r?   rC   rF   r1   dataclassesr   textwrapr   rA   posthog.exception_utilsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r~   r   r   r#   r(   r,   r6   r>   rQ   rS   rx   r   r   r   r#  r  r  r  r  r2  r  r  r  r`  r   r$   r"   <module>r     sg      	  
  !      ( 5R45
 "  7:	L$ "& 0*A AJ%7 %7V9 9.: :8x< x<|A> A>N@L @LL9$ 9$~AG AGNI' I'b
 	KLI 	N 	#$/0/078N 	)*D 	89U 	4567,-=>12S 	7834P 	?@56/0	+W5;;S* X  Fr; r;r$   