§
    ä¶»jg0  ã                   ó>  — d Z ddlZddlZddlZddlmZ ddlmZ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 ddlmZ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!m"Z"m#Z# ddl$m%Z%  G d„ d¦  «        Z& G d„ d¦  «        Z' G d„ d¦  «        Z( G d„ d¦  «        Z)dS )zÅ
Unit tests for Persistent SQLite Account Database, Bank-Grade Security,
Device Remember-Me, and Level 1 Character Creation with Season Persistence.
Following Autonomous TDD Closed-Loop standards.
é    N)ÚPath)ÚDictÚAny)ÚAccountÚAccountStatusÚRoleÚAuthTokenPair)ÚPasswordHasherÚTokenService)ÚCaptchaEngine)ÚEmailVerificationServiceÚMockEmailSender)ÚOAuthService)ÚDatabaseAccountRepository)ÚBankGradeSecurityEngineÚSecurityEventTypeÚDeviceFingerprintÚRememberTokenResult)ÚCharacterServiceÚ	CharacterÚCharacterClassÚCharacterCreationResult)ÚAuthServicec                   ó.   — e Zd Zdeddfd„Zdeddfd„ZdS )ÚTestDatabaseAccountRepositoryÚtmp_pathÚreturnNc                 ó8  — t          |dz  ¦  «        }t          |¬¦  «        }t          ¦   «         }|                     d¦  «        }|                     d|dt
          j        ¬¦  «        }|j                             d¦  «        sJ ‚|j	        dk    sJ ‚| 
                    d¦  «        }|€J ‚|j        |j        k    sJ ‚|                     |j        ¦  «        }|€J ‚|j        dk    sJ ‚|                     d¦  «        }	|	€J ‚| 
                    d¦  «        }
|
€J ‚d S )	Nztest_auth.db©Údb_pathzBankGrade#Exile2026zemperor@freeexile.ioÚEmperorSword©ÚemailÚpassword_hashÚusernameÚstatusÚacc_zEMPEROR@FREEEXILE.IO)Ústrr   r
   Úhash_passwordÚcreate_accountr   ÚACTIVEÚ
account_idÚ
startswithr#   Úget_by_emailÚ	get_by_idr%   Úget_by_username)Úselfr   r    ÚrepoÚhasherÚpwd_hashÚaccountÚacc_by_emailÚ	acc_by_idÚacc_by_userÚacc_capss              úFC:\Projects\FreeExile\tests\unit\test_persistent_auth_and_character.pyÚ-test_database_initialization_and_account_crudzKTestDatabaseAccountRepository.test_database_initialization_and_account_crud(   sU  € Ý�h Ñ/Ñ0Ô0ˆÝ(°Ð9Ñ9Ô9ˆõ  Ñ!Ô!ˆØ×'Ò'Ð(=Ñ>Ô>ˆØ×%Ò%Ø(Ø"Ø#Ý Ô'ð	 &ñ 
ô 
ˆð Ô!×,Ò,¨VÑ4Ô4Ð4Ð4Ð4ØŒ}Ð 6Ò6Ð6Ð6Ð6ð ×(Ò(Ð)?Ñ@Ô@ˆØÐ'Ð'Ð'ØÔ&¨'Ô*<Ò<Ð<Ð<Ð<à—N’N 7Ô#5Ñ6Ô6ˆ	ØÐ$Ð$Ð$ØÔ! ^Ò3Ð3Ð3Ð3à×*Ò*¨>Ñ:Ô:ˆØÐ&Ð&Ð&ð ×$Ò$Ð%;Ñ<Ô<ˆØÐ#Ð#Ð#Ð#Ð#ó    c                 ót  — t          |dz  ¦  «        }t          |¬¦  «        }|                     dddt          j        ¬¦  «        }|                     d|j        ¦  «         |                     d¦  «        }|€J ‚|j        |j        k    sJ ‚|                     d¦  «         |                     d¦  «        �J ‚d S )Nztest_auth_tokens.dbr   ztoken_user@freeexile.ioÚ
hash_dummyÚ	TokenUserr"   Úrf_token_12345)	r(   r   r*   r   r+   Ústore_refresh_tokenr,   Úget_account_by_refresh_tokenÚrevoke_refresh_token)r1   r   r    r2   r5   Ú	found_accs         r:   Ú'test_database_refresh_token_persistencezETestDatabaseAccountRepository.test_database_refresh_token_persistenceH   s×   € Ý�hÐ!6Ñ6Ñ7Ô7ˆÝ(°Ð9Ñ9Ô9ˆà×%Ò%Ø+Ø&Ø Ý Ô'ð	 &ñ 
ô 
ˆð 	× Ò Ð!1°7Ô3EÑFÔFÐFØ×5Ò5Ð6FÑGÔGˆ	ØÐ$Ð$Ð$ØÔ# wÔ'9Ò9Ð9Ð9Ð9à×!Ò!Ð"2Ñ3Ô3Ð3Ø×0Ò0Ð1AÑBÔBÐJÐJÐJÐJÐJr<   )Ú__name__Ú
__module__Ú__qualname__r   r;   rE   © r<   r:   r   r   '   sa   € € € € € ð$Àdð $Ètð $ð $ð $ð $ð@KÀð KÈð Kð Kð Kð Kð Kð Kr<   r   c                   ó.   — e Zd Zdeddfd„Zdeddfd„ZdS )ÚTestBankGradeSecurityEnginer   r   Nc                 óÚ  — t          |dz  ¦  «        }t          |¬¦  «        }t          |¬¦  «        }|                     dddt          j        ¬¦  «        }t          dd	d
d¬¦  «        }|                     |j        |d¬¦  «        }|j	        du sJ ‚|j
        €J ‚|                     |j
        |¬¦  «        }|j	        du sJ ‚|j        |j        k    sJ ‚t          dddd¬¦  «        }	|                     |j
        |	¬¦  «        }
