
    ҫfi1                        d Z ddlZddlZddlZddlmZ ddlmZ ej                  d        Z	ej                  d        Z
ej                  j                  d        Zej                  j                  d        Zej                  j                  d	        Zej                  j                  d
        Zej                  j                  d        Zej                  j                  d        Zej                  j                  d        Zej                  j                  d        Zej                  j                  d        Zej                  j                  d        Zej                  j                  ej                  j-                  d      d               Zej                  j                  d        Zej                  j                  d        Zy)z
Test session recovery functionality for TikTokApi

These tests verify that the API can detect and recover from dead browser sessions.
    N)	TikTokApi)Errorc                  .    t        j                  dd      S )z,Get ms_token from environment or return Nonems_tokenN)osgetenv     [/home/homepc/tiktok-worker/venv/lib/python3.12/site-packages/tests/test_session_recovery.pyr   r      s     99Z&&r
   c                  R    t        j                  dd      j                         } | dv S )z6Get headless setting from environment, default to Trueheadlesstrue)r   1yes)r   r   lower)headless_envs    r   r   r      s)     99Z0668L///r
   c                   K   t               }|r|gnd}|j                  d| |       d{    	 |j                  D ]$  }|j                  |       d{   }|rJ d        |j                  d   }|j                  j                          d{    |j                  j                          d{    d|_        |j                  |       d{   }|rJ d       |j                  |j                  d          d{   }|sJ d	       	 |j                          d{    |j                          d{    y7 7 7 7 7 w7 J7 *7 # |j                          d{  7   |j                          d{  7   w xY ww)
z@Test that session validation correctly identifies valid sessionsN   num_sessionsr   	ms_tokensz%Newly created session should be validr   Fz Closed session should be invalid   z'Untouched session should still be valid)
r   create_sessionssessions_is_session_validpageclosecontextis_validclose_sessionsstop_playwright)r   r   apir   sessionr   session_to_kills          r   test_session_validationr%      s     +C&
DI


1x9

UUU$|| 	EG 227;;HDDD8	E
 ,,q/""((***%%++---#(  ..?????| ..s||A??BBBx   """!!###1 V
 <
 	+- @ @ 	##   """!!###s   )F	EF	#E EE 4E E!E 2E3E E
.E EE F	#E$F	;E<F	E E E 
E E F	F	F&E)'F?F FF	c                 ,  K   t               }|r|gnd}|j                  d| |       d{    	 |j                  d   }|j                  sJ d       |j	                  |       d{    |j                  rJ d       |j                  |       d{   }|rJ d       	 |j                          d{    |j                          d{    y7 7 m7 C7 #7 # |j                          d{  7   |j                          d{  7   w xY ww)z6Test that marking a session as invalid works correctlyNr   r   r   zNew session should be validz Session should be marked invalidz,Validation should confirm session is invalid)r   r   r   r   _mark_session_invalidr   r    r!   )r   r   r"   r   r#   r   s         r   test_mark_session_invalidr(   <   s     +C&
DI


1x9

UUU$,,q/>!>> ''000##G%GG# ..w77KKK|8   """!!#### V 	1
 8 	##   """!!###s   )DCD6C 'C(+C CC "D5C6DCDC C DDD1C42D
DDDc                   K   t               }|r|gnd}|j                  d| |       d{    	 |j                          d{   \  }}|J |J |j                  sJ |j	                  |       d{   sJ 	 |j                          d{    |j                          d{    y7 7 l7 <7 #7 # |j                          d{  7   |j                          d{  7   w xY ww)z1Test getting a valid session when all are healthyN   r   )r   r   _get_valid_session_indexr   r   r    r!   r   r   r"   r   idxr#   s         r   %test_get_valid_session_with_all_validr.   U   s      +C&
DI


1x9

UUU$ 99;;W"""**733333   """!!### V <
 4 	##   """!!###s   )C0B/C0B9 B11B9 6B37B9 >C0B5C0)B7*C01B9 3B9 5C07C09C-CC-&C)'C--C0c                   K   t               }|r|gnd}|j                  d| |       d{    	 |j                  d   j                  j	                          d{    |j                  d   j
                  j	                          d{    d|j                  d   _        |j                  d   j                  j	                          d{    |j                  d   j
                  j	                          d{    d|j                  d   _        |j                          d{   \  }}|dk(  sJ d       ||j                  d   k(  sJ |j                  |       d{   sJ 	 |j                          d{    |j                          d{    y7 r7 E7 7 7 7 7 G7 .7 # |j                          d{  7   |j                          d{  7   w xY ww)	z/Test getting a valid session when some are deadNr*   r   r   Fr   r   z.Should return the only valid session (index 2))r   r   r   r   r   r   r   r+   r   r    r!   r,   s         r   %test_get_valid_session_with_some_deadr0   j   s     +C&
DI


1x9

UUU$ll1o""((***ll1o%%++---#(Q ll1o""((***ll1o%%++---#(Q  !99;;WaxIIIx#,,q/)))**733333   """!!###+ V 	+- 	+- < 4 	##   """!!###s   )G)FG)*F2 F .F2 
F#AF2 F&.F2 <F(=+F2 (F*);F2 $F,%F2 ,G)?F. G)F0G) F2 #F2 &F2 (F2 *F2 ,F2 .G)0G)2G&G	G&G" G&&G)c                   K   t               }|r|gnd}|j                  d| |       d{    	 |j                  D ]M  }|j                  j	                          d{    |j
                  j	                          d{    d|_        O t        j                  t        d      5  |j                          d{    ddd       |j                          d{    |j                          d{    y7 7 7 ~7 C# 1 sw Y   BxY w7 17 # |j                          d{  7   |j                          d{  7   w xY ww)z.Test getting a valid session when all are deadNr   r   FNo valid sessions availablematch)r   r   r   r   r   r   r   pytestraises	Exceptionr+   r    r!   r   r   r"   r   r#   s        r   $test_get_valid_session_with_all_deadr9      s&     +C&
DI


1x9

UUU$|| 	%G,,$$&&&//'')))$G	% ]]9,IJ 	1..000	1   """!!### V
 ')
 1	1 	1 	##   """!!###s   )E	C:E	,D C<!D ?C> (D (D<D =DD 	E	DE	4D5E	<D >D  DDD E	E	E&D)'E?E EE	c                 8  K   t               }|r|gnd}|j                  d| |       d{    	 |j                  d   j                  j	                          d{    |j                  d   j
                  j	                          d{    d|j                  d   _        t        |j                        }|dk(  sJ |j                          d{    t        |j                        dk(  sJ d       |j                  D ]  }|j                  |       d{   rJ  	 |j                          d{    |j                          d{    y7 )7 7 7 7 C7 (7 # |j                          d{  7   |j                          d{  7   w xY ww)z0Test that session recovery removes dead sessionsNr*   r   r   Fr   z"Should have removed 1 dead session)r   r   r   r   r   r   r   len_recover_sessionsr   r    r!   )r   r   r"   r   initial_countr#   s         r   test_recover_sessionsr>      s{     +C&
DI


1x9

UUU$ll1o""((***ll1o%%++---#(Q CLL)!!! ##%%% 3<< A%K'KK% || 	8G..w77777	8   """!!###/ V 	+- 	& 8 	##   """!!###s   )FEF*E# E.E# 
EAE# EAE# EE# E# #F6E7FE!FE# E# E# E# F!F#F7E:8FFFFc                   K   t               }|r|gnd}|j                  d| |d       d{    	 |j                  rJ |j                  D ]M  }|j                  j                          d{    |j                  j                          d{    d|_        O t        j                  t        d      5  |j                          d{    ddd       |j                          d{    |j                          d{    y7 7 7 ~7 C# 1 sw Y   BxY w7 17 # |j                          d{  7   |j                          d{  7   w xY ww)z"Test that recovery can be disabledNr   F)r   r   r   enable_session_recoveryr2   r3   )r   r   _session_recovery_enabledr   r   r   r   r   r5   r6   r7   r+   r    r!   r8   s        r   test_session_recovery_disabledrB      sD     +C&
DI


 %	    $0000 || 	%G,,$$&&&//'')))$G	% ]]9,IJ 	1..000	1   """!!###/ ')
 1	1 	1 	##   """!!###s   *ED	E:D! ,D-!D! D(D! 7DDDD! E+D,EDED! D! DDD! EE!E5D86EEEEc                   K   t               }|r|gnd}|j                  d| |       d{    |j                  d   j                  j	                          d{    |j                  d   j
                  j	                          d{    |j                          d{    |j                          d{    t        |j                        dk(  sJ y7 7 7 S7 =7 'w)zCTest that close_sessions handles already-closed sessions gracefullyNr   r   r   )	r   r   r   r   r   r   r    r!   r;   )r   r   r"   r   s       r   /test_close_sessions_graceful_with_dead_sessionsrD      s      +C&
DI


1x9

UUU ,,q/


$
$
&&&
,,q/
!
!
'
'
))) 






 s||!!! V ') sW   )C#C.C#C.C#	C
C#!C"C#9C!: C#C#C#C#!C#c                   K   t               }|r|gnd}|j                  d| |       d{    	 |j                  d       d{   \  }}|dk(  sJ ||j                  d   k(  sJ |j                  d   }|j	                  |       d{    t        |j                        dk(  sJ d       ||j                  vsJ d       |j                  d       d{   \  }}|j                  sJ d	       ||j                  v sJ d
       	 |j                          d{    |j                          d{    y7 7 7 7 h7 &7 # |j                          d{  7   |j                          d{  7   w xY ww)z8Test requesting a specific session index with validationNr*   r   r   session_indexr   z#Dead session should be auto-removedz"Dead session should not be in listzShould get a valid sessionz*Should get a session from the current list)	r   r   r+   r   r'   r;   r   r    r!   )	r   r   r"   r   r-   r#   dead_session_refidx2session2s	            r   &test_specific_session_index_validationrK      s     +C&
DI


1x9

UUU$ 999JJWaxx#,,q/))) <<? ''(8999 3<< A%L'LL%CLL0	0/	00
  #;;!;LLh   >">> 3<<'U)UU'   """!!###= V K 	: M 	##   """!!###s   )F D<F E	 D?AE	 EAE	 E/E	 F EF 6E7F ?E	 E	 E	 F F 	E=E E=6E97E==F c                   K   t               }|r|gnd}|j                  d| |       d{    	 |j                         \  }}|J |J ||j                  v sJ |j                  d      \  }}|dk(  sJ ||j                  d   k(  sJ 	 |j	                          d{    |j                          d{    y7 7 7 	# |j	                          d{  7   |j                          d{  7   w xY ww)z-Test that old _get_session method still worksNr   r   r   rF   )r   r   _get_sessionr   r    r!   r,   s         r   test_backwards_compatibilityrN     s     +C&
DI


1x9

UUU$'')W"""#,,&&& ''a'8Waxx#,,q/)))   """!!###! V 	##   """!!###sc   )C;B>C;AC C; C !C;8C9C; C;C;C8CC81C42C88C;z#Integration test - requires network)reasonc                   K   t               }|r|gnd}|j                  d| |       d{    	 |j                         }|j                  d       d{   }t	        |      dkD  sJ |j
                  d   j                  j                          d{    |j
                  d   j                  j                          d{    |j                  d       d{   }t	        |      dkD  sJ 	 |j                          d{    |j                          d{    y7 7 7 7 f7 N7 '7 # |j                          d{  7   |j                          d{  7   w xY ww)z>Integration test: Make real request and handle session failureNr*   r      )countr   )r   r   trendingvideosr;   r   r   r   r   r    r!   )r   r   r"   r   rS   rT   s         r   &test_real_request_with_session_failurerU   -  sB     +C&
DI


1x9

UUU$<<>Q//6{Q ll1o""((***ll1o%%++---  Q//6{Q   """!!###% V
 0 	+- 0 	##   """!!###s   )E*D%E*%D3 D'>D3 D).D3 D+D3 D-D3 4E*D/E*D1 E*'D3 )D3 +D3 -D3 /E*1E*3E'E
E' E#!E''E*c                   K   t               |r|gnd}j                  d| |       d{    	 fd}t        j                  t	        d      D cg c]	  } |        c}  d{   }t        |      sJ d       	 j                          d{    j                          d{    y7 c c}w 7 O7 &7 # j                          d{  7   j                          d{  7   w xY ww)z9Test that concurrent access to sessions is handled safelyNr*   r   c                     K   j                          d {   \  } }t        j                  d       d {    j                  |       d {   S 7 =7 7 w)Ng?)r+   asynciosleepr   )r-   r#   r"   s     r   get_session_taskz8test_concurrent_session_access.<locals>.get_session_taskQ  sP     !$!=!=!??LC--$$$..w777 @$7s1   AAAAAAAAA
   z.All concurrent session requests should succeed)r   r   rX   gatherrangeallr    r!   )r   r   r   rZ   _resultsr"   s         @r   test_concurrent_session_accessra   H  s      +C&
DI


1x9

UUU$	8  U2Y(O)9);(OPP 7|MMM|   """!!#### V )PP 	##   """!!###s   )C5B1C5!B> B3!B> (B8)B>  C5B:C5+B<,C53B> :C5<C5>C2CC2+C.,C22C5c                 "  K   t               |r|gnd}j                  d| |       d{    	 j                  d   j                  j	                          d{    j                  d   j
                  j	                          d{    dj                  d   _        fd}t        j                  t        d      D cg c]	  } |        c}  d{    t        j                        dk(  sJ dt        j                                	 j                          d{    j                          d{    y7 7 7 c c}w 7 w7 +7 # j                          d{  7   j                          d{  7   w xY ww)	zBTest that session recovery uses locking to prevent race conditionsNr   r   r   Fc                  B   K    j                          d {    y 7 w)N)r<   )r"   s   r   recovery_taskz6test_session_recovery_with_lock.<locals>.recovery_taskq  s     '')))s   rQ   zExpected 0 sessions, got )r   r   r   r   r   r   r   rX   r\   r]   r;   r    r!   )r   r   r   rd   r_   r"   s        @r   test_session_recovery_with_lockre   a  sX     +C&
DI


1x9

UUU$ll1o""((***ll1o%%++--- 	Q 
	* nnaA1}ABBB 3<< A%V)B3s||CTBU'VV%   """!!###- V 	+- BB 	##   """!!###s   )FEF*E E	.E E9E EE E9E F(E)F EF	E E E FFF,E/-FFFF)__doc__r5   rX   r   r   playwright.async_apir   PlaywrightErrorfixturer   r   markr%   r(   r.   r0   r9   r>   rB   rD   rK   rN   skiprU   ra   re   r	   r
   r   <module>rl      s     	  9 ' '
 0 0 $ $> $ $0 $ $( $ $8 $ $, $ $< $ $< " "$ "$ "$J $ $. >?$ @ $2 $ $0 $ $r
   