§
    T¶jŒ  ã                   óÜ   — 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 ddlmZmZ  G d„ d¦  «        Z G d	„ d
¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )aå  
Unit & Integration Tests for AIHawk Stealth Anti-Bot and 3-Hour Auth Cooldown.
Ensures zero-risk of GDT account lockout:
1. AIHawk stealth scripts and Chromium flags properly configured.
2. MAX_ATTEMPTS is strictly capped at 1.
3. Cooldown logic in storage_sync_config correctly calculates and checks expiry.
4. GDT Fetcher aborts connection attempt if cooldown is active.
5. GDT Fetcher triggers 3h cooldown on authentication failure.
6. GDT Sync aggregates cooldown status cleanly.
é    N)ÚdatetimeÚ	timedeltaÚtimezone)Ú	MagicMockÚpatch)ÚInvoiceProcessingService)ÚAIHAWK_STEALTH_JSÚGDT_MAX_AUTH_ATTEMPTSc                   ó   — e Zd Zd„ Zd„ ZdS )ÚTestGdtStealthConfigurationc                 óv  — d}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d	}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d
}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}|t           v }|s¦t          j        d|fd|t           f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )u\   Kiá»ƒm tra AIHawk Stealth script loáº¡i bá»� hoÃ n toÃ n cÃ¡c dáº¥u váº¿t tá»± Ä‘á»™ng hÃ³a.Ú	webdriver©Úin)z%(py1)s in %(py3)sr	   ©Úpy1Úpy3úassert %(py5)sÚpy5Nz,Object.defineProperty(navigator, 'webdriver'zwindow.chromez
'platform'ÚWin32z	'plugins'z'languages'zpermissions.query)	r	   Ú
@pytest_arÚ_call_reprcompareÚ	_safereprÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚAssertionErrorÚ_format_explanation)ÚselfÚ@py_assert0Ú@py_assert2Ú@py_format4Ú@py_format6s        ú9C:\Projects\DSCons\tests\test_gdt_stealth_and_cooldown.pyÚ$test_stealth_script_masks_automationz@TestGdtStealthConfiguration.test_stealth_script_masks_automation   s>  € àÐ/ˆ{Õ/Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/ˆ{Õ/Ð/Ñ/Ô/Õ/Ô/ˆ{Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/Õ/Ñ/Ô/Ð/Õ/Ô/Õ/Ñ/Ô/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ø=ÐRÐ=ÕARÐRÐRÐRÐRÕRÔRÐRÐRÐRÐRÐ=ÕARÐRÑRÔRÕRÔRÐ=ÑRÔRÐRÕRÔRÑRÔRÐRÐRÕRÔRÕARÑRÔRÐRÕRÔRÕARÑRÔRÐRÐRÐRÐRÑRÐRÐRÐRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRØÐ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ØÐ0ˆ|Õ0Ð0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0ˆ|Õ0Ð0Ñ0Ô0Õ0Ô0ˆ|Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0Õ0Ñ0Ô0Ð0Õ0Ô0Õ0Ñ0Ô0Ð0Ð0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0ØÐ+ˆwÕ+Ð+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+ˆwÕ+Ð+Ñ+Ô+Õ+Ô+ˆwÑ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+Õ+Ñ+Ô+Ð+Õ+Ô+Õ+Ñ+Ô+Ð+Ð+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+ØÐ/ˆ{Õ/Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/ˆ{Õ/Ð/Ñ/Ô/Õ/Ô/ˆ{Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/Õ/Ñ/Ô/Ð/Õ/Ô/Õ/Ñ/Ô/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/ØÐ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Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ø"Ð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Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ó    c                 óx  — d}t           |k    }|s¦t          j        d|fdt           |f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )	ux   Quy Ä‘á»‹nh an toÃ n tuyá»‡t Ä‘á»‘i: KhÃ´ng Ä‘Æ°á»£c tá»± Ä‘á»™ng retry Ä‘Äƒng nháº­p trong 1 phiÃªn (MAX_ATTEMPTS = 1).é   ©ú==)z%(py0)s == %(py3)sr
   ©Úpy0r   r   r   N)	r
   r   r   r   r   r   r   r   r   )r   r!   Ú@py_assert1r"   r#   s        r$   Ú(test_max_attempts_strictly_capped_at_onezDTestGdtStealthConfiguration.test_max_attempts_strictly_capped_at_one$   sÎ   € à()Ð)Õ$¨Ò)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Õ$¨Ð)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)Õ$Ñ)Ô)Ð)Õ)Ô)Õ$Ñ)Ô)Ð)Ð)Õ)Ô)¨Ñ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)r&   N)Ú__name__Ú
__module__Ú__qualname__r%   r.   © r&   r$   r   r      s2   € € € € € ð	8ð 	8ð 	8ð*ð *ð *ð *ð *r&   r   c                   ó   — e Zd Zd„ ZdS )ÚTestGdtAuthCooldownStoragec                 ó®
  — t          ¦   «         }t          j        t          j        ¦  «        }|t          d¬¦  «        z                        ¦   «         }|t          d¬¦  «        z
                       ¦   «         }t          ¦   «         }||j        _	        t          ¦   «         }||j
        j	        j        _	        t          j        |d|¬¦  «        5  d|i|j        _	        |                     d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}
}	||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dœz  }dd|iz  }t+          t          j        |¦  «        ¦  «        ‚d}
d|i|j        _	        |                     d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}	||	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di|j        _	        |                     d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}	||	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dd¦  «         dS # 1 swxY w Y   dS )u>   Kiá»ƒm tra tÃ­nh toÃ¡n cooldown_until khi check_auth_cooldown.é   ©Úhoursé
   )ÚminutesÚget_connection©Úreturn_valueÚcd_untilÚ
