§
    ™"Ãjæ  ã                   ó’   — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlmZmZ e
j        d„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd	„ ZdS )
u°  
Kiá»ƒm thá»­ cáº¥u hÃ¬nh logging táº­p trung (sá»± cá»‘ 05/10/2026).

Bá»‘i cáº£nh: á»©ng dá»¥ng chÆ°a tá»«ng cáº¥u hÃ¬nh logging -> chá»‰ WARNING+ lá»�t ra stderr qua handler dá»± phÃ²ng
`logging.lastResort` (khÃ´ng giá»�, khÃ´ng má»©c, khÃ´ng tÃªn module); má»�i INFO (captcha Ä‘á»“ng thuáº­n, Ä‘á»“ng bá»™
thÃ nh cÃ´ng...) bá»‹ nuá»‘t. Khi Ä‘á»“ng bá»™ cháº¡y tá»‘t, `docker logs` gáº§n nhÆ° trá»‘ng -> khÃ´ng thá»ƒ truy váº¿t.
é    N)ÚDSCONS_HANDLER_NAMEÚconfigure_loggingc               #   ó¸  K  — t          j        ¦   «         } t          j        ¦   «         }t	          |j        ¦  «        |j        }}d„ dD ¦   «         }| V — t	          |j        ¦  «        D ]}||vr|                     |¦  «         Œ|                     |¦  «         | 	                    ¦   «         D ],\  }}t          j        |¦  «                             |¦  «         Œ-d S )Nc                 óB   — i | ]}|t          j        |¦  «        j        “ŒS © )ÚloggingÚ	getLoggerÚlevel)Ú.0Úns     ú/C:\Projects\DSCons\tests\test_logging_config.pyú
<dictcomp>zstream.<locals>.<dictcomp>   s(   € ÐVÐVÐV°a�A•wÔ(¨Ñ+Ô+Ô1ÐVÐVÐVó    )ÚappÚdsconsÚhttpx)
ÚioÚStringIOr   r	   ÚlistÚhandlersr
   ÚremoveHandlerÚsetLevelÚitems)ÚbufÚrootÚsaved_handlersÚsaved_levelÚsaved_levelsÚhr   Úlvls           r   Ústreamr!      sç   è è € å
