o
    3i                    @   s   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Zd dlmZ d dlm	Z	 d dl
mZmZmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZ d dl
mZ G dd dejZdS )    N)datetime)uuid4)parameterizedClient)get_context_session_idnew_contextset_context_session)APIErrorGetResponse)FAKE_TEST_API_KEY)FeatureFlagLegacyFlagMetadata)VERSION)tagc                   @   s  e Zd Zedd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zed#d$d% Zed#d&d' Zed(d)d* Zed(d+d, Zed#d-d. Zed#d/d0 Zed#d1d2 Zed#d3d4 Zed#d5d6 Zed#d7d8 Z ed#d9d: Z!ed#d;d< Z"ed#d=d> Z#ed#d?d@ Z$dAdB Z%dCdD Z&dEdF Z'dGdH Z(dIdJ Z)dKdL Z*dMdN Z+dOdP Z,dQdR Z-dSdT Z.dUdV Z/dWdX Z0e12dYdZi i fd[d\d]d^d_d`d]d^d_d`fdae3e4 i i fdbdci i fdddei i fdfdgi i fgdhdi Z5djdk Z6dldm Z7e12dndodpdqdridqdrifdsdtdudvdwdxdygdzd{dvifd|d}d~ddd]dddddd]dddfdddddd^dddddddd^dddddfgdd Z8e12ddddddddifdddddddddfdi ddi fdddddddddfgdd Z9dd Z:dd Z;dd Z<dd Z=dd Z>dd Z?dd Z@dd ZAdd ZBdd ZCdd ZDdd ZEed#dd ZFdd ZGdd ZHdd ZIdd ZJed#dd ZKed¡ed(ddĄ ZLed#ddƄ ZMe12dddgddidgfdddgddidgfddgddidfddgddidfddgi dfged#ddф ZNed#ddӄ ZOe12dddddddddddddif
gddބ ZPed#dd ZQdd ZRdd ZSdd ZTed¡ed(dd ZUed¡ed(dd ZVeddd ZWdd ZXdd ZYed#dd ZZeddd Z[eddd Z\dd Z]ejde^dddd Z_ejde^d ddd Z`dS (  
TestClientc                 C   s0   t d| _t d| _| j  | j  d S )Nposthog.client.batch_postposthog.consumer.batch_post)mockpatchclient_post_patcherconsumer_post_patcherstartcls r   f/lsinfo/ai/hellotax_ai/llm_service/venv_embed/lib/python3.10/site-packages/posthog/test/test_client.py
setUpClass   s   
zTestClient.setUpClassc                 C   s   | j   | j  d S N)r   stopr   r   r   r   r   tearDownClass   s   
zTestClient.tearDownClassc                 C   s   t d|| d| _dS )zMark the failure handlerFAILTN)printfailed)selfebatchr   r   r   set_fail!   s   
zTestClient.set_failc                 C   s   d| _ tt| jd| _d S )NFon_error)r#   r   r   r'   clientr$   r   r   r   setUp&   s   zTestClient.setUpc                 C   s   |  tt d S r   )assertRaises	TypeErrorr   r+   r   r   r   test_requires_api_key*      z TestClient.test_requires_api_keyc                 C   s   | j   d S r   )r*   flushr+   r   r   r   test_empty_flush-   s   zTestClient.test_empty_flushc                 C   sF  t d}tt| jdd}|jddd}| | | | j |	  |j
d d }|d	 }| |d
 d | t|d t | |d | |d d | |d d d | |d d t |d d t jkspJ |d d t jks{J |d d t jksJ |d d t jksJ W d    d S 1 sw   Y  d S )Nr   Tr)   	sync_modepython test eventdistinct_idr6      r&   r   event	timestampuuid
properties$libposthog-python$lib_version$python_runtime$python_version$os$os_version)r   r   r   r   r'   captureassertIsNotNoneassertFalser#   assert_called_once	call_argsassertEqual
assertTrue
isinstancestrgetr   ANYr$   	mock_postr*   msg_uuid
batch_datamsgr   r   r   test_basic_capture0   s&   
"zTestClient.test_basic_capturec                 C   s   t do}tt| jdd}tt }|jdd|d}| || | 	| j
 |  |jd d }|d	 }| |d
 d | t|d t | |d | | |d d | |d d d | |d d t W d    d S 1 sww   Y  d S )Nr   Tr3   r5   r6   )r6   r;   r8   r&   r   r9   r:   r;   r<   r=   r>   r?   )r   r   r   r   r'   rL   r   rD   rI   rF   r#   rG   rH   rJ   rK   r   )r$   rP   r*   r;   rQ   rR   rS   r   r   r   test_basic_capture_with_uuidH   s$   
"z'TestClient.test_basic_capture_with_uuidc                 C   s   t d`}tt| jdd}|jddd}| | | | j |	  |j
d d }|d	 }| |d
 d | t|d t | |d d | |d d d | |d d t W d    d S 1 shw   Y  d S )Nr   T)project_api_keyr)   r4   r5   r6   r7   r8   r&   r   r9   r:   r<   r=   r>   r?   )r   r   r   r   r'   rD   rE   rF   r#   rG   rH   rI   rJ   rK   rL   r   rO   r   r   r   'test_basic_capture_with_project_api_key^   s$   
"z2TestClient.test_basic_capture_with_project_api_keyc                 C   s   t d?}ttddidd}|jddd}| | |  |jd	 d
 }|d }| |d d | |d d d W d    d S 1 sGw   Y  d S )Nr   sourcez	repo-nameTsuper_propertiesr4   r5   r6   r7   r8   r&   r   r9   r<   )	r   r   r   r   rD   rE   rG   rH   rI   rO   r   r   r   test_basic_super_propertiesu   s   
"z&TestClient.test_basic_super_propertiesc                 C      t jjtdd d4}| j}td}|j|dd | |j |j	}| 
|d d d | 
|d d d W d    d S 1 s@w   Y  d S 	NrD   return_valuetest exceptionr6   r7   r   
$exceptionr8   r   r   objectr   r*   	Exceptioncapture_exceptionrJ   calledrH   rI   r$   patch_capturer*   	exceptioncapture_callr   r   r   test_basic_capture_exception      "z'TestClient.test_basic_capture_exceptionc                 C   r\   r]   rb   rg   r   r   r   -test_basic_capture_exception_with_distinct_id   rl   z8TestClient.test_basic_capture_exception_with_distinct_idc                 C      t jjtdd d9}tt| jdd}td}|j|dd | |j	 |j
}| |d d d	 | |d
 d d W d    d S 1 sEw   Y  d S )NrD   r^   zhttps://aloha.comr)   hostr`   r6   r7   r   ra   r8   r   r   rc   r   r   r'   rd   re   rJ   rf   rH   rI   )r$   rh   r*   ri   callr   r   r   9test_basic_capture_exception_with_correct_host_generation   s   "zDTestClient.test_basic_capture_exception_with_correct_host_generationc                 C   rn   )NrD   r^   https://app.posthog.comro   r`   r6   r7   r   ra   r8   rq   rg   r   r   r   Jtest_basic_capture_exception_with_correct_host_generation_for_server_hosts   s   "zUTestClient.test_basic_capture_exception_with_correct_host_generation_for_server_hostsc              	   C   s*  t jjtdd d }| j}ztd ty"   |jd dd Y nw | |j |j	}t
