§
    ¾¤Àju*  ã                   óò   — d Z ddlZddlmc mZ ddlmZmZm	Z	 ddl
mZmZ ddlZddlZddlmZmZmZ ddlmZ ddlmZmZ  G d„ d	¦  «        Zd
eddfd„Ze\  ZZZ G d„ d¦  «        Z G d„ d¦  «        ZdS )u=  
Kiá»ƒm thá»­ 2 báº£n vÃ¡ sau sá»± cá»‘ 03/10/2026 (AI Ä‘á»�c sai captcha 'MD3F8C' -> Cá»•ng Thuáº¿ tá»« chá»‘i):

1. Ä�á»“ng thuáº­n Ä‘a model (Multi-model Consensus) trÆ°á»›c khi gá»­i captcha lÃªn Cá»•ng Thuáº¿.
   - temperature=0 nÃªn gá»�i láº·p 1 model sáº½ cho cÃ¹ng 1 káº¿t quáº£ (ká»ƒ cáº£ khi sai) -> pháº£i dÃ¹ng
     cÃ¡c model KHÃ�C NHAU lÃ m "ngÆ°á»�i Ä‘á»�c Ä‘á»™c láº­p".
   - Chá»‰ cháº¥p nháº­n khi >= 2 model khÃ¡c nhau (theo model_used thá»±c táº¿) tráº£ vá»� cÃ¹ng 1 chuá»—i.
   - KhÃ´ng Ä‘á»“ng thuáº­n -> tráº£ None Ä‘á»ƒ luá»“ng gá»�i Ä‘á»•i áº£nh captcha má»›i (khÃ´ng tá»‘n lÆ°á»£t Ä‘Äƒng nháº­p).

2. Hiá»ƒn thá»‹ giá»� Viá»‡t Nam (GMT+7) trong email/Telegram cáº£nh bÃ¡o vÃ  thÃ´ng bÃ¡o cooldown,
   vÃ¬ container Cloud cháº¡y mÃºi giá»� UTC khiáº¿n email ghi '01:18' trong khi thá»±c táº¿ lÃ  08:18.
é    N)ÚdatetimeÚ	timedeltaÚtimezone)Ú	AsyncMockÚpatch)ÚAiCapabilityÚAiProviderTypeÚ
AiResponse)ÚCanonicalModelRegistry)ÚCAPTCHA_READER_MODELSÚInvoiceGdtCaptchaMixinc                   óR   — e Zd ZdZd
deeeez  f         dedz  fd„Zddede	fd	„Z
dS )Ú_FakeGatewayuW   Gateway giáº£ láº­p: má»—i model tráº£ vá»� má»™t káº¿t quáº£ Ä‘á»�c cáº¥u hÃ¬nh sáºµn.NÚanswersÚmodel_used_overridec                 ó0   — || _         || _        g | _        d S ©N)r   r   Úcalls)Úselfr   r   s      ú>C:\Projects\DSCons\tests\test_captcha_consensus_and_vn_time.pyÚ__init__z_FakeGateway.__init__"   s   € ØˆŒØ#6ˆÔ Ø "ˆŒ
ˆ
ˆ
ó    ç      N@ÚtimeoutÚreturnc                 ó  — |j         }| j                             |¦  «         | j                             |¦  «        }t          |t          ¦  «        r|‚|€t          d|› d�¦  «        ‚t          || j	        p|t          j        ¬¦  «        S )Nzmodel z unavailable)ÚcontentÚ
model_usedÚprovider_used)Úcanonical_model_idr   Úappendr   ÚgetÚ
isinstanceÚ	ExceptionÚRuntimeErrorr
   r   r	   Ú
OPENROUTER)r   Úreqr   Úmodel_idÚanss        r   Úanalyze_vision_syncz _FakeGateway.analyze_vision_sync'   s–   € ØÔ)ˆØŒ
×Ò˜(Ñ#Ô#Ð#ØŒl×Ò˜xÑ(Ô(ˆÝ�c�9Ñ%Ô%ð 	ØˆIØˆ;ÝÐ>¨Ð>Ð>Ð>Ñ?Ô?Ð?ÝØØÔ/Ð;°8Ý(Ô3ð
ñ 
ô 
ð 	
r   r   )r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚdictÚstrr$   r   Úfloatr
   r*   © r   r   r   r      s}   € € € € € ØaÐað#ð #  S¨#°	©/Ð%9Ô :ð #ÐQTÐW[ÑQ[ð #ð #ð #ð #ð