Œ+‰-Œ-€CÝÔÑÔ€DÝ"& t¤}Ñ"5Ô"5°t´z�K€NØVÐVÐ;UÐVÑVÔV€LØ
€I€I€IÝ�$”-Ñ Ô ð "ð "ˆØ�NÐ"Ð"Ø×Ò˜qÑ!Ô!Ð!øØ‡M‚M�+ÑÔÐØ×$Ò$Ñ&Ô&ð +ð +‰ˆˆ3ÝÔ˜!ÑÔ×%Ò% cÑ*Ô*Ð*Ð*ð+ð +r   c                 óv  — t          | ¬¦  «         t          j        d¦  «                             d¦  «         t          j        d¦  «                             d¦  «         |                      ¦   «         }d}||v }|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}||v }|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 S )N©r!   z9app.modules.invoices.infrastructure.adapters.gdt.gdt_authu(   Giáº£i mÃ£ Captcha thÃ nh cÃ´ng [EX85BV]z
dscons.appu   Khá»Ÿi Ä‘á»™ng DSCons©Úin©z%(py1)s in %(py3)sÚout©Úpy1Úpy3úassert %(py5)sÚpy5)r   r   r	   ÚinfoÚgetvalueÚ
@pytest_arÚ_call_reprcompareÚ	_safereprÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚAssertionErrorÚ_format_explanation©r!   r'   Ú@py_assert0Ú@py_assert2Ú@py_format4Ú@py_format6s         r   Útest_app_info_logs_are_emittedr<   !   sû  € Ý˜VÐ$Ñ$Ô$Ð$ÝÔÐQÑRÔR×WÒWØ2ñô ð õ Ô�lÑ#Ô#×(Ò(Ð)@ÑAÔAÐAØ
�/Š/Ñ
Ô
€CØ5Ð<Ð5¸Ð<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð5¸Ð<Ñ<Ô<Õ<Ô<Ð5Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<¸Ñ<Ô<Ð<Õ<Ô<¸Ñ<Ô<Ð<Ð<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ø"Ð)Ð" cÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð" cÐ)Ñ)Ô)Õ)Ô)Ð"Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) cÑ)Ô)Ð)Õ)Ô) cÑ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)r   c                 óp  — t          | ¬¦  «         t          j        d¦  «                             d¦  «         |                      ¦   «                              ¦   «                              ¦   «         d         }t          j        }d} |||¦  «        }|sût          j
        |¦  «        dz   dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}d
}||v }|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 S )Nr#   zGapp.modules.invoices.application.invoice_processing.auto_sync_schedulerÚxéÿÿÿÿz8^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \(GMT\+7\) WARNING zR
>assert %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.match
}(%(py4)s, %(py5)s)
}ÚreÚline)Úpy0Úpy2Úpy4r,   Úpy7zI[app.modules.invoices.application.invoice_processing.auto_sync_scheduler]r$   r&   r(   r+   r,   )r   r   r	   Úwarningr.   ÚstripÚ
splitlinesr@   Úmatchr/   Ú_format_assertmsgr2   r3   r4   r1   r5   r6   r0   )
r!   rA   Ú@py_assert1Ú@py_assert3Ú@py_assert6Ú@py_format8r8   r9   r:   r;   s
             r   Ú-test_format_has_vn_time_level_and_logger_namerO   ,   sF  € Ý˜VÐ$Ñ$Ô$Ð$ÝÔÐ_Ñ`Ô`×hÒhÐilÑmÔmÐmØ�?Š?ÑÔ×"Ò"Ñ$Ô$×/Ò/Ñ1Ô1°"Ô5€DÝŒ8Ð\ÐOÐ\ˆ8ˆ8ÐOÐQUÑVÔVÐ\ÐVÐ\Õ\Ô\ÐX\Ñ\Ô\Ð\Ñ\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\�2Ñ\Ô\Ð\Õ\Ô\�2Ñ\Ô\Ð\Ð\Õ\Ô\ˆ8Ñ\Ô\Õ\Ô\ÐOÑ\Ô\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\ÐQUÑ\Ô\Ð\Õ\Ô\ÐQUÑ\Ô\Ð\Ð\Õ\Ô\ÐVÑ\Ô\Ð\Ð\Ñ\Ð\Õ\Õ\Ô\Ð\Ñ\Ô\Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\Ð\ØVÐ^ÐVÐZ^Ð^Ð^Ð^Ð^Õ^Ô^Ð^Ð^Ð^Ð^ÐVÐZ^Ð^Ñ^Ô^Õ^Ô^ÐVÑ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^ÐZ^Ñ^Ô^Ð^Õ^Ô^ÐZ^Ñ^Ô^Ð^Ð^Ð^Ð^Ñ^Ð^Ð^Ð^Ð^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^r   c           
      ó  — t          | ¬¦  «         t          | ¬¦  «         t          j        ¦   «         }d„ |j        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}}t          j        d
¦  «                             d¦  «         | j        } |¦   «         }|j        }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
        |¦  «        t          j
        |¦  «        t          j
        |	¦  «        t          j
        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}x}x}x}	x}}