|
j	        du sJ ‚d|
j                             ¦   «         v sJ ‚|                     |j
        ¦  «         |                     |j
        |¬¦  «        }|j	        du sJ ‚d S )Nztest_bank_security.dbr   ©Ú
repositoryzvip_bank@freeexile.ioÚsecure_hashÚ	VipPlayerr"   Úiphone_16_pro_max_001ziPhone 16 Pro MaxÚhw_a18pro_metal3_9948z113.161.45.22©Ú	device_idÚdevice_nameÚhardware_hashÚ	client_ipé   )r,   ÚdeviceÚ
valid_daysT)Ú	raw_tokenÚcurrent_devicezEmulator BlueStacksÚhw_tampered_x86z
45.12.99.1Fzfingerprint mismatch)r(   r   r   r*   r   r+   r   Úissue_remember_tokenr,   Úsuccessr[   Úauthenticate_remember_tokenÚmessageÚlowerÚrevoke_remember_token)r1   r   r    r2   Ú
sec_enginer5   rY   Úrem_resÚauth_resÚhacker_deviceÚ
hijack_resÚrevoked_checks               r:   Ú3test_remember_me_token_lifecycle_and_device_bindingzOTestBankGradeSecurityEngine.test_remember_me_token_lifecycle_and_device_binding]   só  € Ý�hÐ!8Ñ8Ñ9Ô9ˆÝ(°Ð9Ñ9Ô9ˆÝ,¸Ð=Ñ=Ô=ˆ
à×%Ò%Ø)Ø'Ø Ý Ô'ð	 &ñ 
ô 
ˆõ #Ø-Ø+Ø1Ø%ð	
ñ 
ô 
ˆð ×1Ò1ØÔ)ØØð 2ñ 
ô 
ˆð
 Œ $Ð&Ð&Ð&Ð&ØÔ Ð,Ð,Ð,ð ×9Ò9ØÔ'Ø!ð :ñ 
ô 
ˆð Ô 4Ð'Ð'Ð'Ð'ØÔ" gÔ&8Ò8Ð8Ð8Ð8õ *Ø-Ø-Ø+Ø"ð	
ñ 
ô 
ˆð  ×;Ò;ØÔ'Ø(ð <ñ 
ô 
ˆ
ð Ô! UÐ*Ð*Ð*Ð*Ø%¨Ô);×)AÒ)AÑ)CÔ)CÐCÐCÐCÐCð 	×(Ò(¨Ô):Ñ;Ô;Ð;Ø"×>Ò>ØÔ'Ø!ð ?ñ 
ô 
ˆð Ô$¨Ð-Ð-Ð-Ð-Ð-Ð-r<   c                 óP  — t          |dz  ¦  «        }t          |¬¦  «        }t          |¬¦  «        }|                     dddt          j        ¬¦  «        }t          dd	d
d¬¦  «        }t          dd¦  «        D ].}|                     |j	        |¦  «        \  }}	|	du sJ ‚|dk    sJ ‚Œ/|                     |j	        |¦  «        \  }}	|	du sJ ‚|dk    sJ ‚| 
                    |j	        ¦  «        }
