
    jKj                       d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZmZ d dlmZ  G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Z G d dej0                        Zy)    N)mock)ZoneInfo)parser)relativedelta)freeze_time)parameterized)Client)InconclusiveMatchErrormatch_propertyparse_datetime-relative_date_parse_for_feature_flag_matching)APIErrorGetResponse)FAKE_TEST_API_KEYc                      e Zd Zed        Zed        Zd Zd Z ej                  d      d        Z
 ej                  d      d        Zd	 Z ej                  g d
      d        Zd Zd Zd Z ej                  d       ej                  d      d               Zd Z ej                  d       ej                  d      d               Z ej                  d       ej                  d      d               Z ej                  d       ej                  d      d               Z ej                  d       ej                  d      d               Z ej                  d       ej                  d      d               Z ej                  d      d        Zej                  j7                  ed       ej                  d      d               Zej                  j7                  ed       ej                  d      d               Zej                  j7                  ed       ej                  d      d               Zej                  j7                  ed       ej                  d      d               Z ej                  j7                  ed       ej                  d      d               Z!ej                  j7                  ed       ej                  d      d               Z"ej                  j7                  ed       ej                  d      d               Z#ej                  j7                  ed       ej                  d      d               Z$ej                  j7                  ed       ej                  d      d                Z% ej                  d       ej                  d      d!               Z& ej                  d       ej                  d      d"               Z' ej                  d       ej                  d      d#               Z( ej                  d$       ej                  d       ej                  d      d%                      Z) ej                  d       ej                  d      d&               Z* ej                  d       ej                  d      d'               Z+ ej                  d       ej                  d      d(               Z, ej                  d       ej                  d      d)               Z- ej                  d       ej                  d      d*               Z. ej                  d       ej                  d      d+               Z/d, Z0 ej                  d       ej                  d      d-               Z1d. Z2 ej                  d       ej                  d      d/               Z3 ej                  d0       ej                  d      d1               Z4 ej                  d0       ej                  d      d2               Z5 ej                  d0       ej                  d      d3               Z6 ej                  d0       ej                  d      d4               Z7 ej                  d0       ej                  d      d5               Z8 ej                  d0       ej                  d      d6               Z9 ej                  d       ej                  d      d7               Z: ej                  d       ej                  d      d8               Z; ej                  d       ej                  d      d9               Z< ej                  d      d:        Z= ej                  d      d;        Z> ej                  d      d<        Z? ej                  d      d=        Z@ ej                  d0       ej                  d      d>               ZA ej                  d0       ej                  d      d?               ZB ej                  d0       ej                  d      d@               ZC ej                  d      dA        ZD ej                  d      dB        ZE ej                  d      dC        ZF ej                  d      dD        ZG ej                  d      dE        ZHej                  j7                  ed       ej                  d      dF               ZI ej                  d      dG        ZJ ej                  d       ej                  d      dH               ZK ej                  d      dI        ZLdJ ZM ej                  d      dK        ZN ej                  d      dL        ZO ej                  d      dM        ZP ej                  d      dN        ZQ ej                  d      dO        ZR ej                  d      dP        ZS ej                  d      dQ        ZT ej                  d      dR        ZU ej                  d      dS        ZVdTdUdVdWdXdYdZd[d\dXd]gd^d_dWd`dad[dbdcgd^d_gdddeZW ej                  dfdgd`daiidVfdhdidjididYdZiidkdVfdld`dmididjididYdniidodpfg       ej                  d      dq               ZX ej                  d      dr        ZY ej                  d      ds        ZZ ej                  d      dt        Z[ ej                  d      du        Z\yW)vTestLocalEvaluationc                     t         j                  j                  t        d      | _        | j                  j                          y Ncapturer   patchobjectr	   capture_patchstartclss    p/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/test/test_feature_flags.py
setUpClasszTestLocalEvaluation.setUpClass   /     !JJ--fi@!    c                 8    | j                   j                          y Nr   stopr   s    r   tearDownClassz!TestLocalEvaluation.tearDownClass        r    c                 ,    t        d||       d| _        yzMark the failure handlerFAILTNprintfailedselfebatchs      r   set_failzTestLocalEvaluation.set_fail!       far    c                 R    d| _         t        t        | j                        | _        y NF)on_errorr,   r	   r   r1   clientr.   s    r   setUpzTestLocalEvaluation.setUp&       .Gr    posthog.client.getc           
         ddddddddgd	d
gddgidg| j                   _        | j                   j                  ddddi      }| j                   j                  ddddi      }| j                  |       | j	                  |       y )N   Beta Featureperson-flagTgroupsregionexactUSApersonkeyoperatorvaluetyped   
propertiesrollout_percentageidnamerF   activefilterssome-distinct-idperson_propertiessome-distinct-2Canada)r7   feature_flagsget_feature_flag
assertTrueassertFalse)r.   	patch_getfeature_flag_matchnot_feature_flag_matchs       r   test_flag_person_propertiesz/TestLocalEvaluation.test_flag_person_properties*   s     &$ ,407.3W,4	!"+ 36
%
!0 "[[99-(EAR : 
 "&!=!=,8@T "> "
 	*+/0r    posthog.client.flagsc           
         ddddddddd	d
gddgidg| j                   _        ddi}| j                   j                  dd|dd      }| j                  |       | j	                  |ddi       | j	                  |j
                  d       y )Nr=   zDistinct ID Featurezdistinct-id-flagTr@   distinct_idrB   rS   rD   rE   rJ   rK   rN   rA   rC   F)rU   only_evaluate_locallysend_feature_flag_eventsr   )r7   rX   rY   rZ   assertEqual
call_count)r.   patch_flagsrU   r]   s       r   @test_distinct_id_property_is_available_for_local_evaluation_onlyzTTestLocalEvaluation.test_distinct_id_property_is_available_for_local_evaluation_onlyO   s     -) ,907-?,4	!"+ 36
%
!0 &u-![[99/"&%* : 
 	*+*Xu,=>//3r    c                    dddddddddgd	d
gdddddgd	d
gddgidg| j                   _        | j                  | j                   j                  ddddi             | j                  | j                   j                  ddddi             | j                  | j                   j                  ddddi             | j                  | j                   j                  ddddi             y )Nr=   r>   r?   Tr@   locationrB   u   StraßerD   rE   rJ   rK   staru   ſun)rO   rP   rF   is_simple_flagrQ   rR   rS   u   straßerT   strassesunr7   rX   rZ   rY   r8   s    r   test_case_insensitive_matchingz2TestLocalEvaluation.test_case_insensitive_matchingx   sE    &$"& ,607.7[,4	!"+ 36
 ,207.4X,4	!"+ 36
 "%
!H 	KK(("#-y"9 ) 	
 	KK(("#-y"9 ) 	
 	KK((1ffEU ) 	
 	KK((1fe_ ) 	
r    ))enabledTF)znot setNT)zexplicitly disabledFTc                     ddddgddgdddddgddgd	dgi}|||d
<   dddd|dg| j                   _        | j                  | j                   j                  ddddi      |       y )Nr@   rA   rB   rC   rD   rE   r   rK   rJ   
early_exitr=   Early Exit Featureearly-exit-flagTrN   rS   rT   )r7   rX   re   rY   )r.   _namers   expectedrR   s        r   test_early_exitz#TestLocalEvaluation.test_early_exit   s      $,(/&+W$,	# +,
 $,(/&+W$,	# +.

4 !$.GL! ,("%
! 	KK((!"#+U"3 ) 
 	
r    c                     dddddddiddigdd	g| j                   _        | j                  | j                   j                  dd
             y )Nr=   rt   ru   TrM   r   rJ   rs   r@   rN   rS   r7   rX   r[   rY   r8   s    r   >test_early_exit_on_rollout_only_group_with_no_property_filterszRTestLocalEvaluation.test_early_exit_on_rollout_only_group_with_no_property_filters   sf     ,("&-q1-s3%
!  	KK(():<NO	
r    c                     ddddddddgdd	gd
ddddgdd	gddgddg| j                   _        | j                  | j                   j                  ddddi             y )Nr=   rt   ru   TrA   rB   rW   rD   rE   r   rK   rC   rJ   rz   rN   rS   rT   ro   r8   s    r   5test_early_exit_does_not_trigger_on_property_mismatchzITestLocalEvaluation.test_early_exit_does_not_trigger_on_property_mismatch	  s    
 ,("&
 ,407.6Z,4	!"+ 34
 ,407.3W,4	!"+ 36
 "%
!H 	KK((!"#+U"3 ) 	
r    c                     dddddddddd	ddgid
ddgddgddd
ddgddgddgddg| j                   _        | j                  | j                   j                  ddd
di             y )Nr=   zEarly Exit Multivariatezearly-exit-multivariateTvariantscontrol2   rF   rM   testrA   rB   rC   rD   rE   r   rK   rJ   )rs   multivariater@   rN   rS   rT   r{   r8   s    r   $test_early_exit_on_multivariate_flagz8TestLocalEvaluation.test_early_exit_on_multivariate_flag8  s     10"&"$-RH$*"E%% ,407.3W,4	!"+ 34
 ,407.3W,4	!"+ 36
 &(%
!T 	KK(()"#+U"3 ) 	
r    c                    dddddddddgd	d
gddgddg| j                   _        ddd| j                   _        | j                  | j                   j	                  dddddii             | j                  | j                   j	                  dddddii             | j                  | j                   j	                  ddddidddii             | j                  | j                   j	                  ddddidddii             | j                  | j                   j	                  ddddidddii             | j                  |j                  d       dddii|_        i | j                   _        | j                  | j                   j	                  ddddidddii      d       | j                  |j                  d       y )Nr=   r>   
group-flagTr   rP   rB   zProject Name 1group)group_type_indexrF   rG   rH   rI   #   rK   aggregation_group_type_indexr@   rN   companyproject)01rS   )group_propertiesrV   zProject Name 2amazon_without_rolloutr@   r   amazonfeatureFlagsflags-fallback-value)	r7   rX   group_type_mappingr[   rY   rZ   re   rf   return_value)r.   r\   rg   s      r   test_flag_group_propertiesz.TestLocalEvaluation.test_flag_group_propertiesk  sE   
 &#45
 9:+107.>-?,3!"+ 35%
!4 09y)I& 	KK((""+f6F-G!H ) 	
 	KK((!"+f6F-G!H ) 	
 	KK(("!#;<"+f6F-G!H	 ) 	
 	KK(("!8,"+f6F-G!H	 ) 	
 	KK((!!#;<"+f6F-G!H	 ) 	
 	//3 \+AB$
  *,&KK(("!8,"+f6F-G!H	 )  #	
 	//3r    c                     dddddg ddgdd	}d
di| j                   _        | j                  t              5  | j                   j	                  |dddii        d d d        y # 1 sw Y   y xY w)Nr=   z#Group Flag Without Property Filterszgroup-flag-no-propsTr   rJ   rK   r   rN   r   r   rS   acmer   )r7   r   assertRaisesr
   _compute_flag_locally)r.   feature_flags     r   =test_group_flag_is_inconclusive_when_group_properties_missingzQTestLocalEvaluation.test_group_flag_is_inconclusive_when_group_properties_missing  s~    9(01*,CHI	
 +.y)9&56KK--"!6*!#	 .  766s   "A##A,c                 6   dddii|_         t        t        t              }dddddd	d
dgdddd
dgddgdddd
ddgddgdddd
ddgddgddgidg|_        | j	                  |j                  ddddd             | j                  |j                  d       | j	                  |j                  ddddd             | j                  |j                  d       | j                  |j                  dd ddd      d       | j                  |j                  d       |j                          | j                  |j                  ddddi      d       | j                  |j                  d       |j                          | j                  |j                  ddd	di      d       | j                  |j                  d       |j                          | j                  |j                  dd ddd!dd"             | j                  |j                  d       y )#Nr   complex-flagr   personal_api_keyr=   r>   Tr@   rA   rB   rC   rD   rE   rP   AloharJ   rK   emailza@b.comzb@c.com   doesnt_matterr   2r   rN   rS   rA   rP   rT   z some-distinct-id_within_rollout?)rA   r   z!some-distinct-id_outside_rollout?X)rA   r   rP   r   )
r   r	   r   rX   rZ   rY   re   rf   
reset_mockr[   r.   r\   rg   r7   s       r   !test_flag_with_complex_definitionz5TestLocalEvaluation.test_flag_with_complex_definition  s    ^-CD$
  )<MN &% ,407.3W,4	!" ,207.5Y,4	!"+ 36( ,307.7-C,4	!"+ 35
 ,;07.13Z,4	!"+ 34
;(*02 
h 	##"-2G"D $ 	
 	//3 	##2-2Y"G $ 	
 	//3 	##3-2Y"G $ 
 #	
 	//3  	##"#2C"8 $ 
 #	
 	//3  	## 2xQVFW $  #		
 	//3  	##3#&%(	# $ 		
 	//3r    c                    ddddi|_         t        t        t              }dddd	d
ddd ddgddgiddddd	d
dddgddgddgidg|_        |j	                  dd      }| j                  |d       | j                  |j                  d       |j	                  dd      }| j                  |d       | j                  |j                  d       y )Nr   alakazam	alakazam2beta-featurebeta-feature2r   r=   r>   r   Tr@   rO   b   cohortrF   rH   rG   rI   rJ   rK   rN      r   rA   rB   rC   rD   rE   rS   r   r	   r   rX   rY   re   rf   r.   r\   rg   r7   r]   s        r   $test_feature_flags_fallback_to_flagsz8TestLocalEvaluation.test_feature_flags_fallback_to_flagsb  s8    Z+V$
  )<MN &% ,0-/04,4	!"+ 36
, && ,407.3W,4	!"+ 36
-+ 
\ $44^EWX+Z8//3 $44/
 	+[9//3r    c                 z   ddddi|_         t        t        t              }dddd	d
ddd ddgddgiddddd	d
dddgddgddgidg|_        |j	                  ddd	      }| j                  |d        | j                  |j                  d       |j                  ddd	      }| j                  |d        | j                  |j                  d       |j	                  ddd	      }| j                  |d        |j                  ddd	      }| j                  |d        | j                  |j                  d       y )Nr   r   r   r   r   r=   r>   r   Tr@   rO   r   r   r   rJ   rK   rN   r   r   rA   rB   rC   rD   rE   rS   rc   r   )r   r	   r   rX   rY   re   rf   feature_enabledr   s        r   Ltest_feature_flags_dont_fallback_to_flags_when_only_local_evaluation_is_truez`TestLocalEvaluation.test_feature_flags_dont_fallback_to_flags_when_only_local_evaluation_is_true  s    Z+V$
  )<MN &% ,0-/04,4	!"+ 36
, && ,407.3W,4	!"+ 36
-+ 
^ $44.d 5 
 	+T2//3#33.d 4 
 	+T2//3 $44/t 5 
 	+T2#33/t 4 
 	+T2//3r    c                    di i|_         t        t        t              }dddddg dd	gid
