
    jKj~                     ^   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
m	Z	mZmZ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 d dlmZ dZdZ G d d      Z G d dej@                        Z! G d dej@                        Z" G d dej@                        Z#y)    N)	ExitStack)mock)	dataclass)datedatetime	timedeltatimezonetzinfo)Decimal)Optional)UUID)parameterized)	BaseModel)utils)FeatureFlagResult+kOOlRy2QlMY9jHZQv0bKz0FZyazBUoY8Arj0lFVNjs4
random_keyc                   :    e Zd Zd	dZd Zd Zd Zd Zd
dZd Z	y)	FakeRedisc                 J    i | _         || _        g | _        g | _        g | _        y N)storefailsetex_calls
scan_calls_last_scan_keys)selfr   s     h/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/test/test_utils.py__init__zFakeRedis.__init__   s'    
	!    c                 F    t        |t              r|j                         S |S r   )
isinstancebytesdecoder   keys     r   _keyzFakeRedis._key    s    )#u5szz|>3>r    c                     | j                   rt        d      | j                  j                  | j	                  |            S Nredis unavailable)r   RuntimeErrorr   getr'   r%   s     r   r,   zFakeRedis.get#   s0    99233zz~~diin--r    c                     | j                   rt        d      | j                  j                  | j	                  |      ||f       || j
                  | j	                  |      <   y r)   )r   r+   r   appendr'   r   )r   r&   ttlvalues       r   setexzFakeRedis.setex(   sN    992333e <=%*

499S>"r    c                 n    | j                   rt        d      || j                  | j                  |      <   y r)   )r   r+   r   r'   )r   r&   r0   s      r   setzFakeRedis.set.   s+    99233%*

499S>"r    Nc                    | j                   rt        d      | j                  j                  |||f       |r|j	                  d      r|d d n|}|dk(  rIt        | j                        D cg c]%  }||j                  |      r|j                         ' c}| _	        | j                  }t        dt        |      dz        }|dk(  rt        |      dkD  rd|d | fS d|dk(  r||d  fS |fS c c}w )Nr*   *r         )r   r+   r   r.   endswithsortedr   
startswithencoder   maxlen)r   cursormatchcountprefixr&   keysmidpoints           r   scanzFakeRedis.scan3   s    99233u56$)<s%Q; "$**-$-C>S^^F%; 

-$D 
 ##q#d)q.)Q;3t9q=d9Ho%%Vq[$xy/::d::$s   ,*C+c                     | j                   rt        d      |D ]-  }| j                  j                  | j	                  |      d        / y r)   )r   r+   r   popr'   )r   rC   r&   s      r   deletezFakeRedis.deleteD   s9    99233CJJNN499S>40 r    )F)NN)
__name__
__module____qualname__r   r'   r,   r1   r3   rE   rH    r    r   r   r      s%    "?.
++
;"1r    r   c                   v   e Zd Z ej                  ddg      dedefd       Zd Zd Z	d Z
d	 Zd
 Zd Zd Z ej                  g d      d        Zd Zd>dZd Zd Zd Z ej                  ddddddfddddddfdddd ddd!fd"d"d#d$d%d&ddd'd$id%fd(d)d*d+dddddd+fd,d-d-d.dddddd.fg      	 	 	 	 	 d?d/       Z ej                  g d0      d1        Z ej                  g d2      d3        Z ej                  d4d'd$id%d5fd6d'didd7fg      d8        Z ej                  d9d:g      d;        Zd< Zd= Zy)@	TestUtils)znaive datetime should be naiveT)z+timezone-aware datetime should not be naiveF_nameexpected_naivec                     |rt        j                         }n$t        j                  t        j                        }t	        j
                  |      |u sJ y )Ntz)r   nowr	   utcr   is_naive)r   rO   rP   dts       r   test_is_naivezTestUtils.test_is_naiveL   s;     B.B~~b!^333r    c                    t        j                         }t        j                  t        j                        }t	        j
                  |      }t	        j                  |      du sJ t	        j
                  |      }||k(  sJ t        ddd      }t	        j
                  |      }||j                  t        j                        k(  sJ y )NrR   Fi  r7   r
   )r   rT   r	   rU   r   guess_timezonerV   replace)r   rT   utcnowfixedshouldnt_be_edited	old_naive	fixed_olds          r   test_timezone_utilszTestUtils.test_timezone_utilsZ   s    lln.$$S)~~e$---"11&9++++T1a(	((3	I--X\\-BBBBr    c                 T    t        ddd      }t        j                  |      dk(  sJ y )Nr8         )dayssecondsmicrosecondsg A)r   r   total_seconds)r   deltas     r   test_total_secondszTestUtils.test_total_secondsh   s)    q!!<""5)]:::r    c           	      x     G d dt               }t        j                  t        ddd |                   du sJ y )Nc                       e Zd Zd Zy)CTestUtils.test_is_naive_when_tzinfo_has_no_offset.<locals>.NoOffsetc                      |t        d      S y )Nr7   )hours)r   )r   rW   s     r   	utcoffsetzMTestUtils.test_is_naive_when_tzinfo_has_no_offset.<locals>.NoOffset.utcoffsetn   s    :$1--r    N)rI   rJ   rK   rq   rL   r    r   NoOffsetrn   m   s    r    rr     r7   rZ   T)r
   r   rV   r   )r   rr   s     r   'test_is_naive_when_tzinfo_has_no_offsetz1TestUtils.test_is_naive_when_tzinfo_has_no_offsetl   s4    	v 	 ~~htQ(*EF$NNNr    c           
         t        d      dt        j                         dddddd d	}t        d      t	        d	
      g dd}t        |j                               }|j                  |j                                |j                         }t        j                  |       |j                         |k(  sJ t        j                  t        d            dk(  sJ y )Nz0.142857wooi r7   g       @T)	decimalunicoder   longintegerfloatboolstrnonezThis should show up   )rh   )r7   r8   rd   )	exceptionr   list 12345678123456781234567812345678$12345678-1234-5678-1234-567812345678)r   r   rT   	Exceptionr   dictitemsupdaterC   r   cleanr   )r   simplecomplicatedcombinedpre_clean_keyss        r   