t          |
¦  «        dk    sJ ‚|
d         d         t          j        j        k    sJ ‚d S )Nztest_audit.dbr   rM   ztarget@freeexile.ioÚpwdÚ	TargetAccr"   Údev_001ÚBrowserÚhw_001z192.168.1.1rS   é   é   Fr   Tg      Œ@Ú
event_type)r(   r   r   r*   r   r+   r   ÚrangeÚrecord_login_failurer,   Úget_audit_logs_for_accountÚlenr   ÚLOCKOUTÚvalue)r1   r   r    r2   rd   r5   rY   ÚiÚdelayÚ	is_lockedÚlogss              r:   Ú*test_progressive_lockout_and_audit_loggingzFTestBankGradeSecurityEngine.test_progressive_lockout_and_audit_logging—   se  € Ý�h Ñ0Ñ1Ô1ˆÝ(°Ð9Ñ9Ô9ˆÝ,¸Ð=Ñ=Ô=ˆ
à×%Ò%Ø'ØØ Ý Ô'ð	 &ñ 
ô 
ˆõ #ØØ!Ø"Ø#ð	
ñ 
ô 
ˆõ �q˜!‘”ð 	ð 	ˆAØ)×>Ò>¸wÔ?QÐSYÑZÔZÑˆE�9Ø Ð%Ð%Ð%Ð%Ø˜A’:�:�:�:�:ð &×:Ò:¸7Ô;MÈvÑVÔVÑˆˆyØ˜DÐ Ð Ð Ð Ø˜Š~ˆ~ˆ~ˆ~ð ×4Ò4°WÔ5GÑHÔHˆÝ�4‰yŒy˜AŠ~ˆ~ˆ~ˆ~Ø�AŒw�|Ô$Õ(9Ô(AÔ(GÒGÐGÐGÐGÐGÐGr<   )rF   rG   rH   r   rj   r~   rI   r<   r:   rK   rK   \   sb   € € € € € ð8.ÈDð 8.ÐUYð 8.ð 8.ð 8.ð 8.ðt!HÀ4ð !HÈDð !Hð !Hð !Hð !Hð !Hð !Hr<   rK   c                   ó   — e Zd Zdeddfd„ZdS )Ú)TestCharacterCreationAndSeasonPersistencer   r   Nc                 ó®  — t          |dz  ¦  «        }t          |¬¦  «        }t          |¬¦  «        }|                     dddt          j        ¬¦  «        }|                     |j        ¦  «        }t          |¦  «        dk    sJ ‚| 	                    |j        d	t          j        d
¬¦  «        }|j        du sJ ‚|j        €J ‚|j        }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        d
k    sJ ‚|j        dk    sJ ‚| 	                    |j        d	t          j        d
¬¦  «        }	|	j        du sJ ‚d|	j                             ¦   «         v sJ ‚|                     |j        ¦  «        }
t          |
¦  «        dk    sJ ‚|
d         j        d	k    sJ ‚|
d         j        dk    sJ ‚d S )Nztest_char.dbr   rM   znew_player@freeexile.ioÚpassÚ
NoviceHeror"   r   u   VÃ´ Danh Kiáº¿mÚseason_01_minh_nguyet©r,   ÚnameÚ
class_typeÚ	season_idTrq   éd   é2   Úzone_boundless_sanctuaryFzalready taken)r(   r   r   r*   r   r+   Úlist_charactersr,   rw   Úcreate_characterr   ÚSWORD_MASTERr_   Ú	characterÚlevelÚ
experienceÚ
current_hpÚmax_hpÚcurrent_manaÚmax_manarˆ   Úcurrent_zone_idÚFERAL_BERSERKERra   rb   r†   )r1   r   r    r2   Úchar_servicer5   Úchars_initialÚ
create_resÚcharÚdup_resÚcharss              r:   Ú*test_create_level_1_character_from_scratchzTTestCharacterCreationAndSeasonPersistence.test_create_level_1_character_from_scratch¼   sC  € Ý�h Ñ/Ñ0Ô0ˆÝ(°Ð9Ñ9Ô9ˆÝ'°4Ð8Ñ8Ô8ˆà×%Ò%Ø+Ø Ø!Ý Ô'ð	 &ñ 
ô 
ˆð %×4Ò4°WÔ5GÑHÔHˆÝ�=Ñ!Ô! QÒ&Ð&Ð&Ð&ð "×2Ò2ØÔ)Ø"Ý%Ô2Ø-ð	 3ñ 
ô 
ˆ
ð Ô! TÐ)Ð)Ð)Ð)ØÔ#Ð/Ð/Ð/àÔ#ˆØŒz˜QŠˆˆˆØŒ !Ò#Ð#Ð#Ð#ØŒ #Ò%Ð%Ð%Ð%ØŒ{˜cÒ!Ð!Ð!Ð!ØÔ  BÒ&Ð&Ð&Ð&ØŒ} Ò"Ð"Ð"Ð"ØŒ~Ð!8Ò8Ð8Ð8Ð8àÔ#Ð'AÒAÐAÐAÐAð ×/Ò/ØÔ)Ø"Ý%Ô5Ø-ð	 0ñ 
ô 
ˆð Œ %Ð'Ð'Ð'Ð'Ø '¤/×"7Ò"7Ñ"9Ô"9Ð9Ð9Ð9Ð9ð ×,Ò,¨WÔ-?Ñ@Ô@ˆÝ�5‰zŒz˜QŠˆˆˆØ�QŒxŒ}Ð 1Ò1Ð1Ð1Ð1Ø�QŒxŒ~ Ò"Ð"Ð"Ð"Ð"Ð"r<   )rF   rG   rH   r   rž   rI   r<   r:   r€   r€   »   s6   € € € € € ð3#À4ð 3#ÈDð 3#ð 3#ð 3#ð 3#ð 3#ð 3#r<   r€   c                   ó   — e Zd Zdeddfd„ZdS )Ú3TestFullIntegratedAuthWithPersistentDBAndRememberMer   r   Nc           
      ó  — t          |dz  ¦  «        }t          |¬¦  «        }t          ¦   «         }t          d¬¦  «        }t	          d¬¦  «        }t          ¦   «         }t          |dd¬	¦  «        }t          ||¬