d S )Nr#   c              3   óT   K  — | ]#}|                      ¦   «         t          k    ¯d V — Œ$dS )é   N)Úget_namer   )r   r   s     r   ú	<genexpr>z1test_idempotent_across_reloads.<locals>.<genexpr>9   s5   è è € ÐOÐO�Q¨1¯:ª:©<¬<Õ;NÒ+NÐ+NˆqÐ+NÐ+NÐ+NÐ+NÐOÐOr   rR   )ú==)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sÚsum)rB   rC   rD   rE   zassert %(py9)sÚpy9zapp.xu   má»™t láº§n)zƒ%(py10)s
{%(py10)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.getvalue
}()
}.count
}(%(py8)s)
} == %(py13)sr!   )rB   rC   rD   Úpy6Úpy8Úpy10Úpy13zassert %(py15)sÚpy15)r   r   r	   r   rV   r/   r0   r2   r3   r4   r1   r5   r6   r-   r.   Úcount)r!   r   rK   rL   rM   Ú@py_assert5rN   Ú@py_format10Ú@py_assert7Ú@py_assert9Ú@py_assert12Ú@py_assert11Ú@py_format14Ú@py_format16s                 r   Útest_idempotent_across_reloadsrf   4   sÊ  € å˜VÐ$Ñ$Ô$Ð$Ý˜VÐ$Ñ$Ô$Ð$ÝÔÑÔ€DØOÐO˜$œ-ÐOÑOÔOÐT�3ÐOÑOÔOÐTÐSTÐTÐOÐSTÒTÐTÐTÐTÕTÔTÐTÐTÐTÐTÐOÐSTÐTÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔT�3ÑTÔTÐTÕTÔT�3ÑTÔTÐTÐTÕTÔTÐOÑTÔTÕTÔTÐOÑTÔTÕTÔTÐSTÑ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ÐTÐTÐTÐTÝÔ�gÑÔ×#Ò# MÑ2Ô2Ð2ØŒ?Ð6ˆ?ˆ?ÑÔÐ6ÐÔ"Ð6 =Ð6Ð"Ð" =Ñ1Ô1Ð6°QÐ6Ð1°QÒ6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð1°QÐ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Õ6Ô6ÐÑ6Ô6Õ6Ô6Ð"Ñ6Ô6Õ6Ô6 =Ñ6Ô6Õ6Ô6Ð1Ñ6Ô6Õ6Ô6°QÑ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Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6r   c                 óv  — t          | ¬¦  «         t          j        d¦  «                             d¦  «         t          j        d¦  «                             d¦  «         |                      ¦   «         }d}||v}|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}||v }|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 S )Nr#   r   z,HTTP Request: POST https://openrouter.ai ...u   cáº£nh bÃ¡o tháº­tzHTTP Request©únot in)z%(py1)s not in %(py3)sr'   r(   r+   r,   r$   r&   )r   r   r	   r-   rF   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   s         r   Ú)test_third_party_info_noise_is_suppressedrj   >   sï  € Ý˜VÐ$Ñ$Ô$Ð$ÝÔ�gÑÔ×#Ò#Ð$RÑSÔSÐSÝÔ�gÑÔ×&Ò&Ð';Ñ<Ô<Ð<Ø
�/Š/Ñ
Ô
€CØÐ$ˆ> Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ> Ð$Ñ$Ô$Õ$Ô$ˆ>Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$ØÐ&Ð 3Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð 3Ð&Ñ&Ô&Õ&Ô&ÐÑ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô& 3Ñ&Ô&Ð&Õ&Ô& 3Ñ&Ô&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r   c                 ó  — |                      dd¦  «         t          | ¬¦  «         t          j        d¦  «                             d¦  «         t          j        d¦  «                             d¦  «         |                      ¦   «         }g }d}||v}|}|rd}||v }|}|�sXt          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  }
|                     |
¦  «         |r‹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          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}x}x}x}}d S )NÚDSCONS_LOG_LEVELÚWARNINGr#   zapp.yu   áº©nu   hiá»‡nrh   )z%(py3)s not in %(py5)sr'   )r*   r,   z%(py7)srE   r$   )z%(py10)s in %(py12)s)rZ   Úpy12z%(py14)sÚpy14r   zassert %(py17)sÚpy17)Úsetenvr   r   r	   r-   rF   r.   r/   r0   r1   r2   r3   r4   ÚappendÚ_format_boolopr5   r6   )r!   Úmonkeypatchr'   rK   r9   Ú@py_assert4r8   ra   rc   r;   rN   Ú@py_format13Ú@py_format15re   Ú@py_format18s                  r   Útest_log_level_env_overridery   G   s^  € Ø×ÒÐ)¨9Ñ5Ô5Ð5Ý˜VÐ$Ñ$Ô$Ð$ÝÔ�gÑÔ×#Ò# FÑ+Ô+Ð+ÝÔ�gÑÔ×&Ò& xÑ0Ô0Ð0Ø
�/Š/Ñ
Ô
€CØ0Ð0ˆ6Ð0ˆ6˜ÐÐ0Ð0Ð0Ð0Ð0 Ð0 ¨S Ð0Ð0Ð0Ð0Ñ0Õ0Ô0Ð0Ð0Ð0Ð0ˆ6˜Ð0Ñ0Ô0Õ0Ô0ˆ6Ñ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 ¨SÐ0Ñ0Ô0Õ0Ô0 Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0¨SÑ0Ô0Ð0Õ0Ô0¨SÑ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Ð0r   )Ú__doc__Úbuiltinsr2   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter/   r   r   r@   ÚpytestÚapp.core.logging_configr   r   Úfixturer!   r<   rO   rf   rj   ry   r   r   r   ú<module>r‚      sÜ   ððð ð € € € € € € € € € € € € €	€	€	€	Ø €€€Ø 	€	€	€	à €€€à JÐ JÐ JÐ JÐ JÐ JÐ JÐ Jð „ð+ð +ñ „ð+ð*ð *ð *ð_ð _ð _ð7ð 7ð 7ð'ð 'ð 'ð1ð 1ð 1ð 1ð 1r   