test_cleanzTestUtils.test_cleanu   s    z*LLN

 ##89"3
 '))+,!H}}.000 KK?@A56	
6r    c                     t        ddd      t        j                  t        j                        d}|t        j                  |      k(  sJ y )Ni  r7   rR   )	birthdateregistration)r   r   rT   r	   rU   r   r   )r   dict_with_datess     r   test_clean_with_dateszTestUtils.test_clean_with_dates   s>    dAq)$LLHLL9
 %++o">>>>r    c                 x    t        d      }t        j                  |       t        j                  |      dk(  sJ y )N
   z
          )r#   r   r   )r   items     r   
test_byteszTestUtils.test_bytes   s/    RyD{{4 $NNNNr    c                 J    t        j                  d dd      }|d ddk(  sJ y )Nc                     | S r   rL   )xs    r   <lambda>z)TestUtils.test_clean_fn.<locals>.<lambda>   s    qr    re   )fnnumber)r   r   )r   cleaneds     r   test_clean_fnzTestUtils.test_clean_fn   s(    ++[A>?3333r    ))zhttp://posthog.io/http://posthog.io)r   r   )zhttps://example.com/path/https://example.com/path)r   r   c                 8    |t        j                  |      k(  sJ y r   )r   remove_trailing_slash)r   	input_urlexpected_urls      r   test_remove_slashzTestUtils.test_remove_slash   s     u::9EEEEr    c           	          G d dt                G d dt              } G fddt               } G d d      }t        j                   |             d	d
ik(  sJ t        j                   dd            ddd dk(  sJ t        j
                  dk  r%t        j                   |dd            dddk(  sJ t        j                   | ddd                  d	ddddik(  sJ y )Nc                   6    e Zd ZU eed<   eed<   dZee   ed<   y).TestUtils.test_clean_pydantic.<locals>.ModelV2foobarNbaz)rI   rJ   rK   r}   __annotations__intr   r   rL   r    r   ModelV2r      s    HH!%C#%r    r   c                   "    e Zd ZU eed<   eed<   y).TestUtils.test_clean_pydantic.<locals>.ModelV1r   r   N)rI   rJ   rK   r   r   r}   rL   r    r   ModelV1r      s    HHr    r   c                       e Zd ZU W  ed<   y)2TestUtils.test_clean_pydantic.<locals>.NestedModelr   N)rI   rJ   rK   r   )r   s   r   NestedModelr      s    Lr    r   c                       e Zd Zd Zy)4TestUtils.test_clean_pydantic.<locals>.ModelDumpOnlyc                 
    ddiS )Nr   