¦  «        }	t          |¬¦  «        }
t          |¬¦  «        }t          ||||||	|
|¬¦  «        }|                     d¬¦  «        }|j                             ¦   «         }t          |d         ¦  «        |d         t          |d         ¦  «        }}}|dk    r||z   n|dk    r||z
  n||z  }|                     ddd|j        t          |¦  «        d¬¦  «        }|j        du sJ ‚|j                             d¦  «        }|€J ‚|                     d|j        ¬¦  «        }|j        du sJ ‚t-          dddd¬¦  «        }|                     dddd|¬¦  «        }|j        du sJ ‚|j        €J ‚|                     |j        |¬¦  «        }|j        du sJ ‚|j        |j        k    sJ ‚|j                             |j        d t:          j        d!¬"¦  «        }|j        du sJ ‚|j        j         dk    sJ ‚|j        j!        d!k    sJ ‚d S )#Nzintegrated_auth.dbr   Ú3secret_test_key_freeexile_2026_super_secure_32bytes)Ú
secret_keyÚcaptcha_test_secret_123)Úhmac_secreti,  é<   )Úemail_senderÚcode_ttl_secondsÚcooldown_seconds)rN   Útoken_servicerM   )rN   r3   rª   Úcaptcha_engineÚemail_serviceÚoauth_serviceÚsecurity_engineÚcharacter_servicez	127.0.0.1)rW   r   rq   é   ú+ú-zpersisted_warrior@freeexile.iozSecurePass#Exile2026ÚPersistedBlade)r#   Úpasswordr%   Ú
captcha_idÚcaptcha_solutionrW   T)r#   Úverification_codeÚiphone_client_01ziPhone 16 iOS NativeÚhw_apple_a18_secure_enclaverS   )r#   r´   rW   Úremember_meÚdevice_fingerprint)Úremember_tokenr»   u   Cá»• Kiáº¿m Ä�oáº¡n Há»“nr„   r…   )"r(   r   r
   r   r   r   r   r   r   r   r   Úrequest_captchaÚquestionÚsplitÚintÚquick_registerÚchallenge_idr_   r¬   Úget_active_recordÚverify_emailÚcoder   Úloginr¼   Úlogin_with_remember_tokenr,   r¯   r�   r   rŽ   r�   r�   rˆ   )r1   r   r    r2   r3   rª   r«   r§   r¬   r­   rd   r˜   Úauth_systemÚcaptchaÚpartsÚaÚopÚbÚansÚreg_resÚ