| | |d d d | |d d d | |d d	 d
 d d d d | |d d	 d
 d d d d | |d d	 d
 d d d  | |d d	 d
 d d d | |d d	 d
 d d d | |d d	 d
 d d d d | |d d	 d
 d d d d d d | |d d	 d
 d d d d d d | |d d	 d
 d d d d d d | |d d	 d
 d d d d d d W d    d S 1 sw   Y  d S )NrD   r^   r`   r6   r7   r8   r   ra   r<   z$exception_list	mechanismtypegenerichandledTmodulerd   value
stacktracerawframesfilenamezposthog/test/test_client.pyfunction4test_basic_capture_exception_with_no_exception_givenzposthog.test.test_clientin_app)r   r   rc   r   r*   rd   re   rJ   rf   rH   r"   rI   )r$   rh   r*   rj   r   r   r   r      s   $z?TestClient.test_basic_capture_exception_with_no_exception_givenc              	   C   s   t jjtdd d?}| jddd}| j}|d  | |j | 	|j
d d W d    n1 s3w   Y  W d    d S W d    d S 1 sKw   Y  d S )NrD   r^   posthogWARNINGlevelr   z2WARNING:posthog:No exception information available)r   r   rc   r   
assertLogsr*   re   rF   rf   rI   output)r$   rh   logsr*   r   r   r   8test_basic_capture_exception_with_no_exception_happening   s   
"zCTestClient.test_basic_capture_exception_with_no_exception_happeningc                 C   sd   t tdd}| jddd}|jtddd | |jd	 d
 W d    d S 1 s+w   Y  d S )NT)log_captured_exceptionsr   ERRORr   r`   r6   r7   r   z+ERROR:posthog:test exception
NoneType: None)r   r   r   re   rd   rI   r   )r$   r*   r   r   r   r   (test_capture_exception_logs_when_enabled
  s   
"z3TestClient.test_capture_exception_logs_when_enabledzposthog.client.flagsc                 C   s8  dddii|_ td}tt| jtdd}|jdddd	}| | | | j	 |
  |jd
 d }|d }| |d d | t|d t | |d | |d d | |d d d | |d d t | |d d d | |d d dg | |jd
 W d    d S 1 sw   Y  d S )NfeatureFlagsbeta-featurerandom-variantr   Tr)   personal_api_keyr4   r5   r6   r6   send_feature_flagsr8   r&   r   r9   r:   r;   r<   r=   r>   r?   $feature/beta-feature$active_feature_flagsr_   r   r   r   r   r'   rD   rE   rF   r#   rG   rH   rI   rJ   rK   rL   rM   r   
call_countr$   patch_flagsrP   r*   rQ   rR   rS   r   r   r   %test_basic_capture_with_feature_flags  s<   
"z0TestClient.test_basic_capture_with_feature_flagsc           
      C   s  dddii|_ dddddd	d
dddgddddigdddddddddddddgidddiddd}ddd dd!dd"gd
d#gddgd$d%id&d'}ddd(dg d)dgd$d%id&d'}td*}tt| jtdd+}|||g|_|jd,d-dd.}| | | 	| j
 |  |jd d/ }|d) }	| |	d0 d, | t|	d1 t | |	d2 | |	d- d- | |	d3 d4 d5 | |	d3 d6 t | |	d3 d7 d | |	d3 d8 d9 | |	d3 d: dg d;|	d3 vsJ | |jd) W d    n	1 sw   Y  td*Z}tt| jtdd+}g |_|jd,d-d<}| | | 	| j
 |  |jd d/ }|d) }	d;|	d3 vsGJ d7|	d3 vsPJ d8|	d3 vsYJ d:|	d3 vsbJ W d    d S 1 snw   Y  d S )=Nr   r   r   r8   Beta Featurebeta-feature-localTd   emailpersontest@posthog.comexactkeyrw   r{   operatorr<   rollout_percentager   2   variantsfirst-variantFirst Variantr   namer   second-variantSecond Variant   third-variantThird Variantsome-payloadajsonr   r   groupsmultivariatepayloadsidr   r   activer   filtersperson-flagregionUSAr   r   r{   rw   true,  r   r   r   r   r   r   r   z
false-flagr   r   r   r5   r6   r   r&   r9   r:   r;   r<   r=   r>   r?   $feature/beta-feature-localz$feature/false-flagFr   r   r7   r_   r   r   r   r   r'   feature_flagsrD   rE   rF   r#   rG   rH   rI   rJ   rK   rL   rM   r   r   )
r$   r   multivariate_flag
basic_flag
false_flagrP   r*   rQ   rR   rS   r   r   r   7test_basic_capture_with_locally_evaluated_feature_flags9  s   1
&
$zBTestClient.test_basic_capture_with_locally_evaluated_feature_flagszposthog.client.getc                 C   s   dddd}t d|d |_ttdd}| jd	d
d2}|  | |jg  | |ji  | |j	i  | |j
i  | d|jd  W d    d S 1 sPw   Y  d S )Nquota_limitedz1You have exceeded your feature flag request quotapayment_required)rw   detailcodei  r   testr   r   r   r   z#PostHog feature flags quota limitedr   r
   side_effectr   r   r   _load_feature_flagsrI   r   feature_flags_by_keygroup_type_mappingcohortsassertInr   )r$   	patch_getmock_responser*   r   r   r   r   %test_load_feature_flags_quota_limited  s   "z0TestClient.test_load_feature_flags_quota_limitedc                 C   s   t dd|_ttdd}| jddd2}|  | |jg  | |ji  | |j	i  | |j