gdt_portalÚ
0202111150T)Úis)z%(py0)s is %(py3)sÚ	is_activer+   r   r   Nr)   )z%(py0)s == %(py2)sÚ	until_strÚ
future_iso)r,   Úpy2zassert %(py4)sÚpy4F)r   r   Únowr   Úutcr   Ú	isoformatr   Ú	__enter__r=   Úcursorr   ÚobjectÚfetchoneÚcheck_auth_cooldownr   r   r   r   r   r   r   r   )r   ÚsvcrG   rD   Úpast_isoÚ	mock_connÚmock_currB   rC   r!   r-   r"   r#   Ú@py_format3Ú@py_format5s                  r$   Ú test_cooldown_expiry_check_logicz;TestGdtAuthCooldownStorage.test_cooldown_expiry_check_logic*   s9  € å&Ñ(Ô(ˆÝŒl�8œ<Ñ(Ô(ˆØ�I¨AÐ.Ñ.Ô.Ñ.×9Ò9Ñ;Ô;ˆ
Ø�)¨BÐ/Ñ/Ô/Ñ/×:Ò:Ñ<Ô<ˆå‘K”Kˆ	Ø+4ˆ	ÔÔ(Ý‘;”;ˆØ?Gˆ	ÔÔ%Ô/Ô<åŒ\˜#Ð/¸iÐHÑHÔHð 	%ð 	%à.8¸*Ð-EˆHÔÔ*Ø#&×#:Ò#:¸<ÈÑ#VÔ#VÑ ˆI�yØ $Ð$�9 Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$�9 Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�9Ñ$Ô$Ð$Õ$Ô$�9Ñ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ø 
Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*�9 
Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�9Ñ*Ô*Ð*Õ*Ô*�9Ñ*Ô*Ð*Ð*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô* 
Ñ*Ô*Ð*Õ*Ô* 
Ñ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*ð /9¸(Ð-CˆHÔÔ*Ø#&×#:Ò#:¸<ÈÑ#VÔ#VÑ ˆI�yØ %Ð%�9 Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%�9 Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�9Ñ%Ô%Ð%Õ%Ô%�9Ñ%Ô%Ð%Ð%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ø $Ð$�9 Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$�9 Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�9Ñ$Ô$Ð$Õ$Ô$�9Ñ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$ð /9¸$Ð-?ˆHÔÔ*Ø#&×#:Ò#:¸<ÈÑ#VÔ#VÑ ˆI�yØ %Ð%�9 Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%�9 Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�9Ñ%Ô%Ð%Õ%Ô%�9Ñ%Ô%Ð%Ð%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ø $Ð$�9 Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$�9 Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�9Ñ$Ô$Ð$Õ$Ô$�9Ñ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$ð#	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	%s   ÃQ1U
Õ
UÕUN)r/   r0   r1   rU   r2   r&   r$   r4   r4   )   s#   € € € € € ð%ð %ð %ð %ð %r&   r4   c                   ó   — e Zd Zd„ Zd„ ZdS )Ú!TestGdtFetcherCooldownEnforcementc           
      óð  — t          ¦   «         }t          j        t          j        ¦  «        t          d¬¦  «        z                        ¦   «         }t          j        |dd|f¬¦  «        5 }| 	                    t          j        ¦   «         dddi dd	¬