g|_        | j	                  |j                  dd             | j	                  |j                  dd             | j	                  |j                  dd             | j                  |j                  d       | j	                  |j                  dd             | j                  |j                  d       y )Nr   r   r=   r>   r   Tr@   r   rK   rN   rS   r   r   )	r   r	   r   rX   r[   rY   r   re   rf   r   s       r   Ctest_feature_flag_never_returns_undefined_during_regular_evaluationzWTestLocalEvaluation.test_feature_flag_never_returns_undefined_during_regular_evaluation  s    
 %3B#7 )<MN &%*,23 
$ 	00ASTU//@RST 	00BTUV//3//ASTU//3r    c                 R   t        dd      |_        t        t        t              }g |_        | j                  |j                  dd             | j                  |j                  d       | j                  |j                  dd             | j                  |j                  d       y )Ni  zFlags errorr   r   rS   r=   r   )
r   side_effectr	   r   rX   assertIsNonerY   re   rf   r   r   s       r   3test_feature_flag_return_none_when_flags_errors_outzGTestLocalEvaluation.test_feature_flag_return_none_when_flags_errors_out  s    
 #+3">)<MN! 	&11/CUVW//3&00BTUV//3r    c           	          dddii|_         t        t        d      }ddddd	d
g d	dgiddg|_        | j	                  |j                  dd      d       | j	                  |j                  d       y )Nr   r   r   r   r   r=   r>   TrJ   r@   rK   )rO   rP   rF   rQ   rM   rR   ensure_experience_continuityrb   r   r	   r   rX   re   rY   rf   r.   rg   r7   s      r   5test_experience_continuity_flag_not_evaluated_locallyzITestLocalEvaluation.test_experience_continuity_flag_not_evaluated_locally+  s     ^-CD$
  )FC &%&)*,25 15 
& 	##NMB"	
 	//3r    r   c           
      V   dddddi|_         | j                  }dddd	d
dg d
dgiddddd	dg ddgiddddd	ddddgddgidg|_        | j                  |j	                  d      dddd       | j                  |j
                  d       | j                  |j
                  d       y )Nr   	variant-1	variant-2F)r   r   disabled-featurer=   r>   r   TrJ   r@   rK   rO   rP   rF   rQ   rM   rR   r   r   r   rN      r   countryUSrF   rH   rb   r   r7   rX   re   get_all_flagsrf   r.   rg   patch_capturer7   s       r    test_get_all_flags_with_fallbackz4TestLocalEvaluation.test_get_all_flags_with_fallbackJ  s     +!,$)$
   &%&)*,25  &)*,23 &&3<t+L*M23=, 
\ 	  / +!,$)	
 	//31115r    c           	      r   ddddddd|_         | j                  }ddd	d
dg ddgddidddddd
g ddgddidddddd
dddgddgddiddg|_        | j                  |j	                  d      d   ddd       | j                  |j
                  d       | j                  |j
                  d       y )Nr   r   r   rJ   ,  r   featureFlagPayloadsr=   r>   r   TrK   truesome-payloadr@   payloadsr   r   r   r   another-payloadrN   r   r   r   r   r   	payload-3rb   r   r   r7   rX   re   get_all_flags_and_payloadsrf   r   s       r   -test_get_all_flags_and_payloads_with_fallbackzATestLocalEvaluation.test_get_all_flags_and_payloads_with_fallback  s@    .9;W47##N$
   &%&) +-25 !
& &) +-23  1!
$ && 4=t+L*M23 !
I5 
n 	--m<=RS #!$	
 	//31115r    c                     ddddi|_         | j                  }g |_        | j                  |j	                  d      ddd       | j                  |j
                  d       | j                  |j
                  d       y )Nr   r   r   r   rb   r=   r   r   r   s       r   2test_get_all_flags_with_fallback_empty_local_flagszFTestLocalEvaluation.test_get_all_flags_with_fallback_empty_local_flags  s}     [;W$
  !  /(;G	
 	//31115r    c                    ddddddd|_         | j                  }g |_        | j                  |j	                  d      d   ddd       | j                  |j
                  d	       | j                  |j
                  d
       y )Nr   r   r   rJ   r   r   rb   r   r=   r   r   r   s       r   ?test_get_all_flags_and_payloads_with_fallback_empty_local_flagszSTestLocalEvaluation.test_get_all_flags_and_payloads_with_fallback_empty_local_flags  s     .9;W47##N$
  !--m<=RS 37	
 	//31115r    c           	      0   ddddi|_         | j                  }ddddd	d
g d	dgidddddd
g ddgidg|_        | j                  |j	                  d      ddd       | j                  |j
                  d       | j                  |j
                  d       y )Nr   r   r   r   r=   r>   r   TrJ   r@   rK   r   r   r   r   rN   rb   Fr   r   r   r   s       r   #test_get_all_flags_with_no_fallbackz7TestLocalEvaluation.test_get_all_flags_with_no_fallback  s     [;W$
   &%&)*,25  &)*,23! 
> 	  /!u=	

 	//31115r    c                 0   | j                   }dddddg ddgddid	d
}ddddg ddgddid	d}||g|_        | j                  |j                  d      d   ddi       | j                  |j                  d       | j                  |j                  d       y )Nr=   r>   r   TrJ   rK   r   newr   r   r   r   r   r   rN   rb   r   )r7   rX   re   r   rf   )r.   rg   r   r7   
basic_flagdisabled_flags         r   0test_get_all_flags_and_payloads_with_no_fallbackzDTestLocalEvaluation.test_get_all_flags_and_payloads_with_no_fallback*  s    
 "!"% ').1 E


& "% ')./ N

$  
 	--m<=RSU#	

 	//31115r    c           
      V   ddddi|_         | j                  }ddddd	d
g d	dgidddddd
g ddgidddddd
dddgddgidg|_        | j                  |j	                  dd      ddd       | j                  |j
                  d       | j                  |j
                  d       y )Nr   r   r   r   r=   r>   r   TrJ   r@   rK   r   r   r   r   rN   r   r   r   r   r   rb   r   Fr   r   r   s       r   >test_get_all_flags_with_fallback_but_only_local_evaluation_setzRTestLocalEvaluation.test_get_all_flags_with_fallback_but_only_local_evaluation_set_  s    [;W$
   &%&)*,25  &)*,23 &&3<t+L*M23=, 
\ 	  d K!u=	
 	//31115r    c                    ddddddd|_         | j                  }ddd	d
dg ddgddidd}dddd
g ddgddidd}dddd
dddgddgddidd}|||g|_        | j                  |j	                  dd
      d   d	di       | j                  |j
                  d       | j                  |j
                  d       y )Nr   r   r   rJ   r   r   r=   r>   r   TrK   r   r   r   r   r   r   r   r   rN   r   r   r   r   r   r   rb   r   r   r   )r.   rg   r   r7   flag_1flag_2flag_3s          r   Ktest_get_all_flags_and_payloads_with_fallback_but_only_local_evaluation_setz_TestLocalEvaluation.test_get_all_flags_and_payloads_with_fallback_but_only_local_evaluation_set  sX    .9;W47##N$
  "!"% ').1 N

& "% ')./ -

$ "" 094'H&I./ K

$  
 	--T . #% ^,		
 	//31115r    c           	         | j                   }ddddddg ddgidd	dd
ddg ddgidg|_        | j                  |j                  d      ddd       | j                  |j                  d       | j                  |j                  d       ddddddg ddgidd	dd
ddg ddgidg|_        | j                  |j                  d      ddd       | j                  |j                  d       | j                  |j                  d       y )Nr=   r>   r   TrJ   r@   rK   r   r   r   r   rN   rb   Fr   )r7   rX   re   r   rf   r   s       r   #test_compute_inactive_flags_locallyz7TestLocalEvaluation.test_compute_inactive_flags_locally  s{     &%&)*,25  &)*,23! 
> 	  /!u=	

 	//31115
 &%&)*,25  &)*,25! 
> 	  /"=	

 	//31115r    c                    t        t        t              }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gddgiig|_        |j	                  ddd d d d d      }| j                  |d       | j                  |j                  d       | j                  |j                  d       |j	                  ddddd d!d      }| j                  |d       y )"Nr   r=   rP   r>   rF   r   rQ   TrR   r@   latestBuildVersionrD   z.+regexrF   rI   rH   rG   latestBuildVersionMajor23gtlatestBuildVersionMinor31latestBuildVersionPatchr   rJ   )variantrL   rM   rS   )r   r   r  r  rT   Fr   z24.32.12432r   )r	   r   rO   rX   rY   re   rf   r   s        r   /test_feature_flags_local_evaluation_None_valueszCTestLocalEvaluation.test_feature_flags_local_evaluation_None_values=  sX    )<MN A~$'+ ,@,4-107	!" ,E,4-104	!" ,E,4-104	!" ,E,4-004	!"'+4 369!') 
V $44&*+/+/+/	 5 	
 	+U3//3--q1#44&/+/+/+.	 5 	
 	+T2r    c                    t        t        t              }dddddddd	gd
dddd ddgddgidg|_        ddddddddgd
dgdddddgd
dgdd|_        |j	                  ddddi      }| j                  |d       | j                  |j                  d        | j                  |j                  d        |j	                  ddd	dd!      }| j                  |d       | j                  |j                  d        | j                  |j                  d        |j	                  ddd	dd"      }| j                  |d       | j                  |j                  d        | j                  |j                  d        y )#Nr   r   r>   r   Tr@   rA   rB   rC   rD   rE   rO   r   r   r   rJ   rK   rN   ORr=   rF   rH   rI   nationUKrI   valuesANDotherthing98r   rS   rT   Fr   rA   r  rA   r  )r	   r   rX   cohortsrY   re   rf   r   s        r   /test_feature_flags_local_evaluation_for_cohortszCTestLocalEvaluation.test_feature_flags_local_evaluation_for_cohorts  s    )<MN &% ,407.3W,4	!" ,0-/04,4	!"+ 36 
>  1h?'$+"& (	   '$+") (	

4 $44.8TBR 5 
 	+U3//3--q1#44).$? 5 
 	+T2//3--q1#44).A 5 

 	+T2//3--q1r    c                    t        t        t              }dddddddd	gd
dddd ddgddgidg|_        ddddddddgd
dgdddddgd
ddgdd|_        |j	                  ddddi      }| j                  |d        | j                  |j                  d!       | j                  |j                  d!       |j	                  ddd	dd"      }| j                  |d       | j                  |j                  d!       | j                  |j                  d!       |j	                  ddd	dd#      }| j                  |j                  d       | j                  |j                  d!       |j                          |j	                  ddd	d$d#      }| j                  |d       | j                  |j                  d!       | j                  |j                  d!       y )%Nr   r   r>   r   Tr@   rA   rB   rC   rD   rE   rO   r   r   r   rJ   rK   rN   r
  r=   r  r  r  r  r  r  r  )rF   rG   rH   rI   negationr  rS   rT   Fr   r  r  thing2)r	   r   rX   r  rY   re   rf   r   r   s        r   7test_feature_flags_local_evaluation_for_negated_cohortszKTestLocalEvaluation.test_feature_flags_local_evaluation_for_negated_cohorts  sW   
 )<MN &% ,407.3W,4	!" ,0-/04,4	!"+ 36 
>  1h?'$+"& (	   '$+") ($(
6 $44.8TBR 5 
 	+U3//3--q1#44).$? 5 
 	+T2//3--q1#44).A 5 
 	//3--q1 #44).B 5 

 	+T2//3--q1r    zposthog.feature_flags.logc                     di i|_         t        t        t              }ddddddd	dd
dgddddddgddgidg|_        |j	                  ddddi      }| j                  |       | j                  |j                  d       | j                  |j                  d       |j	                  ddddi      }| j                  |       | j                  |j                  d       | j                  |j                  d       y )Nr   r   r=   zFlag with Dependencieszflag-with-dependenciesTr@   r   flag_evaluates_toflagrF   rG   rH   rI   dependency_chainr   	icontains@example.comrD   rE   rJ   rK   rN   	test-usertest@example.comrT   r   test-user-2test@other.comr   )r   r	   r   rX   rY   r   re   rf   )r.   r\   rg   mock_logr7   r]   s         r   )test_feature_flags_with_flag_dependenciesz=TestLocalEvaluation.test_feature_flags_with_flag_dependenciesB  sM    %3B#7 )<MN 0/ ,:0C-1,29G8H!" ,30;-;,4	!"+ 36! 
F $44$&(:; 5 

 	,-//3--q1 $44$&(89 5 

 	,-//3--q1r    c                 ,   t        t        t              }dddddddd	d
dgddgidddddddddddgdgddgidg|_        |j                  ddddi      }| j	                  |d       |j                  ddddi      }| j	                  |d       y)z4Test basic flag dependency: flag-b depends on flag-ar   r=   Flag Aflag-aTr@   r   r"  r#  rD   rE   rJ   rK   rN   r   Flag Bflag-br  r  r   r$  r%  rT   r&  r'  FNr	   r   rX   rY   re   r.   r\   rg   r7   results        r   #test_flag_dependencies_simple_chainz7TestLocalEvaluation.test_flag_dependencies_simple_chain  s    )<MN   ,30;-;,4	!"+ 36
,   ,40C-1,29A
!"+ 36-, 
^ ((&(:; ) 

 	& ((&(89 ) 

 	'r    c                 *   di i|_         t        t        t              }ddddddd	dd
g dgddgidddddddd	dd
g dgddgidg|_        |j	                  dd      }| j                  |       |j	                  dd      }| j                  |       y)zUTest circular dependency handling: flag-a depends on flag-b, flag-b depends on flag-ar   r   r=   r+  r,  Tr@   r.  r  r  r   rJ   rK   rN   r   r-  r$  Nr   r	   r   rX   rY   r   )r.   r\   rg   r7   result_aresult_bs         r   *test_flag_dependencies_circular_dependencyz>TestLocalEvaluation.test_flag_dependencies_circular_dependency  s    
 %3B#7 )<MN   ,40C-1,28:!"+ 36.   ,40C-1,28:!"+ 36/- 
