§
    #x»jµA  ã                   ó4  — d Z ddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
mZ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mZ ddlmZmZmZmZmZ dd	lm Z m!Z!  G d
„ d¦  «        Z" G d„ d¦  «        Z# G d„ d¦  «        Z$ G d„ d¦  «        Z% G d„ d¦  «        Z&dS )z–
Unit tests for FreeExile Account Management, Anti-Bot Captcha, OAuth, and Email Verification System.
Following Autonomous TDD Closed-Loop standards.
é    N)ÚDictÚAny)ÚAccountÚAccountStatusÚRoleÚOAuthProviderTypeÚOAuthIdentityÚAuthTokenPair)ÚPasswordHasherÚTokenService)ÚCaptchaEngineÚCaptchaTypeÚCaptchaChallengeÚRateLimiter)ÚEmailVerificationServiceÚMockEmailSenderÚVerificationCode)ÚOAuthServiceÚGoogleOAuthProviderÚAppleOAuthProviderÚFacebookOAuthProviderÚOAuthUserProfile)ÚAuthServiceÚAccountRepositoryc                   ó&   — e Zd Zdd„Zdd„Zdd„ZdS )ÚTestPasswordAndCryptoÚreturnNc                 óö   — t          ¦   «         }d}|                     |¦  «        }||k    sJ ‚|                     d¦  «        sJ ‚|                     ||¦  «        du sJ ‚|                     d|¦  «        du sJ ‚d S )NzSavageExile!2026_Securezpbkdf2_sha256$TÚWrongPassword123F)r   Úhash_passwordÚ
startswithÚverify_password)ÚselfÚhasherÚraw_pwdÚhasheds       ú<C:\Projects\FreeExile\tests\unit\test_account_auth_system.pyÚ&test_password_hashing_and_verificationz<TestPasswordAndCrypto.test_password_hashing_and_verification)   sš   € ÝÑ!Ô!ˆØ+ˆØ×%Ò% gÑ.Ô.ˆà˜Ò Ð Ð Ð Ø× Ò Ð!1Ñ2Ô2Ð2Ð2Ð2Ø×%Ò% g¨vÑ6Ô6¸$Ð>Ð>Ð>Ð>Ø×%Ò%Ð&8¸&ÑAÔAÀUÐJÐJÐJÐJÐJÐJó    c                 ó"  — t          d¬¦  «        }|                     ddgd¬¦  «        }|j        €J ‚|j        €J ‚|j        dk    sJ ‚|                     |j        ¦  «        }|€J ‚|d         dk    sJ ‚|d	         dk    sJ ‚d|d
         v sJ ‚d S )NÚ3secret_test_key_freeexile_2026_super_secure_32bytes©Ú