¦  «        }|d         }d}||k    }|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}}|                     dd¦  «         ddd¦  «         dS # 1 swxY w Y   dS )um   Fetcher pháº£i láº­p tá»©c dá»«ng phiÃªn Ä‘á»“ng bá»™ náº¿u tÃ i khoáº£n Ä‘ang trong thá»�i gian giÃ£n cÃ¡ch.é   r7   rN   Tr<   r@   Úencrypted_passwordú
2026-08-01ú
2026-08-30©Ú	config_idÚtax_codeÚusernameÚpasswordÚextraÚ	from_dateÚto_dateÚstatusÚcooldown_activer)   ©z%(py1)s == %(py4)s©r   rF   úassert %(py6)sÚpy6Nu   chá»� an toÃ n 3 giá»�Úmessager   ©z%(py1)s in %(py4)sÚcooldown_until)z%(py1)s == %(py3)sÚ
future_strr   r   r   r?   )r   r   rG   r   rH   r   rI   r   rL   Ú_execute_real_gdt_connectionÚuuidÚuuid4r   r   r   r   r   r   r   r   Úassert_called_once_with)r   rO   rn   Ú
mock_checkÚresr    Ú@py_assert3r!   rT   Ú@py_format7r"   r#   s               r$   Ú$test_fetcher_aborts_when_in_cooldownzFTestGdtFetcherCooldownEnforcement.test_fetcher_aborts_when_in_cooldownK   s<  € å&Ñ(Ô(ˆÝ”l¥8¤<Ñ0Ô0µ9À1Ð3EÑ3EÔ3EÑE×PÒPÑRÔRˆ
åŒ\ØÐ&°d¸JÐ5Gð
ñ 
ô 
ð 	KàØ×2Ò2Ýœ*™,œ,Ø%Ø%Ø-ØØ&Ø$ð 3ñ ô ˆCð �x”=Ð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Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ø+Ð=¨s°9¬~Ð=Ð+¨~Ð=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð+¨~Ð=Ñ=Ô=Õ=Ô=Ð+Ñ=Ô=Õ=Ô=¨~Ñ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ØÐ'Ô(Ð6Ð(¨JÒ6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð(¨JÐ6Ñ6Ô6Õ6Ô6Ð(Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6¨JÑ6Ô6Ð6Õ6Ô6¨JÑ6Ô6Ð6Ð6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ø×.Ò.¨|¸\ÑJÔJÐJð	Kð 	Kð 	Kñ 	Kô 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Køøøð 	Kð 	Kð 	Kð 	Kð 	Kð 	Ks   Á)G5I+É+I/É2I/c                 ó4  — t          ¦   «         }t          j        |dd¬¦  «        5  t          j        |ddddœ¬¦  «        5  t          j        |dd	¬¦  «        5 }t          j        |d
¦  «        5  |                     t	          j        ¦   «         dddi dd¬¦  «        }|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}|                     ddd¬¦  «         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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¦  «         dS # 1 swxY w Y   dS )u]   Fetcher pháº£i kÃ­ch hoáº¡t cooldown 3 giá»� ngay láº­p tá»©c khi Ä‘Äƒng nháº­p tháº¥t báº¡i.rN   )FNr<   Ú_authenticate_gdt_portalÚ
auth_erroruJ   Máº­t kháº©u khÃ´ng chÃ­nh xÃ¡c hoáº·c tÃ i khoáº£n Ä‘ang bá»‹ táº¡m khÃ³a)re   rk   Úset_auth_cooldownz2026-09-22T10:00:00ZÚ_update_sync_statusr@   Úwrong_passwordr[   r\   r]   re   r)   rg   rh   ri   rj   Nr?   g      @r7   u   3 giá»�rk   r   rl   )r   r   rL   ro   rp   rq   r   r   r   r   r   rr   )	r   rO   Úmock_set_cooldownrt   r    ru   r!   rT   rv   s	            r$   Ú/test_fetcher_activates_cooldown_on_auth_failurezQTestGdtFetcherCooldownEnforcement.test_fetcher_activates_cooldown_on_auth_failurea   s”  € å&Ñ(Ô(ˆåŒ\ØÐ&°]ð
ñ 
ô 
ð 	/ð 	/åŒ<ØØ&à&Øgðð ð
ñ 
ô 
ð	/ð 	/õ Œ<ØÐ$Ð3Ið
ñ 
ô 
ð	/ð ¥¤ØÐ&ñ!
ô !
ð	/ð 	/ð ×2Ò2Ýœ*™,œ,Ø%Ø%Ø)ØØ&Ø$ð 3ñ ô ˆCð �x”=Ð0 LÐ0�= LÒ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0�= LÐ0Ñ0Ô0Õ0Ô0�=Ñ0Ô0Õ0Ô0 LÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0à×5Ò5°lÀLÐX[Ð5Ñ\Ô\Ð\ØÐ.  I¤Ð.�9 Ð.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.�9 Ð.Ñ.Ô.Õ.Ô.�9Ñ.Ô.Õ.Ô. Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ð5	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/s~   ¦HÁG5ÁGÁ/EG	Æ;GÇGÇGÇGÇGÇG5ÇG"Ç"G5Ç%G"Ç&G5Ç)HÇ5G9	Ç9HÇ<G9	Ç=HÈHÈHN)r/   r0   r1   rw   r   r2   r&   r$   rW   rW   J   s5   € € € € € ðKð Kð Kð,/ð /ð /ð /ð /r&   rW   c                   ó   — e Zd Zd„ ZdS )ÚTestGdtSyncCooldownAggregationc           
      óð  — t          ¦   «         }t          ¦   «         }||j        _        t          ¦   «         }||j        j        j        _        t          j        ¦   «         ddddi ddœg|j        _        t          j	        |d|¬¦  «        5  t          j	        |dd	d