b **8[A(#**8[A(#r    c                     di i|_         t        t        t              }ddddddd	dd
dgdgddgidg|_        |j	                  dd      }| j                  |       y)z(Test handling of missing flag dependencyr   r   r=   r+  r,  Tr@   znon-existent-flagr  r  r   rJ   rK   rN   r$  Nr4  r0  s        r   #test_flag_dependencies_missing_flagz7TestLocalEvaluation.test_flag_dependencies_missing_flag  s    
 %3B#7 )<MN   ,?0C-1,29L8M!"+ 36 
6 ((;?&!r    c                    t        t        t              }dddddg ddgid	d
ddddg ddgid	ddddddddddgddddddgdgddgid	dddddddddg ddgddgid	g|_        |j                  dd      }| j	                  |d       d|j                  d   d<   |j                  dd      }| j	                  |d       y)zCTest complex dependency chain: flag-d -> flag-c -> [flag-a, flag-b]r   r=   r+  r,  Tr@   rJ   rK   rN   r   r-  r.  r   zFlag Cflag-cr  r  r      zFlag Dzflag-d)r,  r.  r;  r$  Fr   rQ   Nr/  r0  s        r   $test_flag_dependencies_complex_chainz8TestLocalEvaluation.test_flag_dependencies_complex_chain'  sv    )<MN  *,25  *,25   ,40C-1,29A
!" ,40C-1,29A
!"+  36#<   ,40C-1,28V!"+ 36uP 
f ((;?& -2Q)((;?'r    c                    t        t        t              }dddddg ddgid	d
dddddddddgddddddgddgid	g|_        |j                  ddddi      }| j	                  |d       |j                  ddddi      }| j	                  |d       d|j                  d   d<   |j                  ddddi      }| j	                  |d       y)z9Test flag dependency mixed with other property conditionsr   r=   	Base Flag	base-flagTr@   rJ   rK   rN   r   z
Mixed Flag
mixed-flagr  r  r   r   r"  r#  rD   rE   r$  r%  rT   r&  r'  Fr   rQ   ztest-user-3Nr/  r0  s        r   'test_flag_dependencies_mixed_conditionsz;TestLocalEvaluation.test_flag_dependencies_mixed_conditions  s_    )<MN #"*,25 $# ,70C-1,29D!" ,30;-;,4	!"+ 36!+ 
\ ((&(:; ) 

 	& ((&(89 ) 

 	' -2Q)((&(:; ) 

 	'r    c                     di i|_         t        t        t              }dddddg dd	gid
ddddddddddgdd	gid
g|_        |j	                  dd      }| j                  |       y)z,Test handling of malformed dependency chainsr   r   r=   r?  r@  Tr@   rJ   rK   rN   r   zMissing Chain Flagzmissing-chain-flagr  r  rE   r$  Nr4  r0  s        r   &test_flag_dependencies_malformed_chainz:TestLocalEvaluation.test_flag_dependencies_malformed_chain  s    
 %3B#7 )<MN #"*,25 ,+ ,70C-1,2	!"+ 36% 
R (()={K&!r    c           	      "   ddl m}m} dddddgd}| j                  |      5 } ||di d	i i 
       ddd       | j	                  dt        j                               | j	                  dt        |j                               y# 1 sw Y   TxY w)z<Test that missing flags_by_key raises InconclusiveMatchErrorr   )evaluate_flag_dependencyr
   z	some-flagr  Tr  r   Nr$  )flags_by_keyevaluation_cacherb   rL   cohort_propertieszCannot evaluate flag dependency)posthog.feature_flagsrF  r
   r   assertInstr	exception)r.   rF  r
   property_with_flag_depcms        r   :test_flag_dependencies_without_context_raises_inconclusivezNTestLocalEvaluation.test_flag_dependencies_without_context_raises_inconclusive  s    	
 +!,"
 56"$&!!#'"$ 7 	7R\\9JKk3r||#45 76s   BBc                    t        t        t              }dddddddd	d
dgddddddd
dgddddddgdddddddddgiddddddddddddgddddd
dgddddddddgdddd d
dgdd dgddd!ddd d"ddgiddd#d$d%ddd&ddddddgdgdd'gidg|_        | j                  d|j	                  dd(dd	i)             | j                  d|j	                  dd(ddi)             | j                  d|j	                  dd(d	dd*)             | j                  d |j	                  dd(d	d d*)             | j                  d+|j	                  dd(ddd*)             | j                  d|j	                  d%d(d	dd*)             | j                  d+|j	                  d%d(d	d d*)             | j                  d+|j	                  d%d(ddd*)             y,)-z`Test multi-level multivariate dependency chain: dependent-flag -> intermediate-flag -> leaf-flagr   r=   z	Leaf Flagz	leaf-flagTrJ   r   rD   zcontrol@example.comrB   r   r   rL   rM   r  r%  r   r   rM   r  r   ControlrF   rP   rM   Testr@   r   r   r   zIntermediate Flagzintermediate-flagr  r  r   variant_typebluegreenBlueGreenr   zDependent Flagzdependent-flagr@   rK   zany-userrT   )r   rX  FN)r	   r   rX   re   rY   r   s       r   .test_multi_level_multivariate_dependency_chainzBTestLocalEvaluation.test_multi_level_multivariate_dependency_chain"  s    )<MN #"&) ,3,4-B07	!"+ 36'0 ,3,4-?07	!"+ 36'- 35'03> #'0(168
 %+FRTU%	%?)0f +*&) ,70C-6,29D!" ,:,4-307	!"+ 36'-#, ,70C-6,29D!" ,:,4-407	!"+ 36'.#)'R #$*FRTU$+WTVW%%S/6r ('&) ,?0C-3,2(3(;9&	!"+ 36YF 
V 	###*,A"B $ 	
 	###*,>"? $ 	
 	###2$*# $ 
	
 	###2$+# $ 
	
 	###/$*# $ 
	
 	## 2$*# $ 
	
 	## 2$+# $ 
	
 	## ,>PV"W $ 	
r    c                    ddl m} | j                   |dd             | j                   |dd             | j                   |dd             | j                   |dd             | j                   |dd             | j                   |dd             | j                   |dd             | j                   |dd             | j                   |dd             | j                   |dd             | j                   |dd             | j                   |dd             | j                   |dd	             | j                   |dd	             | j                   |d
d             | j                   |dd             y)z0Test the matches_dependency_value function logicr   )matches_dependency_valuer   rT  CONTROLr   TF {   N)rJ  r_  rZ   r[   )r.   r_  s     r   test_matches_dependency_valuez1TestLocalEvaluation.test_matches_dependency_value	  sc   B 	0IFG0IFG1)YGH1)YGH1)VDE 	0yAB0v>?1%CD 	0t<=0>?1%>?1$>? 	1$;<1)R@A 	1#yAB1)TBCr    c                    t        t        t              }dddddddd	gd
dgddddddgd
dgddddddgd
dgddddddgd
dgdddg ddgdddddddddddddgiddddddddddddgd gdd!ddddddgd gdd"dgdd!ddd"ddd#ddd$ddgiddd%d&d'ddddd!dddgd gdd(dddd"dddgd gdd)dgdd(ddd)ddd*ddd+ddgiddg|_        |j                  dd,dd	i-      }|j                  dd,dd	i-      }|j                  d'd,dd	i-      }| j	                  |d       | j	                  |d!       | j	                  |d(       |j                  dd,ddi-      }|j                  dd,ddi-      }|j                  d'd,ddi-      }	| j	                  |d       | j	                  |d"       | j	                  |	d)       |j                  dd,dd.i-      }
|j                  dd,dd.i-      }|j                  d'd,dd.i-      }| j	                  |
d/       | j	                  |d/       | j	                  |d/       y0)1zTest production-style multivariate dependency chain: multivariate-root-flag -> multivariate-intermediate-flag -> multivariate-leaf-flagr   i  zMultivariate Leaf Flag (Base)zmultivariate-leaf-flagTrJ   r   rD   zpineapple@example.comrB   r   	pineapplerR  zmango@example.commangozpapaya@example.compapayazkiwi@example.comkiwir   rK   r      r   rW  r   i  z1Multivariate Intermediate Flag (Depends on fruit)zmultivariate-intermediate-flagr  r  )rF   rI   rH   rG   r!  rY  redrZ  blacki  z)Multivariate Root Flag (Depends on color)zmultivariate-root-flagzbreaking-badzthe-wirezgame-of-throneszthe-expanser$  rT   zunknown@example.comFNr/  )r.   r\   rg   r7   leaf_resultintermediate_resultroot_resultmango_leaf_resultmango_intermediate_resultmango_root_resultunknown_leaf_resultunknown_intermediate_resultunknown_root_results                r   3test_production_style_multivariate_dependency_chainzGTestLocalEvaluation.test_production_style_multivariate_dependency_chain+	  sy    )<MN 7/&) ,3,4.E-F07	!"+ 36'2 ,3,4.A-B07	!"+ 36'. ,3,4.B-C07	!"+ 36'/ ,3,4.@-A07	!"+ 36'- +-23c5n #$/rJ$+2F$,BG$*"E	%%o?FR K7&) ,D,2-80C9Q8R!"+ 36'-  ,D,2-40C9Q8R!"+ 36',: #$*#F$)C$+1E$+1E	%%;%,^ C/&) ,L,2-30C(@(H9&	!"+ 36'5& ,L,2-20C(@(H9&	!"+ 36'1#!F #$2#N$.aH$5QO$1K	%%G+2qk 
\ --$&(?@ . 

 %55,&(?@ 6 

 --$&(?@ . 
 	k2,f5n5 #33$&(;< 4 

 %+$;$;,&(;< %< %
!
 #33$&(;< 4 
 	*G42E:*J7 %55$&(=> 6 

 '-&=&=,&(=> '> '
#
 %55$&(=> 6 
 		
 	4e<,e4r    zposthog.client.Pollerc                 \   t        ddddddddd	dgd
dii dd      |_        t        t        d      }t	        d      5  |j                          d d d        | j                  t        |j                        d       | j                  |j                  d   d   d       | j                  |j                  d
di       | j                  |j                  j                         d       | j                  |j                  d       | j                  |j                  d       y # 1 sw Y   xY w)Nr=   r>   r   T)rO   rP   rF   rQ   r   zAlpha Featurezalpha-featureFr   r   flagsr   r  z"abc123"dataetagr   r   z2020-01-01T12:01:00.0000Zr   rF   z2020-01-01T12:01:00+00:00)r   r   r	   r   r   load_feature_flagsre   lenrX   r   _last_feature_flag_poll	isoformatrf   _flags_etagr.   r\   
patch_pollr7   s       r   test_load_feature_flagsz+TestLocalEvaluation.test_load_feature_flags 
  s,    "-   .-"&	   /."'	 (+I&6!$ '"
	* )FC45%%' 6V112A6--a07H22S)4DE**4468S	
 	..2++Z8 65s   D""D+c                 f   t        ddddgi i dd      |_        t        t        d	      }|j	                          |j
                  d
   d   }| j                  |j                  d             |j                          |j
                  d   d   }| j                  |j                  d      d       y)zITest that the ETag is sent in If-None-Match header on subsequent requestsr=   r   TrO   rF   rQ   rw  z"initial-etag"ry  r   r   r   r{  N)
r   r   r	   r   r|  call_args_listr   get_load_feature_flagsre   )r.   r\   r  r7   first_call_kwargssecond_call_kwargss         r   9test_load_feature_flags_sends_etag_on_subsequent_requestszMTestLocalEvaluation.test_load_feature_flags_sends_etag_on_subsequent_requestsE
  s     "-!">TJK&(
 ""
	 )FC!!# &44Q7:+//78 	""$ '55a8;+//79IJr    c                 X   t        ddddgddii dd	      }t        d
dd      }||g|_        t        t        d      }|j	                          | j                  t        |j                        d       | j                  |j                  d   d   d       | j                  |j                  ddi       |j                          | j                  t        |j                        d       | j                  |j                  d   d   d       | j                  |j                  ddi       y
)z9Test that 304 Not Modified responses skip flag processingr=   r   Tr  r   r   rw  z"test-etag"ry  N)rz  r{  not_modifiedr   r   r   rF   )
r   r   r	   r   r|  re   r}  rX   r   r  )r.   r\   r  initial_responsenot_modified_responser7   s         r   (test_load_feature_flags_304_not_modifiedz<TestLocalEvaluation.test_load_feature_flags_304_not_modifieda
  s.   
 '!">TJK'*I&6
 
 !,!

 "23H I	)FC!!# 	V112A6--a07H22S)4DE 	""$ 	V112A6--a07H22S)4DEr    c                 |   t        ddddgi i dd      t        ddddgi i dd	      g|_        t        t        d
      }|j	                          | j                  |j                  d       |j                          | j                  |j                  d	       | j                  |j                  d   d   d       y)z+Test that ETag is updated when flags changer=   flag-v1Tr  rw  	"etag-v1"ry  flag-v2z	"etag-v2"r   r   r   rF   N)	r   r   r	   r   r|  re   r  r  rX   r  s       r   4test_load_feature_flags_etag_updated_on_new_responsezHTestLocalEvaluation.test_load_feature_flags_etag_updated_on_new_response
  s     %&yDIJ*,!
 ! %&yDIJ*,!
 !!
	& )FC!!#++[9""$++[9--a07Cr    c                 z   t        ddddgi i dd      t        ddddgi i dd	      g|_        t        t        d
      }|j	                          | j                  |j                  d       |j                          | j                  |j                         | j                  |j                  d   d   d       y	)z6Test that ETag is cleared when server stops sending itr=   r  Tr  rw  r  ry  r  Nr   r   r   rF   )
r   r   r	   r   r|  re   r  r  r   rX   r  s       r   =test_load_feature_flags_clears_etag_when_server_stops_sendingzQTestLocalEvaluation.test_load_feature_flags_clears_etag_when_server_stops_sending
  s     %&yDIJ*,!
 ! %&yDIJ*,!
 !
	& )FC!!#++[9""$&,,---a07Cr    c                    t        dd      |_        t        t        t              }| j	                  dd      5 }|j                          | j                  d|j                  d          | j                  d|j                  d          | j                  d	|j                  d          d d d        d
|_        | j                  t         d      5  |j                          d d d        y # 1 sw Y   @xY w# 1 sw Y   y xY w)N  Unauthorizedr   posthogERROR)levelr   project_api_keyr   T)
r   r   r	   r   
assertLogsr|  rK  outputdebugassertRaisesRegex)r.   r\   _patch_pollr7   logss        r   !test_load_feature_flags_wrong_keyz5TestLocalEvaluation.test_load_feature_flags_wrong_key
  s     !)n =	)<MN__Yg_6$%%'MM.$++a.9MM+T[[^<MM,dkk!n=	 7
 ##Hn=%%' >= 76 >=s   A.C'C3'C03C<c           	          t        t              }ddddddg ddgidg|_        | j                  |j	                  dd	             | j                  |j                  d
       y )Nr=   r>   r   TrJ   r@   rK   r   rb   r   r	   r   rX   rZ   r   re   rf   r   s       r   test_feature_enabled_simplez/TestLocalEvaluation.test_feature_enabled_simple
  sx     )* &%&)*,25 
" 	..~}MN//3r    c           	          t        t              }ddddddg ddgidg|_        | j                  |j	                  dd	             | j                  |j                  d       y )
Nr=   r>   r   Tr   r@   rK   r   rb   )r	   r   rX   r[   r   re   rf   r   s       r   $test_feature_enabled_simple_is_falsez8TestLocalEvaluation.test_feature_enabled_simple_is_false
  sz     )* &%&'*,23 
" 	//NO//3r    c           	          t        t              }ddddd dg d dgidg|_        | j                  |j	                  dd             | j                  |j                  d	       y )
Nr=   r>   r   Tr@   rK   r   rb   r   r  r   s       r   =test_feature_enabled_simple_is_true_when_rollout_is_undefinedzQTestLocalEvaluation.test_feature_enabled_simple_is_true_when_rollout_is_undefined  sx    
 )* &%&**,26 
" 	..~}MN//3r    c           	          t        t        | j                        }ddddddg ddgid	g|_        | j	                  |j                  dd
             y )N)r  r5   r=   r>   r   TrJ   r@   rK   r   rb   )r	   r   r1   rX   rZ   r   r.   r\   r7   s      r   0test_feature_enabled_simple_with_project_api_keyzDTestLocalEvaluation.test_feature_enabled_simple_with_project_api_key!  sf    (9DMMR &%&)*,25 
" 	..~}MNr    c           	          dddii|_         t        t        d      }ddddd	d
g d	dgidg|_        | j	                  |j                  dd             | j                  |j                  d       y )Nr   r   r   r   r   r=   r>   TrJ   r@   rK   r   rb   r   )r   r	   r   rX   rZ   r   re   rf   r   s      r   *test_feature_enabled_request_multi_variatez>TestLocalEvaluation.test_feature_enabled_request_multi_variate7  s    $2^[4Q#R )FC &%&)*,25 
" 	..~}MN//3r    c                     t        t              }ddddddg igidg|_        | j                  |j	                  dd             y )	Nr=   r>   r   Tr@   rL   rN   rb   )r	   r   rX   rZ   r   r  s      r   6test_feature_enabled_simple_without_rollout_percentagezJTestLocalEvaluation.test_feature_enabled_simple_without_rollout_percentageP  s\    )* &%(" 
 	..~}MNr    c                     dddii|_         t        t        d      }ddddd	g d	d