secret_keyÚacc_001Úplayerzwarrior@freeexile.io©Ú
account_idÚrolesÚemaili„  Úsubr3   r2   )r   Úgenerate_token_pairÚaccess_tokenÚrefresh_tokenÚexpires_in_secondsÚverify_access_token©r#   Útoken_serviceÚ
token_pairÚclaimss       r'   Ú(test_jwt_token_generation_and_validationz>TestPasswordAndCrypto.test_jwt_token_generation_and_validation3   sÔ   € Ý$Ð0eÐfÑfÔfˆØ"×6Ò6Ø Ø�*Ø(ð 7ñ 
ô 
ˆ
ð Ô&Ð2Ð2Ð2ØÔ'Ð3Ð3Ð3ØÔ,°Ò3Ð3Ð3Ð3à×2Ò2°:Ô3JÑKÔKˆØÐ!Ð!Ð!Ø�eŒ} 	Ò)Ð)Ð)Ð)Ø�gŒÐ"8Ò8Ð8Ð8Ð8Ø˜6 'œ?Ð*Ð*Ð*Ð*Ð*Ð*r)   c                 ó  — t          d¬¦  «        }|                     ddgd¬¦  «        }|                     |j        ¦  «         |                     |j        ¦  «        du sJ ‚|                     |j        ¦  «        }|�J ‚d S )Nr+   r,   Úacc_002r/   zhunter@freeexile.ior0   T)r   r5   Úrevoke_tokenr6   Úis_token_revokedr9   r:   s       r'   Útest_token_revocation_blacklistz5TestPasswordAndCrypto.test_token_revocation_blacklistE   s–   € Ý$Ð0eÐfÑfÔfˆØ"×6Ò6Ø Ø�*Ø'ð 7ñ 
ô 
ˆ
ð 	×"Ò" :Ô#:Ñ;Ô;Ð;Ø×-Ò-¨jÔ.EÑFÔFÈ$ÐNÐNÐNÐNØ×2Ò2°:Ô3JÑKÔKˆØˆ~ˆ~ˆ~ˆ~ˆ~r)   ©r   N)Ú__name__Ú
__module__Ú__qualname__r(   r>   rC   © r)   r'   r   r   (   sT   € € € € € ðKð Kð Kð Kð+ð +ð +ð +ð$ð ð ð ð ð r)   r   c                   ó.   — e Zd Zdd„Zdd„Zdd„Zdd„ZdS )ÚTestAntiBotCaptchaEnginer   Nc                 óÞ  — t          d¬¦  «        }|                     ¦   «         }|j        €J ‚|j        t          j        k    sJ ‚d|j        v sd|j        v sd|j        v sJ ‚|j        €J ‚|j                             ¦   «         }t          |d         ¦  «        |d         t          |d         ¦  «        }}}|dk    r||z   n|dk    r||z
  n||z  }| 
                    |j        t          |¦  «        |j        |j        ¬	¦  «        \  }}	|d
