
    P1iF                        d Z ddlZddlZddl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mZ ddlZej(                  j+                  d
d       ej(                  j+                  dd       ddlmZ ddlmZ ddlmZ  G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z  G d de      Z! G d de      Z"e#dk(  rddl$Z$ e$jJ                          yy) z
Comprehensive unit tests for the new temporary user creation endpoint.
Tests creation without parameters, with parameters, security restrictions,
and temp user behaviors like logout, redirects, and migration.
    N)TestCaseClient)	APIClient)status)reverse)get_user_modelUntypedToken)InvalidToken
TokenErrorDJANGO_SETTINGS_MODULEziching.settings
DJANGO_ENVdevelopment)User)UserProfile)Personc                       e Zd ZdZd Zy)TempUserCreateEndpointTestCasez9Base test case for temporary user creation endpoint testsc                    t               | _        | j                  j                  }t	        t        |            dd }d| | _        t        j                  j                  | j                  d| dddd	      | _
        d
dddddd| _        y)zSet up test dataiN99regularz@example.comtestpass123Regularr   phoneemailpassword
first_name	last_name	Test UserM
1990-01-01z14:30:00BeijingzAsia/Shanghai)namegender
birth_date
birth_time
birth_citytimezone)r   client	__class____name__strhash
test_phoner   objectscreate_userregular_uservalid_profile_data)self
class_namephone_suffixs      Y/home/cursorai/projects/iching/iching/tests/../../tests/test_temp_user_create_endpoint.pysetUpz$TempUserCreateEndpointTestCase.setUp   s    k ^^,,
4
+,RS1|n- !LL44//L>6"  5 
  &$#'#
    N)r,   
__module____qualname____doc__r8    r9   r7   r   r      s
    C
r9   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TempUserCreateBasicTestsz7Test basic functionality of temp user creation endpointc                 Z   t         j                  j                  d      j                         }| j	                  |d       | j
                  j                  t        d      i d      }| j	                  |j                  t        j                         |j                         }g d}|D ]  }| j                  ||d|         | j                  |d	          | j                  |d
   t               | j	                  |d   d       t         j                  j!                  |d
         }| j                  |j"                         | j                  |j$                  j'                  d             t(        j                  j                  |      j+                         }| j-                  |       y)z3Test creating temporary user without any parametersT)is_temporary_userr   api:temp_user_createjsonformat)user_idaccessrefreshis_temporarymessage
expires_inzMissing field: rI   rF   rJ   z#Temporary user created successfullyidtemp_userN)r   r0   filtercountassertEqualr*   postr   status_coder   HTTP_201_CREATEDrC   assertIn
assertTrueassertIsInstanceintgetrA   r   
startswithr   firstassertIsNotNone)r4   temp_users_beforeresponseresponse_datarequired_fieldsfield	temp_userprofiles           r7   #test_create_temp_user_no_parametersz<TempUserCreateBasicTests.test_create_temp_user_no_parameters>   sm    !LL//$/GMMO*A. ;;##*+ $ 
 	--v/F/FG  d$EMM%/%0IJ % 	n56mI6<y13XY LL$$i(@$A		334	227;< %%,,),<BBDW%r9   c                    | j                   j                  t        d      | j                  d      }| j	                  |j
                  t        j                         |j                         }t        j                  j                  |d         }| j                  |j                         t        j                  j                  |      j!                         }| j#                  |       | j                  d   j%                  dd	      }| j	                  |j&                  |d
          t)        |      d	kD  r | j	                  |j*                  |d	          yy)z:Test creating temporary user with valid profile parametersrB   rC   rD   rF   rL   rO   r$       r   N)r*   rT   r   r3   rS   rU   r   rV   rC   r   r0   r[   rX   rA   r   rQ   r]   r^   splitr   lenr   )r4   r`   ra   rd   re   
name_partss         r7   +test_create_temp_user_with_valid_parameterszDTempUserCreateBasicTests.test_create_temp_user_with_valid_parametersb   s   ;;##*+## $ 
 	--v/F/FG  LL$$i(@$A		334 %%,,),<BBDW% ,,V4::3B
--z!}=z?QY00*Q-@ r9   c                 $   dddd}| j                   j                  t        d      |d      }| j                  |j                  t
        j                         |j                         }| j                  dt        |      j                                y	)
z7Test that providing phone parameter returns bad requestr    
1234567890r!   )r$   r   r%   rB   rC   rD   r   Nr*   rT   r   rS   rU   r   HTTP_400_BAD_REQUESTrC   rW   r-   lowerr4   invalid_datar`   ra   s       r7   test_reject_phone_parameterz4TempUserCreateBasicTests.test_reject_phone_parameter|   s      !
 ;;##*+ $ 
 	--v/J/JK gs=1779:r9   c                 $   dddd}| j                   j                  t        d      |d      }| j                  |j                  t
        j                         |j                         }| j                  dt        |      j                                y	)