gdddddddgiddg|_        | j	                  |j                  dd      d       | j	                  |j                  d       y )Nr   r   r   r   r   r=   r>   TrJ   rK   r   r   r   r   rW  r   rb   r   r   r   s      r   test_get_feature_flagz)TestLocalEvaluation.test_get_feature_flagd  s    $2^[4Q#R )FC &%&) +-25 #$/rJ$/rJ%% 
. 	##NMBK	
 	//3r    c                     t        t              }g |_        di i|_        | j	                  |j                  dd             t        dd      |_        | j                  |j                  dd             y )Nr   doesnt-existrb   r  zflags error)	r	   r   rX   r   r[   r   r   r   r   r.   rg   r  r7   s       r   !test_feature_enabled_doesnt_existz5TestLocalEvaluation.test_feature_enabled_doesnt_exist  si     )*!$2B#7 //NO"*3">&00OPr    c                     t        t        d      }g |_        dddii|_        | j	                  |j                  dd             y )Nr   r   r   zfeature-flagTrb   )r	   r   rX   r   rZ   r   r  s       r   "test_personal_api_key_doesnt_existz6TestLocalEvaluation.test_personal_api_key_doesnt_exist  sD     )FC!$2^T4J#K ..~}MNr    c                     d }||j                   j                  _        t        t        d      }g |_        | j                  |j                  dd             y )Nc                      t        d      )Nzhttp exception)	Exception r    r   raise_effectzGTestLocalEvaluation.test_load_feature_flags_error.<locals>.raise_effect  s    ,--r    r   r   r  rb   )r   
raiseErrorr   r	   r   rX   r[   r   )r.   r\   r  r  r7   s        r   test_load_feature_flags_errorz1TestLocalEvaluation.test_load_feature_flags_error  sN    	. 9E	))5)FC!//NOr    c                 h   dddii|_         t        t        d      }ddddd	d
ddddgd	dddddgdddddddddddddgiddg|_        | j	                  |j                  ddd
di      d       | j	                  |j                  dd      d       | j	                  |j                  d        y )!Nr   r   r   r   r   r=   r>   TrJ   r   rD   test@posthog.comrB   r   second-variantrR  r   first-variantrS  r   First VariantrU  Second Variantri  third-variantThird VariantrW  r   test_idrT   
example_idr   r   r   s      r   ,test_get_feature_flag_with_variant_overridesz@TestLocalEvaluation.test_get_feature_flag_with_variant_overrides  s)   $2^[4Q#R )FC &%&) ,3,4-?07	!"+ 36'7 02oN  #'6(768 (8(868 (7(768%%!#*, 
Z 	###*,>"? $ 
 	
 	##NLA?	
 	//3r    c                    dddii|_         t        t        d      }ddddd	d
ddddgd	ddd
ddddgd	dddddgdddddddddddddgiddg|_        | j	                  |j                  ddd
di      d       | j	                  |j                  ddd
di      d       | j	                  |j                  d        y )!Nr   r   r   r   r   r=   r>   TrJ   r   rD   r  rB   r   r  rR  r  r   rS  r   r  rU  r  ri  r  r  rW  r   r  rT   r  r   r   r   s      r   )test_flag_with_clashing_variant_overridesz=TestLocalEvaluation.test_flag_with_clashing_variant_overrides  sc   $2^[4Q#R )FC &%&) ,3,4-?07	!"+ 36'7  ,3,4-?07	!"+ 36'6 02oN5: #'6(768 (8(868 (7(768%%;079 
t 	###*,>"? $ 
 	
 	###*,>"? $ 
 	
 	//3r    c                 h   dddii|_         t        t        d      }ddddd	d
ddddgd	dddddgdddddddddddddgiddg|_        | j	                  |j                  ddd
di       d       | j	                  |j                  dd!      d       | j	                  |j                  d"       y )#Nr   r   r   r   r   r=   r>   TrJ   r   rD   r  rB   r   	second???rR  r   first??rS  r   r  r  rU  r  r  ri  r  r  rW  r   r  rT   r  r   r   r   s      r   (test_flag_with_invalid_variant_overridesz<TestLocalEvaluation.test_flag_with_invalid_variant_overrides7  s*   $2^[4Q#R )FC &%&) ,3,4-?07	!"+ 36'2 02iH  #'6(768 (8(868 (7(768%%!#*, 
Z 	###*,>"? $ 
 	
 	##NLACS	
 	//3r    c                    dddii|_         t        t        d      }ddddd	d
idddddgd
ddgdddd
dddddgiddg|_        |j	                  ddddi      }| j                  |d       | j                  |j                  d       y )Nr   z
order-testzserver-variantr   r   r=   zOrder Test FlagTrM   rJ   r   rD   z@vip.comr"  r   zvip-variantrR  r   r   rT  rU  zVIP Variantr   rW  rN   user123zuser@vip.comrT   r   r.   rg   r7   r1  s       r   "test_conditions_evaluated_in_orderz6TestLocalEvaluation.test_conditions_evaluated_in_orderv  s    $2\CS4T#U )FC )# 1# ,3,4-70;	!"+ 36'4	$ #'0(169 (5(567%%% &( 
X ((&7 ) 

 	+ 	//3r    c           	      R   dddddddgdd	gd
dgddidd}|g| j                   _        | j                  | j                   j                  ddddi      d       | j                  | j                   j                  dddddi      d       | j                  |j                  d       y )Nr=   r>   r?   TrA   rB   rC   rD   rE   rJ   rK   r   r   r   rN   rS   rT   match_valuerU   r   r7   rX   re   get_feature_flag_payloadrf   )r.   rg   r   s      r   (test_boolean_feature_flag_payloads_localz<TestLocalEvaluation.test_boolean_feature_flag_payloads_local  s     "  (0,3*/(0	' /2
 $SM

, &0L!KK001hPUEV 1  		
 	KK00" #+U"3	 1  	
 	//3r    c           	      t   ddiddid|_         | j                  | j                  j                  ddddi      d       | j                  | j                  j                  dddddid	      d       | j                  |j                  d
       | j                  |j                  d       |j                          y )Nr?   Tr   r   rS   rA   rC   rT   )r  rU   rd   r   r=   )r   re   r7   r  rf   r   )r.   rg   r   s      r   (test_boolean_feature_flag_payload_decidez<TestLocalEvaluation.test_boolean_feature_flag_payload_decide  s     +D1$13#7$
  	KK001hPUEV 1  		
 	KK00" #+U"3)- 1  		
 	//31115  "r    c                    ddddddddd	d
gddddddgdddddddddddddgiddddd}|g| j                   _        | j                  | j                   j                  ddddi      d d!i       | j                  | j                   j                  dddddi"      d d!i       | j                  | j                   j                  dddddi"      d#       | j                  |j                  d$       y )%Nr=   r>   r   TrJ   r   rD   r  rB   r   r  rR  r   r  rS  r   r  r  rU  r  r  ri  r  r  z"some-payload"z{"a": "json"})r  r  r@   r   r   r   r  rT   ajsonr  r   r   r  )r.   rg   multivariate_flags      r   'test_multivariate_feature_flag_payloadsz;TestLocalEvaluation.test_multivariate_feature_flag_payloads  s    "!"% (/(0);,3	' /2#. ,.)D  #2$324 $4$424 $3$324!!( &6%4G'.
^ &7$7!KK00#*,>"? 1 
 &M	
 	KK00+#*,>"?	 1  &M	
 	KK00+#*,>"?	 1  	
 	//3r    c           	      :   t        t        t              }dddddddgd	d
ddddgddgd	ddgdd
dddddgiddg|_        i |_        ddd
ii|_        |j                  ddddi      }| j                  |d
       | j                  |j                  d       y)al  
        When a flag has multiple conditions and one contains a static cohort,
        the SDK should fallback to API for the entire flag, not just skip that
        condition and evaluate the next one locally.

        This prevents returning wrong variants when later conditions could match
        locally but the user is actually in the static cohort.
        r   r=   multi-condition-flagTrO     r   r  rJ   zset-1rR  z$geoip_country_coderB   DErD   rE   zset-8r   r   r   rW  rO   rF   rQ   rR   r   test-distinct-idrT   N)r	   r   rX   r  r   rY   re   rf   r0  s        r   Ctest_fallback_to_api_when_flag_has_static_cohort_in_multi_conditionzWTestLocalEvaluation.test_fallback_to_api_when_flag_has_static_cohort_in_multi_conditionI  s    )<MN
 -
 )-sH M+ 36'. ,A07.2V,4	!"+ 36'., #$+2F$+2F%%-	!# 
H  %35KW4U#V (("4d; ) 
 	) 	//3r    c                    t        t        t              }ddddg ddgdd	g|_        |j                  dd
d      }|j                  dd
d      }| j	                  ||       | j	                  |j
                  d       y)z
        When a flag has bucketing_identifier: "device_id", the device_id should be
        used for hashing instead of distinct_id.
        r   r=   device-bucketed-flagT	device_idrJ   rK   bucketing_identifierr@   r  user-123zdevice-Ar  r   Nr	   r   rX   rY   re   rf   r.   rg   r7   result1result2s        r   0test_device_id_bucketing_uses_device_id_for_hashzDTestLocalEvaluation.test_device_id_bucketing_uses_device_id_for_hash  s     )<MN
 -,7 +-25	 
& ))"J* * 
 ))"J* * 

 	'* 	//3r    c                     ddl m} ddddg ddgd	d
}| j                  t        d      5   ||di d      }ddd       | j	                         y# 1 sw Y   xY w)z
        match_feature_flag_properties should preserve backward compatibility when
        bucketing_value is omitted, while warning about deprecation.
        r   )match_feature_flag_propertiesr=   r  Tr  rJ   rK   r  r  z%without bucketing_value is deprecatedr  
device-123r  N)rJ  r  assertWarnsRegexDeprecationWarningrZ   )r.   r  r  r1  s       r   Htest_match_feature_flag_properties_without_bucketing_value_is_deprecatedz\TestLocalEvaluation.test_match_feature_flag_properties_without_bucketing_value_is_deprecated  s     	H )(3 ').1	
 "" G
 3&	F
 	
 
s   AAc                 N   t        t        t              }ddddg ddgdd	g|_        |j                  dd
d      }|j                  ddd      }|j                  ddd      }| j	                  ||       | j	                  ||       | j	                  |j
                  d       y)z
        When a flag uses device_id bucketing, different distinct_ids with the same
        device_id should get the same result.
        r   r=   r  Tr  r   rK   r  r  user-Azshared-devicer  user-Bzuser-Cr   Nr  )r.   rg   r7   r  r  result3s         r   @test_device_id_bucketing_same_device_different_users_same_resultzTTestLocalEvaluation.test_device_id_bucketing_same_device_different_users_same_result  s     )<MN -,7 +-24	 
$ ))"H * 
 ))"H * 
 ))"H * 

 	'*'*//3r    c                     dddii|_         t        t        t              }ddddg ddgd	d
g|_        |j	                  dd      }| j                  |       | j                  |j                  d       y)z
        When a flag requires device_id for bucketing but none is provided,
        it should fallback to server evaluation.
        r   r  Tr   r=   r  rJ   rK   r  r  r  N)r   r	   r   rX   rY   rZ   re   rf   r  s       r   8test_device_id_bucketing_fallback_when_device_id_missingzLTestLocalEvaluation.test_device_id_bucketing_fallback_when_device_id_missing  s     %35KT4R#S )<MN -,7 +-25	 
$ (()?L//3r    c                     t        t        t              }ddddg ddgdd	g|_        |j                  dd
d      }| j	                  |       | j                  |j                  d       y)z
        When only_evaluate_locally=True and device_id is required but missing,
        should return None instead of falling back to API.
        r   r=   r  Tr  rJ   rK   r  r  r  r   r   N)r	   r   rX   rY   r   re   rf   r  s       r   Qtest_device_id_bucketing_returns_none_when_only_evaluate_locally_and_no_device_idzeTestLocalEvaluation.test_device_id_bucketing_returns_none_when_only_evaluate_locally_and_no_device_id(  s     )<MN -,7 +-25	 
$ (("Jd ) 
 	&!//3r    c                     t        t        t              }ddddg ddgidg|_        |j                  dd	      }|j                  dd	      }| j	                  ||       | j	                  |j
                  d
       y)z
        When bucketing_identifier is not set or is 'distinct_id', should use
        distinct_id for hashing (default behavior).
        r   r=   normal-flagTr@   r   rK   r  r   r   Nr  r  s        r   2test_default_bucketing_identifier_uses_distinct_idzFTestLocalEvaluation.test_default_bucketing_identifier_uses_distinct_idL  s     )<MN
 $*,24	 
$ ))-B))-B'*//3r    c           
      @   t        t        t              }ddddg ddgdd	d
ddd
dgiddg|_        |j                  ddd      }|j                  ddd      }| j	                  ||       | j                  |d	dg       | j	                  |j                  d       y)z
        Multivariate flag variant selection should use device_id when
        bucketing_identifier is set to device_id.
        r   r=   zmultivariate-device-flagTr  rJ   rK   r   r   r   r   r   )r  r@   r   r  r   zdevice-1r  r  r   N)r	   r   rX   rY   re   rK  rf   r  s        r   /test_device_id_bucketing_with_multivariate_flagzCTestLocalEvaluation.test_device_id_bucketing_with_multivariate_flagm  s     )<MN 1,7 +-25 #$-RH$*"E%%	 
0 ))&J * 
 ))&J * 

 	'*g	623//3r    c                 ,   ddl m}m} t        t        t              }ddddg dd	gd
dg|_         |       5   |d       |j                  dd      }ddd       | j                         | j                  |j                  d       y# 1 sw Y   7xY w)z
        When device_id is not passed as a parameter but is set in the context,
        it should be resolved from context.
        r   )new_contextset_context_device_idr   r=   r  Tr  rJ   rK   r  r  zcontext-device-idr  N)
posthog.contextsr  r  r	   r   rX   rY   rZ   re   rf   )r.   rg   r  r  r7   r1  s         r   %test_device_id_bucketing_from_contextz9TestLocalEvaluation.test_device_id_bucketing_from_context  s     	H)<MN -,7 +-25	 
$ ]!"56,,-CZPF 
 	//3 ]s   B

Bc                     t        t        t              }dddddg ddgd	d
g|_        ddi|_        |j	                  ddddid      }| j                  |       | j                  |j                  d       y)z
        Group flags should continue to use the group identifier for hashing,
        regardless of the bucketing_identifier setting.
        r   r=   r   Tr   r  rJ   rK   r   r  r@   r  r   r   r  acme-inczsome-devicer@   r  Nr	   r   rX   r   rY   rZ   re   rf   r  s       r   ,test_group_flags_ignore_bucketing_identifierz@TestLocalEvaluation.test_group_flags_ignore_bucketing_identifier  s     )<MN #45,7 +-25		 
" &))$4! ((z*#	 ) 
 	//3r    c                 0   dddii|_         t        t        t              }ddddg d	d