otp_recordÚact_resrY   Ú	login_resÚfast_login_resÚchar_ress                             r:   Ú2test_register_login_remember_me_and_character_flowzfTestFullIntegratedAuthWithPersistentDBAndRememberMe.test_register_login_remember_me_and_character_flowó   s;  € Ý�hÐ!5Ñ5Ñ6Ô6ˆÝ(°Ð9Ñ9Ô9ˆÝÑ!Ô!ˆÝ$Ð0eÐfÑfÔfˆÝ&Ð3LÐMÑMÔMˆÝ&Ñ(Ô(ˆÝ0Ø%Ø Øð
ñ 
ô 
ˆõ
 %°ÀMÐRÑRÔRˆÝ,¸Ð=Ñ=Ô=ˆ
Ý'°4Ð8Ñ8Ô8ˆå!ØØØ'Ø)Ø'Ø'Ø&Ø*ð	
ñ 	
ô 	
ˆð ×-Ò-¸Ð-ÑDÔDˆØÔ ×&Ò&Ñ(Ô(ˆÝ�u˜Q”x‘=”= %¨¤(­C°°a´©M¬Mˆqˆ2ˆØ˜S’y�yˆa�!‰eˆe°°c²	°	 q¨1¡u u¸qÀ1¹uˆà×,Ò,Ø2Ø+Ø%ØÔ+Ý  ™XœXØ!ð -ñ 
ô 
ˆð Œ $Ð&Ð&Ð&Ð&ð !Ô.×@Ò@ÐAaÑbÔbˆ
ØÐ%Ð%Ð%à×*Ò*Ø2Ø(œoð +ñ 
ô 
ˆð Œ $Ð&Ð&Ð&Ð&õ #Ø(Ø.Ø7Ø!ð	
ñ 
ô 
ˆð  ×%Ò%Ø2Ø+Ø!ØØ%ð &ñ 
ô 
ˆ	ð Ô  DÐ(Ð(Ð(Ð(ØÔ'Ð3Ð3Ð3ð %×>Ò>Ø$Ô3Ø%ð ?ñ 
ô 
ˆð Ô%¨Ð-Ð-Ð-Ð-ØÔ(¨IÔ,@Ò@Ð@Ð@Ð@ð Ô0×AÒAØ Ô+Ø,Ý%Ô2Ø-ð	 Bñ 
ô 
ˆð Ô 4Ð'Ð'Ð'Ð'ØÔ!Ô'¨1Ò,Ð,Ð,Ð,ØÔ!Ô+Ð/FÒFÐFÐFÐFÐFÐFr<   )rF   rG   rH   r   rÕ   rI   r<   r:   r    r    ò   sG   € € € € € ðXGÈ4ð XGÐTXð XGð XGð XGð XGð XGð XGr<   r    )*Ú__doc__ÚosÚtimeÚpytestÚpathlibr   Útypingr   r   Úserver.auth.modelsr   r   r   r	   Úserver.auth.cryptor
   r   Úserver.auth.captchar   Úserver.auth.email_verificationr   r   Úserver.auth.oauthr   Úserver.auth.databaser   Úserver.auth.bank_securityr   r   r   r   Úserver.auth.character_servicer   r   r   r   Úserver.auth.auth_servicer   r   rK   r€   r    rI   r<   r:   ú<module>rå      s_  ððð ð 
€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø -Ð -Ð -Ð -Ð -Ð -Ø TÐ TÐ TÐ TÐ TÐ TÐ TÐ TØ *Ð *Ð *Ð *Ð *Ð *Ø :Ð :Ð :Ð :Ð :Ð :ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð 1Ð 0Ð 0Ð 0Ð 0Ð 0ð2Kð 2Kð 2Kð 2Kð 2Kñ 2Kô 2Kð 2Kðj\Hð \Hð \Hð \Hð \Hñ \Hô \Hð \Hð~4#ð 4#ð 4#ð 4#ð 4#ñ 4#ô 4#ð 4#ðnYGð YGð YGð YGð YGñ YGô YGð YGð YGð YGr<   