model_dumprL   r   s    r   r   z?TestUtils.test_clean_pydantic.<locals>.ModelDumpOnly.model_dump   s    |,,r    N)rI   rJ   rK   r   rL   r    r   ModelDumpOnlyr      s    -r    r   r   r   1r8   )r   r   )r   r   r   )rd      r7   23)r   )r   BaseModelV1r   r   sysversion_info)r   r   r   r   r   s       @r   test_clean_pydanticzTestUtils.test_clean_pydantic   s    	&i 	&
	k 		) 		- 	- {{=?+|/DDDD{{7s238
 
 	
 
 g%;;w1#671S;QQQQ{{;7ss+KLM3q5R
 
 	
 
r    Nc                 Z    G d d      }t         j                  j                  t        j                  d      5 }t        j
                  d |       i      dd ik(  sJ 	 d d d        j                          |j                  j                  d   j                  d      sJ y # 1 sw Y   DxY w)Nc                       e Zd ZdedefdZy)7TestUtils.test_clean_pydantic_like_class.<locals>.Dummyrequired_paramreturnc                     i S r   rL   )r   r   s     r   r   zBTestUtils.test_clean_pydantic_like_class.<locals>.Dummy.model_dump   s    	r    N)rI   rJ   rK   r}   r   r   rL   r    r   Dummyr      s      r    r   debugtestr   z(Could not serialize Pydantic-like model:)
r   patchobjectr   logr   assert_called_once	call_argsargsr;   )r   r   r   s      r   test_clean_pydantic_like_classz(TestUtils.test_clean_pydantic_like_class   s    	 	 ZZuyy'2e;;01fd^CCC 3  "##A&116
 	
 
 32s   $B!!B*c                 R   t        j                  t        d      t        d      f      ddgk(  sJ t	               fd}t        j                  d|      5  t
        j                  j	                  t         j                  d      5 }t        j                  d	d
      dd	ik(  sJ 	 d d d        d d d        j                          |j                  j                  d   dk(  sJ |j                  j                  d	d  dt              fk(  sJ y # 1 sw Y   jxY w# 1 sw Y   nxY w)N1.5r         ?r   c                 &    | u rt        d      | S )Nunsupported)	TypeError)r0   	bad_values    r   clean_or_raisezOTestUtils.test_clean_containers_and_invalid_dict_values.<locals>.clean_or_raise   s    	!..Lr    zposthog.utils.clean)side_effectwarningr7   )okbadr   r   zXDictionary values must be serializeable to JSON "%s" value %s of type %s is unsupported.r   )r   r   r   r   r   r   r   r   _clean_dictr   r   r   type)r   r   r   r   s      @r   -test_clean_containers_and_invalid_dict_valuesz7TestUtils.test_clean_containers_and_invalid_dict_values   s   {{U^T"DEF
 2

 	
 
 H		 JJ,.IJJeii3w$$Ai%@AdAYNNN 4 J
 	""$  %%a(f
 	
 
   %%ab)eYY-PPPP 43 JIs$   /D D(DD	DD&c                    t        j                  d      dk(  sJ t        j                  d      dk(  sJ t        j                  d      J t        j                  j	                  t         j
                  d      5 }t        j                  d      J 	 d d d        j                          |j                  j                  d   dk(  sJ d	|j                  j                  d
   v sJ  G d dt              }t        j                  j	                  t         j
                  d      5 }t        j                   |d            J 	 d d d        |j                  j                  d
   dk(  sJ y # 1 sw Y   xY w# 1 sw Y   4xY w)Nzalready unicodes   bytesr#   {   r      r   zError decoding: %szinvalid start byter7   c                       e Zd Zd Zy)7TestUtils.test_coerce_unicode.<locals>.UndecodableBytesc                     t        dd      )Nleftright)r   )r   r   kwargss      r   r$   z>TestUtils.test_coerce_unicode.<locals>.UndecodableBytes.decode  s    00r    N)rI   rJ   rK   r$   rL   r    r   UndecodableBytesr     s    1r    r   s   brokenz
left:right)
r   _coerce_unicoder   r   r   r   r   r   r   r#   )r   r   r   s      r   test_coerce_unicodezTestUtils.test_coerce_unicode   sI   $$%67;LLLL$$X.'999$$S)111ZZuyy)4((1999 5""$  %%a(,@@@@#w'8'8'='=a'@@@@	1u 	1 ZZuyy)4(()9))DEMMM 5  %%a(L888 54 54s   :E)#E5)E25E>c                    t        j                  d      du sJ t        j                  d      du sJ t        ddd      }t        dddt        j                        }t        j
                  |      |k(  sJ t        j
                  |      |u sJ t        j                  dd	      du sJ t        j                  dd
      du sJ t        j                  dd      du sJ t        j                  dd      du sJ y )Nz
^posthog.*T[Frs   r7   rZ   zHello WorldWORLDpythonzhello worldhello)r   is_valid_regexr   r	   rU   convert_to_datetime_awarestr_icontainsstr_iequals)r   naiveawares      r   $test_regex_datetime_and_case_helpersz.TestUtils.test_regex_datetime_and_case_helpers  s    ##L1T999##C(E111q!$q!HLL9..u5>>>..u5>>>""=':dBBB""=(;uDDD  >$FFF  8EAAAr    zwin32 with versionwin32Windows11$os$os_versionr    r  r  zwin32 without versionr  r  r  r  r  darwinMac OS X14.4r  r  r  r  r  linuxLinux24.04Ubuntu)r   r   z
$os_distroversionfreebsd	freebsd13FreeBSD13.2zgeneric fallbacksunosz5.11c	                    t         j                  j                  t        j                  d|      g}	|?|	j                  t         j                  j                  t        j                  d|             |?|	j                  t         j                  j                  t        j                  d|             |?|	j                  t         j                  j                  t        j                  d|             |?|	j                  t         j                  j                  t        j                  d|             |?|	j                  t         j                  j                  t        j                  d|             t               5 }
|	D ]  }|
j                  |        t        j                         |k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nplatform	win32_verreturn_valuemac_verinfonamerelease)r   r   r   r   r   r.   r  distror   enter_contextget_os_info)r   rO   sys_platformexpectedr  r  distro_infodistro_namer  patchesstackr   s               r   test_get_os_info_branchesz#TestUtils.test_get_os_info_branches  sY   F ::$$UYY
LIJ NN