gdddddddddddgdgd	d
gddg|_        ddi|_        |j                  ddddid      }| j                  |       | j                  |j                  d       y)z
        Group flag dependency evaluation should receive device_id so dependent
        device_id-bucketed flags can be evaluated locally.
        r   zgroup-parent-flagfrom-apir   r=   zdevice-dependent-flagTr  rJ   rK   r  r  r   r   r  r  r   r   r   r   r  r  r  r  N	r   r	   r   rX   r   rY   rZ   re   rf   r  s       r   -test_group_flag_dependency_receives_device_idzATestLocalEvaluation.test_group_flag_dependency_receives_device_id  s     %35H*4U#V )<MN .,7 +-25	 *45
 ,C0C-1,29P8Q!"+ 36	% 
L &))$4!((z*"	 ) 
 	//3r    c                 0   dddii|_         t        t        t              }ddddd	g d
dgdddddddddddgdgd
dgddg|_        ddi|_        |j                  ddddi      }| j                  |       | j                  |j                  d       y)z
        Group flag dependencies should keep bucketing by group key, even when
        the dependent group flag has bucketing_identifier set to device_id.
        r   zparent-group-flagr  r   r=   zchild-group-flagTr   r  rJ   rK   r  r  r   r  r  r   r   r   r   r  r  r@   Nr  r  s       r   Atest_group_flag_dependency_ignores_device_id_bucketing_identifierzUTestLocalEvaluation.test_group_flag_dependency_ignores_device_id_bucketing_identifier  s     %35H*4U#V )<MN )45,7 +-25		  *45
 ,>0C-1,29K8L!"+ 36	!& 
N &))$4!((z* ) 
 	//3r    r=   rA  TNr   plan
enterpriserB   r   )rF   rH   rG   rI   r   rJ   r   rL   rM   r   r%  rD   r   r   r  person_condition_matchesrU   group_condition_matchesr   r   r   no_matchzwrong@example.comfree)rU   r@   r   Fc                     t        t        t              }| j                  g|_        ddi|_         |j
                  di |}| j                  t        |      |       | j                  |j                  d       y )Nr   r   r   r   )rA  r  )	r	   r   
MIXED_FLAGrX   r   rY   re   boolrf   )r.   rv   call_kwargsrw   rg   r7   r1  s          r   test_mixed_targetingz(TestLocalEvaluation.test_mixed_targeting  sm    8 )<MN $0%()$4!(((Q[Qfx0//3r    c                     t        t        t              }dddd dg ddgdd	g|_        d
di|_        |j	                  dd      }| j                  |       | j                  |j                  d       y )Nr   r=   rA  Tr   rJ   r!  r   r  r   r   r  )r	   r   rX   r   rY   r[   re   rf   r  s       r   ;test_mixed_targeting_only_group_conditions_no_groups_passedzOTestLocalEvaluation.test_mixed_targeting_only_group_conditions_no_groups_passed  s    )<MN #48 =>*,25		 
" &))$4! ((
 	 //3r    c           	          t        t        t              }dddd dg ddd g ddgdd	g|_        d
di|_        |j	                  ddddidi i      }| j                  |       | j                  |j                  d       y )Nr   r=   rA  Tr   rJ   r!  r   r  r   r   r  r   r   r  r  s       r   3test_mixed_targeting_rollout_uses_correct_bucketingzGTestLocalEvaluation.test_mixed_targeting_rollout_uses_correct_bucketing  s    )<MN #48 =>*,25 =A*,23	 
, &))$4! ((v&'_	 ) 
 	//3r    c                     t        t        t              }ddddg ddgidd	d
ddg ddgddg|_        |j                  dd      }| j	                  |d   d       | j	                  |d
   d       | j	                  |j
                  d       y)zc
        get_all_flags_and_payloads should properly handle flags with device_id bucketing.
        r   r=   r	  Tr@   rJ   rK   r  r   device-flagr  r  r  z	my-devicer  r   N)r	   r   rX   r   re   rf   r  s       r   +test_get_all_flags_with_device_id_bucketingz?TestLocalEvaluation.test_get_all_flags_with_device_id_bucketing  s    
 )<MN $bLM	 $,7.0LM	 
* %%jK%H.5.5//3r    c                     ddddi|_         t        t        t              }ddddg d	d
gidddddg d	d
gddg|_        |j	                  d       | j                  |j                  d       y)z
        When some flags require device_id but it's not provided, those flags
        should trigger fallback while others can be evaluated locally.
        r   Tr  )r	  r0  r   r=   r	  r@   rJ   rK   r  r   r0  r  r  r  N)r   r	   r   rX   r   re   rf   r   s      r   Atest_get_all_flags_fallback_when_device_id_missing_for_some_flagszUTestLocalEvaluation.test_get_all_flags_fallback_when_device_id_missing_for_some_flags	  s     DL$
  )<MN $bLM	 $,7.0LM	 
* 	Z( 	//3r    )]__name__
__module____qualname__classmethodr   r%   r1   r9   r   r   r_   rh   rp   r   expandrx   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)  r2  r7  r9  r=  rB  rD  rP  r]  rc  ru  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  r  r  r'  r*  r,  r.  r1  r3  r  r    r   r   r      s   " "
 ! !
H TZZ$%"1 &"1H TZZ&'&4 (&4P?
B ]	
1
1
f
*-
^1
f TZZ&'TZZ$%\4 & (\4|* TZZ&'TZZ$%~4 & (~4@ TZZ&'TZZ$%>4 & (>4@ TZZ&'TZZ$%P4 & (P4d TZZ&'TZZ$%4 & (4B TZZ&'TZZ$%4 & (4 TZZ&'4 (4< 
ZZvy)TZZ&'@6 ( *@6D 
ZZvy)TZZ&'E6 ( *E6N 
ZZvy)TZZ&'6 ( *6  
ZZvy)TZZ&'6 ( *6" 
ZZvy)TZZ&'*6 ( **6X 
ZZvy)TZZ&'16 ( *16f 
ZZvy)TZZ&':6 ( *:6x 
ZZvy)TZZ&'I6 ( *I6V 
ZZvy)TZZ&'O6 ( *O6b TZZ&'TZZ$%G3 & (G3R TZZ&'TZZ$%R2 & (R2h TZZ&'TZZ$%`2 & (`2D TZZ+,TZZ&'TZZ$%:2 & ( -:2x TZZ&'TZZ$%?( & (?(B TZZ&'TZZ$%:$ & (:$x TZZ&'TZZ$%!" & (!"F TZZ&'TZZ$%\( & (\(| TZZ&'TZZ$%G( & (G(R TZZ&'TZZ$%/" & (/"b6: TZZ&'TZZ$%g
 & (g
RD< TZZ&'TZZ$%q5 & (q5f TZZ'(TZZ$%!9 & )!9F TZZ'(TZZ$%K & )K4 TZZ'(TZZ$%!F & )!FF TZZ'(TZZ$%D & )D> TZZ'(TZZ$%D & )D> TZZ'(TZZ$%( & )( TZZ&'TZZ$%4 & (4, TZZ&'TZZ$%4 & (4, TZZ&'TZZ$%4 & (40 TZZ$%O &O* TZZ&'4 (40 TZZ$%O &O& TZZ&'4 (4@ TZZ'(TZZ&'Q ( )Q TZZ'(TZZ&'O ( )O TZZ'(TZZ$%P & )P TZZ&'<4 (<4| TZZ&'N4 (N4` TZZ&'<4 (<4| TZZ&'74 (74r TZZ&')4 ()4V 
ZZvy)TZZ&'# ( *#4 TZZ&'N4 (N4` TZZ&'TZZ$%A4 & (A4F TZZ&'&4 (&4P" H TZZ&')4 ()4V TZZ&'4 (4@ TZZ&'!4 (!4F TZZ&'4 (4@ TZZ&'*4 (*4X TZZ&'!4 (!4F TZZ&'#4 (#4J TZZ&'84 (84t TZZ&':4 (:4z ,0 56 $*%1(/$+01# +. 59 $+%7(/$,	# +.
	"JH ] +$w0B&CD *(&1)2V\4J(K  *13F)G(&1)2VV4D(E
 	
4 TZZ&'4 (564 TZZ&'4 (4: TZZ&'"4 ("4H TZZ&'4 (4B TZZ&'$4 ($4r    r   c                   J   e Zd Zd dZd Zd Zd Zd Zd Zd Z	d	 Z
 ed
      d        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ej6                  g d      d        Z ej6                  g d      d        Z ej6                  g d      d        Zd Zy)!TestMatchPropertiesNc                 :    ||d}||j                  d|i       |S )Nr   rG   )update)r.   rF   rH   rG   r1  s        r   propertyzTestMatchProperties.property2  s(    u-MM:x01r    c                    | j                  dd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd i             | j	                  t
              5  t        |ddi       t        |i        d d d        | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  dg d	d      }| j                  t        |dd
i             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j	                  t
              5  t        |ddi       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NrF   rH   r   value2ra  key2rB   rF   rH   rG   value1r?  value3rC  rD  value4r=  rZ   r   r[   r   r
   )r.   
property_a
property_b
property_cs       r   test_match_properties_exactz/TestMatchProperties.test_match_properties_exact9  s   ]]uG]<
zE73CDE
UH4EFG
UBK@A
UDMBC56:'89:r* 7 ]]uGg]N
zE73CDE
UH4EFG]];g # 

 	zE83DEFzE83DEFzE83DEF
UH4EFG56:'89 76% 76$ 76s   G-GGGc                 b   | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd i             | j                  dg dd      }| j                  t        |ddi             | j                  t        |dd	i             | j                  t        |dd
i             | j                  t        |ddi             | j                  t        |dd i             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j	                  t
              5  t        |ddi       t        |ddi       d d d        y # 1 sw Y   y xY w)NrF   rH   is_notrA  r?  ra  rB  rE  value5value6rD  rC  r@  rF  )r.   rG  rI  s      r   test_match_properties_not_inz0TestMatchProperties.test_match_properties_not_inW  sv   ]]uGh]O
zE83DEFzE2;?@zE4=AB]];h # 

 	zE83DEFzE83DEFzE83DEFzE2;?@zE4=AB
UH4EFG
UH4EFG
UH4EFG56:'89:'9: 766s   ?F%%F.c                    | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd i             | j	                  t
              5  t        |ddi       t        |i        d d d        y # 1 sw Y   y xY w)NrF   is_setrA  rH   r?  ra  r@  rF  )r.   rG  s     r   test_match_properties_is_setz0TestMatchProperties.test_match_properties_is_setn  s    ]]uHx]P
zE73CDEzE83DEFzE2;?@
UDMBC56:'89:r* 766s   CCc                    | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd	i             | j                  t        |dd
i             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             y )NrF   valUer"  rA  rH   r?  rD  vaLue4343tfvalue5Alakazamrb  3C  val3threer=  rZ   r   r[   )r.   rG  rH  s      r   test_match_properties_icontainsz3TestMatchProperties.test_match_properties_icontainsy  s4   ]]uGk]R
zE73CDEzE83DEFzE83DEFzE83DEFzE=3IJK
UJ4GHI
UCLAB]]uC+]N
zE3<@AzE3<@AzE6?CD
UG4DEFr    c                 ~   | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd	i             | j                  t        |dd
i             | j                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             y )NrF   z\.com$r   rA  z	value.comz
value2.com	value2comz.com343tfvalue5rW  rb  valuecomz	value\comrX  rY  rZ  r[  z?*rH   r?  r<  4r\  r.   rG  rH  rI  
property_ds        r   test_match_properties_regexz/TestMatchProperties.test_match_properties_regex  s   ]]uI]P
zE;3GHIzE<3HIJ
UK4HIJ
U<M4NOP
UJ4GHI
UCLAB
UJ4GHI
UL4IJK]]uC']J
zE3<@AzE3<@AzE6?CD
UG4DEF ]]uD7]K

UG4DEF
UH4EFG ]]uA]H
zE3<@AzE1:>?
UG4DEFr    c                 L   | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd	i             | j                  ddd
      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  ddd
      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             y )NrF   r=   r  rA  r   r   r   r   ltr   rX  gte43lte414244,   *   3029100rJ   123aloha123z      r\  )r.   rG  rH  rI  rc  
property_e
property_fs          r   $test_match_properties_math_operatorsz8TestMatchProperties.test_match_properties_math_operators  s   ]]uA]E
zE1:>?zE1:>?
UAJ?@
UBK@AzE4=AB]]uA]E
zE1:>?zE2;?@zE2;?@
UAJ?@
UCLAB
UCLAB]]uA]F
zE1:>?zE1:>?
UAJ?@
UBK@AzE3<@A]]uD5]I
zE4=ABzE4=ABzE4=AB
UDMBC
UBK@AzE2;?@]]uD4]H
zE4=AB 	zE5>BC
UCLAB]]uJ]N

UENCD
UCLAB 	zE3<@Ar    c                    | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |dt        j                  ddd	      i             | j                  t        |dt        j                  ddd	d
dd      i             | j                  t        |dt        j                  ddd	d
ddt        d            i             | j                  t        |dt        j                  j                  d      i             | j                  t        |ddi             | j                  t              5  t        |dd
i       d d d        | j                  t              5  t        |ddi       d d d        | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |dt        j                  ddd	      i             | j                  t        |dt        j                  j                  d      i             | j                  t        |ddi             | j                  t              5  t        |ddi       d d d        | j                  ddd      }| j                  t              5  t        |dd
i       d d d        | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             y # 1 sw Y   YxY w# 1 sw Y   :xY w# 1 sw Y   DxY w# 1 sw Y   xY w)NrF   
2022-05-01is_date_beforerA  
2022-03-01
2022-04-30  r<  r   r=   r   r   Europe/Madridtzinfo
2022-05-30abcdefis_date_after
2022-05-02     2022-04-05 12:34:12 +01:00
2022-03-30z2022-04-05 12:34:11 +01:00z2022-04-05 12:34:13 +01:00z2022-04-05 11:34:11 +00:00z2022-04-05 11:34:13 +00:00)
r=  rZ   r   datetimedater   fromisoformatr[   r   r
   rb  s        r   "test_match_property_date_operatorsz6TestMatchProperties.test_match_property_date_operators  s   ]]\4D # 

 	zE<3HIJzE<3HIJzE8==qRT;U3VWX:x/@/@q"aQRTU/V'WX	
 	8,,'8
	
  	UH$5$5$C$CL$QR	

 	
UL4IJK 56:qz2 7 56:x'89 7 ]]\O # 

 	zE<3HIJzE<3HIJ:x/@/@q"/M'NO	
 	UH$5$5$C$CL$QR	

 	
UL4IJK 56:x'89 7 ]]uDCS]T
56:qz2 7 ]]9DT # 

 	
UL4IJKzE<3HIJ:/K'LM	
 	:/K'LM	
 	:/K'LM	
 	:/K'LM	
 	:/K'LM	
k 76 76& 76 76s0   "OOO"O/OO"O,/O9r|  c                    | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |dt        j                  ddd	d
dd      i             | j	                  t        |dt        j
                  ddd	      i             | j	                  t        |dt        j                  ddd	ddd      i             | j                  t        |dt        j                  ddd	d
ddt        d            i             | j                  t        |dt        j                  j                  d      i             | j	                  t        |ddi             | j                  t              5  t        |dd
i       d d d        | j                  t              5  t        |ddi       d d d        | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |dt        j                  ddd	      i             | j                  t        |dt        j                  j                  d      i             | j	                  t        |ddi             | j                  t              5  | j	                  t        |ddi             d d d        | j                  ddd      }| j                  t              5  | j	                  t        |dd
i             d d d        | j                  t        |ddi             | j                  ddd      }| j	                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j	                  t        |ddi             | j                  ddd      }| j	                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j	                  t        |dd i             | j                  dd!d      }| j                  t        |dd"i             | j	                  t        |dd#i             | j	                  t        |dd$i             | j                  dd%d      }| j                  t        |dd&i             | j	                  t        |dd'i             | j                  dd(d      }	| j                  t        |	dd)i             | j	                  t        |	dd*i             | j                  dd+d      }
| j                  t        |
ddi             | j	                  t        |
dd,i             | j                  dd-d      }| j                  t        |ddi             | j                  t        |dd.i             | j	                  t        |dd/i             | j                  dd0d      }| j                  t        |ddi             | j	                  t        |dd1i             | j                  dd%d      }| j                  t        |dd2i             | j	                  t        |dd3i             | j                  dd(d      }| j                  t        |ddi             | j                  t        |dd*i             | j	                  t        |dd4i             | j	                  t        |dd5i             | j	                  t        |dd6i             y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)7NrF   z-6hr}  rA  r~  r  r  r<  r   r=   r   r      r  r  r  r  1hr  r  r  r  12dr  z2022-04-05 12:34:11+01:00z2022-04-19 01:34:11+02:00z2022-04-19 02:00:01+02:00z2022-05-01 00:00:00z2022-04-30 22:00:00z-1dz2022-04-29 23:59:00z2022-04-30 00:00:011wz2022-04-23 00:00:00z2022-04-24 00:00:00z2022-04-24 00:00:011mz2022-03-01 00:00:00z2022-04-05 00:00:001yz2021-04-28 00:00:00z2021-05-01 00:00:01122hz2022-04-23 01:00:002dz2022-04-29 00:00:01z2022-04-29 00:00:00z-02wz2022-04-16 00:00:00z2022-04-01 00:00:01z2022-04-01 00:00:00z2021-05-01 00:00:00z2021-04-30 00:00:00z2021-03-01 12:13:00)
r=  rZ   r   r  r[   r  r   r  r   r
   )r.   rG  rH  rI  rc  rx  ry  
property_g
property_h
property_i
property_j
property_k
property_l
property_m
property_ns                  r   +test_match_property_relative_date_operatorsz?TestMatchProperties.test_match_property_relative_date_operators8  s&   ]]uEDT]U
zE<3HIJzE<3HIJ:x/@/@q"aQRTU/V'WX	
 	:x}}T1b/I'JK	
 	UH$5$5dAr2q!$LM	

 	8,,'8
	
  	UH$5$5$C$CL$QR	

 	
UL4IJK 56:qz2 7 56:x'89 7 ]]uD?]S
zE<3HIJzE<3HIJ:x/@/@q"/M'NO	
 	UH$5$5$C$CL$QR	

 	
UL4IJK 56^J8IJK 7 ]]uD?]S
56^J
CD 7 	zE<3HIJ ]]uEDT]U

UL4IJKzE<3HIJ:/J'KL	
 	:/J'KL	
 	:/J'KL	

 ]]uDCS]T

U<Q4RSTzE;P3QRS]]uEDT]U
zE;P3QRS
U<Q4RST]]uDCS]T
zE;P3QRS
U<Q4RST
U<Q4RST]]uDCS]T
zE;P3QRS
U<Q4RST]]uDCS]T
zE;P3QRS
U<Q4RST]]uF_]U
zE;P3QRS
U<Q4RST]]uD?]S
zE;P3QRSzE;P3QRS
U<Q4RST]]uF_]U
zE;P3QRS
U<Q4RST]]uD?]S
zE;P3QRS
U<Q4RST]]uD?]S
zE;P3QRSzE;P3QRS
U<Q4RST
U<Q4RST
U<Q4RST{ 76 76" 76 76s0   ^^(^5_^%(^25^?_c                 d   | j                  ddd      }| j                  t        |dd i             | j                  t        |ddi             | j                  dd d      }| j                  t        |dd i             | j                  ddd      }| j                  t        |dd i             | j                  t        |dd	i             | j                  dd
d      }| j                  t        |dd i             | j                  ddd      }| j                  t        |dd i             | j                  ddd      }| j                  t        |dd i             | j                  ddd      }| j                  t        |dd i             | j                  ddd      }| j                  t        |dd i             | j                  ddd      }	| j                  t        |	dd i             | j                  ddd      }
| j                  t        |
dd i             | j                  ddd      }| j                  t        |dd i             | j                  ddd      }| j	                  t
              5  | j                  t        |ddi             d d d        y # 1 sw Y   y xY w)NrF   nonerL  rA  nonrQ  nor"  smhNor   r=   r  rg  xyzri  Oork  r|  r}  r  random)r=  r[   r   rZ   r   r
   )r.   rG  rH  rI  rc  property_d_lower_caserx  ry  r  r  r  r  r  s                r   +test_none_property_value_with_all_operatorsz?TestMatchProperties.test_none_property_value_with_all_operators  s   ]]uFX]N

UDMBCzE5>BC]]uD8]L

UDMBC]]uD;]O

UDMBC
UENCD]]uD7]K

UDMBC $%tg V(=t}MN]]uA]E

UDMBC]]uA]E

UDMBC]]uEE]J

UDMBC]]uD5]I

UDMBC]]\4D # 

 	
UDMBC]]\O # 

 	
UDMBC]]\4D # 

 56^J8IJK 766s   ?J&&J/c                    | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  dd	d      }| j                  t        |dd
i             | j                  t        |ddi             y )Nversion1.2.3	semver_eqrA  1.2.41.2.22.0.0z1.2.3-alpha.1z1.21.2.0z1.2.1r\  )r.   propprop_partials      r   test_match_properties_semver_eqz3TestMatchProperties.test_match_properties_semver_eq  s    }}'K}Pti-ABCy'.BCDy'.BCDy'.BCD 	ti-IJK }}%+}V|i5IJKy'6JKLr    c                     | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             y )Nr  r  
semver_neqrA  r  r  )r=  r[   r   rZ   r.   r  s     r    test_match_properties_semver_neqz4TestMatchProperties.test_match_properties_semver_neq  s`    }}'L}Qy'.BCDti-ABCti-ABCr    c                    | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd	i             y )
Nr  r  	semver_gtrA  r  1.3.0r  r  0.9.0r\  r  s     r   test_match_properties_semver_gtz3TestMatchProperties.test_match_properties_semver_gt      }}'K}Pti-ABCti-ABCti-ABCy'.BCDy'.BCDy'.BCDr    c                 N   | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             y )	Nr  r  
semver_gterA  r  r  r  r  r\  r  s     r    test_match_properties_semver_gtez4TestMatchProperties.test_match_properties_semver_gte      }}'L}Qti-ABCti-ABCti-ABCy'.BCDy'.BCDr    c                    | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd	i             y )
Nr  r  	semver_ltrA  r  z1.1.0r  r  r  r\  r  s     r   test_match_properties_semver_ltz3TestMatchProperties.test_match_properties_semver_lt  r  r    c                 N   | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             y )	Nr  r  
semver_lterA  r  r  r  r  r\  r  s     r    test_match_properties_semver_ltez4TestMatchProperties.test_match_properties_semver_lte  r  r    c                    | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd	i             y )
Nr  r  semver_tilderA  1.2.51.2.99r  r  r  r\  r  s     r   "test_match_properties_semver_tildez6TestMatchProperties.test_match_properties_semver_tilde&  s    }}'N}Sti-ABCti-ABCti-BCDy'.BCDy'.BCDy'.BCDr    c                 n   | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd	i             | j                  dd
d      }| j                  t        |dd
i             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             y )Nr  r  semver_caretrA  z1.9.01.99.99r  r  r  z0.2.3z0.2.9z0.3.01.0.0z0.0.3z0.0.40.1.0r\  )r.   r  prop_zero_majorprop_zero_minors       r   "test_match_properties_semver_caretz6TestMatchProperties.test_match_properties_semver_caret0  s   }}'N}Sti-ABCti-ABCti-CDEy'.BCDy'.BCDy'.BCD --> ( 
 	G8LMNG8LMN)W9MNO)W9MNO --> ( 
 	G8LMN)W9MNO)W9MNOr    c                    | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd	i             | j                  t        |dd
