§
    WŠ¬j®2  ã                   ó¨   — d dl Zd dlmc mZ d dlZd dlmZ d dl	m
Z
mZmZ d dlmZ  G d„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )é    N)ÚHTTPException)Úhash_passwordÚvalidate_password_strengthÚverify_password)ÚAuthServicec                   ób   — 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S )ÚTestOwnerAuthc                 ó,   — t          ¦   «         | _        d S )N)r   Úauth_service)Úselfs    ú+C:\Projects\DSCons\tests\test_owner_auth.pyÚsetUpzTestOwnerAuth.setUp   s   € Ý'™MœMˆÔÐÐó    c                 ó�  — d}t          |¦  «        }|                      |                     d¦  «        ¦  «         |                      t          ||¦  «        ¦  «         |                      t          d|¦  «        ¦  «         |                      t          d|¦  «        ¦  «         |                      t          |d ¦  «        ¦  «         d S )NzDSCons@2026#SecurePasswordzpbkdf2_sha256$100000$Ú	wrong_pwdÚ )r   Ú
assertTrueÚ
startswithr   ÚassertFalse)r   ÚpwdÚhs      r   Útest_password_hasher_pbkdf2z)TestOwnerAuth.test_password_hasher_pbkdf2   s¯   € Ø*ˆÝ˜#ÑÔˆØ�Š˜ŸšÐ%<Ñ=Ô=Ñ>Ô>Ð>Ø�Š�¨¨QÑ/Ô/Ñ0Ô0Ð0Ø×Ò�¨°aÑ8Ô8Ñ9Ô9Ð9Ø×Ò�¨¨QÑ/Ô/Ñ0Ô0Ð0Ø×Ò�¨¨dÑ3Ô3Ñ4Ô4Ð4Ð4Ð4r   c                 óø   — t          d¦  «        \  }}|                      |¦  «         |                      d|¦  «         t          d¦  «        \  }}|                      |¦  «         |                      |¦  «         d S )NÚshortu   tá»‘i thiá»ƒu 8zDSCons@2026)r   r   ÚassertInr   ÚassertIsNone)r   ÚvalidÚmsgs      r   Ú!test_password_strength_validationz/TestOwnerAuth.test_password_strength_validation   s{   € å/°Ñ8Ô8‰
ˆˆsØ×Ò˜ÑÔÐØ�ŠÐ'¨Ñ-Ô-Ð-õ 0°Ñ>Ô>‰
ˆˆsØ�Š˜ÑÔÐØ×Ò˜#ÑÔÐÐÐr   c                 ó
  — dddddœ}| j                              ¦   «         5 }|                     ¦   «         5 }|                     d|d         f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   | j                              |¦  «        }|                      |¦  «         |                      |d         |d         ¦  «         |                      |d         d	¦  «         d S )
Núdinhsonconstruction@gmail.comz-google-oauth2|dinhsonconstruction-test-sub-idúDinh Son Constructionz(https://lh3.googleusercontent.com/a/test©ÚemailÚsubÚnameÚpictureú'DELETE FROM erp_users WHERE email = %s;r$   ÚroleÚ
superadmin©r   Úget_connectionÚcursorÚexecuteÚcommitÚget_or_create_google_userÚassertIsNotNoneÚassertEqual©r   ÚprofileÚconnÚcurÚusers        r   Ú!test_new_owner_email_registrationz/TestOwnerAuth.test_new_owner_email_registration%   sy  € ð 5ØBØ+ØAð	
ð 
ˆð Ô×-Ò-Ñ/Ô/ð 	°4¸¿º¹¼ð 	È#Ø�KŠKÐAÀGÈGÔDTÐCVÑWÔWÐWØ�KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð Ô ×:Ò:¸7ÑCÔCˆØ×Ò˜TÑ"Ô"Ð"Ø×Ò˜˜gœ¨°Ô(8Ñ9Ô9Ð9Ø×Ò˜˜fœ |Ñ4Ô4Ð4Ð4Ð4ó4   ¡B¶2A4Á(BÁ4A8	Á8BÁ;A8	Á<BÂBÂBc                 ó
  — dddddœ}| j                              ¦   «         5 }|                     ¦   «         5 }|                     d|d         f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   | j                              |¦  «        }|                      |¦  «         |                      |d         |d         ¦  «         |                      |d         d	¦  «         d S )