dddœ¬¦  «        5  | 
                    dddd¬¦  «        }|d         }d	}||k    }|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         }
t!          |
¦  «        }d}||k    }|sÇt          j        d|fd||f¦  «        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}}|d         d"         d         }d	}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}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 )#uX   run_gdt_tax_sync pháº£i tráº£ vá»� status='cooldown_active' khi connector bá»‹ cooldown.r?   r@   Úencrypted_pwT)ÚidÚservice_typer_   r`   Úpassword_hashÚextra_configrB   r;   r<   ro   rf   uH   Ä�ang trong thá»�i gian giÃ£n cÃ¡ch báº£o vá»‡ tÃ i khoáº£n Ä‘áº¿n 10:00)re   rk   Úservicer_   r[   r\   Úall)r_   rc   rd   Ú	sync_typere   r)   rg   rh   ri   rj   Nu   giÃ£n cÃ¡chrk   r   rl   Ú
connectorsr(   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sÚlen)r,   rE   rF   Úpy7zassert %(py9)sÚpy9r   )r   r   rJ   r=   rK   rp   rq   Úfetchallr   rL   Úrun_gdt_tax_syncr   r   r   r   r   rŒ   r   r   r   )r   rO   rQ   rR   rt   r    ru   r!   rT   rv   r-   Ú@py_assert6Ú@py_assert5Ú@py_format8Ú@py_format10s                  r$   Ú,test_gdt_sync_returns_cooldown_active_statuszKTestGdtSyncCooldownAggregation.test_gdt_sync_returns_cooldown_active_statusƒ   sØ  € å&Ñ(Ô(ˆõ ‘K”Kˆ	Ø+4ˆ	ÔÔ(Ý‘;”;ˆØ?Gˆ	ÔÔ%Ô/Ô<õ ”j‘l”lØ ,Ø(Ø(Ø!/Ø "Ø!ðð ð
*
ˆÔÔ&õ Œ\ØÐ!°	ð
ñ 
ô 
ð 	Gð 	GåŒ<ØØ*à+ØeØ'Ø(ð	ð ð	
ñ 	
ô 	
ð	Gð 	Gð ×&Ò&Ø%Ø&Ø$Øð	 'ñ ô ˆCð �x”=Ð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Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ø Ð2 C¨	¤NÐ2�= NÐ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2�= NÐ2Ñ2Ô2Õ2Ô2�=Ñ2Ô2Õ2Ô2 NÑ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Ø˜<Ô(Ð.•3Ð(Ñ)Ô)Ð.¨QÐ.Ð)¨QÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð)¨QÐ.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.•3Ñ.Ô.Ð.Õ.Ô.•3Ñ.Ô.Ð.Ð.Õ.Ô.Ð(Ñ.Ô.Õ.Ô.Ð)Ñ.Ô.Õ.Ô.¨QÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ø�|Ô$ QÔ'¨Ô1ÐFÐ5FÐFÐ1Ð5FÒFÐFÐFÐFÕFÔFÐFÐFÐFÐFÐ1Ð5FÐFÑFÔFÕFÔFÐ1Ñ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ð+	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gs7   Â
M+Â'J MÍM+ÍM	ÍM+ÍM	ÍM+Í+M/Í2M/N)r/   r0   r1   r•   r2   r&   r$   r�   r�   ‚   s(   € € € € € ð*Gð *Gð *Gð *Gð *Gr&   r�   )Ú__doc__Úbuiltinsr   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   r   r   r   Úunittest.mockr   r   rp   ÚpytestÚ3app.modules.invoices.application.invoice_processingr   Ú<app.modules.invoices.application.invoice_processing.gdt_authr	   r
   r   r4   rW   r�   r2   r&   r$   ú<module>rŸ      sd  ðð	ð 	ð € € € € € € € € € € € € Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø €€€Ø €€€à XÐ XÐ XÐ XÐ XÐ Xðð ð ð ð ð ð ð ð*ð *ð *ð *ð *ñ *ô *ð *ð"%ð %ð %ð %ð %ñ %ô %ð %ðB5/ð 5/ð 5/ð 5/ð 5/ñ 5/ô 5/ð 5/ðp+Gð +Gð +Gð +Gð +Gñ +Gô +Gð +Gð +Gð +Gr&   