i  | d|jd	  W d    d S 1 sHw   Y  d S )
Ni  Unauthorizedr   r   r   r   r   z#please set a valid personal_api_keyr   r   )r$   r   r*   r   r   r   r   $test_load_feature_flags_unauthorized  s   "z/TestClient.test_load_feature_flags_unauthorizedc           	      C   s  dddii|_ dddddd	d
dddgddddigdddddddddddddgidddiddd}ddd dd!dd"gd
d#gddgd$d%id&d'}td(}tt| jtdd)}||g|_|jd*d+d,d-idd.}| | | 	| j
 |  |jd d/ }|d0 }| |d1 d* | t|d2 t | |d3 | |d+ d+ | |d4 d5 d6 | |d4 d7 t | |d4 d, d- | |d4 d8 dg d9|d4 vsJ d:|d4 vsJ | |jd0 W d    d S 1 sw   Y  d S );Nr   r   r   r8   r   r   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   r6   r   zmy-custom-variant)r6   r<   r   r&   r   r9   r:   r;   r<   r=   r>   r?   r   r   z$feature/person-flagr   )	r$   r   r   r   rP   r*   rQ   rR   rS   r   r   r   +test_dont_override_capture_with_local_flags  s   1

"z6TestClient.test_dont_override_capture_with_local_flagsc                 C   s  dddddi|_ td}tt| jtdd}|jdd	dd
}| | | | j	 |
  |jd d }|d }| |d d | t|d t | |d | |d	 d	 | |d d  | |d d d | |d d t | |d d d | |d d d | |d d ddg | |jd |jdddd	i i i dd d	 W d    d S 1 sw   Y  d S )Nr   r   TFr   alpha-featureoff-featurer   r   r5   r6   r   r8   r&   r   r9   r:   r;   r<   $geoip_disabler=   r>   r?   r   $feature/alpha-featurer   r   r   
random_keyhttps://us.i.posthog.com   timeoutr6   r   person_propertiesgroup_propertiesgeoip_disable	device_idr_   r   r   r   r   r'   rD   rE   rF   r#   rG   rH   rI   rJ   rK   rL   rM   r   r   assert_called_withr   r   r   r   9test_basic_capture_with_feature_flags_returns_active_onlyc  sb   

"zDTestClient.test_basic_capture_with_feature_flags_returns_active_onlyc                 C   s  dddddi|_ td}ttd| jtdddd	}|jd
dddd}| | | | j	 |
  |jd d }|d }| |d d
 | t|d t | |d | d|d v | |d d | |d d d | |d d t | |d d d | |d d d | |d d ddg | |jd |jddddi i i dd d	 W d    d S 1 sw   Y  d S ) Nr   r   TFr   r   rt      )rp   r)   r   disable_geoip%feature_flags_request_timeout_secondsr4   r5   r6   )r6   r   r   r8   r&   r   r9   r:   r;   r   r<   r=   r>   r?   r   r   r   r   r   r   r   r   r   r   r   r   r   Itest_basic_capture_with_feature_flags_and_disable_geoip_returns_correctly  sn   	

"zTTestClient.test_basic_capture_with_feature_flags_and_disable_geoip_returns_correctlyc                 C   s2  dddii|_ td}tt| jtdd}|jddd	d
}| | | | j	 |
  |jd d }|d }| |d d | t|d t | |d | |d d | |d d d | |d d t | d|d v | d|d v | |jd W d    d S 1 sw   Y  d S )Nr   r   r   r   Tr   r5   r6   Fr   r8   r&   r   r9   r:   r;   r<   r=   r>   r?   r   r   r   r   r   r   r   Ctest_basic_capture_with_feature_flags_switched_off_doesnt_send_them  s4   
"zNTestClient.test_basic_capture_with_feature_flags_switched_off_doesnt_send_themc           	      C   sL  dddii|_ dddddd	digd
ddddddddgidd}dddddd	digid}tdh}tt| jtdd}||g|_|jdddd}| | | 	| j
 |  |jd d }|d }| |d  d | |d d | d!|d"  | d#|d"  | d$|d"  | |jd W d%   d%S 1 sw   Y  d%S )&zTTest that send_feature_flags=False with local evaluation enabled does NOT send flagsr   r   remote-variantr8   r   r   Tr   r   r   r   r   r   r   r   r   r   r   r      Simple Flagsimple-flagr   r   r   r   r5   r6   Fr   r&   r   r9   r   r<   $feature/simple-flagr   N)r_   r   r   r   r   r'   r   rD   rE   rF   r#   rG   rH   rI   assertNotInr   )	r$   r   r   simple_flagrP   r*   rQ   rR   rS   r   r   r   Qtest_capture_with_send_feature_flags_false_and_local_evaluation_doesnt_send_flags   sr   

"z\TestClient.test_capture_with_send_feature_flags_false_and_local_evaluation_doesnt_send_flagsc           
      C   s  dddii|_ dddddd	digd
ddddddddgidd}dddddd	digid}td}tt| jtdd}||g|_|jdddd}| | | 	| j
 |  |jd d }|d }| |d d | |d d | d |d!  | d"|d!  | |d! d" d |d! d# }	| d|	 | d|	 | d$|d!  | |jd W d%   d%S 1 sw   Y  d%S )&zaTest that send_feature_flags=True with local evaluation enabled uses local flags without API callr   remote-flagr   r8   r   r   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   r6   r   r&   r   r9   r   r<   r   r   $feature/remote-flagN)r_   r   r   r   r   r'   r   rD   rE   rF   r#   rG   rH   rI   r   r   r   )
r$   r   r   r   rP   r*   rQ   rR   rS   active_flagsr   r   r   Otest_capture_with_send_feature_flags_true_and_local_evaluation_uses_local_flagsR  sz   

"zZTestClient.test_capture_with_send_feature_flags_true_and_local_evaluation_uses_local_flagsc                 C   s   t dg}tt| jtdd}ddddddd	gd
dgidg|_dddid}|jdd|d}| | | | j	 |
  |  |jd d }|d }| |d d d | |d d dg W d   dS 1 sow   Y  dS )zWTest that SendFeatureFlagsOptions with only_evaluate_locally=True uses local evaluationr   Tr   r8   z
local-flagr   r   US)r   r{   r   r   )r   r   r   r   only_evaluate_locallyr   
test eventr6   r   r&   r   r<   z$feature/local-flagr   N)r   r   r   r   r'   r   rD   rE   rF   r#   assert_not_calledrG   rH   rI   )r$   r   rP   r*   send_optionsrQ   rR   rS   r   r   r   Gtest_capture_with_send_feature_flags_options_only_evaluate_locally_true  sB   


"zRTestClient.test_capture_with_send_feature_flags_options_only_evaluate_locally_truec           	      C   s  dddii|_ tdl}tt| jtdd}ddd	id
ddiid}|jddd
di|d}| | | | j	 |
  |jd }| |d dd	i | |d d