Nzmirsixabcf2@gmail.comz%google-oauth2|mirsixabcf2-test-sub-idzMir Sixz1https://lh3.googleusercontent.com/a/test-originalr#   r(   r$   r)   r*   r+   r3   s        r   Ú&test_original_owner_email_registrationz4TestOwnerAuth.test_original_owner_email_registration8   sy  € ð -Ø:ØØJð	
ð 
ˆð Ô×-Ò-Ñ/Ô/ð 	°4¸¿º¹¼ð 	È#Ø�KŠKÐAÀGÈGÔDTÐCVÑWÔWÐWØ�KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð Ô ×:Ò:¸7ÑCÔCˆØ×Ò˜TÑ"Ô"Ð"Ø×Ò˜˜gœ¨°Ô(8Ñ9Ô9Ð9Ø×Ò˜˜fœ |Ñ4Ô4Ð4Ð4Ð4r9   c                 ó�  — dddddœ}| j                              ¦   «         5 }|                     ¦   «         5 }|                     d¦  «         |                     d|d         f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   |                      t          ¦  «        5 }| j                              |¦  «         d d d ¦  «         n# 1 swxY w Y   |                      |j	        j
        d	¦  «         |                      d
|j	        j        ¦  «         | j                              ¦   «         5 }|                     ¦   «         5 }|                     d|d         f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nzunauthorized_guest@gmail.comz,google-oauth2|unauthorized-guest-test-sub-idzUnauthorized Guestz5https://lh3.googleusercontent.com/a/test-unauthorizedr#   z±INSERT INTO erp_users (company_id, email, full_name, role) SELECT id, 'admin_dummy@dscons.vn', 'Dummy Admin', 'superadmin' FROM companies LIMIT 1 ON CONFLICT (email) DO NOTHING;r(   r$   é“  u%   chÆ°a Ä‘Æ°á»£c cáº¥p phÃ©p truy cáº­pzCDELETE FROM erp_users WHERE email IN (%s, 'admin_dummy@dscons.vn');©r   r,   r-   r.   r/   ÚassertRaisesr   r0   r2   Ú	exceptionÚstatus_coder   Údetail)r   r4   r5   r6   Úctxs        r   Ú3test_unknown_email_registration_rejected_zero_trustzATestOwnerAuth.test_unknown_email_registration_rejected_zero_trustJ   s  € ð 4ØAØ(ØNð	
ð 
ˆð Ô×-Ò-Ñ/Ô/ð 		°4Ø—’‘”ð  #à—’ð Hñô ð ð —’Ø=ÀÈÔ@PÐ?Rñô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð ×Ò�}Ñ-Ô-ð 	A°ØÔ×7Ò7¸Ñ@Ô@Ð@ð	Að 	Að 	Añ 	Aô 	Að 	Að 	Að 	Að 	Að 	Að 	Aøøøð 	Að 	Að 	Að 	Aà×Ò˜œÔ2°CÑ8Ô8Ð8Ø�ŠÐ=¸s¼}Ô?SÑTÔTÐTð Ô×-Ò-Ñ/Ô/ð 	°4Ø—’‘”ð  #Ø—’ØYØ˜WÔ%Ð'ñô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s}   ¡B ¶AB	Á=B Â	B	ÂB ÂB	ÂB Â B$Â'B$ÃC,Ã,C0Ã3C0ÅF;Å%2F#ÆF;Æ#F'	Æ'F;Æ*F'	Æ+F;Æ;F?ÇF?c                 ó8  — d}|ddddœ}| j                              ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     d|df¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   | j                              |¦  «        }|                      |¦  «         |                      |d         |¦  «         |                      |d	         d
¦  «         | j                              ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nzpreregistered_qs@dscons.vnz*google-oauth2|preregistered-qs-test-sub-idzPre-registered QSz/https://lh3.googleusercontent.com/a/test-preregr#   r(   z{INSERT INTO erp_users (company_id, email, full_name, role, is_active) SELECT id, %s, %s, 'qs', TRUE FROM companies LIMIT 1;r$   r)   Úqsr+   )r   Ú
test_emailr4   r5   r6   r7   s         r   Ú$test_preregistered_user_google_loginz2TestOwnerAuth.test_preregistered_user_google_loginl   s�  € à1ˆ
àØ?Ø'ØHð	
ð 
ˆð Ô×-Ò-Ñ/Ô/ð 	°4¸¿º¹¼ð 	È#Ø�KŠKÐAÀJÀ=ÑQÔQÐQØ�KŠKð NØÐ0Ð1ñô ð ð �KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð Ô ×:Ò:¸7ÑCÔCˆØ×Ò˜TÑ"Ô"Ð"Ø×Ò˜˜gœ¨
Ñ3Ô3Ð3Ø×Ò˜˜fœ tÑ,Ô,Ð,ð Ô×-Ò-Ñ/Ô/ð 	°4¸¿º¹¼ð 	È#Ø�KŠKÐAÀJÀ=ÑQÔQÐQØ�KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	sk   £B¸ABÁ<BÂB	ÂBÂB	ÂBÂB#Â&B#Ä*FÄ?,E7Å+FÅ7E;	Å;FÅ>E;	Å?FÆFÆFc                 ó‚  — d}|ddddœ}| j                              ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     d|df¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   |                      t          ¦  «        5 }| j                              |¦  «         d d d ¦  «         n# 1 swxY w Y   |                      |j	        j
        d¦  «         |                      d	|j	        j        ¦  «         | j                              ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )
Nzdeactivated_user@dscons.vnz*google-oauth2|deactivated-user-test-sub-idzDeactivated Userz.https://lh3.googleusercontent.com/a/test-deactr#   r(   z‚INSERT INTO erp_users (company_id, email, full_name, role, is_active) SELECT id, %s, %s, 'engineer', FALSE FROM companies LIMIT 1;r=   u   vÃ´ hiá»‡u hÃ³ar>   )r   rG   r4   r5   r6   rC   s         r   Ú(test_inactive_user_google_login_rejectedz6TestOwnerAuth.test_inactive_user_google_login_rejectedˆ   sñ  € à1ˆ
àØ?Ø&ØGð	
ð 
ˆð Ô×-Ò-Ñ/Ô/ð 	°4¸¿º¹¼ð 	È#Ø�KŠKÐAÀJÀ=ÑQÔQÐQØ�KŠKð UØÐ/Ð0ñô ð ð �KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð ×Ò�}Ñ-Ô-ð 	A°ØÔ×7Ò7¸Ñ@Ô@Ð@ð	Að 	Að 	Añ 	Aô 	Að 	Að 	Að 	Að 	Að 	Að 	Aøøøð 	Að 	Að 	Að 	Aà×Ò˜œÔ2°CÑ8Ô8Ð8Ø�ŠÐ'¨¬Ô)=Ñ>Ô>Ð>ð Ô×-Ò-Ñ/Ô/ð 	°4¸¿º¹¼ð 	È#Ø�KŠKÐAÀJÀ=ÑQÔQÐQØ�KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s}   £B¸ABÁ<BÂB	ÂBÂB	ÂBÂB#Â&B#ÃC+Ã+C/Ã2C/ÅF4Å$,FÆF4ÆF 	Æ F4Æ#F 	Æ$F4Æ4F8Æ;F8c                 ó   — | j                              ddd¬¦  «        }|                      d|¦  «         |                      d|¦  «         |                      |d         d         d¦  «         |                      |d         d         d	¦  «         d S )
Núadmin@dscons.vnzDSCons@2026#SecureAdminu   Ban GiÃ¡m Ä�á»‘c DSCons©r$   ÚpasswordÚ	full_nameÚaccess_tokenr7   r$   r)   r*   )r   Úauthenticate_email_userr   r2   )r   Úresults     r   Ú*test_authenticate_email_user_owner_successz8TestOwnerAuth.test_authenticate_email_user_owner_success¤   s—   € àÔ"×:Ò:Ø#Ø.Ø/ð ;ñ 
ô 
ˆð
 	�Š�n fÑ-Ô-Ð-Ø�Š�f˜fÑ%Ô%Ð%Ø×Ò˜ œ¨Ô0Ð2CÑDÔDÐDØ×Ò˜ œ¨Ô/°Ñ>Ô>Ð>Ð>Ð>r   c                 ó"  — |                       t          ¦  «        5 }| j                             dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   |                      |j        j        d¦  «         |                      d|j        j        ¦  «         d S )NrL   Ú123456©r$   rN   é‘  u   khÃ´ng chÃ­nh xÃ¡c)	r?   r   r   rQ   r2   r@   rA   r   rB   ©r   rC   s     r   Ú4test_authenticate_email_user_wrong_password_rejectedzBTestOwnerAuth.test_authenticate_email_user_wrong_password_rejected°   sË   € à×Ò�}Ñ-Ô-ð 	°ØÔ×5Ò5Ø'Ø!ð 6ñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 	×Ò˜œÔ2°CÑ8Ô8Ð8Ø�ŠÐ*¨C¬MÔ,@ÑAÔAÐAÐAÐAó   ›AÁAÁAc                 óâ   — |                       t          ¦  «        5 }| j                             dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   |                      |j        j        d¦  «         d S )NrL   r   rV   é�  )r?   r   r   rQ   r2   r@   rA   rX   s     r   Ú1test_authenticate_email_missing_password_rejectedz?TestOwnerAuth.test_authenticate_email_missing_password_rejectedº   s±   € Ø×Ò�}Ñ-Ô-ð 	°ØÔ×5Ò5Ø'Øð 6ñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 	×Ò˜œÔ2°CÑ8Ô8Ð8Ð8Ð8rZ   c                 óà  — d}d}| j                              ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   | j                              ||d¬¦  «        }|                      |d         ¦  «         t          d¦  «        D ]p}|                      t          ¦  «        5 }| j          
                    |d¬	¦  «         d d d ¦  «         n# 1 swxY w Y   |                      |j        j        d