!!%..+I!V NN

!!%..)'!R "NN

!!%,,[!Q "NN

!!%,,[!Q NN

!!%..)'!R [E ##E* !$$&(222 [[s    2F<<G))r  r   )r   r   r  )empty_versionr  r   r  r  )missing_win32_verNr&  c                    |nt         j                  j                  t        j                  dd      5  t        t        j                  d       t        j                         |k(  sJ 	 d d d        y t         j                  j                  t        j                  d|      5  t        j                         |k(  sJ 	 d d d        y # 1 sw Y   y xY w# 1 sw Y   y xY w)Nr  Tcreater  )r   r   r   r   r  delattr_get_windows_os_info)r   rO   r  r  s       r   test_get_windows_os_infoz"TestUtils.test_get_windows_os_infoy  s     ""5>>;t"L4113x??? M ZZu~~{S--/8;;; TS M SS   4C!CCC))r  r  )r  r  r  )r%  )r  r  r  r  r  r  )missing_mac_verNr/  c                    |nt         j                  j                  t        j                  dd      5  t        t        j                  d       t        j                         |k(  sJ 	 d d d        y t         j                  j                  t        j                  d|      5  t        j                         |k(  sJ 	 d d d        y # 1 sw Y   y xY w# 1 sw Y   y xY w)Nr  Tr)  r  )r   r   r   r   r  r+  _get_macos_info)r   rO   r  r  s       r   test_get_macos_infozTestUtils.test_get_macos_info  s     ?""5>>9T"J	2,,.(::: K ZZu~~ywO((*h666 PO K OOr.  version_and_distro)r	  r
  r  empty_version_and_distro)r	  r  r  c                 L   t         j                  j                  t        j                  d|      5  t         j                  j                  t        j                  d|      5  t        j
                         |k(  sJ 	 d d d        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  _get_linux_os_info)r   rO   r   r!  r  s        r   test_get_linux_os_infoz TestUtils.test_get_linux_os_info  su     JJellFMJJellFM++-999 N NMMM NMs#   1B"B=BB	BB#)r  r  r  )missing_releaseNr  c                    |nt         j                  j                  t        j                  dd      5  t        t        j                  d       t        j                         |k(  sJ 	 d d d        y t         j                  j                  t        j                  d|      5  t        j                         |k(  sJ 	 d d d        y # 1 sw Y   y xY w# 1 sw Y   y xY w)Nr  Tr)  r  )r   r   r   r   r  r+  _platform_release)r   rO   r  r  s       r   test_platform_releasezTestUtils.test_platform_release  s     ?""5>>9T"J	2..0H<<< K ZZu~~ywO**,888 PO K OOr.  c                    t         j                  j                  t        j                  dd      5  t         j                  j                  t        dddd      5  t        j
                         }d d d        d d d        dt        j                  d    d	t        j                  d
    d	t        j                  d    dddk(  sJ y # 1 sw Y   YxY w# 1 sw Y   ]xY w)Npython_implementationCPythonr  r  TestOSr   r   r   .r7   r8   )z$python_runtimez$python_versionr   r   )r   r   r   r   r  system_contextr   r   )r   contexts     r   test_system_contextzTestUtils.test_system_context  s    JJ 7i   JJ}8TW3X   **,G	 ("%"2"21"5!6a8H8H8K7LAcN^N^_`NaMbc	
 
 	
 
  s#   *CC0CC	CCc                    t          G d d             t          G fdd             }t        j                   |dd ddt        d	      t	        d
dd                        dddddt	        d
dd      d ddk(  sJ y )Nc                   J    e Zd ZU eed<   eed<   eed<   eed<   dZe	e   ed<   y)6TestUtils.test_clean_dataclass.<locals>.InnerDataClass	inner_foo	inner_bar
inner_uuid
inner_dateNinner_optional)
rI   rJ   rK   r}   r   r   r   r   rL  r   rL   r    r   InnerDataClassrG    s&    NN  ,0NHSM0r    rM  c                   0    e Zd ZU eed<   eed<   W  ed<   y)5TestUtils.test_clean_dataclass.<locals>.TestDataClassr   r   nestedN)rI   rJ   rK   r}   r   r   )rM  s   r   TestDataClassrO    s    HH""r    rQ  r   r8   r   re   r   i  r7   )rH  rI  rJ  rK  )r   r   rP  r   )rH  rI  rJ  rK  rL  )r   r   r   r   r   )r   rQ  rM  s     @r   test_clean_dataclasszTestUtils.test_clean_dataclass  s    		1 	1 
	1 
	# 	# 
	#
 {{%!#$FG'a3		
  D&tQ2"&


 	
 
r    )r   N)NNNNN)rI   rJ   rK   r   expandr}   r|   rX   rb   rk   rt   r   r   r   r   r   r   r   r   r   r   r$  r-  r3  r8  r<  rD  rR  rL   r    r   rN   rN   K   st   ]4B	
43 4 44C;O
B?O
4 ]	
FF
<
 Q69&B ] %!$7"	 (!"5 	 "6:* "#*"*
 G$ !&9	 #7	W5	