ddii |
  |jd d }|d }| |d d d W d   dS 1 s{w   Y  dS )z[Test that SendFeatureFlagsOptions with only_evaluate_locally=False forces remote evaluationr   r   zremote-valuer   Tr   Fplanpremiumcompanyrw   
enterpriser  r   r   r  r6   acme)r6   r   r   r8   r   r   r&   r   r<   r  Nr_   r   r   r   r   r'   rD   rE   rF   r#   rG   rH   rI   	r$   r   rP   r*   r	  rQ   rH   rR   rS   r   r   r   Htest_capture_with_send_feature_flags_options_only_evaluate_locally_false  s>   


"zSTestClient.test_capture_with_send_feature_flags_options_only_evaluate_locally_falsec           	      C   s   dddii|_ tdW}tt| jtdd}ddd	ii}|jd
d|d}| | | | j	 |
  |jd }| |d dd	i |
  |jd d }|d }| |d d d W d   dS 1 sfw   Y  dS )z]Test that SendFeatureFlagsOptions without only_evaluate_locally defaults to remote evaluationr   zdefault-flagzdefault-valuer   Tr   r   subscriptionpror  r6   r   r8   r&   r   r<   z$feature/default-flagNr  r  r   r   r   =test_capture_with_send_feature_flags_options_default_behavior  s2   

"zHTestClient.test_capture_with_send_feature_flags_options_default_behaviorc           
      C   s  dddii|_ tdw}tt| jtdd}dddid	}ztd
 ty; } z|j|d|d}W Y d}~nd}~ww | | | 	| j
 |  |jd }| |d ddi |  |jd d }|d }	| |	d d | |	d d d W d   dS 1 sw   Y  dS )zATest that capture_exception also supports SendFeatureFlagsOptionsr   zexception-flagTr   r   F	user_typeadminr  zTest exceptionr6   r   Nr8   r   r&   r   r9   ra   r<   z$feature/exception-flag)r_   r   r   r   r   r'   
ValueErrorre   rE   rF   r#   rG   rH   rI   )
r$   r   rP   r*   r	  r%   rQ   rH   rR   rS   r   r   r   6test_capture_exception_with_send_feature_flags_options7  s<   

"zATestClient.test_capture_exception_with_send_feature_flags_optionsc                 C   s   t d:}tt| jdd}|jddd}| | | | j |	  |j
d d }|d	 }| |d
 d W d    d S 1 sBw   Y  d S )Nr   Tr3   r5   l   IqKr7   r8   r&   r   r6   157963456373623802)r   r   r   r   r'   rD   rE   rF   r#   rG   rH   rI   rO   r   r   r   test_stringifies_distinct_id`  s   
"z'TestClient.test_stringifies_distinct_idc              	   C   s  t d}}tt| jdd}|jdddditdd	d
dd}| |d |  |j	d d }|d }| |d d | |d d d | |d d | |d d d | |d d t
 | |d d | |d d | d|d v W d    d S 1 sw   Y  d S )Nr   Tr3   r5   r6   propertyr{     	   r   new-uuidr6   r<   r:   r;   r8   r&   r   r:   2014-09-03T00:00:00+00:00r<   r9   r=   r>   r?   r;   $groups)r   r   r   r   r'   rD   r   rI   rG   rH   r   rJ   rO   r   r   r   test_advanced_capturer  s,   
"z TestClient.test_advanced_capturec                 C   s   t d=}tt| jdd}|jdddddd	}| | |  |jd
 d }|d }| 	|d d ddd W d    d S 1 sEw   Y  d S )Nr   Tr3   
test_eventr6   id:5app.posthog.comr  instance)r6   r   r8   r&   r   r<   r#  
r   r   r   r   r'   rD   rE   rG   rH   rI   rO   r   r   r   test_groups_capture  s    

"zTestClient.test_groups_capturec                 C      t dX}tt| jdd}|jdddid}| | | | j |	  |j
d d	 }|d
 }| |d d d | t|d t | |d | |d d W d    d S 1 s`w   Y  d S )Nr   Tr3   r6   traitr{   r6   r<   r8   r&   r   $setr:   r;   )r   r   r   r   r'   setrE   rF   r#   rG   rH   rI   rJ   rK   rL   rM   rO   r   r   r   test_basic_set     
"zTestClient.test_basic_setc                 C     t du}tt| jdd}|jddditddd	d
d}| |d
 |  |j	d d }|d }| |d d | |d d d | |d d d | |d d t
 | t|d t | |d d
 | |d d W d    d S 1 s}w   Y  d S )Nr   Tr3   r6   r-  r{   r  r  r   r   r!  r8   r&   r   r:   r"  r/  r<   r=   r>   r?   r;   )r   r   r   r   r'   r0  r   rI   rG   rH   r   rJ   rK   rL   rO   r   r   r   test_advanced_set  (   
"zTestClient.test_advanced_setc                 C   r,  )Nr   Tr3   r6   r-  r{   r.  r8   r&   r   	$set_oncer:   r;   )r   r   r   r   r'   set_oncerE   rF   r#   rG   rH   rI   rJ   rK   rL   rM   rO   r   r   r   test_basic_set_once  r2  zTestClient.test_basic_set_oncec                 C   r3  )Nr   Tr3   r6   r-  r{   r  r  r   r   r!  r8   r&   r   r:   r"  r6  r<   r=   r>   r?   r;   )r   r   r   r   r'   r7  r   rI   rG   rH   r   rJ   rK   rL   rO   r   r   r   test_advanced_set_once  r5  z!TestClient.test_advanced_set_oncec                 C   s   t dT}tt| jdd}|dd}| | |  |jd d }|d }| 	|d	 d
 | 	|d ddi dt
dd | t|d t | |d W d    d S 1 s\w   Y  d S )Nr   Tr3   organizationr&  r8   r&   r   r9   $groupidentifyr<   r>   z$group_type
$group_keyz
$group_setr=   r?   r   r:   r;   r   r   r   r   r'   group_identifyrE   rG   rH   rI   r   rJ   rK   rL   rM   rO   r   r   r   test_basic_group_identify  s*   
"z$TestClient.test_basic_group_identifyc                 C   s   t d^}tt| jdd}|jdddd}| | |  |jd d	 }|d
 }| 	|d d | 	|d d | 	|d ddi dt
dd | t|d t | |d W d    d S 1 sfw   Y  d S )Nr   Tr3   r:  r&  r6   r7   r8   r&   r   r9   r;  r<   r>   r<  r:   r;   r>  rO   r   r   r   *test_basic_group_identify_with_distinct_id  s0   
"z5TestClient.test_basic_group_identify_with_distinct_idc                 C   s   t dW}tt| jdd}|jdddditdd	d
dd}| |d |  |j	d d }|d }| |d d | |d ddddidt
dd | |d d W d    d S 1 s_w   Y  d S )Nr   Tr3   r:  r&  r-  r{   r  r  r   r   )r:   r;   r8   r&   r   r9   r;  r<   r>   r<  r:   r"  r   r   r   r   r'   r?  r   rI   rG   rH   r   rO   r   r   r   test_advanced_group_identify2  s4   
"z'TestClient.test_advanced_group_identifyc                 C   s   t d`}tt| jdd}|jdddditdd	d
ddd}| |d |  |j	d d }|d }| |d d | |d d | |d ddddidt
dd | |d d W d    d S 1 shw   Y  d S )Nr   Tr3   r:  r&  r-  r{   r  r  r   r   r6   )r:   r;   r6   r8   r&   r   r9   r;  r<   r>   r<  r:   r"  rB  rO   r   r   r   -test_advanced_group_identify_with_distinct_idR  s8   
	"z8TestClient.test_advanced_group_identify_with_distinct_idc                 C   s   t dE}tt| jdd}|dd}| | | | j |	  |j