¦  «         Œq|                      t          ¦  «        5 }| j          
                    |d¬	¦  «         d d d ¦  «         n# 1 swxY w Y   |                      |j        j        d¦  «         |                      d|j        j                             ¦   «         ¦  «         | j                              ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nzlockout_test@dscons.vnzSecurePassword@2026r(   zLockout Test UserrM   Úidé   Úwrong_password_testrV   rW   i§  u   khÃ³a)r   r,   r-   r.   r/   Úcreate_user_accountr1   Úranger?   r   rQ   r2   r@   rA   r   rB   Úlower)r   rG   r   r5   r6   Ú
reg_resultÚirC   s           r   Ú*test_account_lockout_after_failed_attemptsz8TestOwnerAuth.test_account_lockout_after_failed_attemptsÂ   sÉ  € à-ˆ
Ø#ˆð Ô×-Ò-Ñ/Ô/ð 	°4¸¿º¹¼ð 	È#Ø�KŠKÐAÀJÀ=ÑQÔQÐQØ�KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 Ô&×:Ò:ØØØ)ð ;ñ 
ô 
ˆ
ð
 	×Ò˜Z¨Ô-Ñ.Ô.Ð.õ �q‘”ð 	=ð 	=ˆAØ×"Ò"¥=Ñ1Ô1ð °SØÔ!×9Ò9Ø$Ð/Dð :ñ ô ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ×Ò˜Sœ]Ô6¸Ñ<Ô<Ð<Ð<ð ×Ò�}Ñ-Ô-ð 	°ØÔ×5Ò5Ø Ð+@ð 6ñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	×Ò˜œÔ2°CÑ8Ô8Ð8Ø�Š�g˜sœ}Ô3×9Ò9Ñ;Ô;Ñ<Ô<Ð<ð Ô×-Ò-Ñ/Ô/ð 	°4¸¿º¹¼ð 	È#Ø�KŠKÐAÀJÀ=ÑQÔQÐQØ�KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	sŽ   žB³,A+ÁBÁ+A/	Á/BÁ2A/	Á3BÂBÂ	BÃ0DÄD	Ä D	ÅFÆFÆFÇ>I#È,IÈ?I#ÉI	ÉI#ÉI	ÉI#É#I'É*I'c                 ó
  — d}d}d}| j                              ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   | j                              ||d¬¦  «        }|d         }|                      t          ¦  «        5 }| j                              |d|¦  «         d d d ¦  «         n# 1 swxY w Y   |  	                    |j
        j        d	¦  «         | j                              |||¦  «        }	|  	                    |	d
         d¦  «         |                      t          ¦  «        5 }| j                              ||¬¦  «         d d d ¦  «         n# 1 swxY w Y   |  	                    |j
        j        d¦  «         | j                              ||¬¦  «        }