i             | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |dd
i             | j                  t        |ddi             y )Nr  1.2.*semver_wildcardrA  r  r  r  r  z1.1.9r  z1.*r  r  r  r\  )r.   r  
prop_majors      r   %test_match_properties_semver_wildcardz9TestMatchProperties.test_match_properties_semver_wildcardK  s0   }}'DU}Vti-ABCti-ABCti-BCDy'.BCDy'.BCDy'.BCD ]]1B # 

 	zIw3GHIzIy3IJK
Y4HIJ
Y4HIJr    c                 v   | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  t        |dd	i             | j                  t        |dd
i             y )Nr  r  r  rA  z1.3.0-beta.1z
1.2.2-rc.1z1.2.3-alphar  r  r  r\  )r.   r  prop_pres      r   ,test_match_properties_semver_with_prereleasez@TestMatchProperties.test_match_properties_semver_with_prerelease^  s    }}'K}Pti-HIJy,.GHI == ! 
 	x)W1EFGx)W1EFG9g2FGHr    c                 $   | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  ddd	      }| j                  t        |dd
i             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j	                  t
              5  t        |ddi       ddd       | j	                  t
              5  t        |ddi       ddd       | j	                  t
              5  t        |ddi       ddd       | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             | j                  ddd      }| j                  t        |ddi             | j                  t        |ddi             y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)zKTest semver parsing handles v-prefix, whitespace, and other common formats.r  r  r  rA  zv1.2.3z 1.2.3z1.2.3 0.0.0r  z0.0.1z1.2.3.4abcNra  z.1.2.3r  z1.5.0r  r  r  zv1.2.5zv1.3.0rF  )r.   r  prop_vprop_minprop_gt_min	prop_fourprop_caret_v	prop_wilds           r   'test_match_properties_semver_edge_casesz;TestMatchProperties.test_match_properties_semver_edge_casesl  s^   }}'K}P 	ti-BCD 	ti-BCD 	ti-BCD 9H{Sv	7/CDE ==Yg=Tx)W1EFGmm	;mW{Y4HIJi5IJK MMiwMU	y9i2HIJ 564)U!34 7 564)R1 7 564)X!67 7 }}N % 
 	|i5IJKy'6JKL MM3D " 
	 	y9h2GHI	Ix3HIJ- 76 76 76s$   "I.I::J.I7:JJc                    | j                  ddd      }| j                  t              5  t        |ddi       d d d        | j                  t              5  t        |ddi       d d d        | j	                  t        |dd i             | j                  ddd      }| j                  t              5  t        |ddi       d d d        y # 1 sw Y   xY w# 1 sw Y   sxY w# 1 sw Y   y xY w)	Nr  r  r  rA  znot-a-version	other_keyz	not-validr  )r=  r   r
   r   r[   )r.   r  prop_bads      r   +test_match_properties_semver_invalid_valuesz?TestMatchProperties.test_match_properties_semver_invalid_values  s    }}'K}P 564)_!=> 7 564+w!78 7 	y$.?@A ==YkK=X568i%9: 76 76 76 76s#   CC3C#CC #C,))major01.2.3)minorz1.02.3)r   z1.2.03)all_componentsz01.02.03)two_digit_minorz1.07.3)triple_zero_majorz001.2.3c                     | j                  ddd      }| j                  t              5  t        |d|i       d d d        y # 1 sw Y   y xY w)Nr  r  r  rA  r=  r   r
   r   )r.   rv   	bad_valuer  s       r   @test_match_properties_semver_rejects_leading_zero_override_valuezTTestMatchProperties.test_match_properties_semver_rejects_leading_zero_override_value  sB     }}'K}P564)Y!78 766   AA))
zero_majorr  )
zero_patchr  )all_zeror  c                 f    | j                  d|d      }| j                  t        |d|i             y )Nr  r  rA  )r=  rZ   r   )r.   rv   rH   r  s       r   :test_match_properties_semver_literal_zero_components_matchzNTestMatchProperties.test_match_properties_semver_literal_zero_components_match  s0     }}%+}Nti-?@Ar    ))r  r  )r  1.07.0)r  r  )r  z01.*c                     | j                  d||      }| j                  t              5  t        |ddi       d d d        y # 1 sw Y   y xY w)Nr  rA  r  r  )r.   rG   
flag_valuer  s       r   <test_match_properties_semver_rejects_leading_zero_flag_valuezPTestMatchProperties.test_match_properties_semver_rejects_leading_zero_flag_value  sB     }}*x}P564)W!56 766r  c                     | j                  ddd      }| j                  t              5 }t        |ddi       d d d        | j	                  t        j                        d       y # 1 sw Y   /xY w)NrF   r|  
is_unknownrA  r  zUnknown operator is_unknown)r=  r   r
   r   re   rL  rM  )r.   rG  exception_contexts      r   test_unknown_operatorz)TestMatchProperties.test_unknown_operator  se    ]]uL<]X
56:K:x'89 7!++,.K	
 76s   A''A0r"   ) r4  r5  r6  r=  rJ  rO  rR  r]  rd  rz  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r8  r  r  r  r  r  r    r   r:  r:  1  s   :<;.	+G$G>1BfY
v FU FUP,L\MDEEEEEP6K&I4Kl;( ]	
	9	9 ]	