d d }|d }| |d	 d d | |d	 d
 d W d    d S 1 sMw   Y  d S )Nr   Tr3   
previousIdr6   r8   r&   r   r<   alias)r   r   r   r   r'   rF  rE   rF   r#   rG   rH   rI   rO   r   r   r   test_basic_aliasu  s   
"zTestClient.test_basic_aliasbasic_session_idztest-session-123 session_id_with_other_propertiesztest-session-456custom_valueFzhttps://example.com)custom_prop$process_person_profile$current_urlsession_id_uuid_formatsession_id_numeric_string
1234567890session_id_empty_string session_id_with_special_charszsession-123_test.idc                 C   s  t dz}tt| jdd}d|i|}|jdd|d}| | | | j |	  |j
d d	 }	|	d
 }
| |
d d | |
d d | |
d d | | |
d d d | |
d d t | D ]\}}| |
d | | qhW d    d S 1 sw   Y  d S )Nr   Tr3   $session_idr5   r6   r.  r8   r&   r   r9   r<   r=   r>   r?   )r   r   r   r   r'   rD   rE   rF   r#   rG   rH   rI   r   items)r$   	test_name
session_idadditional_propertiesexpected_propertiesrP   r*   r<   rQ   rR   rS   r   r{   r   r   r   'test_capture_with_session_id_variations  s(   
"z2TestClient.test_capture_with_session_id_variationsc                 C   s   t dL}tt| jdd}d}|jddd|idd	d
d}| | |  |jd d }|d }| 	|d d | | 	|d d dd	d
 W d    d S 1 sTw   Y  d S )Nr   Tr3   zgroup-session-101r%  r6   rT  r&  r'  r(  )r6   r<   r   r8   r&   r   r<   r#  r*  r$   rP   r*   rW  rQ   rR   rS   r   r   r   %test_session_id_preserved_with_groups  s&   

"z0TestClient.test_session_id_preserved_with_groupsc                 C   s   t dF}tt| jdd}d}|jdd|ddd	}| | |  |jd
 d }|d }| 	|d d | | 	|d d d W d    d S 1 sNw   Y  d S )Nr   Tr3   zanonymous-session-202anonymous_eventr6   F)rT  rL  r.  r8   r&   r   r<   rT  rL  r*  r[  r   r   r   $test_session_id_with_anonymous_event  s"   
	"z/TestClient.test_session_id_with_anonymous_eventscreen_eventz$screenzspecial-session-505z$screen_name
HomeScreensurvey_eventzsurvey sentzsurvey-session-606
survey_123q1z#How likely are you to recommend us?)r   question)
$survey_idz$survey_questionsre  complex_properties_eventcomplex_eventzmixed-session-707zhttps://example.com/pageT*   )rM  rL  custom_propertynumeric_propertyboolean_propertycsp_violationz$csp_violationzcsp-session-789z1.0zMozilla/5.0 Test Agentzhttps://malicious.com/script.jsz
script-src)z$csp_versionrM  rL  z$raw_user_agentz$csp_document_urlz$csp_blocked_urlz$csp_violated_directivec                 C   s   t dl}tt| jdd}d|i|}|j|d|d}	| |	 |  |jd d }
|
d	 }| 	|d
 | | 	|d d | |
 D ]\}}| 	|d | | qF| 	|d d d | 	|d d t W d    d S 1 stw   Y  d S )Nr   Tr3   rT  r6   r.  r8   r&   r   r9   r<   r=   r>   r?   )r   r   r   r   r'   rD   rE   rG   rH   rI   rU  r   )r$   rV  
event_namerW  rX  expected_additional_propertiesrP   r*   r<   rQ   rR   rS   r   r{   r   r   r   *test_session_id_with_different_event_types  s"   J
"z5TestClient.test_session_id_with_different_event_types$super_properties_override_session_idzsuper-sessionr   )rT  rX   zevent-session-808rX   no_super_properties_conflict)rX   versionzevent-session-909empty_super_propertieszevent-session-111(super_properties_with_other_dollar_propszhttps://super.com)rM  rX   zevent-session-222c                 C   s   t dK}tt|dd}|jddd|id}| | |  |jd d	 }	|	d
 }
| |
d d | |	 D ]\}}| |
d | | q9W d    d S 1 sSw   Y  d S )Nr   TrY   r%  r6   rT  r.  r8   r&   r   r<   )
r   r   r   r   rD   rE   rG   rH   rI   rU  )r$   rV  rZ   event_session_idexpected_session_idexpected_super_propsrP   r*   rQ   rR   rS   r   r{   r   r   r   0test_session_id_with_super_properties_variationsM  s$   )
"z;TestClient.test_session_id_with_super_properties_variationsc                 C   sD   | j }tdD ]}|jddddid q|  | |j  d S )N  r9   r6   r-  r{   r.  )r*   rangerD   r1   rJ   queueempty)r$   r*   ir   r   r   
test_flush  s   
zTestClient.test_flushc                 C   s^   | j }tdD ]}|jddddid q|  | |j  |jD ]	}| |	  q#d S )Nry  r  r6   r-  r{   r.  )
r*   rz  rD   shutdownrJ   r{  r|  	consumersrF   is_alive)r$   r*   r}  consumerr   r   r   test_shutdown  s   

zTestClient.test_shutdownc                 C   sx   t d-}ttdd}|jddd}| |j | |j	  | 
| |  W d    d S 1 s5w   Y  d S )Nr   Tr4   r  r6   r7   )r   r   r   r   rD   rF   r  rJ   r{  r|  rE   rG   )r$   rP   r*   rQ   r   r   r   test_synchronous  s   