7z $3q7p$3L ]	
<< ]	
77 ] %G$,	 ()R">OP	

:
: ]')	
99
$$
r    rN   c                   l    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zy)TestFlagCachec                 t    t        j                  dd      | _        t        j                  ddd       | _        y )Nrd   r7   max_sizedefault_ttl	test-flagT)r   	FlagCachecacher   from_value_and_payloadflag_resultr   s    r   setUpzTestFlagCache.setUp  s.    __aQ?
,CCt
r    c                 p    t        j                         }|j                  dk(  sJ |j                  dk(  sJ y )Ni'  ,  )r   r[  rX  rY  )r   r\  s     r   test_default_cache_settingsz)TestFlagCache.test_default_cache_settings  s4    !~~&&&  C'''r    c                    t        j                  | j                  dd      }|j                  ddd      du sJ |j                  ddd      d	u sJ |j                  d
dd      d	u sJ |j                  ddd      d	u sJ |j	                  dd      du sJ |j	                  dd      d	u sJ |j	                  d      d	u sJ |j	                  d      d	u sJ y )Nr7   d   )flag_definition_version	timestampm   r   )current_timer/   current_flag_versionTn   Fo   r8   )rh  max_stale_ageit  )rh  g     @)r   FlagCacheEntryr^  is_validis_stale_but_usable)r   entrys     r   test_cache_entry_validityz'TestFlagCache.test_cache_entry_validity  s   $$a3
 ~~3BQ~OSWWWW~~3BQ~OSXXXX~~3BQ~OSXXXX~~3BQ~OSXXXX((c(LPTTTT((c(LPUUUU((d(;uDDD((f(=FFFr    c                    d}d}d}| j                   j                  |||      }|J | j                   j                  ||| j                  |       | j                   j                  |||      }|J |j	                         sJ y Nuser123rZ  r7   )r\  get_cached_flagset_cached_flagr^  	get_valuer   distinct_idflag_keyflag_versionresults        r   test_cache_basic_operationsz)TestFlagCache.test_cache_basic_operations  s     ++K<P~~ 	

""4#3#3\	
 ++K<P!!!!!!r    c                    d}d}d}| j                   j                  ||| j                  |       | j                   j                  |||      }|J t	        j
                  d       | j                   j                  |||      }|J y Nrt  rZ  r7   g?)r\  rv  r^  ru  timesleeprx  s        r   test_cache_ttl_expirationz'TestFlagCache.test_cache_ttl_expiration!  s     	

""4#3#3\	

 ++K<P!!! 	

3 ++K<P~~r    c                    d}d}d}d}| j                   j                  ||| j                  |       | j                   j                  |||      }|J | j                   j                   |   |   j                  t        j
                         k  sJ | j                   j                  |||      }|J | j                   j                  |       | j                   j                  |||      }|J || j                   j                  vsJ y )Nrt  rZ  r7   r8   )r\  rv  r^  ru  rf  r  invalidate_versionaccess_times)r   ry  rz  old_versionnew_versionr|  s         r   test_cache_version_invalidationz-TestFlagCache.test_cache_version_invalidation6  s     	

"";$:J:JKX ++K;O!!!zz,X6@@DIIKOOO ++K;O~~ 	

%%k2 ++K;O~~$**"9"9999r    c                 t   | j                   j                  dd| j                  d       | j                   j                  dd| j                  d       | j                   j                  d       d| j                   j                   d   vsJ d| j                   j                   d   v sJ d| j                   j                  v sJ d}| j                   j                  |d| j                  d       | j                   j                  d       || j                   j                   vsJ || j                   j                  vsJ y )Nrt  zold-flagr7   znew-flagr8   zold-empty-user)r\  rv  r^  r  r  )r   old_empty_users     r   <test_cache_version_invalidation_keeps_users_with_other_flagszJTestFlagCache.test_cache_version_invalidation_keeps_users_with_other_flagsP  s   

""9j$:J:JAN

""9j$:J:JAN

%%a(!1!1)!<<<<TZZ--i8888DJJ33333)