ð 
°ð 
Àð 
ð 
ð 
ð 
ð 
ð 
r   r   Úgatewayr   c                 óZ   ‡— dd l mc mc mc m} |                      |dˆfd„¦  «         d S )Nr   Úget_ai_gatewayc                  ó   •— ‰ S r   r2   )r3   s   €r   ú<lambda>z"_install_gateway.<locals>.<lambda>9   s   ø€ ¸'€ r   )Ú"app.core.ai.infrastructure.gatewayÚcoreÚaiÚinfrastructurer3   Úsetattr)Úmonkeypatchr3   Úgw_mods    ` r   Ú_install_gatewayr?   6   sU   ø€ Ø7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7à×Ò˜Ð 0°/°/°/°/ÑBÔBÐBÐBÐBr   c                   ó>   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚTestCaptchaConsensusc           	      óÂ	  — t          t          ¦  «        }d}||k    }|süt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}}t          t          ¦  «        }t          |¦  «        }d}||k    }|�sWt          j        d|fd	||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndd
t	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd
dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j	        |
¦  «        ¦  «        ‚d x}x}x}}t          D �](}t          j        |¦  «        }|j        }||k    }|sít          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        |› d�¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}}t          j        }|j        }||v }|sòt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}}�Œ*d S )Né   ©ú==©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenr   ©Úpy0Úpy1Úpy3Úpy6úassert %(py8)sÚpy8)zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py9)sÚset)rI   rJ   Úpy2Úpy4rL   Úpy9zassert %(py11)sÚpy11)z4%(py2)s
{%(py2)s = %(py0)s.canonical_id
} == %(py4)sÚspecr(   )rI   rP   rQ   u)    chÆ°a Ä‘Æ°á»£c Ä‘Äƒng kÃ½ trong registryz
>assert %(py6)srL   ©Úin)z[%(py2)s
{%(py2)s = %(py0)s.MULTIMODAL_VISION
} in %(py6)s
{%(py6)s = %(py4)s.capabilities
}r   )rI   rP   rQ   rL   )rG   r   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationrO   r   Úresolve_specÚcanonical_idÚ_format_assertmsgr   ÚMULTIMODAL_VISIONÚcapabilities)r   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9Ú@py_assert3Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12r(   rT   Ú@py_assert1Ú@py_format5s                  r   Ú-test_reader_models_are_distinct_vision_modelszBTestCaptchaConsensus.test_reader_models_are_distinct_vision_modelsC   s  € ÝÕ(Ñ)Ô)Ð.¨QÐ.Ð)¨QÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð)¨QÐ.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.�sÑ.Ô.Ð.Õ.Ô.�sÑ.Ô.Ð.Ð.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.Õ(Ñ.Ô.Ð.Õ.Ô.Õ(Ñ.Ô.Ð.Ð.Õ.Ô.Ð)Ñ.Ô.Õ.Ô.¨QÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ÝÕ,Ñ-Ô-Ð3�sÐ-Ñ.Ô.Ð3°!Ð3Ð.°!Ò3Ð3Ð3Ñ3Õ3Ô3Ð3Ð3Ð3Ð3Ð.°!Ð3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3�sÑ3Ô3Ð3Õ3Ô3�sÑ3Ô3Ð3Ð3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3•3Ñ3Ô3Ð3Õ3Ô3•3Ñ3Ô3Ð3Ð3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3Õ,Ñ3Ô3Ð3Õ3Ô3Õ,Ñ3Ô3Ð3Ð3Õ3Ô3Ð-Ñ3Ô3Õ3Ô3Ð.Ñ3Ô3Õ3Ô3°!Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ý-ð 	Gñ 	GˆHÝ)Ô6°xÑ@Ô@ˆDØÔ$ÐhÐ$¨Ò0ÐhÐhÐhÕhÔhÐhÐhÐhÐhÐ$¨ÐhÑhÔhÐhÕhÔhÑhÔhÐhÐhÕhÔh�4ÑhÔhÐhÕhÔh�4ÑhÔhÐhÐhÕhÔhÐ$ÑhÔhÐhÕhÔhÑhÔhÐhÐhÕhÔh¨ÑhÔhÐhÕhÔh¨ÑhÔhÐhÐhÐhÐhÑhÐhÕhÔh°XÐ2hÐ2hÐ2hÑhÔhÐhÑhÐhÐhÐhÑhÐhÕhÕhÔhÐhÑhÔhÑhÔhÐhÐhÐhÐhÐhÝÔ1ÐF°TÔ5FÐFÐ1Ð5FÐFÐFÐFÐFÕFÔFÐFÐFÐFÐFÐ1Ð5FÐFÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔF•<ÑFÔFÐFÕFÔF•<ÑFÔFÐFÐFÕFÔFÐ1ÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔF°TÑFÔFÐFÕFÔF°TÑFÔFÐFÐFÕFÔFÐ5FÑFÔFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFÐFÐFÑFð	Gð 	Gr   c                 ó¶  — t          j        t          ¦  «        }|j        }d}||u }|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}dS )u_   Model Ä‘á»�c thá»© 2 khÃ´ng Ä‘Æ°á»£c tá»± fallback sang model khÃ¡c (máº¥t tÃ­nh Ä‘á»™c láº­p).N©Úis)z=%(py2)s
{%(py2)s = %(py0)s.fallback_canonical_id
} is %(py5)srT   ©rI   rP   Úpy5úassert %(py7)sÚpy7)r   r_   Ú	SECONDARYÚfallback_canonical_idrW   rX   rY   rZ   r[   r\   r]   r^   )r   rT   rn   rf   ri   Ú@py_format6Ú@py_format8s          r   Ú,test_secondary_reader_has_no_silent_fallbackzATestCaptchaConsensus.test_secondary_reader_has_no_silent_fallbackK   sù   € å%Ô2µ9Ñ=Ô=ˆØÔ)Ð1¨TÐ1Ð)¨TÐ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð)¨TÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1ˆtÑ1Ô1Ð1Õ1Ô1ˆtÑ1Ô1Ð1Ð1Õ1Ô1Ð)Ñ1Ô1Õ1Ô1¨TÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1r   c                 ó¦  — t          t          dt          dt          di¦  «        }t	          ||¦  «         t          ¦   «                              d¦  «        \  }}d}||k    }|s—t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}g }t          |v }	|	}
|	rt          |v }|}
|
�sÌt          j        d|	fdt          |f¦  «        dt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         |	rÅt          j        d|fdt          |f¦  «        dt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}
x}x}	}|j        }t          t          g}||k    }	|	s¿t          j        d|	fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}	}d S ) NÚWBC4EJÚwbc4ejÚXXXXXXúdata:image/png;base64,AAAArD   ©z%(py0)s == %(py3)sÚvalue©rI   rK   úassert %(py5)sru   rU   ©z%(py2)s in %(py4)sÚPRIMARYÚprovider©rP   rQ   ú%(py6)srL   ©z%(py8)s in %(py10)srx   ©rN   Úpy10ú%(py12)sÚpy12r   úassert %(py15)sÚpy15©z-%(py2)s
{%(py2)s = %(py0)s.calls
} == %(py5)sÚgwrt   uA   KhÃ´ng Ä‘Æ°á»£c gá»�i trá»�ng tÃ i khi 2 model Ä‘áº§u Ä‘Ã£ khá»›pz
>assert %(py7)srw   )r   r‡   rx   ÚARBITERr?   r   Ú_solve_with_ai_gatewayrW   rX   rY   rZ   r[   r\   r]   r^   r!   Ú_format_boolopr   ra   ©r   r=   r“   rƒ   rˆ   rd   rn   Ú@py_format4rz   ri   Ú@py_assert0Ú@py_assert9ro   rg   Ú@py_format11Ú@py_format13Ú@py_format14Ú@py_format16rf   r{   s                       r   Ú3test_two_models_agree_returns_value_without_arbiterzHTestCaptchaConsensus.test_two_models_agree_returns_value_without_arbiterP   s-  € Ý�7 H­i¸Å7ÈHÐUÑVÔVˆÝ˜ bÑ)Ô)Ð)å0Ñ2Ô2×IÒIÐJfÑgÔg‰ˆˆxà Ð ˆu˜Ò Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆu˜Ð Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆuÑ Ô Ð Õ Ô ˆuÑ Ô Ð Ð Õ Ô ˜Ñ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ø<Ð<�w˜(Ð"Ð<Ð<Ð<Ð<Ð<¥y°HÐ'<Ð<Ð<Ð<Ð<Ñ<Õ<Ô<Ð<Ð<Ð<Ð<�w˜(Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<�wÑ<Ô<Ð<Õ<Ô<�wÑ<Ô<Ð<Ð<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<˜(Ñ<Ô<Ð<Õ<Ô<˜(Ñ<Ô<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<×<Ò<Ð<Ñ<Ô<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<¥y°HÐ<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<¥yÑ<Ô<Ð<Õ<Ô<¥yÑ<Ô<Ð<Ð<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<°HÑ<Ô<Ð<Õ<Ô<°HÑ<Ô<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<×<Ò<Ð<Ñ<Ô<Ð<Õ<Ô<Ð<Ð<Ñ<Ô<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØŒxÐt�G¥YÐ/ÐtˆxÐ/Ò/ÐtÐtÐtÕtÔtÐtÐtÐtÐtˆxÐ/ÐtÑtÔtÐtÕtÔtÑtÔtÐtÐtÕtÔtˆrÑtÔtÐtÕtÔtˆrÑtÔtÐtÐtÕtÔtˆxÑtÔtÕtÔtÐ/ÑtÔtÐtÐtÑtÐtÕtÔtÐ1tÑtÔtÐtÑtÐtÐtÐtÑtÐtÕtÕtÔtÐtÑtÔtÑtÔtÐtÐtÐtÐtÐtÐtÐtÐtÐtr   c                 óˆ  — t          t          dt          dt          di¦  «        }t	          ||¦  «         t          ¦   «                              d¦  «        \  }}d}||k    }|s—t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}g }t          |v }	|	}
|	rt          |v }|}
|
�sÌt          j        d
|	fdt          |f¦  «        dt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         |	rÅt          j        d
|fdt          |f¦  «        dt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}
x}x}	}|j        }t          t          t          g}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}	}d S )NÚMD3F8CÚMD3FBCr�   rD   r‚   rƒ   r„   r…   ru   rU   r†   rx   rˆ   r‰   rŠ   rL   r‹   r”   rŒ   rŽ   r�   r   r�   r‘   r’   r“   rt   rv   rw   )r   r‡   rx   r”   r?   r   r•   rW   rX   rY   rZ   r[   r\   r]   r^   r!   r–   r   r—   s                       r   Ú%test_disagreement_resolved_by_arbiterz:TestCaptchaConsensus.test_disagreement_resolved_by_arbiterZ   s  € Ý�7 H­i¸Å7ÈHÐUÑVÔVˆÝ˜ bÑ)Ô)Ð)å0Ñ2Ô2×IÒIÐJfÑgÔg‰ˆˆxà Ð ˆu˜Ò Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆu˜Ð Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆuÑ Ô Ð Õ Ô ˆuÑ Ô Ð Ð Õ Ô ˜Ñ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ø<Ð<�y˜HÐ$Ð<Ð<Ð<Ð<Ð<­°HÐ)<Ð<Ð<Ð<Ð<Ñ<Õ<Ô<Ð<Ð<Ð<Ð<�y˜HÐ<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<�yÑ<Ô<Ð<Õ<Ô<�yÑ<Ô<Ð<Ð<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<˜HÑ<Ô<Ð<Õ<Ô<˜HÑ<Ô<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<×<Ò<Ð<Ñ<Ô<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<­°HÐ<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<­Ñ<Ô<Ð<Õ<Ô<­Ñ<Ô<Ð<Ð<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<°HÑ<Ô<Ð<Õ<Ô<°HÑ<Ô<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<×<Ò<Ð<Ñ<Ô<Ð<Õ<Ô<Ð<Ð<Ñ<Ô<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØŒxÐ8�G¥YµÐ8Ð8ˆxÐ8Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8ˆxÐ8Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆrÑ8Ô8Ð8Õ8Ô8ˆrÑ8Ô8Ð8Ð8Õ8Ô8ˆxÑ8Ô8Õ8Ô8Ð8Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8r   c                 ó¬  — t          t          dt          dt          di¦  «        }t	          ||¦  «         t          ¦   «         }|                     d¦  «        \  }}g }d }||u }|}	|rd }
||
u }|}	|	�sXt          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }|                     |¦  «         |r‹t          j        d|fd||
f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}x}x}x}}
d}	|j        }|	|v }|sªt          j        d|fd|	|f¦  «        t          j        |	¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd
|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}d}	|j        }|	|v }|sªt          j        d|fd|	|f¦  «        t          j        |	¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd
|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}d S )Nr¡   r¢   ÚHD3FBCr�   rr   )z%(py2)s is %(py5)srƒ   )rP   ru   z%(py7)srw   )z%(py9)s is %(py12)srˆ   )rR   r�   z%(py14)sÚpy14r   zassert %(py17)sÚpy17u   khÃ´ng thá»‘ng nháº¥trU   )z;%(py1)s in %(py5)s
{%(py5)s = %(py3)s._last_captcha_error
}Úsolver)rJ   rK   ru   rv   )r   r‡   rx   r”   r?   r   r•   rW   rX   rY   rZ   r[   r\   r!   r–   r]   r^   Ú_last_captcha_error)r   r=   r“   r¨   rƒ   rˆ   rn   rf   ri   r™   Ú@py_assert11Ú@py_assert10rz   r{   rœ   Ú@py_format15rž   Ú@py_format18rd   s                      r   Ú1test_total_disagreement_returns_none_and_explainszFTestCaptchaConsensus.test_total_disagreement_returns_none_and_explainsd   sû  € Ý�7 H­i¸Å7ÈHÐUÑVÔVˆÝ˜ bÑ)Ô)Ð)å'Ñ)Ô)ˆØ ×7Ò7Ð8TÑUÔU‰ˆˆxà1Ð1˜Ð1ˆu˜ˆ}Ð1Ð1Ð1Ð1Ð1¨TÐ1 ¨TÐ!1Ð1Ð1Ð1Ð1Ñ1Õ1Ô1Ð1Ð1Ð1Ð1ˆu˜Ð1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1ˆuÑ1Ô1Ð1Õ1Ô1ˆuÑ1Ô1Ð1Ð1Õ1Ô1˜Ñ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Ð1×1Ò1Ð1Ñ1Ô1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1 ¨TÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1 Ñ1Ô1Ð1Õ1Ô1 Ñ1Ô1Ð1Ð1Õ1Ô1¨TÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Ð1×1Ò1Ð1Ñ1Ô1Ð1Õ1Ô1Ð1Ð1Ñ1Ô1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ø&ÐD¨&Ô*DÐDÐ&Ð*DÐDÐDÐDÐDÕDÔDÐDÐDÐDÐDÐ&Ð*DÐDÑDÔDÕDÔDÐ&ÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD¨&ÑDÔDÐDÕDÔD¨&ÑDÔDÐDÐDÕDÔDÐ*DÑDÔDÐDÐDÑDÐDÐDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDØÐ5˜6Ô5Ð5ˆxÐ5Ð5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5ˆxÐ5Ð5Ñ5Ô5Õ5Ô5ˆxÑ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5˜6Ñ5Ô5Ð5Õ5Ô5˜6Ñ5Ô5Ð5Ð5Õ5Ô5Ð5Ñ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5r   c                 ó   — t          t          dt          dt          did¬¦  «        }t	          ||¦  «         t          ¦   «                              d¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )uZ   Gateway fallback Ã¢m tháº§m vá»� cÃ¹ng 1 model -> cÃ¡c phiáº¿u trÃ¹ng model chá»‰ tÃ­nh 1.ÚABC123zopenrouter/gemini-3.8-flash)r   r�   Nrr   ©z%(py0)s is %(py3)srƒ   r„   r…   ru   ©r   r‡   rx   r”   r?   r   r•   rW   rX   rY   rZ   r[   r\   r]   r^   ©	r   r=   r“   rƒ   Ú_rd   rn   r˜   rz   s	            r   Ú6test_same_underlying_model_does_not_count_as_consensuszKTestCaptchaConsensus.test_same_underlying_model_does_not_count_as_consensuso   s   € åÝ�h¥	¨8µW¸hÐGØ =ð
ñ 
ô 
ˆõ 	˜ bÑ)Ô)Ð)å)Ñ+Ô+×BÒBÐC_Ñ`Ô`‰ˆˆqØÐˆu˜ˆ}ÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÐÕÔÑÔÐÐÕÔˆuÑÔÐÕÔˆuÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr   c                 ó  — t          t          dt          t          d¦  «        t          di¦  «        }t          ||¦  «         t          ¦   «                              d¦  «        \  }}d}||k    }|s—t          j	        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d S )
NÚQ7KX2PÚ503r�   rD   r‚   rƒ   r„   r…   ru   )r   r‡   rx   r%   r”   r?   r   r•   rW   rX   rY   rZ   r[   r\   r]   r^   r³   s	            r   Útest_failed_reader_is_skippedz2TestCaptchaConsensus.test_failed_reader_is_skippedz   s  € Ý�7 H­i½ÀeÑ9LÔ9LÍgÐW_Ð`ÑaÔaˆÝ˜ bÑ)Ô)Ð)å)Ñ+Ô+×BÒBÐC_Ñ`Ô`‰ˆˆqØ Ð ˆu˜Ò Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆu˜Ð Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆuÑ Ô Ð Õ Ô ˆuÑ Ô Ð Ð Õ Ô ˜Ñ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð r   c                 óü  — t          t          dt          dt          di¦  «        }t	          ||¦  «         t          ¦   «                              d¦  «        \  }}d }||u }|s—t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d S )	NÚABr�   rr   r±   rƒ   r„   r…   ru   r²   r³   s	            r   Ú(test_invalid_length_readings_do_not_votez=TestCaptchaConsensus.test_invalid_length_readings_do_not_vote�   s  € Ý�7 D­)°T½7ÀDÐIÑJÔJˆÝ˜ bÑ)Ô)Ð)å)Ñ+Ô+×BÒBÐC_Ñ`Ô`‰ˆˆqØÐˆu˜ˆ}ÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÐÕÔÑÔÐÐÕÔˆuÑÔÐÕÔˆuÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr   N)r+   r,   r-   rp   r|   rŸ   r£   r®   rµ   r¹   r¼   r2   r   r   rA   rA   B   s’   € € € € € ðGð Gð Gð2ð 2ð 2ð
uð uð uð9ð 9ð 9ð	6ð 	6ð 	6ð	ð 	ð 	ð!ð !ð !ðð ð ð ð r   rA   c                   ó€   — e Zd Zd„ Zd„ Zd„ Zd„ Zej        j	        d„ ¦   «         Z
ej        j	        d„ ¦   «         Zd„ ZdS )	ÚTestVietnamTimeDisplayc           	      óX  — ddl m} t          ddddddt          j        ¬¦  «        } ||¦  «        }d	}||k    }|sèt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}d S )Nr   ©Úformat_vn_timeéê  é
   rC   é   é   )Útzinfoz03/10/2026 08:18:10 (GMT+7)rD   rF   rÁ   ÚdtrH   rM   rN   )Úapp.core.vn_timerÁ   r   r   ÚutcrW   rX   rY   rZ   r[   r\   r]   r^   )r   rÁ   rÇ   rd   re   rf   rg   rh   s           r   Ú"test_format_vn_time_from_aware_utcz9TestVietnamTimeDisplay.test_format_vn_time_from_aware_utc�   s^  € Ø3Ð3Ð3Ð3Ð3Ð3å�d˜B  1 b¨"µX´\ÐBÑBÔBˆØˆ~˜bÑ!Ô!ÐBÐ%BÐBÐ!Ð%BÒBÐBÐBÐBÕBÔBÐBÐBÐBÐBÐ!Ð%BÐBÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBˆ~ÑBÔBÐBÕBÔBˆ~ÑBÔBÐBÐBÐBÕBÔBÑBÔBÐBÐBÕBÔB˜bÑBÔBÐBÕBÔB˜bÑBÔBÐBÐBÕBÔBÐ!ÑBÔBÕBÔBÐ%BÑBÔBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBÐBÐBr   c                 ó‚  — ddl m} d} ||¦  «        }d}||k    }|s½t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}}d} ||¦  «        }d}||k    }|s½t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}}d S )Nr   rÀ   ú 2026-10-03T04:18:10.018277+00:00z03/10/2026 11:18:10 (GMT+7)rD   ©z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)srÁ   ©rI   rP   rQ   rw   úassert %(py9)srR   z2026-09-22T10:00:00Zz22/09/2026 17:00:00 (GMT+7)©