"zTestClient.test_synchronousc                 C   sL   t tdd}|  tdD ]	}|jddd q|jddd}| | d S )Nr8   )max_queue_size
   r  r6   r7   )r   r   joinrz  rD   assertIsNone)r$   r*   r}  rQ   r   r   r   test_overflow  s   zTestClient.test_overflowc                 C   s   t td d S )Nunicode_key)r   sixur+   r   r   r   test_unicode  s   zTestClient.test_unicodec                 C   s*   | j jddd | j   | | j d S )Nzpython eventi  r7   )r*   rD   r1   rF   r#   r+   r   r   r   test_numeric_distinct_id  s   
z#TestClient.test_numeric_distinct_idc                 C   s   t ddd d S )Nbad_keyTdebugr   r+   r   r   r   
test_debug  r0   zTestClient.test_debugc                 C   sJ   t t| jdd}tdD ]}|jddddid q|  | | j d S )	NT)r)   gzipr  r9   r6   r-  r{   r.  )r   r   failrz  rD   r1   rF   r#   )r$   r*   _r   r   r   	test_gzip  s   
zTestClient.test_gzipc                    s   t t jddd} fdd}tjd|d&}tdD ]}|jd	d
ddid qtd  	|j
d W d    d S 1 s?w   Y  d S )Nr  r   )r)   flush_atflush_intervalc                     s     t|d d d S )Nr&   r  )rI   len)argskwargsr+   r   r   mock_post_fn  s   z;TestClient.test_user_defined_flush_at.<locals>.mock_post_fnr   r      r9   r6   r-  r{   r.  r8   r   )r   r   r  r   r   rz  rD   timesleeprI   r   )r$   r*   r  rP   r  r   r+   r   test_user_defined_flush_at  s   


"z%TestClient.test_user_defined_flush_atc                 C   s*   t tdd}|jD ]	}| |jd q	d S )Nr  r   r   r   r  rI   r   r$   r*   r  r   r   r   test_user_defined_timeout  s   
z$TestClient.test_user_defined_timeoutc                 C   s&   t t}|jD ]	}| |jd qd S )N   r  r  r   r   r   test_default_timeout_15  s   
z"TestClient.test_default_timeout_15c                 C   s@   t t| jdd}|jddd}|  | | | | j d S )NTr)   disabledr5   r6   r7   )r   r   r'   rD   r1   r  rF   r#   )r$   r*   rQ   r   r   r   test_disabled  s
   
zTestClient.test_disabledc                 C   s   t t| jdd}|dd}| | |  |dd}| | |  |d}| | |  |dd}| | |  |	d}| 
|d d d |  | |j  d S )NTr  r   12345r   )r   featureFlagPayloads)r   r   r'   get_feature_flagr  r  feature_enabledget_all_flagsget_feature_flag_payloadget_all_flags_and_payloadsrI   rJ   r{  r|  )r$   r   r*   responser   r   r    test_disabled_with_feature_flags  s"   





z+TestClient.test_disabled_with_feature_flagsc                 C   s   t dP}tt| jddd}|jddd}| | | | j |	  |j
d d	 }|d
 }| |d d d|_|jddd}| | | | j W d    d S 1 sXw   Y  d S )Nr   FT)r)   r  r4   r5   r6   r7   r8   r&   r   r9   )r   r   r   r   r'   rD   rE   rF   r#   rG   rH   rI   r  r  rO   r   r   r   test_enabled_to_disabled  s&   

"z#TestClient.test_enabled_to_disabledc                 C   s   t d7}tt| jddd}|jddd}| | |  |jd d }|d	 }| 	|d
 d d W d    d S 1 s?w   Y  d S )Nr   Tr)   r   r4   r5   r6   r7   r8   r&   r   r<   r   r*  )r$   rP   r*   rQ   rR   capture_msgr   r   r   $test_disable_geoip_default_on_events.  s   
"z/TestClient.test_disable_geoip_default_on_eventsc                 C   s   t dg}tt| jddd}|jdddddd	}| | |jd
dddidd	}| | | |j	d |j
d d d }|d }| |d d d |j
d d d }|d }| d|d vd W d    d S 1 sow   Y  d S )Nr   FTr  r6   bd)r   c)r6   r<   r   r9   r-  r{   r   r   r8   r&   r<   r   )r   r   r   r   r'   r0  rE   rD   rI   r   call_args_list)r$   rP   r*   rQ   	set_batchr  
page_batchidentify_msgr   r   r   %test_disable_geoip_override_on_events?  s8   

"z0TestClient.test_disable_geoip_override_on_eventsc                 C   s   t d7}tt| jddd}|jdddd}| | |  |jd d	 }|d
 }| 	d|d v W d    d S 1 s?w   Y  d S )Nr   Tr  r5   r6   F)r6   r   r8   r&   r   r   r<   )
r   r   r   r   r'   rD   rE   rG   rH   rJ   rO   r   r   r   2test_disable_geoip_method_overrides_init_on_eventsc  s    
"z=TestClient.test_disable_geoip_method_overrides_init_on_eventsc                 C   s   dddddi|_ tt| jdd}|jdddd	 |jdd
ddi ddii dd dgd
 |  |jdddd	 |jdd
ddi ddii dd dgd
 |  |d |jdd
ddi ddii dd d	 d S )Nr   r   TFr   )r)   r   r   some_id)r   r   r   r6   r   r6   r   r   r   r   r   flag_keys_to_evaluatefeature_enabled_distinct_idall_flags_payloads_idr   )	r_   r   r   r'   r  r   
reset_mockr  r  r$   r   r*   r   r   r   $test_disable_geoip_default_on_decidev  sb   

z/TestClient.test_disable_geoip_default_on_decidezposthog.client.Pollerc                 C   s@   dd }||j j_ttdd}ddig|_| |dd d S )Nc                   S   s   t d)Nzhttp exception)rd   r   r   r   r   raise_effect  s   z9TestClient.test_call_identify_fails.<locals>.raise_effectr   r   r   exampler6   )r_   
raiseErrorr   r   r   r   rF   r  )r$   r   patch_pollerr  r*   r   r   r   test_call_identify_fails  s
   
z#TestClient.test_call_identify_failsc                 C   s*  dddddi|_ ttd| jdd}|jdd	d
ddddidddiid |jdddd	d
ddd	ddd
ddddiddd dgd
 |  |jdd	d