"">:t?O?OQRS

%%a(TZZ%5%5555TZZ%<%<<<<r    c                 t    i | j                   j                   d<   | j                   j                  ddd      J y )Nrt  missing-flagr7   )r\  ru  r   s    r   /test_cache_misses_when_user_exists_without_flagz=TestFlagCache.test_cache_misses_when_user_exists_without_flag`  s5    &(

#zz)))^QGOOOr    c                    i | j                   j                   d<   d| j                   j                  d<   | j                   j                  d       | j                   j                   di ik(  sJ | j                   j                  ddik(  sJ y )Nzexisting-userr   missing-user)r\  r  _remove_userr   s    r   'test_remove_missing_user_does_not_raisez5TestFlagCache.test_remove_missing_user_does_not_raisee  sv    ,.

)36

0

/zzOR#8888zz&&?C*@@@@r    c                     | j                   j                  dd      J i | j                   j                   d<   | j                   j                  dd      J y )Nr  rZ  rt  r  )r\  get_stale_cached_flagr   s    r   test_stale_cache_missesz%TestFlagCache.test_stale_cache_missesn  sP    zz//LTTT&(

#zz//	>JRRRr    c                     dt        j                  | j                  dd      i| j                  j                  d<   | j                  j	                  ddd      J y )NrZ  r7   rd  rf  rt  r   )r   rm  r^  r\  r  r   s    r   3test_stale_cache_returns_none_when_entry_is_too_oldzATestFlagCache.test_stale_cache_returns_none_when_entry_is_too_oldt  sS    --d.>.>SQ'


# zz//	;KSSSr    c                 (    G d d      }d |       i| j                   j                   d<   t        j                  j                  t        j
                  dd      5  | j                   j                  ddd      d	k(  sJ 	 d d d        y # 1 sw Y   y xY w)
Nc                       e Zd ZdZddZy)STestFlagCache.test_stale_cache_passes_current_time_and_max_age.<locals>.StrictEntrystale-resultc                      |dk(  sJ |dk(  sJ y)N  c   TrL   )r   rh  rl  s      r   ro  zgTestFlagCache.test_stale_cache_passes_current_time_and_max_age.<locals>.StrictEntry.is_stale_but_usable  s!    #t+++$***r    N)  )rI   rJ   rK   r^  ro  rL   r    r   StrictEntryr  |  s    (Kr    r  rZ  rt  r  r  r  r  r  )r\  r   r   r   r   r  r  )r   r  s     r   0test_stale_cache_passes_current_time_and_max_agez>TestFlagCache.test_stale_cache_passes_current_time_and_max_age{  s{    	 	 (3KM&B

#ZZuzz6E

00KL!"" FEEs   #BBc                 0   d}d}d}| j                   j                  ||| j                  |       t        j                  d       | j                   j                  |||      }|J | j                   j                  ||      }|J |j                         sJ y r  )r\  rv  r^  r  r  ru  r  rw  )r   ry  rz  r{  r|  stale_results         r   test_stale_cache_functionalityz,TestFlagCache.test_stale_cache_functionality  s     	

""4#3#3\	

 	

3 ++K<P~~ zz77XN'''%%'''r    c                    d}t        d      D ]/  }d| }| j                  j                  |d| j                  |       1 | j                  j	                  dd|       | j                  j                  dd| j                  |       | j                  j	                  dd|      }|J | j                  j	                  dd|      }|J | j                  j	                  dd|      }|J y )Nr7   rd   userrZ  user0user3user2)ranger\  rv  r^  ru  )r   r{  iuser_idr|  s        r   test_lru_evictionzTestFlagCache.test_lru_eviction  s     qAQCjGJJ&&d&6&6  	

""7KF 	

""7K9I9I<X ++G[,O!!! ++G[,O!!! ++G[,O!!!r    c                    t        j                  dd      }t        d      D ]5  }|j                  d| d| j                  d       ||j
                  d| <   7 |j                  dd| j                  d       d|j                  vsJ d	|j                  vsJ d|j
                  vsJ d	|j
                  vsJ t        |j                        d
k(  sJ y )Nr   <   rW  r  rZ  r7   user10r  user1	   )r   r[  r  rv  r^  r  r\  r>   )r   r\  r  s      r   (test_lru_eviction_removes_twenty_percentz6TestFlagCache.test_lru_eviction_removes_twenty_percent  s    <rA!!D*k4;K;KQO-.EaSz*  	hT5E5EqIekk)))ekk)))e00000e000005;;1$$$r    c                    | j                   j                          | j                   j                   i k(  sJ | j                   j                  i k(  sJ | j                   j                  dd| j                  d       | j                   j                          | j                   j                   i k(  sJ | j                   j                  i k(  sJ y rs  )r\  
_evict_lrur  rv  r^  clearr   s    r   !test_empty_lru_eviction_and_clearz/TestFlagCache.test_empty_lru_eviction_and_clear  s    

zz2%%%zz&&",,,

""9k4;K;KQO

zz2%%%zz&&",,,r    N)rI   rJ   rK   r_  rb  rq  r}  r  r  r  r  r  r  r  r  r  r  r  r  rL   r    r   rU  rU    sW    
(
G""*:4= P
AST (,":%-r    rU  c                       e Zd Zd Zd Zd Zd Zd Z ej                  ddg      d        Z
d	 Z ej                  d
dg      d        Zd Zd Zd Zd Zd Zy)TestRedisFlagCachec                 r    t               | _        t        j                  | j                  ddd      | _        y )Nr   r  ztest:flags:)rY  	stale_ttl
key_prefix)r   redisr   RedisFlagCacher\  r   s    r   r_  zTestRedisFlagCache.setUp  s*    [
))JJB"

r    c                     t        j                  | j                        }|j                  dk(  sJ |j                  dk(  sJ |j
                  dk(  sJ |j                  dk(  sJ y )Nra  r  zposthog:flags:zposthog:flags:version)r   r  r  rY  r  r  version_key)r   default_caches     r   rb  z.TestRedisFlagCache.test_default_cache_settings  sh    ,,TZZ8((C///&&$...''+;;;;((,CCCCr    c                    | j                   j                  dd      dk(  sJ t        j                  | j                   j	                  dd            d   }t        |t              sJ | j                   j	                  dt        d      ddd	
      }t        j                  |      ddddd	dk(  sJ | j                   j                  |      }|j                  dddk(  sJ |j                  dk(  sJ |j                  d	k(  sJ | j                   j                  d      J | j                   j                  t        j                  ddi            J y )Nrt  betatest:flags:user123:betaTrd   rf  r   )enabledrA   r   r  r   )r^  r{  rf  not jsonr^  )r\  _get_cache_keyjsonloads_serialize_entryr"   r{   r   _deserialize_entryr^  re  rf  dumps)r   generated_timestamp
serializedrp  s       r    test_cache_key_and_serializationz3TestRedisFlagCache.test_cache_key_and_serialization  sO   zz((F;?XXXX"jj)D)DT1)MN
 -u555ZZ00wu~6S 1 

 zz*%'+c:*
 
 	
 
 

--j9  s$CCCC,,111#%%%zz,,Z8@@@zz,,TZZ8M-NOWWWr    c                    | j                   j                  dddd       | j                   j                  ddd      du sJ | j                   j                  ddd      J | j                  j                  d   dk(  sJ | j                  j
                  d   d   d	k(  sJ | j                   j                  dd
      }| j                   j                  ddt        j                         dz
        | j                  j                  |<   | j                   j                  dd
d      J | j                   j                  dd
d      du sJ | j                   j                  dd
d      	 J | j                   j                  dd      }| j                   j                  ddt        j                         dz
        | j                  j                  |<   | j                   j                  dd      du sJ | j                   j                  dd      }| j                   j                  ddt        j                         dz
        | j                  j                  |<   | j                   j                  dd      J y )Nrt  r  T      ztest:flags:versionr   r7   r  old-betar   r     )rl     zdefault-stalezboundary-staleg     !@)
r\  rv  ru  r  r   r   r  r  r  r  )r   	stale_keydefault_stale_keyboundary_keys       r   #test_get_set_and_stale_cached_flagsz6TestRedisFlagCache.test_get_set_and_stale_cached_flags  sN   

""9fdA>zz)))VQ?4GGGzz)))VQ?GGGzz 45:::zz%%a(+r111JJ--iD	&*jj&A&A!tyy{R/ 'B '


# zz)))ZCKKKJJ,,Y
RT,U	
 JJ,,Y
RS,T	
 !JJ55iQ.2jj.I.I!tyy{R/ /J /


*+ zz//	?KtSSSzz00<LM)-)D)D!tyy{V3 *E *


& zz//	;KLTTTr    c                     t        j                  t        d            }|j                  ddd      J |j	                  dd      J |j                  dddd       |j                  d       |j                          y )NT)r   rt  r  r7   )r   r  r   ru  r  rv  r  r  )r   failing_caches     r   #test_redis_errors_fall_back_to_missz6TestRedisFlagCache.test_redis_errors_fall_back_to_miss  sy    ,,YD-AB,,YBJJJ229fEMMM%%iqA((+r    )stringr  r  )r#   s   test:flags:user123:betar  c                 D    | j                   j                  |      |k(  sJ y r   )r\  _redis_key_to_string)r   rO   r&   r  s       r   test_redis_key_to_stringz+TestRedisFlagCache.test_redis_key_to_string(  s!     zz..s3x???r    c                 |    | j                   j                  dd      }| j                   j                  |d      du sJ y )Nrt  missingr7   F)r\  r  _key_has_versionr%   s     r   /test_key_has_version_returns_false_when_missingzBTestRedisFlagCache.test_key_has_version_returns_false_when_missing1  s7    jj''	9=zz**32e;;;r    )matching_versionr7   T)different_versionr8   Fc                     | j                   j                  dd      }| j                   j                  ddd      | j                  j                  |<   | j                   j                  ||      |u sJ y )Nrt  r  Tr7   rd  r  )r\  r  r  r  r   r  )r   rO   r  r  r&   s        r   (test_key_has_version_checks_flag_versionz;TestRedisFlagCache.test_key_has_version_checks_flag_version6  sc     jj''	6: $

 ; ;D!s ; S

zz**3<HHHr    c                 B   | j                   j                  dd      }d| j                  j                  |<   | j	                  t
        j                        5  | j                   j                  |d       d d d        || j                  j                  v sJ y # 1 sw Y   $xY wNrt  invalidr  r7   )r\  r  r  r   assertRaisesr  JSONDecodeErrorr  r   invalid_keys     r   1test_key_has_version_does_not_delete_corrupt_jsonzDTestRedisFlagCache.test_key_has_version_does_not_delete_corrupt_jsonB  sz    jj//	9E(2

%t334JJ''Q7 5djj..... 54s   BBc                     | j                   j                  dd      }d| j                  j                  |<   | j                   j	                  |gd       || j                  j                  vsJ y r  )r\  r  r  r   _delete_keys_with_versionr  s     r   2test_delete_keys_with_version_deletes_corrupt_jsonzETestRedisFlagCache.test_delete_keys_with_version_deletes_corrupt_jsonJ  sZ    jj//	9E(2

%

,,k]A>$**"2"2222r    c                 t   | j                   j                  dd      }| j                   j                  dd      }| j                   j                  dd      }| j                   j                  ddd      | j                  j                  |<   | j                   j                  dd	d      | j                  j                  |<   d
| j                  j                  |<   d	| j                  j                  | j                   j
                  <   | j                   j                  d       | j                  j                  ddgk(  sJ || j                  j                  vsJ || j                  j                  vsJ || j                  j                  v sJ | j                   j
                  | j                  j                  v sJ y )Nrt  oldnewr  Tr7   rd  r  r8   r  r   test:flags:*rd  r7   r  rd  )r\  r  r  r  r   r  r  r   )r   old_keynew_keyr  s       r   test_invalidate_versionz*TestRedisFlagCache.test_invalidate_versionR  sq   **++Iu=**++Iu=jj//	9E$(JJ$?$?aSV$?$W

!$(JJ$?$?aSV$?$W

!(2

%34

//0

%%a(zz$$$$)
 
 	
 
 djj.....$**"2"2222$*******zz%%)9)9999r    c                    d| j                   j                  | j                  j                  <   | j                  j	                  dd      }| j                  j	                  dd      }| j                  j                  dd      | j                   j                  |<   | j                  j                  dd      | j                   j                  |<   | j                  j                  dd      | j                   j                  | j                  j	                  d	d
      <   | j                  j                  d       || j                   j                  vsJ || j                   j                  v sJ y )Nr8   zzzz-userr  z	zzzz-userznew-betaFr7   Tz
zzzzz-userz
newer-beta)r  r   r\  r  r  r  r  )r   r  	newer_keys      r   Atest_invalidate_version_continues_after_version_key_in_scan_batchzTTestRedisFlagCache.test_invalidate_version_continues_after_version_key_in_scan_batchf  s   34

//0**++J
CJJ--k:F	$(JJ$?$?q$I

!&*jj&A&A$&J

#JJ''a0 	

22<NO 	

%%a(djj.....DJJ,,,,,r    c                    d| j                   j                  | j                  j                  dd      <   d| j                   j                  | j                  j                  <   d| j                   j                  d<   | j                  j                          | j                   j                  ddgk(  sJ | j                   j                  ddik(  sJ y )Nr0   rt  r  r7   z	other:keyr  r  )r  r   r\  r  r  r  r   r   s    r   
test_clearzTestRedisFlagCache.test_clearu  s    IP

229fEF34

//0(/

%

zz$$$$)
 
 	
 
 zzK#9999r    N)rI   rJ   rK   r_  rb  r  r  r  r   rS  r  r  r  r  r  r  r   r  rL   r    r   r  r    s    
DX0 UD ]LL	
@@<
 ])+	
II/3:(-:r    r  )$r  r   r  unittest
contextlibr   r   dataclassesr   r   r   r   r	   r
   rw   r   typingr   uuidr   r   pydanticr   pydantic.v1r   posthogr   posthog.typesr   TEST_API_KEYFAKE_TEST_API_KEYr   TestCaserN   rU  r  rL   r    r   <module>r     s     
      ! @ @    '  0  +<  01 01fh
!! h
V^-H%% ^-Bi:** i:r    