BB ]	
77
r    r:  c                   F    e Zd Z ej                  g d      d        Zd Zy)TestDateParsing))iso_dater|  )iso_datetime_Zz2022-04-05T12:34:12Z)iso_datetime_utcz2022-04-05 12:34:12 UTC)iso_datetime_offsetr  c                 J    t        |      t        j                  |      k(  sJ y r"   )r   r   parse)r.   rv   rH   s      r   :test_parse_datetime_matches_dateutil_for_supported_formatszJTestDateParsing.test_parse_datetime_matches_dateutil_for_supported_formats  s      e$U(;;;;r    c                     t        d      5  t        d      t        j                  d      k(  sJ 	 d d d        y # 1 sw Y   y xY w)N2020-04-03T00:00:001234)r   r   r   r  r8   s    r   @test_parse_datetime_year_only_matches_previous_dateutil_behaviorzPTestDateParsing.test_parse_datetime_year_only_matches_previous_dateutil_behavior  s3    ./!&)V\\&-AAAA 0//s	   $:AN)r4  r5  r6  r   r8  r  r  r  r    r   r  r    s,    ]	
<<Br    r  c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestRelativeDateParsingc                 d   t        d      5  t        d      J t        d      J t        d      J t        d      J t        d      J t        d      J t        d      J t        d	      J t        d
      J t        d      J t        d      J 	 d d d        y # 1 sw Y   y xY w)N2020-01-01T12:01:20.1340Zr   1xz1.2y1z1sz123344000.134mbazinga000bello000hello000h1000h)r   r   r8   s    r   test_invalid_inputz*TestRelativeDateParsing.test_invalid_input  s    45@EMMM@FNNN@HPPP@FNNN@FNNN=>NOWW@KSSS@LTTT@LTTT@HTTT@IUUU 655s   BB&&B/c                 R    t        d      J t        d      J t        d      J y )N1000000h9999y100000000000000000y)r   r8   s    r   test_overflowz%TestRelativeDateParsing.test_overflow  s8    <ZHPPP<WEMMM9:OPX	
Xr    c                 H   t        d      5  t        d      t        j                  dddddddt        j                  j                        k(  sJ t        d	      t        j                  dddd
dddt        j                  j                        k(  sJ t        d      t        j                  dddddddt        j                  j                        k(  sJ t        d      t        j                  dddddddt        j                  j                        k(  sJ t        d      t        j                  dddddddt        j                  j                        k(  sJ t        d      t        d      k(  sJ t        d      t        d      k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr  r    r=         p r  2h
   24h        30h   48hr   1dr  r   r   r  timezoneutcr8   s    r   test_hour_parsingz)TestRelativeDateParsing.test_hour_parsing  s   45@""aB2vh6G6G6K6K  
 A""aB2vh6G6G6K6K  
 A""b"b!R8I8I8M8M  
 A""b"aBx7H7H7L7L  
 A""b"b!R8I8I8M8M   A>tDE E E A>tDE E E= 655s   FFF!c                    t        d      5  t        d      t        j                  dddddddt        j                  j                  	      k(  sJ t        d
      t        j                  dddddddt        j                  j                  	      k(  sJ t        d      t        j                  dddddddt        j                  j                  	      k(  sJ t        d      t        j                  dddddddt        j                  j                  	      k(  sJ t        d      t        j                  dddddddt        j                  j                  	      k(  sJ t        d      t        d      k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr  r4  r.  r/  r0  r=   r)  r*  r  r  r   7dri  14d   30dr   r  r5  r8   s    r   test_day_parsingz(TestRelativeDateParsing.test_day_parsing7  s   45@""b"b!R8I8I8M8M  
 A""b"b!R8I8I8M8M  
 A""b"b!R8I8I8M8M  
 A""b"b!R8I8I8M8M  
 A""b!RBx7H7H7L7L   A>tDE E E7 655   E)E??Fc                    t        d      5  t        d      t        j                  dddddddt        j                  j                  	      k(  sJ t        d
      t        j                  dddddddt        j                  j                  	      k(  sJ t        d      t        j                  dddddddt        j                  j                  	      k(  sJ t        d      t        j                  dddddddt        j                  j                  	      k(  sJ t        d      t        j                  dddddddt        j                  j                  	      k(  sJ t        d      t        d      k7  sJ 	 d d d        y # 1 sw Y   y xY w)Nr  r  r.  r/  ri  r=   r)  r*  r  2wr<  4wr<  8wr(  r2  r  r5  r8   s    r   test_week_parsingz)TestRelativeDateParsing.test_week_parsingW  s   45@""b"b!R8I8I8M8M  
 A""b"b!R8I8I8M8M  
 A""b!RBx7H7H7L7L  
 A""b!RBx7H7H7L7L   A""b!RBx7H7H7L7L  
 A>tDE E E7 655r?  c                     t        d      5  t        d      t        j                  dddddddt        j                  j                        k(  sJ t        d	      t        j                  dd
dddddt        j                  j                        k(  sJ t        d      t        j                  dddddddt        j                  j                        k(  sJ t        d      t        j                  dddddddt        j                  j                        k(  sJ t        d      t        j                  dddddddt        j                  j                        k(  sJ t        d      t        d      k(  sJ 	 d d d        t        d      5  t        d      t        j                  ddddddt        j                  j                        k(  sJ t        d	      t        j                  ddddddt        j                  j                        k(  sJ t        d      t        j                  ddddddt        j                  j                        k(  sJ t        d      t        j                  ddddddt        j                  j                        k(  sJ t        d      t        j                  ddddddt        j                  j                        k(  sJ t        d      t        d      k(  sJ 	 d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr  r  r.  r/  r=   r)  r*  r  2mr(  4m	   8mr  r  12mr  r'  r   r   r      r<  r5  r8   s    r   test_month_parsingz*TestRelativeDateParsing.test_month_parsingw  sE   45@""b!RBx7H7H7L7L  
 A""b!RBx7H7H7L7L  
 A""aB2vh6G6G6K6K  
 A""aB2vh6G6G6K6K   A""aB2vh6G6G6K6K  
 A>tDE E E7 6> ./@""4Aq!Qx?P?P?T?TUV V V A""4Aq!Qx?P?P?T?TUV V V A""4Q1a@Q@Q@U@UVW W W A""4Aq!Qx?P?P?T?TUV V V A""4Aq!Qx?P?P?T?TUV V V A>tDE E E# 0/? 65> 0/s   E)K7	E$L7LLc                     dD ]k  }t        |      5  t        j                  j                  t        j                  j                        }t        d      |t        d      z
  k(  sJ 	 d d d        m y # 1 sw Y   xxY w)N)z2020-03-31T00:00:00Zz2021-03-31T00:00:00Zr  r=   )monthsr   r  nowr6  r7  r   r   )r.   rH   rP  s      r   -test_month_parsing_clamps_to_target_month_endzETestRelativeDateParsing.test_month_parsing_clamps_to_target_month_end  sm    EEU#''++H,=,=,A,ABD=223 3 3 $# F##s   AA22A;	c                     t        d      5  t        j                  j                  t        j                  j                        }t        d      |t        d      z
  k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nz2020-02-29T00:00:00Zr  r=   )yearsrO  )r.   rP  s     r   ,test_year_parsing_clamps_to_target_month_endzDTestRelativeDateParsing.test_year_parsing_clamps_to_target_month_end  s`    /0##''(9(9(=(=>C@}1--. . . 100s   AA++A4c                 ^   t        d      5  t        d      t        j                  dddddddt        j                  j                        k(  sJ t        d	      t        j                  d
ddddddt        j                  j                        k(  sJ t        d      t        j                  dddddddt        j                  j                        k(  sJ t        d      t        j                  dddddddt        j                  j                        k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr  r  r.  r=   r/  r)  r*  r  2yi  4yi  8yi  r5  r8   s    r   test_year_parsingz)TestRelativeDateParsing.test_year_parsing  s4   45@""aB2vh6G6G6K6K  
 A""aB2vh6G6G6K6K  
 A""aB2vh6G6G6K6K  
 A""aB2vh6G6G6K6K  ! 655s   DD##D,N)r4  r5  r6  r   r%  r8  r>  rD  rL  rQ  rT  rY  r  r    r   r  r    s8    V"
!EFE@E@3Ej3.r    r  c                   *   e Zd Zej                  j                  ed       ej                  d      d               Zej                  j                  ed       ej                  d      d               Zej                  j                  ed       ej                  d      d               Z	 ej                  d      d        Z
ej                  j                  ed       ej                  d      d               Z ej                  d      d        Zej                  j                  ed       ej                  d      d	               Zej                  j                  ed       ej                  d      d
               Z ej                   dddiddifdddddddfg      ej                  j                  ed       ej                  d      d                      Zej                  j                  ed       ej                  d      d               Zy)TestCaptureCallsr   r`   c           	      p   dddii|_         t        t        t              }ddddd	d
ddgddgidg|_        | j	                  |j                  ddddd             | j                  |j                  d       |j                  dddddddi d        |j                          | j	                  |j                  ddddd             | j                  |j                  d       |j                          | j	                  |j                  ddddd             | j                  |j                  d       |j                  dddddddi d        |j                          | j	                  |j                  dddddd             | j                  |j                  d       |j                          | j                  |j                  dddddddi      d       | j                  |j                  d       | j                  |j                  d       |j                  dddddddddid        y ) Nr   
flags-flagflags-valuer   r=   r>   r   Tr@   rA   rC   r   rJ   rK   rN   rS   r   r   rT   $feature_flag_called$feature_flag$feature_flag_responselocally_evaluated$feature/complex-flagrb   rL   r@   disable_geoipr   zsome-distinct-id2zsome-distinct-id345F)rU   rd   organizationorg1)rU   r@   )ra  rb  rc  $feature/flags-flag)
r   r	   r   rX   rZ   rY   re   rf   assert_called_withr   r   s       r   test_capture_is_calledz'TestCaptureCalls.test_capture_is_called  s    %3\=4Q#R )<MN &%3;e+L*M25 
" 	##"-2G"D $ 	
 	1115(("*!/*.%))-	  	) 	
 	  " 	##"-2G"D $ 	
 	1115  " 	###-2G"D $ 	
 	1115(("+!/*.%))-	  	) 	
 	  " 	##%-2G"D).	 $ 	
 	1115  " 	###-2G"D&/	 $  	
 	//31115(("+!-*7%*'4	 #F+ 	) 	
r    c                 *   dddddidddd	d
dd ddd ddddd	dddd|_         t        t              }| j                  |j	                  dd      d       | j                  |j
                  d       |j                  dddddddddddd	i d        y )Nr]  Tzflags-variantdescriptionMatched condition set 1   rp  )rO   r  rF   rq   r  reasonmetadata
false-flagFno_matching_conditionzNo matching condition)coderm  condition_indexr=   r   )r]  rs  $18043bf7-9cf6-44cd-b959-9662ee20d371iI)rx  	requestIdevaluatedAtrS   r_  )	ra  rb  rc  ri  $feature_flag_reason$feature_flag_id$feature_flag_version$feature_flag_request_idz$feature_flag_evaluated_atre  )r   r	   r   re   rY   rf   rj  r   s       r   (test_capture_is_called_with_flag_detailsz9TestCaptureCalls.test_capture_is_called_with_flag_detailsG  s     (#.%'@ !#%! ($# 7'>+/  #$!8 @%=$
 @ )*##L2DE	
 	1115(("*!-*9%*'6(A$&)+,R.8
  	) 	
r    c                    dddd ddddddd	d
didd|_         t        t              }| j                  |j	                  ddd      ddi       | j                  |j
                  d       |j                  ddddddddddddid	i d        y )Nzflags-flag-with-payloadTmatched_conditionr   rn  )ru  rv  rm  ro  rp  z{"foo": "bar"})rO   r  payloadrp  rw  )rx  rx  rS   )rd   foobarr=   r_  F)	ra  rb  rc  z $feature/flags-flag-with-payloadrz  r{  r|  r}  z$feature_flag_payloadre  )r   r	   r   re   r  rf   rj  r   s       r   4test_capture_is_called_with_flag_details_and_payloadzETestCaptureCalls.test_capture_is_called_with_flag_details_and_payload  s     *4## 3+,'@ !#%#3!," @%$
 ( )*++)")- , 
 EN	
 	1115(("*!:*.%*48(A$&)+,R*/
  	) 	
r    c           	         dddii|_         t        t        t              }ddddd	d
ddgddgidddddd	g ddgidg|_        | j	                  |j                  ddd
di             |j                  j                  d      }|d   dk(  sJ |d   d   dk(  sJ |d   d   du sJ |d   d   du sJ |d   d   du sJ d|d   vsJ d|d   vsJ y ) Nr   r]  r^  r   r=   r>   r   Tr@   rA   rC   r   rJ   rK   rN   r   zGamma Featuresimple-flagrS   rT   F)blockeventr_  rL   ra  rb  rc  rd  z$feature/simple-flagz$active_feature_flags)r   r	   r   rX   rZ   rY   queuer  )r.   rg   r7   msgs       r   1test_capture_is_called_but_does_not_add_all_flagszBTestCaptureCalls.test_capture_is_called_but_does_not_add_all_flags  sn   $2\=4Q#R )<MN &%3;e+L*M25 '$*,25 
> 	## 2xQVFW $ 	
 llU+7|5555< 1^CCC< !9:dBBB< !45===< !89TAAA%S->>>>&c,.????r    c                    ddiddid|_         t        t        t              }dddddd	d
gddgddiddg|_        |j	                  ddd	dd      }| j                  |       | j                  |j                  d       y)zLTest that get_feature_flag_payload does NOT send $feature_flag_called eventsr?   Tr   r   r  r   r=   r>   rA   rC   r   rJ   rK   r   z	"payload"r   rN   rS   r   r   )rF   rb   rU   r   N)r   r	   r   rX   r  assertIsNotNonere   rf   )r.   rg   r   r7   r  s        r   Ftest_get_feature_flag_payload_does_not_send_feature_flag_called_eventszWTestCaptureCalls.test_get_feature_flag_payload_does_not_send_feature_flag_called_events  s     +D1$13#7$
  -@Q
 &$ 4<e+L*M25 "( 5 
$ 11*).@ 2 

 	W%1115r    c           	      $   t        t        t              }dddddddd	gd
ddgddd
dgiddiddg|_        i |_        ddiddid|_        |j                  dd      }| j                  |ddi       | j                  |j                  d       y)z
        Test that get_feature_flag_payload falls back to API when evaluating
        a flag with static cohorts, similar to get_feature_flag behavior.
        r   r=   zMulti-condition Flagr  TrO   r  r   r  rJ   r   rR  r   r   z{"message": "local-payload"}r  rN   z{"message": "from-api"}r   r  messager  N)r	   r   rX   r  r   r  re   rf   r  s       r   Ltest_fallback_to_api_in_get_feature_flag_payload_when_flag_has_static_cohortz]TestCaptureCalls.test_fallback_to_api_in_get_feature_flag_payload_when_flag_has_static_cohort  s     )<MN
 .-
 )-sH M+ 36'2 #[PS%T$U% "-.L M 
.  4[A$:<U#V$
  00"
 	)Z!89 	//3r    c           	          dddii|_         t        t        t        d      }ddddd	d
ddgddgidg|_        |j	                  dddddd       |j                  dddddddi d       y )Nr   r]  r^  T)r   rf  r=   r>   r   r@   rA   rC   r   rJ   rK   rN   rS   r   r   F)rU   rf  r_  r`  re  )r   r	   r   rX   rY   rj  r   s       r   (test_disable_geoip_get_flag_capture_callz9TestCaptureCalls.test_disable_geoip_get_flag_capture_callI  s     %3\=4Q#R 0AQU

 &%3;e+L*M25 
" 	).@	 	  	
 	(("*!/*.%))-	  	) 	
r    c                    t        t        t              }dddddg ddgid	g|_        |j                  dd
ddi       |j                  dd
ddi       |j                  D cg c];  }|j
                  r-|j
                  d   dk(  r|j                  j                  d      = }}| j                  t        |      d       | j                  ddi|       | j                  ddi|       y c c}w )Nr   r=   
Group flaggroup-scoped-flagTr@   rJ   rK   rN   user-1r   org-ar  zorg-br   r_  r   )r	   r   rX   rY   r  argskwargsr  re   r}  rK  )r.   rg   r   r7   callflag_called_groupss         r   $test_capture_fires_per_group_contextz5TestCaptureCalls.test_capture_fires_per_group_contextu  s    )<MN $*bLM
 
 	9g2F 	  	
 	9g2F 	  	
 &44
4yyTYYq\-CC KKOOH%4 	 

 	/0!4y'*,>?y'*,>?
s   $A C*same_contextr   r  different_key_orderrj  )r   team)r  r   c                    t        t        t              }dddddg ddgid	g|_        |j                  dd
|       |j                  dd
|       t	        d |j
                  D              }| j                  |d       y )Nr   r=   r  r  Tr@   rJ   rK   rN   r  r  c              3   \   K   | ]$  }|j                   r|j                   d    dk(  rd & yw)r   r_  r=   N)r  ).0r  s     r   	<genexpr>z`TestCaptureCalls.test_capture_dedupes_repeated_calls_under_same_group_context.<locals>.<genexpr>  s/       
4yyTYYq\-CC 4s   *,)r	   r   rX   rY   sumr  re   )r.   rv   first_groupssecond_groupsrg   r   r7   flag_called_counts           r   <test_capture_dedupes_repeated_calls_under_same_group_contextzMTestCaptureCalls.test_capture_dedupes_repeated_calls_under_same_group_context  s    & )<MN $*bLM
 
 	 3XlS 3XmT  