ddddidddiid |jdddd	d
ddddiddiddiddd dgd
 |  |jd	i d d d |jdddd	i dd	ii dd d	 d S )Nr   r   TFr   zhttp://app2.posthog.com)rp   r)   r   r   r  r&  r'  r(  x1y1r  xy)r   r   r   r   )r6   r  )r=  r  r=  r  r6   overridegroup_overrider   )r_   r   r   r'   r  r   r  r  r  r   r   r   *test_default_properties_get_added_properly  s   

z5TestClient.test_default_properties_get_added_properlyr  r   r  r6   r  r  Nr  get_flags_decisionc                 C   sh   dddii|_ tt| jd}t|||ddi di |i ddd	}|r'||d
< |j	dddi| dS )zJTest that device_id is properly passed to the flags request when provided.r   r   r   r(   r   ztest-device-123r  T)r6   r   r   r   r   r   r  r   r   r   r   N)r   r   )r_   r   r   r'   getattrr   )r$   methodmethod_argsexpected_person_propsexpected_flag_keysr   r*   expected_callr   r   r   )test_device_id_is_passed_to_flags_request
  s&   #
z4TestClient.test_device_id_is_passed_to_flags_requestc                 C   s   ddl m}m} dddii|_tt| jd}| $ |d |dd	 |jdd
dd	i dd	ii dddgd
 W d   n1 s@w   Y  |	  | ' |d |jdd	dd |jdd
dd	i dd	ii dddgd
 W d   dS 1 svw   Y  dS )zWTest that device_id from context is used in flags request when not explicitly provided.r   )r   set_context_device_idr   r   r   r(   zcontext-device-idr   r  r   r   r6   Tr  Nzexplicit-device-id)r   )
posthog.contextsr   r  r_   r   r   r'   r  r   r  )r$   r   r   r  r*   r   r   r   4test_device_id_from_context_is_used_in_flags_requestA  sX   "z?TestClient.test_device_id_from_context_is_used_in_flags_request)
macOSdarwinr      r  
MockPython3.8.10zMac OS X10.15.7mac_ver)r  rR  rR  N)
Windowswin32r  r  r  r  10	win32_ver)r  rR  rR  rR  NLinuxlinuxr  r  r  z20.04rr  c              
   C   s  t du}t dW}||j_||_||_|r|	t||_|dkrEt jd||fd ddlm} | }W d   n1 s?w   Y  n	ddlm} | }||||d	}||ks[J W d   n1 sew   Y  W d   dS W d   dS 1 s}w   Y  dS )
