ó
    t7já  ã                  ót  • S r SSKJr  SSKrSSKJs  Jr  SSK	r	SSK
r
SSKrSSKJr  \
R                  R                  S\" \" \5      R%                  5       R&                  S   S-  5      5        SS jrS rS	 rS
 rS rS rS rS rS rS rS r\S:X  aÓ  SSK r \!" \"" 5       RG                  5       5       V Vs/ s H  u  pU RI                  S5      (       d  M  UPM!     snn r%Sr&\% Hc  r' S\'RP                  RR                  ;   a)  \RT                  " 5        r+\'" \" \+5      5        SSS5        O\'" 5         \," S\'R>                   35        Me     \
R^                  " \&(       a  SOS5        ggs  snn f ! , (       d  f       NJ= f! \- a/    \&S-  r&\," S\'R>                   35        \ R\                  " 5          MÏ  f = f)a  Basic smoke tests for the WolfPanel Agent v1 foundation.

Run with:  python -m pytest tests/   (or: python tests/test_basic.py)

These tests use a temporary WOLFPANEL_DEV_HOME so nothing touches real system
paths, and the mock API so no network is required.
é    )ÚannotationsN)ÚPathé   Úsrcc                ó    • U [         R                  S'   S[         R                  S'   SS KnSS KnUR	                  U5        UR                  5       $ )NÚWOLFPANEL_DEV_HOMEÚ1ÚWOLFPANEL_API_MOCKr   )ÚosÚenvironÚ	importlibÚconfigÚreloadÚload_config)Útmpr   Úconfig_modules      Ú7D:\laragon\www\wolf\wolfpanel-agent\tests\test_basic.pyÚ_fresh_configr      sC   € Ø'*„B‡J�JÐ#Ñ$Ø'*„B‡J�JÐ#Ñ$Ûã"à×Ñ�]Ô#Ø×$Ñ$Ó&Ð&ó    c                 óJ  • [         R                  " 5        n [        U 5      nUR                  n[	        U5      o3R
                  oD" U 5      oU(       Gdb  SS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n=n=pEUR                  owR                  nSoHU:H  o™(       dÏ  [        R                  " SU	4SX„45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S	.-  n