z7Test that providing email parameter returns bad requestr    ztest@example.comF)r$   r   r%   rB   rC   rD   r   Nrp   rs   s       r7   test_reject_email_parameterz4TempUserCreateBasicTests.test_reject_email_parameter   s      '
 ;;##*+ $ 
 	--v/J/JK gs=1779:r9   N)r,   r:   r;   r<   rf   rm   ru   rx   r=   r9   r7   r?   r?   ;   s    A"&HA4;$;r9   r?   c                   "    e Zd ZdZd Zd Zd Zy)TempUserJWTTokenTestsz8Test JWT token functionality for created temporary usersc                     | j                   j                  t        d      | j                  d      }| j	                  |j
                  t        j                         |j                         S )z,Helper to create temp user and return tokensrB   rC   rD   )	r*   rT   r   r3   rS   rU   r   rV   rC   r4   r`   s     r7   _create_temp_user_with_tokensz3TempUserJWTTokenTests._create_temp_user_with_tokens   sZ    ;;##*+## $ 

 	--v/F/FG}}r9   c                    | j                         }|d   }|d   }	 t        |       d}	 t        |       d}| j	                  |d       | j	                  |d       y# t        t        f$ r d}Y Fw xY w# t        t        f$ r d}Y Ow xY w)z'Test that returned JWT tokens are validrG   rH   TFzAccess token should be validzRefresh token should be validN)r}   r
   r   r   rX   )r4   ra   access_tokenrefresh_tokenaccess_validrefresh_valids         r7   test_jwt_tokens_are_validz/TempUserJWTTokenTests.test_jwt_tokens_are_valid   s    ::<$X.%i0	!&L
	"' M 	&DE'FG j) 	! L	! j) 	"!M	"s"   A A3 A0/A03BBc                    | j                         }|d   }| j                  j                  d|        | j                  j                  t	        d            }| j                  |j                  t        j                         |j                         }| j                  |d   |d          | j                  |d          y)	z0Test using JWT tokens for authenticated requestsrG   Bearer HTTP_AUTHORIZATIONapi:user_profilerM   rF   rA   N)r}   r*   credentialsr[   r   rS   rU   r   HTTP_200_OKrC   rX   )r4   ra   r   r`   profile_datas        r7   test_jwt_authentication_worksz3TempUserJWTTokenTests.test_jwt_authentication_works   s    ::<$X. 	W\N3KL ;;??7+=#>?--v/A/AB  }}d+]9-EF%89:r9   N)r,   r:   r;   r<   r}   r   r   r=   r9   r7   rz   rz      s    BH0;r9   rz   c                       e Zd ZdZd Zd Zy)TempUserNeverLogoutTestsz:Test that temp users created by this endpoint never logoutc                    | j                   j                  t        d      i d      j                         }t        j
                  j                  |d         }| j                  |j                         | j                  |d   d       | j                  |d   d	       |d
   }|d   }ddl
m} ddlm}m}  ||      } ||      }	|j                  |j                        }
|j!                  |d   |j                        }|j!                  |	d   |j                        }||
z
  j"                  dz  }||
z
  j"                  dz  }| j%                  |dd       | j%                  |dd       | j                   j'                  d|        t)        d      D ]P  }| j                   j                  t        d            }| j+                  |j,                  t.        j0                         R y)z<Test that temp users have permanent tokens that never expirerB   rC   rD   rF   rL   rK   z%Temporary users should have no expiryis_permanent_sessionz.Temporary users should have permanent sessionsrG   rH   r   r	   )datetimer)   expim  2   z8Access token should expire far in the future (permanent)z9Refresh token should expire far in the future (permanent)r   r      r   N)r*   rT   r   rC   r   r0   r[   rX   rA   assertIsNonerest_framework_simplejwt.tokensr
   r   r)   nowutcfromtimestampdaysassertGreaterr   rangerS   rU   r   r   )r4   ra   rd   r   r   r
   r   dt_timezoneaccess_decodedrefresh_decodedr   