rÈ   rÁ   rW   rX   rY   rZ   r[   r\   r]   r^   ©r   rÁ   rn   ri   Ú@py_assert6re   r{   rl   s           r   Ú#test_format_vn_time_from_iso_stringz:TestVietnamTimeDisplay.test_format_vn_time_from_iso_string“   s(  € Ø3Ð3Ð3Ð3Ð3Ð3à@Ðbˆ~ˆ~Ð@ÑAÔAÐbÐEbÐbÐAÐEbÒbÐbÐbÐbÕbÔbÐbÐbÐbÐbÐAÐEbÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔbˆ~ÑbÔbÐbÕbÔbˆ~ÑbÔbÐbÐbÕbÔbÐ@ÑbÔbÕbÔbÐAÑbÔbÕbÔbÐEbÑbÔbÐbÐbÑbÐbÐbÐbÐbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbÐbÐbÐbÐbØ4ÐVˆ~ˆ~Ð4Ñ5Ô5ÐVÐ9VÐVÐ5Ð9VÒVÐVÐVÐVÕVÔVÐVÐVÐVÐVÐ5Ð9VÐVÑVÔVÐVÕVÔVÑVÔVÐVÐVÕVÔVˆ~ÑVÔVÐVÕVÔVˆ~ÑVÔVÐVÐVÕVÔVÐ4ÑVÔVÕVÔVÐ5ÑVÔVÕVÔVÐ9VÑVÔVÐVÐVÑVÐVÐVÐVÐVÐVÑVÐVÕVÕVÔVÐVÑVÔVÑVÔVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVr   c                 óÊ  — ddl m} d} ||¦  «        }d}||k    }|s½t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}}d S )
Nr   rÀ   u   khÃ´ng pháº£i ngÃ y giá»�rD   rÍ   rÁ   rÎ   rÏ   rR   rÐ   rÑ   s           r   Ú+test_format_vn_time_passthrough_for_garbagezBTestVietnamTimeDisplay.test_format_vn_time_passthrough_for_garbage™   s!  € Ø3Ð3Ð3Ð3Ð3Ð3à9ÐYˆ~ˆ~Ð9Ñ:Ô:ÐYÐ>YÐYÐ:Ð>YÒYÐYÐYÐYÕYÔYÐYÐYÐYÐYÐ:Ð>YÐYÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYˆ~ÑYÔYÐYÕYÔYˆ~ÑYÔYÐYÐYÕYÔYÐ9ÑYÔYÕYÔYÐ:ÑYÔYÕYÔYÐ>YÑYÔYÐYÐYÑYÐYÐYÐYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYr   c                 óä  — ddl m}m} t          dddddd¦  «        }|                     |¦  «                             d¦  «        } ||¦  «        }||k    }|�st          j        d	|fd
||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )uY   Datetime naive = giá»� há»‡ thá»‘ng (UTC trÃªn Cloud) -> quy Ä‘á»•i Ä‘Ãºng sang giá»� VN.r   )ÚVN_TZÚformat_vn_clockrÂ   rÃ   rC   rÄ   é   z%H:%MrD   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)srØ   Únaive_localÚexpected)rI   rJ   rK   ru   rv   rw   N)rÈ   r×   rØ   r   Ú
astimezoneÚstrftimerW   rX   rY   rZ   r[   r\   r]   r^   )	r   r×   rØ   rÚ   rÛ   rd   rf   rz   r{   s	            r   Ú%test_format_vn_clock_from_naive_localz<TestVietnamTimeDisplay.test_format_vn_clock_from_naive_localž   s›  € à;Ð;Ð;Ð;Ð;Ð;Ð;Ð;å˜t R¨¨A¨r°1Ñ5Ô5ˆØ×)Ò)¨%Ñ0Ô0×9Ò9¸'ÑBÔBˆØˆ˜{Ñ+Ô+Ð7Ð+¨xÒ7Ð7Ð7Ñ7Õ7Ô7Ð7Ð7Ð7Ð7Ð+¨xÐ7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7ˆÑ7Ô7Ð7Õ7Ô7ˆÑ7Ô7Ð7Ð7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7˜{Ñ7Ô7Ð7Õ7Ô7˜{Ñ7Ô7Ð7Ð7Õ7Ô7Ð+Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7¨xÑ7Ô7Ð7Õ7Ô7¨xÑ7Ô7Ð7Ð7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7r   c              ƒ   ó  K  — ddl m}  |t          ¦   «         ¬¦  «        }t          dt          ddi¬¦  «        5 }|                     dd	¬
¦  «        ƒ d {V —† d d d ¦  «         n# 1 swxY w Y   |j        j        }d}|d         }||v }|slt          j	        d|fd||f¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}d}|d         }||v }|slt          j	        d|fd||f¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}d S )Nr   ©ÚInvoiceAutoSyncSchedulerService©Úinvoice_serviceúGapp.modules.core.application.alert_service.BrevoEmailService.send_emailÚsuccessT©Únew_callableÚreturn_valuez08:17õ   MÃ£ captcha khÃ´ng Ä‘Ãºng.©Ú
slot_labelÚerror_messageú(GMT+7)ÚsubjectrU   ©z%(py1)s in %(py4)s©rJ   rQ   úassert %(py6)srL   Úhtml_content)ÚGapp.modules.invoices.application.invoice_processing.auto_sync_schedulerrá   Úobjectr   r   Úsend_sync_failure_alertÚ	call_argsÚkwargsrW   rX   r\   r]   r^   ©
r   rá   ÚserviceÚ	mock_sendr÷   r™   ri   rd   ro   rg   s
             r   Ú+test_failure_alert_email_shows_vietnam_timezBTestVietnamTimeDisplay.test_failure_alert_email_shows_vietnam_time¦   sV  è è € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 2Ð1Å&Á(Ä(ÐKÑKÔKˆÝØUÝ"Ø# TÐ*ð
ñ 
ô 
ð 	rð Ø×1Ò1¸WÐTpÐ1ÑqÔqÐqÐqÐqÐqÐqÐqÐqð	rð 	rð 	rñ 	rô 	rð 	rð 	rð 	rð 	rð 	rð 	røøøð 	rð 	rð 	rð 	rð Ô$Ô+ˆØÐ-˜F 9Ô-Ð-ˆyÐ-Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-ˆyÐ-Ð-Ñ-Ô-Õ-Ô-ˆyÑ-Ô-Õ-Ô-Ð-Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÐ2˜F >Ô2Ð2ˆyÐ2Ð2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2ˆyÐ2Ð2Ñ2Ô2Õ2Ô2ˆyÑ2Ô2Õ2Ô2Ð2Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ó   ºA$Á$A(Á+A(c              ƒ   ó  K  — ddl m}  |t          ¦   «         ¬¦  «        }t          dt          ddi¬¦  «        5 }|                     dd	¬
¦  «        ƒ d {V —† d d d ¦  «         n# 1 swxY w Y   |j        j        }d}|d         }||v }|slt          j	        d|fd||f¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}d}|d         }||v }|slt          j	        d|fd||f¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}d S )Nr   rà   râ   rä   rå   Træ   z20:05u   2 láº§n tháº¥t báº¡irê   rí   rî   rU   rï   rð   rñ   rL   rò   )ró   rá   rô   r   r   Úsend_circuit_breaker_alertrö   r÷   rW   rX   r\   r]   r^   rø   s
             r   Ú3test_circuit_breaker_alert_email_shows_vietnam_timezJTestVietnamTimeDisplay.test_circuit_breaker_alert_email_shows_vietnam_time¸   sV  è è € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 2Ð1Å&Á(Ä(ÐKÑKÔKˆÝØUÝ"Ø# TÐ*ð
ñ 
ô 
ð 	oð Ø×4Ò4ÀÐWmÐ4ÑnÔnÐnÐnÐnÐnÐnÐnÐnð	oð 	oð 	oñ 	oô 	oð 	oð 	oð 	oð 	oð 	oð 	oøøøð 	oð 	oð 	oð 	oð Ô$Ô+ˆØÐ-˜F 9Ô-Ð-ˆyÐ-Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-ˆyÐ-Ð-Ñ-Ô-Õ-Ô-ˆyÑ-Ô-Õ-Ô-Ð-Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÐ2˜F >Ô2Ð2ˆyÐ2Ð2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2ˆyÐ2Ð2Ñ2Ô2Õ2Ô2ˆyÑ2Ô2Õ2Ô2Ð2Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2rü   c                 ó   — ddl m}  |¦   «         }d}t          j        |dd|f¬¦  «        5  |                     t          j        ¦   «         dddi d	d
¬¦  «        }d d d ¦  «         n# 1 swxY w Y   d}|d         }||v }|slt          j        d|fd||f¦  «        t          j	        |¦  «        t          j	        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}d}|d         }||v}|slt          j        d|fd||f¦  «        t          j	        |¦  «        t          j	        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}|d         }||k    }|s—t          j        d|fd||f¦  «        t          j	        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j	        |¦  «        nddœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d x}}t          j        |dd¬¦  «        5  t          j        |ddd d!œ¬¦  «        5  t          j        |d"|¬¦  «        5  t          j        |d#¦  «        5  |                     t          j        ¦   «         dddi d	d
¬¦  «        }d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d}|d         }||v }|slt          j        d|fd||f¦  «        t          j	        |¦  «        t          j	        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}d}|d         }||v}|slt          j        d|fd||f¦  «        t          j	        |¦  «        t          j	        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}d S )$Nr   )ÚInvoiceProcessingServicerÌ   Úcheck_auth_cooldownT)rè   Ú
0202111150Úxz
2026-09-01z
2026-10-03)Ú	config_idÚtax_codeÚusernameÚpasswordÚextraÚ	from_dateÚto_datez11:18:10 (GMT+7)ÚmessagerU   rï   rð   rñ   rL   z+00:00)únot in)z%(py1)s not in %(py4)sÚcooldown_untilrD   )z%(py1)s == %(py3)sÚcd_iso)rJ   rK   r…   ru   )FNÚ_authenticate_gdt_portalÚ
auth_errorré   )Ústatusr  Úset_auth_cooldownÚ_update_sync_status)Ú3app.modules.invoices.application.invoice_processingr  r   rô   Ú_execute_real_gdt_connectionÚuuidÚuuid4rW   rX   r\   r]   r^   rY   rZ   r[   )r   r  Úsvcr  Úresr™   ri   rd   ro   rg   r˜   rz   s               r   Ú(test_cooldown_messages_show_vietnam_timez?TestVietnamTimeDisplay.test_cooldown_messages_show_vietnam_timeÊ   s>  € Ø`Ð`Ð`Ð`Ð`Ð`à&Ð&Ñ(Ô(ˆØ3ˆõ Œ\˜#Ð4ÀDÈ&À>ÐRÑRÔRð 	ð 	Ø×2Ò2Ýœ*™,œ,°ÈØ B°,Èð 3ñ ô ˆCð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 "Ð3 S¨¤^Ð3Ð! ^Ð3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð! ^Ð3Ñ3Ô3Õ3Ô3Ð!Ñ3Ô3Õ3Ô3 ^Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ØÐ-˜s 9œ~Ð-ˆx˜~Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-ˆx˜~Ð-Ñ-Ô-Õ-Ô-ˆxÑ-Ô-Õ-Ô-˜~Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÐ#Ô$Ð.Ð$¨Ò.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð$¨Ð.Ñ.Ô.Õ.Ô.Ð$Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.¨Ñ.Ô.Ð.Õ.Ô.¨Ñ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.õ Œ\˜#Ð4À=ÐQÑQÔQð 		ð 		ÕSXÔS_ØÐ+Ø$0Ð=YÐZÐZðT
ñ T
ô T
ð 		ð 		õ Œ<˜Ð0¸vÐFÑFÔFð		ð 		õ INÌØÐ&ñI
ô I
ð		ð 		ð ×2Ò2Ýœ*™,œ,°ÈØ B°,Èð 3ñ ô ˆCð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð "Ð3 S¨¤^Ð3Ð! ^Ð3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð! ^Ð3Ñ3Ô3Õ3Ô3Ð!Ñ3Ô3Õ3Ô3 ^Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ØÐ-˜s 9œ~Ð-ˆx˜~Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-ˆx˜~Ð-Ñ-Ô-Õ-Ô-ˆxÑ-Ô-Õ-Ô-˜~Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-s�   ¬.A&Á&A*Á-A*È7K?ÉK(É*KÊ .J:	Ê.KÊ:J>Ê>KËJ>ËKËK(ËKËK(ËKËK(ËK?Ë(K,	Ë,K?Ë/K,	Ë0K?Ë?LÌLN)r+   r,   r-   rÊ   rÓ   rÕ   rÞ   ÚpytestÚmarkÚanyiorû   rÿ   r  r2   r   r   r¾   r¾   Œ   sª   € € € € € ðCð Cð CðWð Wð WðZð Zð Zð
8ð 8ð 8ð „[Ôð3ð 3ñ Ôð3ð" „[Ôð3ð 3ñ Ôð3ð".ð .ð .ð .ð .r   r¾   )r.   ÚbuiltinsrY   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterW   r   r   r   Úunittest.mockr   r   r  r  Úapp.core.ai.domain.modelsr   r	   r
   Ú#app.core.ai.infrastructure.registryr   Ú<app.modules.invoices.infrastructure.adapters.gdt.gdt_captchar   r   r   r?   r‡   rx   r”   rA   r¾   r2   r   r   ú<module>r'     s—  ððð ð € € € € € € € € € € € € Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø €€€à €€€à NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ FÐ FÐ FÐ FÐ FÐ Fðð ð ð ð ð ð ð ð
ð 
ð 
ð 
ð 
ñ 
ô 
ð 
ð.C¨<ð C¸Dð Cð Cð Cð Cð 4Ñ €ˆ�GðDð Dð Dð Dð Dñ Dô Dð DðTZ.ð Z.ð Z.ð Z.ð Z.ñ Z.ô Z.ð Z.ð Z.ð Z.r   