%44 
 

 	*A.r    c           
      \   t        t        t              }d|j                  _        dddddg ddgid	g|_        t        d
      D ]d  }d| }|j                  d|ddd       |j                  d|dddddi d        | j                  t        |j                        |dz  dz          f y )Nr   rJ   r=   r>   r   Tr@   rK   rN     rS   rC   r   r   rT   r_  r`  re  )
r	   r   #distinct_ids_feature_flags_reportedmax_sizerX   rangerY   rj  re   r}  )r.   rg   r   r7   irb   s         r   0test_capture_multiple_users_doesnt_out_of_memoryzATestCaptureCalls.test_capture_multiple_users_doesnt_out_of_memory  s    
 )<MN ?B22; &%*,25 
" tA,QC0K##-2G"D $ 
 ,,&'%3.2)--1	 " -  F>>?S1) r    N)r4  r5  r6  r   r   r   r	   rk  r~  r  r  r  r  r  r  r   r8  r  r  r  r    r   r[  r[    se   	ZZvy)TZZ&'o
 ( *o
b 
ZZvy)TZZ&'7
 ( *7
r 
ZZvy)TZZ&'2
 ( *2
h TZZ&'0@ (0@d 
ZZvy)TZZ&'$6 ( *$6L TZZ&'34 (34j 
ZZvy)TZZ&'(
 ( *(
T 
ZZvy)TZZ&'@ ( *@> ] G$G$ &#U373	
 
ZZvy)TZZ&'/ ( * /4 
ZZvy)TZZ&'. ( *.r    r[  c                      e Zd Zed        Zed        Zd Zd Z ej                  d      d        Z
 ej                  d      d        Z ej                  d      d	        Z ej                  d      d
        Z ej                  d      d        Z ej                  d      d        Z ej                  d      d        Zd Zy)TestConsistencyc                     t         j                  j                  t        d      | _        | j                  j                          y r   r   r   s    r   r   zTestConsistency.setUpClass  r   r    c                 8    | j                   j                          y r"   r#   r   s    r   r%   zTestConsistency.tearDownClass  r&   r    c                 ,    t        d||       d| _        yr(   r*   r-   s      r   r1   zTestConsistency.set_fail  r2   r    c                 R    d| _         t        t        | j                        | _        y r4   r6   r8   s    r   r9   zTestConsistency.setUp  r:   r    r;   c                     dddddg ddgidg| j                   _        g d	}t        d
      D ]K  }d| }| j                   j                  d|      }||   r| j	                  |       ;| j                  |       M y )Nr=   r>   r  Tr@   -   rK   rN   (  FTTFTFFTFTFTTFTFFFTTFTFFTFTTFFFTTTTFFFFFFTTFTTFFFTTFFFFTFTFTFTTFTFTFTTFFTFFTFTFFTFFFTTFTTFTTTTTFTTFFTTTTFFTFTTTFFFFFTFFTTTFFTFTFFTFFFFFFFFTTFFTFFTTFFTFTFTTTFFFTFFFFTTFTTFTFTTFTFTTTFTFFTTFTFTTFFTTTTFTTFFTFTFFTTFTFTFFFFFFFTFTTFFTFTFFFTFTFFFTFFTFTTFFFFTFFFFFFFFFFFFFTTFTFTTFTFTFFFTTTTFFFFFTTTFFTTFFFFFTFTTTTFTTTFFTFTFFTTTFTFFFTTFTFTFTTTTTFFTFTFTTTFTFTTFTTTTTFFFFFTFTFFTTFFFTFTTTTFFFFTTFFTTFTTTTFTTTFFTTFFTFFTFFFFFFFFFFTTFFTFFTFTFFTFFFFFFTFFFFFFFFFTTTFFFTFTFFFTFFFFFFFTFFFFFFFFTFTFTTTFFFTTTFTFTTFFFTFFFFTFTFTTFTFFFTFFTTFTFFFFFFTTFFTFFTTTFFFTFFFFTFTFFFTFTTFTFTFTFFTFFTFTFTFTFFTTTTFTFFFFFTFFTFFTTFFFFTTTFFTFFTTTTFFFTFFFTFFTTTTFFTTFTFTFFTTFTTTTFFTFFTTFTFTFFTFFFFTTTFTFFTFFTFFFFTFTFTTFFTFTTTFFFFTTFTFFFTFFFFTTTFFFTTTTFTTFTTTFTFFTFTTTTFTFTFTFFTTFFTFTFFFFTFTFFFTTTFFFTFTTFFFFFTFTFFTTFTTTTFFTFFTFTFTTFFFTFTTFFFTFTFTTFTFFTFFFTTTFFFFFTFFTTTTTFFFFFFFFTTTFFTTFTTFTFTFFFTFFTFFTTTTFFTFTTFFTFFTTFTFFTTTFFFFFTFTFFFFFTTFTTTFFFFTTTTFTTFTFTFTFFFFTTTTFFTFTTFFFFFFTFTFTTFFTTTTFFTFTTFFTTTFTFFTTFFFTFFTFFFTTTTFTFTFTFTFFTFFTFTTr  distinct_id_)r7   rX   r  r   rZ   r[   r.   r\   resultsr  
distinctIDr]   s         r   test_simple_flag_consistencyz,TestConsistency.test_simple_flag_consistency  s     &$bKL
%
!i
V tA's+J!%!<!<]J!Wqz 23  !34 r    c                 :   ddddg ddgddd	d
dddddddddddddddddgiddg| j                   _        g d}t        d      D ]O  }d| }| j                   j                  d|      }||   r| j	                  |||          ?| j                  |       Q y )Nr=   r>   zmultivariate-flagT7   rK   r   r  r  r   rU  r  r  r)  r  r  fourth-variantzFourth Variantr  fifth-variantzFifth VariantrW  rN   (  r  r  r  FFr  r  FFFr  r  Fr  r  r  FFr  r  Fr  FFFr  r  r  r  r  r  r  Fr  r  r  Fr  FFr  r  Fr  r  r  Fr  FFr  r  r  r  r  Fr  r  r  r  r  Fr  r  r  Fr  r  r  Fr  r  Fr  FFFFFFr  r  Fr  r  r  Fr  r  FFFFr  FFr  r  Fr  r  Fr  r  r  FFr  r  FFr  FFFFr  r  r  FFFr  r  Fr  r  FFFFFFFFFr  r  r  r  r  r  r  r  r  Fr  r  r  r  Fr  r  Fr  FFFr  r  FFr  FFFFr  FFFFFFFr  r  r  r  r  FFr  FFr  r  Fr  Fr  r  r  r  r  FFr  FFFFr  FFr  Fr  r  r  r  Fr  r  r  r  FFFFFr  r  r  r  FFFr  FFr  Fr  FFr  r  r  r  r  r  r  r  r  r  r  r  Fr  r  Fr  r  Fr  FFr  r  r  FFFFr  r  r  Fr  r  r  Fr  r  FFr  Fr  r  Fr  r  r  Fr  r  r  r  FFFr  FFr  r  Fr  Fr  Fr  Fr  r  r  FFr  r  r  r  r  FFr  FFFr  Fr  r  FFFFr  FFr  FFr  r  FFr  FFr  r  r  r  r  r  r  Fr  r  Fr  r  r  FFFr  r  r  r  r  r  FFr  Fr  r  Fr  r  FFr  FFr  FFr  r  r  r  FFFr  r  r  Fr  r  r  Fr  Fr  r  r  FFr  FFr  r  r  r  r  Fr  r  FFFr  r  r  r  r  r  Fr  r  Fr  r  r  r  Fr  r  r  r  FFFr  r  r  Fr  r  r  r  Fr  r  r  Fr  r  Fr  r  Fr  Fr  Fr  FFFr  r  r  FFr  r  r  r  FFFr  r  Fr  r  Fr  FFFr  r  r  FFFFr  r  r  r  r  Fr  Fr  r  r  Fr  Fr  r  r  FFFr  r  r  FFr  r  Fr  r  r  FFr  Fr  Fr  r  r  r  r  Fr  FFFFr  r  r  Fr  Fr  r  Fr  r  r  r  r  r  r  FFFr  Fr  r  r  r  r  r  r  r  r  r  r  r  Fr  FFFr  FFr  FFFr  r  r  r  r  r  r  Fr  FFFFFr  r  Fr  FFr  Fr  r  r  r  r  r  FFr  r  FFr  FFFr  r  r  r  FFr  Fr  r  FFFFr  r  FFFr  FFr  r  FFr  r  r  r  Fr  r  FFr  r  r  r  FFr  FFr  Fr  FFFFr  Fr  Fr  FFr  r  r  r  r  r  r  Fr  Fr  FFFFFr  FFFFFr  Fr  FFFFr  Fr  Fr  FFr  r  Fr  FFr  Fr  r  r  FFFFFr  FFr  r  Fr  FFFFFr  r  FFFr  r  r  FFFr  Fr  FFr  FFFFFr  r  r  r  Fr  Fr  Fr  Fr  r  Fr  Fr  Fr  Fr  r  FFFr  Fr  r  FFr  r  FFr  FFr  Fr  r  r  r  r  Fr  FFFFFr  FFFFr  r  r  r  Fr  r  FFr  r  r  FFr  r  Fr  r  r  r  r  FFFr  r  r  Fr  r  r  FFr  r  Fr  FFr  Fr  r  r  r  r  r  Fr  r  FFFr  r  r  r  r  r  r  r  FFFr  r  FFr  FFFFFFr  r  Fr  Fr  Fr  r  r  r  Fr  Fr  r  FFFr  Fr  Fr  r  r  r  FFr  FFFr  r  r  r  r  r  FFFr  FFFr  r  FFr  r  r  r  r  r  r  r  r  r  Fr  FFr  r  r  Fr  r  r  r  r  FFr  r  FFFr  r  r  r  r  r  Fr  r  r  FFr  r  Fr  r  r  )r7   rX   r  rY   re   r[   r  s         r   "test_multivariate_flag_consistencyz2TestConsistency.test_multivariate_flag_consistency
  s     &*.0KL"'6(768 (8(868 (7(768 (8(867 (7(767+%%%'%
!Ri
V tA's+J!%!=!=#Z" qz  !3WQZ@  !34 r    r`   c                 ,   di i|_         t        t        t              }ddddg ddgid	g|_        | j	                  |j                  dd
             | j                  |j                  dd
             | j                  |j                  dd
             y )Nr   r  r=   Beta-FeatureTr@   rJ   rK   r  user1r   BETA-FEATURE)r   r	   r   rX   rZ   r   r[   r.   
mock_flagsr7   s      r    test_feature_flag_case_sensitivez0TestConsistency.test_feature_flag_case_sensitive+  s     B#

 -@Q

 %bLM		 
 	..~wGH//HI//HIr    c                 J   ddidddiid|_         t        t        t              }dddg dd	gd
ddiiddg|_        | j	                  |j                  dd      ddi       | j                  |j                  dd             | j                  |j                  dd             y )Nr  TsomerH   r   r  r=   rJ   rK   r   r   r  r  r   r  )r   r	   r   rX   re   r  r   r  s      r   (test_feature_flag_payload_case_sensitivez8TestConsistency.test_feature_flag_payload_case_sensitiveD  s     ,T2$2VW4E#F#


 -@Q

 %.0LM 1!	
 
 	++NGDvwFW	
 	&99.'RS&99.'RSr    c                 `   ddidddiid|_         t        t        t              }dddg dd	gd
ddiiddg|_        | j	                  |j                  dd             | j                  |j                  dd      ddi       g d}|D ]#  }| j                  |j                  |d             % y )Nr  Tr  rH   r   r  r=   rJ   rK   r   r   r  r  )r   r  zbEtA-FeAtUrE)	r   r	   r   rX   rZ   r   re   r  r[   )r.   r  r7   
test_casescases        r   ,test_feature_flag_case_sensitive_consistencyz<TestConsistency.test_feature_flag_case_sensitive_consistencyc  s     ,T2$2VW4E#F#


 -@Q

 %.0LM 1!	
 
  	..~wGH++NGDvwFW	

 F
DV33D'BC r    c                 :   ddddi|_         t        t        t              }|j                  dddgd	d
i      }|j	                          |j
                  d   }| j                  |d   ddg       | j                  |d   d	d
i       | j                  |ddd       y)zQTest that get_all_flags with flag_keys_to_evaluate only evaluates specified flagsr   rC  T)flag1flag2r  r  r  r  rA   rC   flag_keys_to_evaluaterU   r=   r  rU   N)r   r	   r   r   assert_called_once	call_argsre   r.   r  r7   r1  r  s        r   -test_get_all_flags_with_flag_keys_to_evaluatez=TestConsistency.test_get_all_flags_with_flag_keys_to_evaluate  s     !#

 -@Q

 %%#*G"4'/ & 
 	%%'((+	#:;gw=OP#67(E9JK 	8d!CDr    c                    dddddiddidd|_         t        t        t              }|j                  d	d
dgddi      }|j	                          |j
                  d   }| j                  |d   d
dg       | j                  |d   ddi       | j                  |d   ddd       | j                  |d   ddiddid       y)z^Test that get_all_flags_and_payloads with flag_keys_to_evaluate only evaluates specified flagsvariant1Tr  flag3rz  payload1payload3r   r  r  r  r  subscriptionpror  r=   r  rU   r   r   N)r   r	   r   r   r  r  re   r  s        r   :test_get_all_flags_and_payloads_with_flag_keys_to_evaluatezJTestConsistency.test_get_all_flags_and_payloads_with_flag_keys_to_evaluate  s
   
 $
 !*- *-$	#

 -@Q

 22#*G"4-u5 3 
 	%%'((+	#:;gw=OP)*U#	
 	/:PT1UV()z*fj5IJ	
r    c           	          t        t        t              }ddddg ddgidd	d
ddg ddgidddddg ddgidg|_        |j                  dddgd      }| j	                  |ddd       | j                  d
|       y)zTTest that local evaluation with flag_keys_to_evaluate only evaluates specified flagsr  r=   r  Tr@   rJ   rK   r  r   r  r   r  r  )r  rc   r  N)r	   r   rX   r   re   assertNotIn)r.   r7   r1  s      r   5test_get_all_flags_locally_with_flag_keys_to_evaluatezETestConsistency.test_get_all_flags_locally_with_flag_keys_to_evaluate  s    -@Q
 $bPS'T&UV	 $bPS'T&UV	 $bPS'T&UV	 
, %%#*G"4"& & 
 	4$!?@&)r    N)r4  r5  r6  r7  r   r%   r1   r9   r   r   r  r  r  r  r  r  r  r  r  r    r   r  r    s(   " "
 ! !
H TZZ$%@5 &@5D  TZZ$%^5 &^5@! TZZ&'J (J0 TZZ&'T (T< TZZ&'!D (!DF TZZ&'E (E: TZZ&'&
 (&
P%*r    r  )r  unittestr   zoneinfor   dateutilr   dateutil.relativedeltar   	freezegunr   r   posthog.clientr	   rJ  r
   r   r   r   posthog.requestr   r   posthog.test.test_utilsr   TestCaser   r:  r  r  r[  r  r  r    r   <module>r     s         0 ! ' !  2 5X@4(++ X@4v@v

(++ v

rBh'' B"Uh// Up]x(( ]@@$*h'' @$*r    