zATest that we can mock platform and sys for testing system_contextzposthog.utils.platformzposthog.utils.sysr  zposthog.utils.get_os_infor^   r   )system_contextN)r@   rA   rB   rC   )	r   r   python_implementationr_   version_infoplatformr  posthog.utilsr  )r$   _namesys_platformr  expected_runtimeexpected_versionexpected_osexpected_os_versionplatform_methodplatform_returndistro_infomock_platformmock_sysr  contextexpected_contextr   r   r   test_mock_system_contextu  s@   7	"z#TestClient.test_mock_system_contextc                 C   s   ddddddiddd|_ tt}d	}d
di}ddi}||||}|tdddd tdddtddd d td ddtddd d td ddddddksOJ d S )Nr   TFr   r   z{"some": "data"}ztest-id)r   r  errorsWhileComputingFlags	requestIdtest_distinct_idtest_group_typetest_group_idtest_property
test_value)payload)r   enabledvariantreasonmetadatar   r   )flagsr  r  )r_   r   r   r  r   r   )r$   r   r*   r6   r   r   r  r   r   r   2test_get_decide_returns_normalized_decide_response  sZ   		z=TestClient.test_get_decide_returns_normalized_decide_responsec              	   C   s   t dX}tt| jdd}t 4 td |jddddid	}| | |	  |j
d
 d }|d }| |d d d W d    n1 sHw   Y  W d    d S W d    d S 1 s`w   Y  d S )Nr   Tr3   zcontext-session-123r%  r6   rK  r{   r.  r8   r&   r   r<   rT  )r   r   r   r   r'   r   r	   rD   rE   rG   rH   rI   rO   r   r   r   %test_set_context_session_with_capture		  s(   
"z0TestClient.test_set_context_session_with_capturec              	   C   s   t d\}tt| jdd}t 8 td t dd}|jdd|d	}| 	| |
  |jd
 d }|d }| |d d d W d    n1 sLw   Y  W d    d S W d    d S 1 sdw   Y  d S )Nr   Tr3   zpage-explicit-session-789landing)rT  	page_typez$pager6   r.  r8   r&   r   r<   rT  )r   r   r   r   r'   r   r	   r   rD   rE   rG   rH   rI   )r$   rP   r*   r<   rQ   rR   rS   r   r   r   6test_set_context_session_with_page_explicit_properties 	  s*   
"zATestClient.test_set_context_session_with_page_explicit_propertiesc              	   C   s   ddl m}m} tdY}tt| jdd}| 5 |d |jddd	d
dd}| 	| |
  |jd d }|d }| |d d d	 W d   n1 sQw   Y  W d   dS W d   dS 1 siw   Y  dS )zETest that explicit session ID overrides context session ID in capturer   )r   r	   r   Tr3   zcontext-session-overrider%  r6   zexplicit-session-overrider{   )rT  rK  r.  r8   r&   r<   rT  N)r  r   r	   r   r   r   r   r'   rD   rE   rG   rH   rI   )r$   r   r	   rP   r*   rQ   rR   rS   r   r   r   ,test_set_context_session_override_in_capture9	  s.   
	"z7TestClient.test_set_context_session_override_in_capturec                 C   st   t dddddgi i ddd|_ttd	d
d}|  |  |  | t|j	d | |j	d d d dS )zGTest that when enable_local_evaluation=False, the poller is not startedr8   r   r   Tr   r   r   r   r  r   r   "test-etag"dataetagtest-personal-keyFr   enable_local_evaluationr   r   N)
r   r_   r   r   load_feature_flagsr  rG   rI   r  r   r$   r   r  r*   r   r   r   2test_enable_local_evaluation_false_disables_pollerV	  s,   z=TestClient.test_enable_local_evaluation_false_disables_pollerc                 C   st   t dddddgi i ddd|_ttd	dd
}|  |  |  | t|jd | |jd d d dS )zLTest that when enable_local_evaluation=True (default), the poller is startedr8   r   r   Tr  r  r  r  r  r  r   r   N)	r   r_   r   r   r  rG   rI   r  r   r  r   r   r   /test_enable_local_evaluation_true_starts_poller|	  s,   z:TestClient.test_enable_local_evaluation_true_starts_pollerzposthog.client.remote_configc                 C   sN   ddi|_ ttddd}|d}| |ddi |jdt|jd|jd dS )	zJTest that get_remote_config_payload works without local evaluation enabledr   r	  r  Fr  	test-flagr  N)r_   r   r   get_remote_config_payloadrI   assert_called_once_withrp   r   )r$   patch_remote_configr*   resultr   r   r   3test_get_remote_config_payload_works_without_poller	  s   


z>TestClient.test_get_remote_config_payload_works_without_pollerc                 C   s$   t tdd}|d}| | dS )z=Test that get_remote_config_payload requires personal API keyF)r  r"  N)r   r   r#  r  )r$   r*   r&  r   r   r   8test_get_remote_config_payload_requires_personal_api_key	  s   
zCTestClient.test_get_remote_config_payload_requires_personal_api_keyc                 C   s  t tdd}|d}dddddd}| || |d}dddddd}| || dddidd	d
iid}||}ddddidd	d
iidd}| || dddii}||}ddddiddd}| || |i }dddddd}| || | t}|d W d   n1 sw   Y  | dt|j | t}|d W d   n1 sw   Y  | dt|j | t}|d W d   n1 sw   Y  | dt|j dS )z0Test the _parse_send_feature_flags helper methodTr  N)should_sendr  r   r   flag_keys_filterFr  r  r  rw   r  r  r   user_id123invalidz#Invalid type for send_feature_flags{   )	r   r   _parse_send_feature_flagsrI   r-   r.   r   rL   ri   )r$   r*   r&  expectedoptionscmr   r   r   $test_parse_send_feature_flags_method	  st   






z/TestClient.test_parse_send_feature_flags_methodc           	      C   s  ddddi|_ tdv}tt| jtdd}dd	gd
did}|jdd|d}| | | | j	 |
  |jd }| |d dd	g | |d d
di |
  |jd d }|d }| |d d d | |d d d | d|d  W d   dS 1 sw   Y  dS )zVTest that SendFeatureFlagsOptions with flag_keys_filter only evaluates specified flagsr   value1value3)flag1flag3r   Tr   r6  r7  r  r  )r*  r   r  r6   r   r8   r  r   r&   r   r<   z$feature/flag1z$feature/flag3z$feature/flag2N)r_   r   r   r   r   r'   rD   rE   rF   r#   rG   rH   rI   r   r  r   r   r   5test_capture_with_send_feature_flags_flag_keys_filter
  s>   

"z@TestClient.test_capture_with_send_feature_flags_flag_keys_filterr   c                 C   s   t tddd}ddddddg dd	d
gdd	dddgid	diddg|_|jdddd}| | | |jd | | d	 | |jd dS )zZTest that get_feature_flag_result returns a FeatureFlagResult when payload is empty stringtest_personal_api_keyTr   r4   r8   z	Test flagr"  FNzempty-variant)r<   r   r  r   zEmpty Variantr   r   rR  r   )r   r   r   is_simple_flagr   r   r   	test-userr  )	r   r   r   get_feature_flag_resultrE   rI   r   	get_valuer	  r$   patch_batch_postr*   r&  r   r   r   6test_get_feature_flag_result_with_empty_string_payload>
  sD   		
zATestClient.test_get_feature_flag_result_with_empty_string_payloadc                 C   s   t tddd}dddddg dd	gd
dddgiddidddddddg dd	gd
dddgiddiddg|_|jddd}| |d d d | |d d d | d|d  | |d d d | |d d d dS )zNTest that get_all_flags_and_payloads includes flags with empty string payloadsr9  Tr:  r8   zFlag with empty payloadzempty-payload-flagFvariant1)r<   r  r   r   )r   r   rR  r   )r   r   r   r;  r   r   r   zFlag with normal payloadznormal-payload-flagvariant2znormal payloadr<  r=  r   r  N)r   r   r   r  rI   r   r@  r   r   r   1test_get_all_flags_and_payloads_with_empty_stringq
  sL   	

z<TestClient.test_get_all_flags_and_payloads_with_empty_stringc              	   C   s   t dF}tt| jdd}t  tdd |jddd W d    n1 s(w   Y  |jd	 d
 }|d }| 	|d d dg W d    d S 1 sNw   Y  d S )Nr   Tr3   
random_tagi90  r5   r6   r7   r8   r&   r   r<   z$context_tags)
r   r   r   r   r'   r   r   rD   rH   rI   )r$   rP   r*   rR   rS   r   r   r   test_context_tags_added
  s   
"z"TestClient.test_context_tags_addedzposthog.client.Client._enqueuezUnexpected errorr  c           	   	   C   s   t d}ddgi fdg dddidfd	g dddidfd
ddgi fdddgi fg}|D ]-\}}}| j|d t||}||i |}| |d W d   n1 sSw   Y  q+dS )z=Test that all decorated methods handle exceptions gracefully.test-keyrD   r%  r0  some-idr   r  r.  r7  r?  
group-type	group-keyrF  new-idr  N)r   subTestr  rI   )	r$   mock_enqueuer*   
test_casesmethod_namer  r  r  r&  r   r   r   test_methods_handle_exceptions
  s   

z)TestClient.test_methods_handle_exceptionsExpected errorc           	   
   C   s   t ddd}ddgi fdg ddd	id
fdg ddd	id
fdddgi fdddgi fg}|D ]E\}}}| j|d2 t||}| t}||i | W d   n1 sUw   Y  | t|jd W d   n1 smw   Y  q-dS )z6Test that methods re-raise exceptions when debug=True.rH  Tr  rD   r%  r0  rI  r   r  r.  r7  r?  rJ  rK  rF  rL  rM  NrS  )r   rN  r  r-   rd   rI   rL   ri   )	r$   rO  r*   rP  rQ  r  r  r  r2  r   r   r   $test_debug_flag_re_raises_exceptions
  s"   

z/TestClient.test_debug_flag_re_raises_exceptions)a__name__
__module____qualname__classmethodr   r    r'   r,   r/   r2   rT   rU   rW   r[   rk   rm   rs   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r$  r+  r1  r4  r8  r9  r@  rA  rC  rD  rG  r   expandrL   r   rZ  r\  r^  ro  rx  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r'  r(  r3  r8  rB  rE  rG  rd   rR  rT  r   r   r   r   r      s   

B

$
 


r
8
@
"
Q
Y
4
-
'
( #






B"
! 	
$
4

R
3
)5
5$!
N
.
2
7

r   )r  unittestr   r;   r   r   r  r   posthog.clientr   r  r   r   r	   posthog.requestr
   r   posthog.test.test_utilsr   posthog.typesr   r   posthog.versionr   r   TestCaser   r   r   r   r   <module>   s    