S
SU
0-  n[        [        R                  " U5      5      eS =n=n=p”UR                   nSo7U:H  oˆ(       dº  [        R                  " SU4SXs45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n
[        [        R                  " U
5      5      eS =n=pƒS S S 5        g ! , (       d  f       g = f)Nz‹assert %(py10)s
{%(py10)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.conf_file
})
}.startswith
}(%(py8)s)
}ÚstrÚcfgr   )Úpy0Úpy1Úpy3Úpy5Úpy7Úpy8Úpy10Úsecrets©ú==)zM%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.secrets_dir
}.name
} == %(py7)s©r   Úpy2Úpy4r   úassert %(py9)sÚpy9é<   )z:%(py2)s
{%(py2)s = %(py0)s.heartbeat_interval
} == %(py5)s©r   r$   r   úassert %(py7)sr   )ÚtempfileÚTemporaryDirectoryr   Ú	conf_filer   Ú
startswithÚ@py_builtinsÚlocalsÚ
@pytest_arÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚsecrets_dirÚnameÚ_call_reprcompareÚheartbeat_interval)r   r   Ú@py_assert2Ú@py_assert4Ú@py_assert6Ú@py_assert9Ú@py_format11Ú@py_assert1Ú@py_assert3Ú@py_assert5Ú@py_format8Ú@py_format10Ú@py_format6s                r   Ú test_config_paths_under_dev_homerE      sð  € Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆØ—=‘=Ð1Œs�=Ó!Ð1×,Ñ,Ð1Ð,¨SÓ1Ð1Ö1×1×1×1×1×1Ñ1Œs×1×1×1Ñ1Œs×1×1×1×1×1Ö1�3×1×1×1Ñ1�3×1×1Õ1�=×1×1Ó1Ð!×1×1Ó1Ð,×1×1×1×1×1Ô1¨S×1×1×1Ñ1¨S×1×1Õ1Ð1×1×1×1×1×1Ö1Ø�‰Ð0×#Ñ#Ð0 yÐ0 yÑ0×0×0×0Ò0Ð#×0×0×0×0×0Õ0ˆs×0×0×0Ñ0ˆs×0×0Õ0ˆ×0×0Ó0Ð#×0×0Ó0 y×0×0×0×0×0×0Õ0Ø×%Ñ%Ð+¨Ð+¨Ñ+×+×+×+Ò+Ð%×+×+×+×+×+Õ+ˆs×+×+×+Ñ+ˆs×+×+Õ+Ð%×+×+Ó+¨×+×+×+×+×+×+Ó+÷	 
'×	&Ö	&ús   –M5NÎ
N"c                 ó˜  • SSK Jn   U " 5       nU " 5       nX:H  o3(       dÛ  [        R                  " SU4SX45      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSS	U0-  n[        [        R                  " U5      5      eS nUR                  nS
oc" U5      ow(       d¯  SS[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n=pgg )Nr   )Úgenerate_fingerprintr!   )z%(py0)s == %(py2)sÚfp1Úfp2©r   r$   úassert %(py4)sr%   Úfp_zLassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}©r   r$   r%   Úpy6)ÚidentityrG   r1   r8   r/   r0   r2   r3   r4   r5   r.   )	rG   rH   rI   r?   Ú@py_format3Ú@py_format5r@   rA   Ú@py_format7s	            r   Ú%test_fingerprint_is_stable_and_opaquerS   &   só   € Ý-á
Ó
 €CÙ
Ó
 €CØ‰:×××Òˆ3×××××Õˆ3×××Ñˆ3×××××Ö�#×××Ñ�#××××××ÒØ�>‰>Ð ˜%Ð ˆ>˜%Ó Ð Õ × × × × × Ñ ˆ3× × × Ñ ˆ3× × Õ ˆ>× × Ó ˜%× × Ó Ð × × × × × Õ r   c                 óº  • [         R                  " 5        n [        U 5      nSSKJn  SSKJnJnJn  U" U5        U" U5      R                  SSS.5      nU" U[        US   5      US   5        UR                  owR                  oˆ" 5       o™R                  oª" 5       nS	oËU:H  oÝ(       Gd  [        R                  " S
U4SX¼45      S[         R"                  " 5       ;   d  [        R$                  " U5      (       a  [        R&                  " U5      OS[        R&                  " U5      [        R&                  " U5      [        R&                  " U	5      [        R&                  " U
5      [        R&                  " U5      [        R&                  " U5      S.-  nSSU0-  n[)        [        R*                  " U5      5      eS =n=n=n	=n
=n=pÜU" U5      nS	n	UU	:H  nU(       Gd  [        R                  " S
U4SUU	45      S[         R"                  " 5       ;   d  [        R$                  " U5      (       a  [        R&                  " U5      OSS[         R"                  " 5       ;   d  [        R$                  " U5      (       a  [        R&                  " U5      OS[        R&                  " U5      [        R&                  " U	5      S.-  nSSU0-  n[)        [        R*                  " U5      5      eS =n=nn	[-        U 5      R/                  S5       GH>  nUR1                  5       (       d  M  UUR                  :X  a  M-  SnUR                  nSnU" US9nUU;  nU(       då  [        R                  " SU4SUU45      [        R&                  " U5      S[         R"                  " 5       ;   d  [        R$                  " U5      (       a  [        R&                  " U5      OS[        R&                  " U5      [        R&                  " U5      [        R&                  " U5      S.-  nSSU0-  n[)        [        R*                  " U5      5      eS =n=n=n=nnGMA     S S S 5        g ! , (       d  f       g = f)Nr   ©Úget_api_client)Úensure_dirsÚload_agent_tokenÚstore_credentialsÚtÚfp_x)ÚhostnameÚfingerprintÚ	server_idÚagent_tokenÚwp_agent_dev_tokenr!   )z£%(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.agent_token_file
}.read_text
}()
}.strip
}()
} == %(py13)sr   )r   r$   r%   rN   r   r   Úpy13zassert %(py15)sÚpy15)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srX   )r   r   r   rN   zassert %(py8)sr   Ú*Úinstall_tokenÚignore)Úerrors©únot in)zZ%(py1)s not in %(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.read_text
}(errors=%(py7)s)
}Úpath)r   r   r   r   r'   úassert %(py11)sÚpy11)r+   r,   r   Ú
api_clientrV   rO   rW   rX   rY   Úregisterr   Úagent_token_fileÚ	read_textÚstripr1   r8   r/   r0   r2   r3   r4   r5   r   ÚrglobÚis_file)r   r   rV   rW   rX   rY   Úrespr?   r@   rA   Ú@py_assert7r=   Ú@py_assert12Ú@py_assert11Ú@py_format14Ú@py_format16r:   r;   rR   Ú@py_format9ri   Ú@py_assert0r<   Ú@py_assert8rC   Ú@py_format12s                             r   Ú6test_register_stores_credentials_and_not_install_tokenr}   /   s«  € Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆÝ-ßMÑMá�CÔÙ˜cÓ"×+Ñ+¸ÈVÑ,TÓUˆá˜#œs 4¨Ñ#4Ó5°t¸MÑ7JÔKð ×#Ñ#ÐO×-Ñ-ÐOÐ-Ó/ÐO×5Ñ5ÐOÐ5Ó7ÐOÐ;OÐOÐ;OÑO×O×O×OÓOÐ7×O×O×O×O×OÕOˆs×O×O×OÑOˆs×O×OÕOÐ#×O×OÓOÐ-×O×OÓOÐ/×O×OÓOÐ5×O×OÓOÐ7×O×OÓOÐ;O×O×O×O×O×O×O×OÓOÙ Ó$Ð<Ð(<Ð<Ð$Ð(<Ñ<×<×<×<Ô<Ð$Ð(<×<×<×<×<×<Õ<Ð×<×<×<Ñ<Ð×<×<×<×<×<Ö< ×<×<×<Ñ< ×<×<Õ<Ð$×<×<Ó<Ð(<×<×<×<×<×<×<Ô<ä˜“I—O‘O C×(ˆDØ�|‰|�~‹~Ø˜3×/Ñ/Ó/ÙØ&ÐM¨d¯n©nÐMÀHÐM©nÀHÑ.MÐM�Ð.MÑM×M×M×MÓM�Ð.M×M×MÔM�×M×M×M×M×MÔM¨d×M×M×MÑM¨d×M×MÕM¨n×M×MÓMÀH×M×MÓMÐ.M×M×M×M×M×M×M×MÓMñ	 )÷ 
'×	&Ö	&ús   –LQÌD(QÑ
Qc                 ó  • SSK Jn   U R                  5       nS Hê  nX!;   o3(       dÛ  [        R                  " SU4SX!45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nS	S
U0-  n[        [        R                  " U5      5      eS nMì     g )Nr   )Úquick)r\   r   ÚarchitectureÚ	cpu_countÚprivate_ips©Úin)z%(py0)s in %(py2)sÚkeyÚsnapshotrJ   rK   r%   )Ú	discoveryr   Úcollectr1   r8   r/   r0   r2   r3   r4   r5   )r   r†   r…   r?   rP   rQ   s         r   Ú*test_quick_discovery_returns_expected_keysr‰   E   s‡   € Ýà�}‰}‹€HÛMˆØ‰×××Òˆs×××××Õˆs×××Ñˆs×××××Ö�h×××Ñ�h××××××Ôò Nr   c                 óÂ  • SSK Jn   SnU " U5      nSnUU:H  oD(       dÐ  [        R                  " SU4SUU45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=pCSo" U5      nSo2U:H  oD(       dÏ  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=pCg )Nr   )Úsanitize_remotez*https://user:ghp_secret@github.com/a/b.gitzhttps://github.com/a/b.gitr!   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr‹   r#   r&   r'   zgit@github.com:a/b.git)
Údiscovery.gitr‹   r1   r8   r/   r0   r2   r3   r4   r5   )r‹   r?   r@   r<   rA   rB   rC   s          r   Útest_git_remote_sanitizationr�   M   sv  € Ý-ð EðÙÐDÓEðà'ðØEØ'ñ	(÷ó ïé ôØEØ'÷ò ïé ÷õ ïé ðØ÷ö ïé ðØ÷ò ïé ðØD÷ð ïé ðØE÷ð ïé ðà'÷÷ ÷ ñ ïé ÷÷ ñ ð 4ÐPˆ?Ð3Ó4ÐPÐ8PÐPÐ8PÑP×P×P×PÒPÐ4×P×P×P×P×PÕPˆ?×P×P×PÑPˆ?×P×PÕPÐ3×P×PÓPÐ4×P×PÓPÐ8P×P×P×P×P×P×PÖPr   c                óv  • SSK Jn  U S-  R                  S5        U S-  R                  S5        U" U 5      S   nSo2U:H  oD(       do  [        R                  " S	U4S
X#45      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCg )Nr   )ÚclassifyÚartisanÚ zcomposer.jsonz{}ÚtypeÚlaravelr!   )z%(py1)s == %(py4)s)r   r%   zassert %(py6)srN   )Údiscovery.projectsr�   Ú
write_textr1   r8   r3   r4   r5   )Útmp_pathr�   rz   r@   r:   rQ   rR   s          r   Útest_project_classificationr—   W   s€   € Ý+à�	Ñ×%Ñ% bÔ)Ø�Ñ×+Ñ+¨DÔ1Ù�HÓ˜fÑ%Ð2¨Ð2¨Ñ2×2×2×2Ò2Ð%×2×2Ô2Ð%×2×2Ó2¨×2×2×2×2×2×2Ô2r   c                 ó(  • [         R                  " 5        n [        U 5      nSSKJn  SSKJn  U" X" U5      5      n/ nS odULowo‡(       a  UR                  n	So©U
L o»nU(       Gd‰  [        R                  " SU4SXF45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nS	S
U0-  oÕR                  U5        U(       a¬  [        R                  " SW4SW	W
45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      [        R                  " U
5      S.-  nSSU0-  oõR                  U5        [        R                  " US5      0 -  nSSU0-  n[!        [        R"                  " U5      5      eS =n=n=n=n=n	=pºS S S 5        g ! , (       d  f       g = f)Nr   rU   )ÚcheckT)úis not)z%(py2)s is not %(py5)sÚinfo)r$   r   z%(py7)sr   ©Úis)z;%(py11)s
{%(py11)s = %(py9)s.update_available
} is %(py14)s)r'   rk   Úpy14z%(py16)sÚpy16zassert %(py19)sÚpy19)r+   r,   r   rl   rV   Úupdater™   Úupdate_availabler1   r8   r/   r0   r2   r3   ÚappendÚ_format_boolopr4   r5   )r   r   rV   r™   r›   r?   r;   r@   rz   Ú@py_assert10Ú@py_assert13ru   rD   rB   Ú@py_format15Ú@py_format17Ú@py_format18Ú@py_format20s                     r   Útest_update_version_comparisonr«   _   s  € Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆÝ-Ý á�S˜.¨Ó-Ó.ˆáA˜4ÐA˜4Ð×A D×$9Ñ$9ÐA¸TÐA¸TÐ$A×A×A×AÕAˆt×A×A×A×A×AÕAˆt×A×A×AÑAˆt×A×AÕA˜4×A×A×A×A×A×A×AÒAÐ$9¸T×A×A×A×A×AÕA D×A×A×AÑA D×A×AÕAÐ$9×A×AÓA¸T×A×A×A×A×A×A×A×A×A×A×A×A×AÔA÷ 
'×	&Ö	&ús   –G$HÈ
Hc                 ó  • SSK Jn   U R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  5        GH  nU R                  o" U5      o™(       då  SS[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      S.-  n
[        [        R                  " U
5      5      eS =pGM     g )Nr   )Úsystemz10.0.0.5Trœ   )zV%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s._is_private_ipv4
}(%(py4)s)
} is %(py9)sr­   )r   r$   r%   rN   r'   rj   rk   z192.168.1.10z
172.16.4.4z	127.0.0.1z169.254.1.1z8.8.8.8Fz
172.32.0.1z	not-an-ipzRassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_private_ipv4
}(%(py3)s)
}Úip)r   r$   r   r   )r‡   r­   Ú_is_private_ipv4r1   r8   r/   r0   r2   r3   r4   r5   r‚   )r­   r?   r@   rA   r{   rt   rC   r|   r®   r;   rD   s              r   Ú*test_private_ips_excludes_public_addressesr°   j   sp  € Ý à×"Ñ"Ð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Ø×"Ñ"Ð: >Ð:Ð" >Ó2Ð:°dÐ:°dÐ:×:×:×:Ò:Ð2×:×:×:×:×:Õ:ˆ6×:×:×:Ñ:ˆ6×:×:Õ:Ð"×:×:Ó: >×:×:Ó:Ð2×:×:Ó:°d×:×:×:×:×:×:×:Ø×"Ñ"Ð8 <Ð8Ð" <Ó0Ð8°DÐ8°DÐ8×8×8×8Ò8Ð0×8×8×8×8×8Õ8ˆ6×8×8×8Ñ8ˆ6×8×8Õ8Ð"×8×8Ó8 <×8×8Ó8Ð0×8×8Ó8°D×8×8×8×8×8×8×8Ø×"Ñ"Ð7 ;Ð7Ð" ;Ó/Ð7°4Ð7°4Ð7×7×7×7Ò7Ð/×7×7×7×7×7Õ7ˆ6×7×7×7Ñ7ˆ6×7×7Õ7Ð"×7×7Ó7 ;×7×7Ó7Ð/×7×7Ó7°4×7×7×7×7×7×7×7Ø×"Ñ"Ð9 =Ð9Ð" =Ó1Ð9°TÐ9°TÐ9×9×9×9Ò9Ð1×9×9×9×9×9Õ9ˆ6×9×9×9Ñ9ˆ6×9×9Õ9Ð"×9×9Ó9 =×9×9Ó9Ð1×9×9Ó9°T×9×9×9×9×9×9×9à×"Ñ"Ð6 9Ð6Ð" 9Ó-Ð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 9×6×6Ó6Ð-×6×6Ó6°×6×6×6×6×6×6×6Ø×"Ñ"Ð9 <Ð9Ð" <Ó0Ð9°EÐ9°EÐ9×9×9×9Ò9Ð0×9×9×9×9×9Õ9ˆ6×9×9×9Ñ9ˆ6×9×9Õ9Ð"×9×9Ó9 <×9×9Ó9Ð0×9×9Ó9°E×9×9×9×9×9×9×9Ø×"Ñ"Ð8 ;Ð8Ð" ;Ó/Ð8°5Ð8°5Ð8×8×8×8Ò8Ð/×8×8×8×8×8Õ8ˆ6×8×8×8Ñ8ˆ6×8×8Õ8Ð"×8×8Ó8 ;×8×8Ó8Ð/×8×8Ó8°5×8×8×8×8×8×8×8à× Ñ ×"ˆØ×&Ñ&Ð*Ð& rÓ*Ð*Õ*×*×*×*×*×*Ñ*ˆv×*×*×*Ñ*ˆv×*×*Õ*Ð&×*×*×*×*×*Ô* r×*×*×*Ñ* r×*×*Õ*Ð*×*×*×*×*×*Õ*ò #r   c                 ó¶  • [         R                  " 5        n [        U 5      nSSKJnJnJn  U" U5        U" US5        U" US5        UR                  oUR                  of" 5       ow(       d¯  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n=pgUR                  R!                  5       n	SoªU	;   o»(       d¥  [        R"                  " SU4S	X©45      [        R                  " U
5      S
[        R                  " 5       ;   d  [        R                  " U	5      (       a  [        R                  " U	5      OS
S.-  nSSU0-  n[        [        R                  " U5      5      eS =p«SoªU	;   o»(       d¥  [        R"                  " SU4S	X©45      [        R                  " U
5      S
[        R                  " 5       ;   d  [        R                  " U	5      (       a  [        R                  " U	5      OS
S.-  nSSU0-  n[        [        R                  " U5      5      eS =p«UR$                  R                  5       (       Ga‚  UR$                  R!                  5       nSoªU;  o»(       d¥  [        R"                  " SU4SX®45      [        R                  " U
5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =p«SoªU;  o»(       d¥  [        R"                  " SU4SX®45      [        R                  " U
5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =p«S S S 5        g ! , (       d  f       g = f)Nr   )rW   Úsave_last_errorÚsave_statusÚrevokedzline1
line2zbassert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.state_file
}.is_file
}()
}r   rM   rƒ   )z%(py1)s in %(py3)sÚ
state_text)r   r   úassert %(py5)sr   zline1 line2ÚWOLFPANEL_STATUSrg   )z%(py1)s not in %(py3)sÚ	conf_textÚWOLFPANEL_LAST_ERROR)r+   r,   r   rO   rW   r²   r³   Ú
state_filerr   r/   r0   r1   r2   r3   r4   r5   ro   r8   r-   )r   r   rW   r²   r³   r?   r@   rA   rR   rµ   rz   r:   Ú@py_format4rD   r¸   s                  r   Ú,test_runtime_state_not_written_to_agent_confr¼   {   sg  € Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆßFÑFá�CÔÙ�C˜Ô#Ù˜˜^Ô,ð �~‰~Ð'×%Ñ%Ð'Ð%Ó'Ð'Õ'×'×'×'×'×'Ñ'ˆs×'×'×'Ñ'ˆs×'×'Õ'ˆ~×'×'Ó'Ð%×'×'Ó'Ð'×'×'×'×'×'Ô'Ø—^‘^×-Ñ-Ó/ˆ
ØÐ&˜JÑ&×&×&×&Ò&ˆy×&×&Ô&ˆy×&×&×&×&×&Ô&˜J×&×&×&Ñ&˜J×&×&×&×&×&×&Ó&àÐ* 
Ñ*×*×*×*Ò*ˆ}×*×*Ô*ˆ}×*×*×*×*×*Ô* 
×*×*×*Ñ* 
×*×*×*×*×*×*Ó*Ø�=‰=× Ñ ×"Ò"ØŸ™×/Ñ/Ó1ˆIØ%Ð6¨YÑ6×6×6×6Ò6Ð%×6×6Ô6Ð%×6×6×6×6×6Ô6¨Y×6×6×6Ñ6¨Y×6×6×6×6×6×6Ó6Ø)Ð:°Ñ:×:×:×:Ò:Ð)×:×:Ô:Ð)×:×:×:×:×:Ô:°×:×:×:Ñ:°×:×:×:×:×:×:Ó:÷# 
'×	&Ö	&ús   –P+Q
Ñ

Qc                 ó$  ^• [         R                  " 5        n [        U 5      nSSKJnJm  SSKJn  SSKJ	n  U" U5         " U4S jSU5      nU" 5       nU" X5      nSo‡UL o™(       d¥  [        R                  " SU	4S	Xx45      S
[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS
[        R                  " U5      S.-  n
SSU
0-  n[!        [        R"                  " U5      5      eS =p˜UR$                  n	SoÉU:H  oÝ(       dº  [        R                  " SU4SXœ45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      [        R                  " U5      S.-  nSSU0-  n[!        [        R"                  " U5      5      eS =n	=pÜUR&                  n	SoÉU:H  oÝ(       dº  [        R                  " SU4SXœ45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      [        R                  " U5      S.-  nSSU0-  n[!        [        R"                  " U5      5      eS =n	=pÜU" X5      nSo�UL o™(       d¥  [        R                  " SU	4S	Xø45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  n
SSU
0-  n[!        [        R"                  " U5      5      eS =p˜S S S 5        g ! , (       d  f       g = f)Nr   )Ú	ApiClientÚApiError)Ú	send_once)rW   c                  ó"   >• \ rS rSrU 4S jrSrg)Ú4test_heartbeat_revoked_on_401.<locals>.Mock401Clienté™   c                ó   >• T" SSS9e)NÚUnauthorizedi‘  )Ústatus_code© )ÚselfÚpayloadÚtokenr¿   s      €r   Ú	heartbeatÚ>test_heartbeat_revoked_on_401.<locals>.Mock401Client.heartbeatš   s   ø€ Ù˜~¸3Ñ?Ð?r   rÇ   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rË   Ú__static_attributes__)r¿   s   €r   ÚMock401ClientrÂ   ™   s   ø† ÷@ð @r   rÒ   Frœ   )z%(py0)s is %(py3)sÚsuccess)r   r   r¶   r   r´   r!   )z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sr   r)   r*   r   rÅ   )z2%(py2)s
{%(py2)s = %(py0)s.last_error
} == %(py5)sÚsuccess2)r+   r,   r   rl   r¾   r¿   rË   rÀ   rO   rW   r1   r8   r/   r0   r2   r3   r4   r5   ÚstatusÚ
last_error)r   r   r¾   rÀ   rW   rÒ   ÚclientrÓ   r:   r?   r»   rD   r;   r@   rB   rÔ   r¿   s                   @r   Útest_heartbeat_revoked_on_401rØ   �   sù  ø€ Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆß2Ý'Ý(á�CÔ÷	@˜Iô 	@ñ “ˆÙ˜CÓ(ˆØÐ˜%Ð×××Òˆw×××××Õˆw×××Ñˆw××Õ˜%××××××ÑØ�z‰zÐ&˜YÐ&˜YÑ&×&×&×&Ò&ˆz×&×&×&×&×&Õ&ˆs×&×&×&Ñ&ˆs×&×&Õ&ˆz×&×&Ó&˜Y×&×&×&×&×&×&Ó&Ø�~‰~Ð/ Ð/ Ñ/×/×/×/Ò/ˆ~×/×/×/×/×/Õ/ˆs×/×/×/Ñ/ˆs×/×/Õ/ˆ~×/×/Ó/ ×/×/×/×/×/×/Ó/ñ ˜SÓ)ˆØ Ð ˜5Ð × × × Ò ˆx× × × × × Õ ˆx× × × Ñ ˆx× × Õ ˜5× × × × × × Ñ ÷) 
'×	&Ö	&ús   —M!NÎ
NÚ__main__Útest_r–   zPASS zFAIL )r   r   )0Ú__doc__Ú
__future__r   Úbuiltinsr/   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter1   r   Úsysr+   Úpathlibr   ri   Úinsertr   Ú__file__ÚresolveÚparentsr   rE   rS   r}   r‰   r�   r—   r«   r°   r¼   rØ   rÍ   Ú	tracebackÚsortedÚglobalsÚitemsr.   ÚfuncsÚfailuresÚfuncÚ__code__Úco_varnamesr,   r   ÚprintÚ	ExceptionÚ	print_excÚexit)ÚkÚvs   00r   Ú<module>rö      sŠ  ðñõ #ç  „ ƒ	Û 
Û Ý à ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×7Ñ7¸Ñ:¸UÑBÓCÔ Dô'ò,ò!òNò,òQò3òBò+ò";ò*!ð0 ˆzÓÛá!¡'£)§/¡/Ó"3Ô4ÔNÒ4‘4�1¸¿¹ÀW×8M�QÑ4ÒN€EØ€HÛˆð	"à˜TŸ]™]×6Ñ6Ó6Ø×0Ò0Ô2°cÙ™˜c›”O÷ 3Ð2ñ ”Ù�E˜$Ÿ-™-˜Ð)Ö*ñ ð ‡H‚H–(‰Q Õ"ð% ùó O÷ 3Õ2ûð
 ó 	"Ø˜‰MˆHÙ�E˜$Ÿ-™-˜Ð)Ô*Ø×Ò×!ð	"ús6   Â9E+ÃE+Ã++FÄE1Ä%%FÅ1
E?	Å;FÆ1F7Æ6F7