u sJ ‚|	dk    sJ ‚| 
                    |j        t          |¦  «        |j        |j        ¬	¦  «        \  }
}|
du sJ ‚d|                     ¦   «         v sJ ‚d S )NÚcaptcha_test_secret_123©Úhmac_secretú+ú-Ú*r   é   é   ©Úchallenge_idÚuser_answerÚ	signatureÚ
expires_atTÚOKFzalready used)r   Úgenerate_math_challengerU   Úcaptcha_typer   ÚMATHÚquestionrW   ÚsplitÚintÚverify_math_challengeÚstrÚexpires_at_msÚlower)r#   ÚengineÚ	challengeÚpartsÚaÚopÚbÚansÚis_validÚmsgÚis_valid_replayÚ
msg_replays               r'   Ú-test_math_captcha_generation_and_verificationzFTestAntiBotCaptchaEngine.test_math_captcha_generation_and_verificationT   sº  € ÝÐ+DÐEÑEÔEˆØ×2Ò2Ñ4Ô4ˆ	àÔ%Ð1Ð1Ð1ØÔ%­Ô)9Ò9Ð9Ð9Ð9Ø�iÔ(Ð(Ð(¨C°9Ô3EÐ,EÐ,EÈÐPYÔPbÐIbÐIbÐIbÐbØÔ"Ð.Ð.Ð.ð Ô"×(Ò(Ñ*Ô*ˆÝ�u˜Q”x‘=”= %¨¤(­C°°a´©M¬Mˆqˆ2ˆØ˜S’y�yˆa�!‰eˆe°°c²	°	 q¨1¡u u¸qÀ1¹uˆð ×4Ò4Ø"Ô/Ý˜C™œØÔ)Ø Ô.ð	 5ñ 
ô 
‰ˆ�#ð ˜4ÐÐÐÐØ�dŠ{ˆ{ˆ{ˆ{ð '-×&BÒ&BØ"Ô/Ý˜C™œØÔ)Ø Ô.ð	 'Cñ '
ô '
Ñ#ˆ˜ð  %Ð'Ð'Ð'Ð'Ø ×!1Ò!1Ñ!3Ô!3Ð3Ð3Ð3Ð3Ð3Ð3r)   c                 óh  — t          d¬¦  «        }|                     ¦   «         }|                     |j        d|j        |j        ¬¦  «        \  }}|du sJ ‚d|                     ¦   «         v sJ ‚|                     |j        dd|j        ¬¦  «        \  }}|du sJ ‚d	|                     ¦   «         v sJ ‚d S )
NrL   rM   Ú999999rT   FÚ	incorrectÚ10Útampered_fake_signaturerW   )r   rZ   r`   rU   rW   rb   rc   )r#   rd   re   rk   rl   Úis_valid_tamperÚ
msg_tampers          r'   Ú+test_math_captcha_wrong_answer_or_tamperingzDTestAntiBotCaptchaEngine.test_math_captcha_wrong_answer_or_tamperingv   sï   € ÝÐ+DÐEÑEÔEˆØ×2Ò2Ñ4Ô4ˆ	ð ×4Ò4Ø"Ô/Ø ØÔ)Ø Ô.ð	 5ñ 
ô 
‰ˆ�#ð ˜5Ð Ð Ð Ð Ø˜cŸiši™kœkÐ)Ð)Ð)Ð)ð '-×&BÒ&BØ"Ô/ØØ/Ø Ô.ð	 'Cñ '
ô '
Ñ#ˆ˜ð  %Ð'Ð'Ð'Ð'Ø˜j×.Ò.Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0r)   c                 ó4  — t          d¬¦  «        }|                     d¬¦  «        }|j        t          j        k    sJ ‚|                     |j        d¬¦  «        }|€J ‚|                     |j        |d|j        |j	        ¬¦  «        \  }}|du sJ ‚|dk    sJ ‚d S )NrL   rM   rS   )Ú
difficulty)ÚseedÚnoncery   rW   rX   TrY   )
r   Úgenerate_pow_challenger[   r   ÚPOWÚ	solve_powrz   Úverify_pow_challengerW   rb   )r#   rd   Úpow_challenger{   rk   rl   s         r'   Útest_proof_of_work_challengez5TestAntiBotCaptchaEngine.test_proof_of_work_challengeŽ   sÄ   € ÝÐ+DÐEÑEÔEˆà×5Ò5ÀÐ5ÑCÔCˆØÔ)­[¬_Ò<Ð<Ð<Ð<ð × Ò  Ô!3ÀÐ ÑBÔBˆØÐ Ð Ð ð ×3Ò3ØÔ#ØØØ#Ô-Ø$Ô2ð 4ñ 
ô 
‰ˆ�#ð ˜4ÐÐÐÐØ�dŠ{ˆ{ˆ{ˆ{ˆ{ˆ{r)   c                 óô   — t          dd¬¦  «        }d}|                     |¦  «        du sJ ‚|                     |¦  «        du sJ ‚|                     |¦  «        du sJ ‚|                     |¦  «        du sJ ‚d S )Né   g      $@)Úmax_requestsÚwindow_secondsz192.168.1.50TF)r   Ú
is_allowed)r#   ÚlimiterÚ	client_ips      r'   Ú test_rate_limiter_sliding_windowz9TestAntiBotCaptchaEngine.test_rate_limiter_sliding_window£   s›   € Ý¨1¸TÐBÑBÔBˆØ"ˆ	à×!Ò! )Ñ,Ô,°Ð4Ð4Ð4Ð4Ø×!Ò! )Ñ,Ô,°Ð4Ð4Ð4Ð4Ø×!Ò! )Ñ,Ô,°Ð4Ð4Ð4Ð4à×!Ò! )Ñ,Ô,°Ð5Ð5Ð5Ð5Ð5Ð5r)   rD   )rE   rF   rG   ro   rw   r�   r‰   rH   r)   r'   rJ   rJ   S   se   € € € € € ð 4ð  4ð  4ð  4ðD1ð 1ð 1ð 1ð0ð ð ð ð*6ð 6ð 6ð 6ð 6ð 6r)   rJ   c                   ó&   — e Zd Zdd„Zdd„Zdd„ZdS )ÚTestEmailVerificationServicer   Nc                 óî  — t          ¦   «         }t          |dd¬¦  «        }d}|                     |d¬¦  «        }t          |j        ¦  «        dk    sJ ‚|j                             ¦   «         sJ ‚t          |j        ¦  «        dk    sJ ‚|j        |j        d	         d
         v sJ ‚|                     ||j        ¦  «        \  }}|du sJ ‚|dk    sJ ‚|                     ||j        ¦  «        \  }}|du sJ ‚d S )Né,  é<   ©Úemail_senderÚcode_ttl_secondsÚcooldown_secondszexile_survivor@freeexile.ioÚacc_999©r3   r1   é   rR   r   ÚbodyTrY   F)r   r   Úsend_activation_emailÚlenÚcodeÚisdigitÚsent_messagesÚverify_code)	r#   ÚsenderÚservicer3   Ú	code_infork   rl   Úis_valid_reusedÚ_s	            r'   Ú,test_code_generation_dispatch_and_activationzITestEmailVerificationService.test_code_generation_dispatch_and_activation¯   s*  € Ý Ñ"Ô"ˆÝ*ØØ Øð
ñ 
ô 
ˆð .ˆØ×1Ò1¸È)Ð1ÑTÔTˆ	Ý�9”>Ñ"Ô" aÒ'Ð'Ð'Ð'ØŒ~×%Ò%Ñ'Ô'Ð'Ð'Ð'Ý�6Ô'Ñ(Ô(¨AÒ-Ð-Ð-Ð-ØŒ~ Ô!5°aÔ!8¸Ô!@Ð@Ð@Ð@Ð@ð  ×+Ò+¨E°9´>ÑBÔB‰ˆ�#Ø˜4ÐÐÐÐØ�dŠ{ˆ{ˆ{ˆ{ð %×0Ò0°¸	¼ÑGÔGÑˆ˜Ø %Ð'Ð'Ð'Ð'Ð'Ð'r)   c                 óÄ   — t          ¦   «         }t          |dd¬¦  «        }d}|                     |d¬¦  «         |                     |¦  «        \  }}|du sJ ‚|dk    sJ ‚d S )	Nr�   rŽ   r�   zcooldown_test@freeexile.ioÚacc_100r”   Fr   )r   r   r—   Ú
can_resend)r#   r�   rž   r3   r¥   Úremaining_cds         r'   Ú test_resend_cooldown_enforcementz=TestEmailVerificationService.test_resend_cooldown_enforcementÇ   sŒ   € Ý Ñ"Ô"ˆÝ*ØØ Øð
ñ 
ô 
ˆð -ˆØ×%Ò%¨E¸iÐ%ÑHÔHÐHð $+×#5Ò#5°eÑ#<Ô#<Ñ ˆ
�LØ˜UÐ"Ð"Ð"Ð"Ø˜aÒÐÐÐÐÐr)   c                 ó  — t          ¦   «         }t          |ddd¬¦  «        }d}|                     |d¬¦  «         t          d¦  «        D ]}|                     |d¦  «         Œ|                     |¦  «        }|€J ‚|j        dk    sJ ‚d S )	Nr�   rŽ   rƒ   )r�   r‘   r’   Úmax_attemptszlock_test@freeexile.ioÚacc_101r”   Ú000000)r   r   r—   Úrangerœ   Úget_active_recordÚfailed_attempts)r#   r�   rž   r3   r¡   Úrecords         r'   Ú#test_max_failed_attempts_locks_codez@TestEmailVerificationService.test_max_failed_attempts_locks_code×   s¶   € Ý Ñ"Ô"ˆÝ*ØØ ØØð	
ñ 
ô 
ˆð )ˆØ×%Ò%¨E¸iÐ%ÑHÔHÐHå�q‘”ð 	1ð 	1ˆAØ×Ò  xÑ0Ô0Ð0Ð0ð ×*Ò*¨5Ñ1Ô1ˆØÐ!Ð!Ð!ØÔ%¨Ò*Ð*Ð*Ð*Ð*Ð*r)   rD   )rE   rF   rG   r¢   r§   r°   rH   r)   r'   r‹   r‹   ®   sP   € € € € € ð(ð (ð (ð (ð0 ð  ð  ð  ð +ð +ð +ð +ð +ð +r)   r‹   c                   ó&   — e Zd Zdd„Zdd„Zdd„ZdS )ÚTestPluggableOAuthProvidersr   Nc                 óF  — t          dd¬¦  «        }|j        t          j        k    sJ ‚|                     dd¬¦  «        }d|v sJ ‚d|v sJ ‚|                     d	d¬
¦  «        }|j        t          j        k    sJ ‚|j        du sJ ‚|j         	                    d¦  «        sJ ‚d S )NÚgoogle_client_id_freeexileÚgoogle_secret_freeexile)Ú	client_idÚclient_secretÚrandom_state_123ú#https://freeexile.io/oauth/callback©ÚstateÚredirect_urizaccounts.google.comz$client_id=google_client_id_freeexileÚmock_google_token_user456©Útoken_or_coder¼   TÚgoogle_)
r   Úprovider_typer   ÚGOOGLEÚget_authorization_urlÚverify_token_or_codeÚproviderÚemail_verifiedÚprovider_user_idr!   )r#   Úgoogle_provÚauth_urlÚuser_profiles       r'   Ú(test_google_provider_staged_verificationzDTestPluggableOAuthProviders.test_google_provider_staged_verificationí   sï   € Ý)Ø2Ø3ð
ñ 
ô 
ˆð Ô(Õ,=Ô,DÒDÐDÐDÐDà×4Ò4Ð;Mð  ]BÐ4ñ  Cô  CˆØ$¨Ð0Ð0Ð0Ð0Ø5¸ÐAÐAÐAÐAð #×7Ò7Ø5Ø>ð 8ñ 
ô 
ˆð Ô$Õ(9Ô(@Ò@Ð@Ð@Ð@ØÔ*¨dÐ2Ð2Ð2Ð2ØÔ,×7Ò7¸	ÑBÔBÐBÐBÐBÐBÐBr)   c                 ó  — t          ddd¬¦  «        }|j        t          j        k    sJ ‚|                     dd¬¦  «        }d|v sJ ‚|                     d	d¬
¦  «        }|j        t          j        k    sJ ‚|j        du sJ ‚d S )NÚAPPLE_TEAM_IDzcom.freeexile.iosÚ	KEY_12345)Úteam_idr¶   Úkey_idÚapple_statez#https://freeexile.io/apple/callbackrº   zappleid.apple.comÚmock_apple_token_user789r¾   T)r   rÁ   r   ÚAPPLErÃ   rÄ   rÅ   rÆ   )r#   Ú
apple_provrÉ   rÊ   s       r'   Ú'test_apple_provider_staged_verificationzCTestPluggableOAuthProviders.test_apple_provider_staged_verification  s·   € Ý'Ø#Ø)Øð
ñ 
ô 
ˆ
ð
 Ô'Õ+<Ô+BÒBÐBÐBÐBà×3Ò3¸-ÐV{Ð3Ñ|Ô|ˆØ" hÐ.Ð.Ð.Ð.à!×6Ò6Ø4Ø>ð 7ñ 
ô 
ˆð Ô$Õ(9Ô(?Ò?Ð?Ð?Ð?ØÔ*¨dÐ2Ð2Ð2Ð2Ð2Ð2r)   c                 ó  — t          dd¬¦  «        }|j        t          j        k    sJ ‚|                     dd¬¦  «        }d|v sJ ‚|                     dd¬	¦  «        }|j        t          j        k    sJ ‚|j        d
u sJ ‚d S )NÚfb_app_id_123Úfb_secret_456)Úapp_idÚ
app_secretÚfb_statez https://freeexile.io/fb/callbackrº   zfacebook.comÚmock_fb_token_user321r¾   T)r   rÁ   r   ÚFACEBOOKrÃ   rÄ   rÅ   rÆ   )r#   Úfb_provrÉ   rÊ   s       r'   Ú*test_facebook_provider_staged_verificationzFTestPluggableOAuthProviders.test_facebook_provider_staged_verification  s´   € Ý'Ø"Ø&ð
ñ 
ô 
ˆð Ô$Õ(9Ô(BÒBÐBÐBÐBà×0Ò0°zÐPrÐ0ÑsÔsˆØ Ð)Ð)Ð)Ð)à×3Ò3Ø1Ø;ð 4ñ 
ô 
ˆð Ô$Õ(9Ô(BÒBÐBÐBÐBØÔ*¨dÐ2Ð2Ð2Ð2Ð2Ð2r)   rD   )rE   rF   rG   rË   rÕ   rß   rH   r)   r'   r²   r²   ì   sT   € € € € € ðCð Cð Cð Cð(3ð 3ð 3ð 3ð$3ð 3ð 3ð 3ð 3ð 3r)   r²   c                   ót   — e Zd Zej        defd„¦   «         Zdeddfd„Zdeddfd„Zdeddfd„Z	deddfd„Z
dS )	ÚTestAuthServiceIntegrationr   c                 óÚ  — t          ¦   «         }t          ¦   «         }t          d¬¦  «        }t          d¬¦  «        }t	          ¦   «         }t          |dd¬¦  «        }t          ||¬¦  «        }|                     t          d	d
¦  «        ¦  «         |                     t          ddd¦  «        ¦  «         |                     t          dd¦  «        ¦  «         t          ||||||¬¦  «        S )NÚ2unit_test_jwt_secret_key_2026_super_secure_32bytesr,   rL   rM   r�   rŽ   r�   )Ú
repositoryr;   Úclient_gÚsecret_gÚteam_azcom.freeexileÚkey_aÚapp_fbÚ	secret_fb)rä   r$   r;   Úcaptcha_engineÚemail_serviceÚoauth_service)r   r   r   r   r   r   r   Úregister_providerr   r   r   r   )r#   Úrepor$   r;   rë   r�   rì   rí   s           r'   Úauth_systemz&TestAuthServiceIntegration.auth_system&  sÿ   € å Ñ"Ô"ˆÝÑ!Ô!ˆÝ$Ð0dÐeÑeÔeˆÝ&Ð3LÐMÑMÔMˆÝ&Ñ(Ô(ˆÝ0Ø%Ø Øð
ñ 
ô 
ˆõ %°ÀMÐRÑRÔRˆØ×'Ò'Õ(;¸JÈ
Ñ(SÔ(SÑTÔTÐTØ×'Ò'Õ(:¸8À_ÐV]Ñ(^Ô(^Ñ_Ô_Ð_Ø×'Ò'Õ(=¸hÈÑ(TÔ(TÑUÔUÐUåØØØ'Ø)Ø'Ø'ð
ñ 
ô 
ð 	
r)   rð   Nc           	      ó
  — |                      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u sJ ‚|j	        €J ‚|j
                             d¦  «        }	|	€J ‚|	j        t          j        k    sJ ‚|                     dd	d¬¦  «        }
|
j        du sJ ‚d|
j                             ¦   «         v sJ ‚|j                             d¦  «        }|€J ‚|                     d|j        ¬¦  «        }|j        du sJ ‚|j        €J ‚|j        €J ‚|j
                             d¦  «        }|€J ‚|j        t          j        k    sJ ‚|                     dd	d¬¦  «        }|j        du sJ ‚|j        €J ‚|j        d
k    sJ ‚d S )Nú	127.0.0.1)rˆ   r   rR   rS   rO   rP   zwanderer@freeexile.iozGrimExile#Password2026ÚWandererBlade©r3   ÚpasswordÚusernameÚ
captcha_idÚcaptcha_solutionrˆ   T©r3   rõ   rˆ   Fzpending activation)r3   Úverification_code)Úrequest_captchar]   r^   r_   Úquick_registerrU   ra   ÚsuccessÚrequires_verificationr1   rä   Úget_by_emailÚstatusr   ÚPENDING_ACTIVATIONÚloginÚmessagerc   rì   r­   Úverify_emailr™   r6   r7   ÚACTIVErö   )r#   rð   Úcaptcharf   rg   rh   ri   rj   Úreg_resÚaccountÚlogin_before_actÚactive_codeÚact_resÚaccount_activeÚlogin_after_acts                  r'   Ú+test_quick_registration_flow_and_activationzFTestAuthServiceIntegration.test_quick_registration_flow_and_activationA  sœ  € à×-Ò-¸Ð-Ñ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ˆð ×,Ò,Ø)Ø-Ø$ØÔ+Ý  ™XœXØ!ð -ñ 
ô 
ˆð Œ $Ð&Ð&Ð&Ð&ØÔ,°Ð4Ð4Ð4Ð4ØÔ!Ð-Ð-Ð-ð Ô(×5Ò5Ð6MÑNÔNˆØÐ"Ð"Ð"ØŒ~¥Ô!AÒAÐAÐAÐAð '×,Ò,Ø)Ø-Ø!ð -ñ 
ô 
Ðð
  Ô'¨5Ð0Ð0Ð0Ð0Ø#Ð'7Ô'?×'EÒ'EÑ'GÔ'GÐGÐGÐGÐGð "Ô/×AÒAÐBYÑZÔZˆØÐ&Ð&Ð&à×*Ò*Ø)Ø)Ô.ð +ñ 
ô 
ˆð Œ $Ð&Ð&Ð&Ð&ØÔ#Ð/Ð/Ð/ØÔ$Ð0Ð0Ð0ð %Ô/×<Ò<Ð=TÑUÔUˆØÐ)Ð)Ð)ØÔ$­Ô(<Ò<Ð<Ð<Ð<ð &×+Ò+Ø)Ø-Ø!ð ,ñ 
ô 
ˆð
 Ô&¨$Ð.Ð.Ð.Ð.ØÔ+Ð7Ð7Ð7ØÔ'¨?Ò:Ð:Ð:Ð:Ð:Ð:r)   c                 óÈ   — |                      dddddd¬¦  «        }|j        du sJ ‚d	|j                             ¦   «         v sJ ‚|j                             d¦  «        }|�J ‚d S )
Nzbot_attacker@freeexile.iozBotPassword123!Ú
BotSpammerÚfake_challenge_idÚinvalid_answerz192.168.100.99rô   Fr  )rü   rý   r  rc   rä   rÿ   )r#   rð   r  r  s       r'   Ú3test_quick_registration_spam_bot_blocked_by_captchazNTestAuthServiceIntegration.test_quick_registration_spam_bot_blocked_by_captcha~  sˆ   € à×,Ò,Ø-Ø&Ø!Ø*Ø-Ø&ð -ñ 
ô 
ˆð Œ %Ð'Ð'Ð'Ð'Ø˜GœO×1Ò1Ñ3Ô3Ð3Ð3Ð3Ð3ð Ô(×5Ò5Ð6QÑRÔRˆØˆˆˆˆˆr)   c                 ó(  — |                      t          j        ddd¬¦  «        }|j        du sJ ‚|j        du sJ ‚|j        €J ‚|j                             |j        ¦  «        }|€J ‚|j	        t          j        k    sJ ‚t          j        |j        v sJ ‚d S )NÚmock_google_token_exile_heror¹   rò   )rÅ   Úauth_code_or_tokenr¼   rˆ   T)Úoauth_loginr   rÂ   rý   Úis_new_accountr6   rä   Ú	get_by_idr1   r   r   r  Úoauth_identities)r#   rð   Ú	oauth_resr  s       r'   Útest_oauth_login_and_bindingz7TestAuthServiceIntegration.test_oauth_login_and_binding�  s¼   € à×+Ò+Ý&Ô-Ø=Ø>Ø!ð	 ,ñ 
ô 
ˆ	ð Ô  DÐ(Ð(Ð(Ð(ØÔ'¨4Ð/Ð/Ð/Ð/ØÔ%Ð1Ð1Ð1àÔ(×2Ò2°9Ô3GÑHÔHˆØÐ"Ð"Ð"ØŒ~¥Ô!5Ò5Ð5Ð5Ð5Ý Ô'¨7Ô+CÐCÐCÐCÐCÐCÐCr)   c                 óD  — |j                              d|j                             d¦  «        dt          j        ¬¦  «        }|                     ddd¬¦  «        }|j        €J ‚|                     |j        ¦  «        }|j        €J ‚|j        €J ‚|j        |j        k    sJ ‚d S )Nzrefreshtest@freeexile.iozPass123!ÚTokenTester)r3   Úpassword_hashrö   r   rò   rù   )	rä   Úcreate_accountr$   r    r   r  r  r7   r6   )r#   rð   r  Ú	login_resÚrefresh_ress        r'   Útest_refresh_token_rotationz6TestAuthServiceIntegration.test_refresh_token_rotation   sÈ   € àÔ(×7Ò7Ø,Ø%Ô,×:Ò:¸:ÑFÔFØ"Ý Ô'ð	 8ñ 
ô 
ˆð  ×%Ò%Ø,ØØ!ð &ñ 
ô 
ˆ	ð
 Ô&Ð2Ð2Ð2ð "×/Ò/°	Ô0GÑHÔHˆØÔ'Ð3Ð3Ð3ØÔ(Ð4Ð4Ð4ØÔ(¨IÔ,CÒCÐCÐCÐCÐCÐCr)   )rE   rF   rG   ÚpytestÚfixturer   rð   r  r  r  r#  rH   r)   r'   rá   rá   %  sÔ   € € € € € Ø„^ð
˜[ð 
ð 
ð 
ñ „^ð
ð4;;À{ð ;;ÐW[ð ;;ð ;;ð ;;ð ;;ðzÈ{ð Ð_cð ð ð ð ð"D¸ð DÈð Dð Dð Dð Dð"D°{ð DÀtð Dð Dð Dð Dð Dð Dr)   rá   )'Ú__doc__Útimer$  Útypingr   r   Úserver.auth.modelsr   r   r   r   r	   r
   Úserver.auth.cryptor   r   Úserver.auth.captchar   r   r   r   Úserver.auth.email_verificationr   r   r   Úserver.auth.oauthr   r   r   r   r   Úserver.auth.auth_servicer   r   r   rJ   r‹   r²   rá   rH   r)   r'   ú<module>r/     sf  ððð ð
 €€€Ø €€€Ø Ð Ð Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð ð ð ð ð ð ð DÐ CÐ CÐ CÐ CÐ CÐ CÐ Cð(ð (ð (ð (ð (ñ (ô (ð (ðVX6ð X6ð X6ð X6ð X6ñ X6ô X6ð X6ðv;+ð ;+ð ;+ð ;+ð ;+ñ ;+ô ;+ð ;+ð|63ð 63ð 63ð 63ð 63ñ 63ô 63ð 63ðrODð ODð ODð ODð ODñ ODô ODð ODð ODð ODr)   