|                      d|
¦  «         | j                              ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nzpwd_change_test@dscons.vnzOldPassword@2026zNewPassword@2026Strongr(   zPassword Change UserrM   r_   Úwrong_old_pwdr\   ÚstatusÚsuccessrV   rW   rP   )r   r,   r-   r.   r/   rb   r?   r   Úchange_user_passwordr2   r@   rA   rQ   r   )r   rG   Úold_pwdÚnew_pwdr5   r6   Úreg_resÚuser_idrC   Ú
change_resÚ	login_ress              r   Útest_change_password_flowz'TestOwnerAuth.test_change_password_flowé   só  € Ø0ˆ
Ø$ˆØ*ˆð Ô×-Ò-Ñ/Ô/ð 	°4¸¿º¹¼ð 	È#Ø�KŠKÐAÀJÀ=ÑQÔQÐQØ�KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð Ô#×7Ò7Ø wÐ:Pð 8ñ 
ô 
ˆð ˜$”-ˆð ×Ò�}Ñ-Ô-ð 	V°ØÔ×2Ò2°7¸OÈWÑUÔUÐUð	Vð 	Vð 	Vñ 	Vô 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vøøøð 	Vð 	Vð 	Vð 	Và×Ò˜œÔ2°CÑ8Ô8Ð8ð Ô&×;Ò;¸GÀWÈgÑVÔVˆ
Ø×Ò˜ HÔ-¨yÑ9Ô9Ð9ð ×Ò�}Ñ-Ô-ð 	°ØÔ×5Ò5Ø ¨7ð 6ñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	×Ò˜œÔ2°CÑ8Ô8Ð8ð Ô%×=Ò=Ø wð >ñ 
ô 
ˆ	ð 	�Š�n iÑ0Ô0Ð0ð Ô×-Ò-Ñ/Ô/ð 	°4¸¿º¹¼ð 	È#Ø�KŠKÐAÀJÀ=ÑQÔQÐQØ�KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	sŽ    Bµ,A-Á!BÁ-A1	Á1BÁ4A1	Á5BÂBÂBÃC7Ã7C;Ã>C;Å4FÆF!Æ$F!ÈI8È(,I ÉI8É I$	É$I8É'I$	É(I8É8I<É?I<c                 óì  — ddl m} ddlm} ddlm}  |¦   «         } ||¦  «        5 } |d¦  «        5 }dddd	d
dœdœ|_        |                     d¦  «        }|                      |j	        d¦  «         |  
                    d|j        ¦  «         |                      d|j        ¦  «         |                      d|j        ¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nr   )Úpatch)Ú
TestClient)Ú
create_appzDapp.modules.auth.presentation.auth.auth_service.exchange_google_codeÚ
test_tokenz$eda1319a-ebcb-4bb8-9dbb-e64bdc02e4ffr!   r"   r*   )r_   r$   rO   r)   )rP   r7   z'/v1/auth/google/callback?code=mock_codeéÈ   zJSON.stringify(zUUID('zdatetime.datetime)Úunittest.mockru   Úfastapi.testclientrv   Úapp.mainrw   Úreturn_valueÚgetr2   rA   r   ÚtextÚassertNotIn)r   ru   rv   rw   ÚappÚclientÚmock_exchangeÚresps           r   Ú'test_google_callback_html_serializationz5TestOwnerAuth.test_google_callback_html_serialization  sÚ  € Ø'Ð'Ð'Ð'Ð'Ð'à1Ð1Ð1Ð1Ð1Ð1à'Ð'Ð'Ð'Ð'Ð'àˆj‰lŒlˆØˆZ˜‰_Œ_ð 	A Ø�ØVñô ð Aàà$0àDØ!@Ø%<Ø ,ð	ð ð.ð .�Ô*ð —z’zÐ"KÑLÔL�Ø× Ò  Ô!1°3Ñ7Ô7Ð7Ø—’Ð/°´Ñ;Ô;Ð;Ø× Ò  ¨4¬9Ñ5Ô5Ð5Ø× Ò Ð!4°d´iÑ@Ô@Ð@ð!Að Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Að	Að 	Að 	Añ 	Aô 	Að 	Að 	Að 	Að 	Að 	Að 	Að 	Aøøøð 	Að 	Að 	Að 	Að 	Að 	As5   ¨C)´BCÃC)ÃC	ÃC)ÃC	ÃC)Ã)C-Ã0C-N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r8   r;   rD   rH   rJ   rS   rY   r]   rg   rs   r…   © r   r   r	   r	      sñ   € € € € € ð*ð *ð *ð5ð 5ð 5ð	ð 	ð 	ð5ð 5ð 5ð&5ð 5ð 5ð$ ð  ð  ðDð ð ð8ð ð ð8
?ð 
?ð 
?ðBð Bð Bð9ð 9ð 9ð%ð %ð %ðN(ð (ð (ðTAð Að Að Að Ar   r	   Ú__main__)ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚunittestÚfastapir   Ú1app.modules.auth.application.auth.password_hasherr   r   r   Ú)app.modules.auth.application.auth_servicer   ÚTestCaser	   r†   Úmainr‰   r   r   ú<module>r—      så   ðØ  € € € € € € € € € € € € €€€€à !Ð !Ð !Ð !Ð !Ð !ðð ð ð ð ð ð ð ð ð ð
 BÐ AÐ AÐ AÐ AÐ Að_Að _Að _Að _Að _A�HÔ%ñ _Aô _Að _AðD	 ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   