access_exprefresh_expyears_diff_accessyears_diff_refreshir`   s                    r7   test_temp_user_never_logs_outz6TempUserNeverLogoutTests.test_temp_user_never_logs_out   s   ((*+ ) 
 $&	 	 LL$$i(@$A	 		334 	-57^_&<=?op %X.%i0 	A>%l3&}5 ll;??+++N5,A;??S
,,_U-C[__U'#-33c9)C/55;,b2lm-r3no 	W\N3KL qA{{w/A'BCHX1163E3EF r9   c                     ddl m} t        j                  j	                  dddd      } ||      }| j                  |d   d	       | j                  |d
   d       | j                  |d   dd       y)z?Test that regular users still get normal (non-permanent) tokensr   )create_tokens_for_user
9876543210zregular@example.comr   F)r   r   r   rA   rK   z&Regular users should have token expiryis_permanentz0Regular users should not have permanent sessionsiQ z,Regular users should have 1-day token expiryN)main.tokensr   r   r0   r1   r^   assertFalserS   )r4   r   r2   
token_datas       r7   $test_regular_users_get_normal_tokensz=TempUserNeverLogoutTests.test_regular_users_get_normal_tokens
  s~    6 ||//'"#	 0 
 ,L9
 	Z57_`N35ghL15:hir9   N)r,   r:   r;   r<   r   r   r=   r9   r7   r   r      s    D-G^jr9   r   c                   "    e Zd ZdZd Zd Zd Zy)TempUserBehaviorTestsz<Test temp user behavior like registration and data migrationc                     | j                   j                  t        d      i d      j                         }|d   }| j                   j	                  d|        |t
        j                  j                  |d         fS )	z:Helper to create temp user and return authenticated clientrB   rC   rD   rG   r   r   rF   rL   )r*   rT   r   rC   r   r   r0   r[   )r4   ra   r   s      r7   _create_authenticated_temp_userz5TempUserBehaviorTests._create_authenticated_temp_user"  s    ((*+ ) 
 $&	 	 %X.W\N3KLdll..-	2J.KKKr9   c                     | j                         \  }}dddddd}| j                  j                  t        d      |d	      }| j	                  |j
                  t        j                         y
)z:Test that temp users can access temp registration endpointr   znewuser@example.comnewpassword123Newr   r   zapi:temp_registerrC   rD   N)r   r*   rT   r   rS   rU   r   r   )r4   ra   rd   register_datar`   s        r7   'test_temp_user_can_access_temp_registerz=TempUserBehaviorTests.test_temp_user_can_access_temp_register/  su    #'#G#G#I y "*(
 ;;##'( $ 
 	--v/A/ABr9   c                    | j                         \  }}dddddd}| j                  j                  t        d      |d	      }| j	                  |j
                  t        j                         t        j                  j                  |
      }| j	                  |j                         d       | j	                  |j                         j                  d       y)z3Test that temp users can create data via other APIszTest Personr!   r"   z12:00:00z
Test notes)r$   r%   r&   r'   noteszapi:bazi-listrC   rD   )
created_byri   N)r   r*   rT   r   rS   rU   r   rV   r   r0   rQ   rR   r]   r$   )r4   ra   rd   	bazi_databazi_responsebazi_recordss         r7   %test_temp_user_data_creation_via_apisz;TempUserBehaviorTests.test_temp_user_data_creation_via_apisE  s    #'#G#G#I y "&$!
	 ((O$ ) 
 	22F4K4KL ~~,,	,B++-q1++-22MBr9   N)r,   r:   r;   r<   r   r   r   r=   r9   r7   r   r     s    FLC,Cr9   r   c                       e Zd ZdZd Zy)TempUserSecurityTestsz+Test security aspects of temp user creationc                    | j                   j                  t        d      ddid      }|j                  }| j                   j                  t        d      ddid      }|j                  }| j	                  |d   |d          | j                   j                  d|d	    
       t        j                  j                  |d         }t        j                  j                  |d         }| j	                  |j                  |j                         | j                  |j                         | j                  |j                         y)z>Test that different temp users cannot access each other's datarB   r$   zUser 1rC   rD   zUser 2rF   r   rG   r   rL   N)r*   rT   r   dataassertNotEqualr   r   r0   r[   rM   rX   rA   )r4   	response1
user1_data	response2
user2_datauser1user2s          r7   test_temp_users_are_isolatedz2TempUserSecurityTests.test_temp_users_are_isolatedc  s    KK$$W-C%DvxFXag$h	^^
 KK$$W-C%DvxFXag$h	^^
 	Jy1:i3HI 	WZ=Q<R3ST  Jy$9 :  Jy$9 : 	EHHehh///0//0r9   N)r,   r:   r;   r<   r   r=   r9   r7   r   r   `  s
    51r9   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TempUserJWTToSessionTestsz,Test JWT to session conversion functionalityc                    | j                   j                  t        d      ddid      }| j                  |j                  t
        j                         |j                  }|d   }| j                   j                  dd|id      }| j                  |j                  t
        j                         | j                  |j                  d	          | j                  |j                  d
   |d
          | j                  |j                  d          | j                  d| j                   j                         t        j                  j                  |d
         }| j                  |j                         y)z:Test converting JWT token to Django session authenticationrB   r$   r    rC   rD   rG   /api/user/jwt-to-session/r   successrF   rI   	sessionidrL   N)r*   rT   r   rS   rU   r   rV   r   r   rX   rW   cookiesr   r0   r[   rA   r4   r`   temp_user_datar   conversion_responserP   s         r7   test_jwt_to_session_conversionz8TempUserJWTToSessionTests.test_jwt_to_session_conversion~  sA    ;;##G,B$CfkEZci#j--v/F/FG!%h/ #kk../JLM
 /  	,88&:L:LM+00;<,11)<nY>WX+00@A 	k4;;#6#67 ||>)#<=../r9   c                     | j                   j                  dddid      }| j                  |j                  t        j
                         | j                  d|j                         y)z1Test JWT-to-session conversion with invalid tokenr   r   invalid_tokenrC   rD   errorN)r*   rT   rS   rU   r   HTTP_401_UNAUTHORIZEDrW   r   r|   s     r7   !test_jwt_to_session_invalid_tokenz;TempUserJWTToSessionTests.test_jwt_to_session_invalid_token  s\    ;;##$?OB
 $  	--v/K/KLgx}}-r9   c                     | j                   j                  di d      }| j                  |j                  t        j
                         | j                  |j                  d   d       y)z6Test JWT-to-session conversion without providing tokenr   rC   rD   r   zAccess token is requiredN)r*   rT   rS   rU   r   rq   r   r|   s     r7   !test_jwt_to_session_missing_tokenz;TempUserJWTToSessionTests.test_jwt_to_session_missing_token  sT    ;;##$?F#S--v/J/JKw/1KLr9   c                 L   | j                   j                  t        d      ddid      }| j                  |j                  t
        j                         |j                  }|d   }| j                   j                  dd|id      }| j                  |j                  t
        j                         t        j                  j                  |d	   
      }| j                  |j                         | j                  |j                  d       | j                  |j                  d       y)z6Test complete temporary user flow for web applicationsrB   r$   zWeb UserrC   rD   rG   r   r   rF   rL   Webr   N)r*   rT   r   rS   rU   r   rV   r   r   r   r0   r[   rX   rA   r   r   r   s         r7    test_complete_temp_user_web_flowz:TempUserJWTToSessionTests.test_complete_temp_user_web_flow  s     ;;##G,B$CfjEYbh#i--v/F/FG!%h/ #kk../JLM
 /  	,88&:L:LM ||>)#<=../%00r9   N)r,   r:   r;   r<   r   r   r   r   r=   r9   r7   r   r   {  s    604.M1r9   r   __main__)&r<   osdjangodjango.testr   r   rest_framework.testr   rest_frameworkr   django.urlsr   django.contrib.authr   r   r
   #rest_framework_simplejwt.exceptionsr   r   rC   environ
setdefaultmain.modelsr   accounts.modelsr   bazi.modelsr   r   r?   rz   r   r   r   r   r,   unittestmainr=   r9   r7   <module>r      s   
 
  ( ) !  . 8 H  

  .0A B 

  lM 2  ' 
X 
@c;= c;L4;: 4;nDj= DjN>C: >CB1: 16C1 > C1L zHMMO r9   