Ë
   ˆ8q¯-9öã                  ó~  — U d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZ ddlZddlmZ ddlmZ ddlmZmZ ddlmZmZmZ  e«       Zd	Zd
ed<   dZd
ed<   dd„Zdd„Zdd„Z	 	 	 	 	 	 d d„Z d!d„Z!d!d„Z"d"d„Z#	 	 	 	 d!d„Z$	 	 	 	 d!d„Z%	 	 	 	 d!d„Z&d!d„Z'd!d„Z(d!d„Z)	 	 	 	 	 	 d d„Z*d!d„Z+d!d„Z,	 	 	 	 	 	 d d„Z-y)#z?Tests for the product sub-applications wired into the main CLI.é    )ÚannotationsN)ÚPath)Ú	CliRunner)Úapp)Ú_check_workspaces_rootÚ
run_checks)ÚENV_WORKSPACES_ROOTÚresolve_db_pathÚworkspaces_rootzis trusted by designÚstrÚSTALE_WORKSPACE_CLAIMz&refused before any process is launchedÚWORKSPACE_CONFINEMENT_CLAIMc                 óæ  — t         j                  t        dg«      } | j                  }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                  |«      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}| 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}}y )Nú--helpr   ©ú==©z1%(py2)s
{%(py2)s = %(py0)s.exit_code
} == %(py5)sÚresult©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7Ú	approvals©Úin©z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.output
}©Úpy1Úpy3r   Údoctor©ÚrunnerÚinvoker   Ú	exit_codeÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚoutput)r   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8Ú@py_assert0Ú@py_assert2s           ú8/home/oem/CyberBrain26-unified/tests/test_product_cli.pyÚ*test_top_level_help_lists_product_commandsr8      s`  € Ü�]‰]œ3  
Ó+€FØ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó ØÐ'˜&Ÿ-™-Ð'ˆ;˜-Ð'×'×'Õ'ˆ;˜-×'×'Ó'ˆ;×'×'×'×'×'Ð'˜&×'×'Ó'˜&×'×'Ô'˜-×'×'×'×'×'×'Ó'ØÐ$�v—}‘}Ð$ˆ8�}Ð$×$×$Õ$ˆ8�}×$×$Ó$ˆ8×$×$×$×$×$Ð$�v×$×$Ó$�v×$×$Ô$�}×$×$×$×$×$×$Ô$ó    c                 óº  — t         j                  t        ddg«      } | j                  }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                  |«      dœz  }dd	|iz  }t        t	        j                  |«      «      ‚d x}x}}d
D ]ò  }| j                  }||v }|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œz  }dd|iz  }t        t	        j                  |«      «      ‚d x}}Œô y )Nr   r   r   r   r   r   r   r   r   )ÚpendingÚshowÚapproveÚdenyÚhistoryr   ©z.%(py0)s in %(py4)s
{%(py4)s = %(py2)s.output
}Úcmd©r   r   Úpy4úassert %(py6)sÚpy6r#   ©	r   r0   r1   r2   r3   r4   rA   Ú@py_format5Ú@py_format7s	            r7   Útest_approvals_helprI   %   s  € Ü�]‰]œ3 ¨hÐ 7Ó8€FØ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó Ø@ò $ˆØ—m‘mÐ#ˆs�mÐ#×#×#Õ#ˆs�m×#×#×#×#×#Ñ#ˆs×#×#Ó#ˆs×#×#×#×#×#Ò#�f×#×#Ó#�f×#×#Ô#�m×#×#×#×#×#×#Ò#ñ$r9   c                 óº  — t         j                  t        ddg«      } | j                  }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                  |«      dœz  }dd	|iz  }t        t	        j                  |«      «      ‚d x}x}}d
D ]ò  }| j                  }||v }|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œz  }dd|iz  }t        t	        j                  |«      «      ‚d x}}Œô y )Nr"   r   r   r   r   r   r   r   r   )ÚcheckÚmainr   r@   rA   rB   rD   rE   r#   rF   s	            r7   Útest_doctor_helprM   ,   s  € Ü�]‰]œ3 ¨8Ð 4Ó5€FØ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó Ø ò $ˆØ—m‘mÐ#ˆs�mÐ#×#×#Õ#ˆs�m×#×#×#×#×#Ñ#ˆs×#×#Ó#ˆs×#×#×#×#×#Ò#�f×#×#Ó#�f×#×#Ô#�m×#×#×#×#×#×#Ò#ñ$r9   c           	     ó¦  — d}| j                  d|«       t        j                  t        dddt	        |«      g«      }|j
                  }d}||v }|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}}|j                  }||v}|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œz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}}t        j                  t        dddt	        |«      dg«      }|j
                  }d}||v }|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}}|j                  }||v}|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œz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}}y )Nz!DO-NOT-PRINT-THIS-SECRET-7c3f1e9aÚOPENAI_API_KEYr"   rK   ú
--data-dir©r   é   r   ©z1%(py2)s
{%(py2)s = %(py0)s.exit_code
} in %(py5)sr   r   r   r   ©únot in)z2%(py0)s not in %(py4)s
{%(py4)s = %(py2)s.output
}Úsecret_valuerB   rD   rE   ú--jsonÚresult_json)Úsetenvr$   r%   r   r   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   )ÚmonkeypatchÚtmp_pathrV   r   r0   r1   r2   r3   r4   rG   rH   rX   s               r7   Ú&test_doctor_never_prints_secret_valuesr\   3   s<  € ð 7€LØ×ÑÐ'¨Ô6Ü�]‰]œ3 ¨7°LÄ#ÀhÃ-Ð PÓQ€FØ×ÑÐ%˜vÐ%Ð˜vÐ%×%×%Õ%Ð˜v×%×%×%×%×%Ñ%ˆ6×%×%Ó%ˆ6×%×%Ô%Ð×%×%Ò%˜v×%×%×%×%×%×%Ó%Ø%Ÿ}™}Ð,ˆ<˜}Ð,×,×,Õ,ˆ<˜}×,×,×,×,×,Ñ,ˆ<×,×,Ó,ˆ<×,×,×,×,×,Ò,˜v×,×,Ó,˜v×,×,Ô,˜}×,×,×,×,×,×,Ñ,Ü—-‘-Üˆh˜ ¬s°8«}¸hÐGó€Kð × Ñ Ð* FÐ*Ð  FÐ*×*×*Õ*Ð  F×*×*×*×*×*Ñ*ˆ;×*×*Ó*ˆ;×*×*Ô*Ð ×*×*Ò* F×*×*×*×*×*×*Ó*Ø*×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Ò1r9   c           
     ór  — t         j                  t        ddddt        | «      g«      }|j                  }d}||k7  }|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}|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}}y )Nr   r;   z--no-persistrP   r   ©ú!=©z1%(py2)s
{%(py2)s = %(py0)s.exit_code
} != %(py5)sr   r   r   r   Ú	TracebackrT   ©z2%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.output
}r   ©r$   r%   r   r   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   )	r[   r   r0   r1   r2   r3   r4   r5   r6   s	            r7   Ú/test_approvals_pending_on_empty_db_fails_closedrd   B   s  € Ü�]‰]Üˆk˜9 n°lÄCÈÃMÐRó€Fð ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó ØÐ+˜fŸm™mÐ+ˆ;˜mÐ+×+×+Õ+ˆ;˜m×+×+Ó+ˆ;×+×+×+×+×+Ð+˜f×+×+Ó+˜f×+×+Ô+˜m×+×+×+×+×+×+Ô+r9   c           
     ó@	  — t         j                  t        ddddt        | «      g«      }|j                  }d}||k7  }|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}|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                  }|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                  |«      t        j                  |	«      t        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}	}
t        | ¬«      }t!        j"                  t        |«      «      }	 |j%                  dd«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}|j%                  d«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}|j)                  «        y # |j)                  «        w xY w) Nr   r=   znonexistent-request-idrP   r   r^   r`   r   r   r   r   ra   rT   rb   r   Úapproved)zd%(py1)s not in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.output
}.lower
}()
})r    r!   r   r   Úpy9úassert %(py11)sÚpy11©Údata_dirz2SELECT COUNT(*) FROM audit_events WHERE result = ?)rf   r   )z%(py0)s == %(py3)sÚapproved_count)r   r!   úassert %(py5)sr   z%SELECT COUNT(*) FROM approval_recordsÚrecord_count)r$   r%   r   r   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   Úlowerr
   Úsqlite3ÚconnectÚexecuteÚfetchoneÚclose)r[   r   r0   r1   r2   r3   r4   r5   r6   Ú@py_assert6Ú@py_assert8Ú@py_format10Ú@py_format12Údb_pathÚconnrl   Ú@py_format4rn   s                     r7   Ú.test_approvals_approve_unknown_id_fails_closedr|   J   sÔ  € Ü�]‰]ÜàØØ$ØÜ�‹Mð	
ó	€Fð ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó ØÐ+˜fŸm™mÐ+ˆ;˜mÐ+×+×+Õ+ˆ;˜m×+×+Ó+ˆ;×+×+×+×+×+Ð+˜f×+×+Ó+˜f×+×+Ô+˜m×+×+×+×+×+×+Ó+ØÐ2˜VŸ]™]Ð2˜]×0Ñ0Ð2Ñ0Ó2Ð2ˆ:Ð2Ð2×2×2Õ2ˆ:Ð2×2×2Ó2ˆ:×2×2×2×2×2Ð2˜V×2×2Ó2˜V×2×2Ô2˜]×2×2Ò2Ð0×2×2Ò2Ð2×2×2×2×2×2×2×2Ü xÔ0€GÜ�?‰?œ3˜w›<Ó(€DðØŸ™Ø@Øó
÷ ‰(‹*�Qñˆð "#Ð"ˆ~ Ñ"×"×"Õ"ˆ~ ×"×"×"×"×"Ñ"ˆ~×"×"Ó"ˆ~×"×"Ô" ×"×"×"×"×"×"Ñ"Ø—|‘|Ø3ó
ç
‰(‹*�Qñˆð  !Ð ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ ˆ|× × Ó ˆ|× × Ô ˜q× × × × × × Ñ à�
‰
�øˆ�
‰
�ús   Ë)FR ÒRc           	     óú  — t         j                  t        dddt        | «      g|¢«      }|j                  }d}||v }|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}}|j                  S )zMReturn the plain-text ``doctor check`` output for an isolated data directory.r"   rK   rP   rQ   r   rS   r   r   r   r   Nrc   )r[   Úargsr   r0   r1   r2   r3   r4   s           r7   Ú_doctor_textr   h   s¡   € ä�]‰]œ3 ¨7°LÄ#ÀhÃ-Ð WÐRVÐ WÓX€FØ×ÑÐ%˜vÐ%Ð˜vÐ%×%×%Õ%Ð˜v×%×%×%×%×%Ñ%ˆ6×%×%Ó%ˆ6×%×%Ô%Ð×%×%Ò%˜v×%×%×%×%×%×%Ó%Ø�=‰=Ðr9   c                óˆ  — t        | «      }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  }t        t        j                  |«      «      ‚d }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  }t        t        j                  |«      «      ‚d }g }d}||v }|}|s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  }|j                  |«       |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  }|j                  |«       t        j                  |d«      i z  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}x}}	y )NrT   ©z%(py0)s not in %(py2)sr   r/   ©r   r   úassert %(py4)srC   r   ©z%(py0)s in %(py2)sr   ÚconfinementÚconfined)z%(py3)s in %(py5)s)r!   r   z%(py7)sr   )z%(py10)s in %(py12)s)Úpy10Úpy12z%(py14)sÚpy14rR   zassert %(py17)sÚpy17)r   r   r'   r(   r)   r*   r+   r,   r-   r.   r   ÚappendÚ_format_boolop)r[   r/   r0   Ú@py_format3rG   r6   r1   r5   Ú@py_assert9Ú@py_assert11r3   r4   Ú@py_format13Ú@py_format15Ú@py_format16Ú@py_format18s                   r7   ÚAtest_doctor_reports_workspace_confinement_and_not_the_stale_claimr”   o   s©  € ô ˜(Ó#€FÜ ¨Ð.×.×.Õ.Ô ¨×.×.×.×.×.Ñ.Ô ×.×.Ó.Ô ×.×.×.×.×.Ò.¨×.×.Ó.¨×.×.×.×.×.×.Ñ.Ü&¨&Ð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Ù:ˆ=Ð:ˆ=˜FÐ"Ô: jÐ: j°FÐ&:×:×:×:Ð:ˆ=˜F×:×:Ó:ˆ=×:×:×:×:×:Ð:˜F×:×:Ó:˜F×:×:×:×:×:×:×: j°F×:×:Ó: j×:×:×:×:×:Ð:°F×:×:Ó:°F×:×:×:×:×:×:×:×:×:×:×:×:×:Õ:r9   c                ó”  — t        | d«      }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  }t        t        j                  |«      «      ‚d }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  }t        t        j                  |«      «      ‚d }y )NrW   rT   r�   r   r/   r‚   rƒ   rC   r   r„   r   )r   r   r'   r(   r)   r*   r+   r,   r-   r.   r   )r[   r/   r0   r�   rG   s        r7   ÚFtest_doctor_json_reports_workspace_confinement_and_not_the_stale_claimr–   x   sæ   € ô ˜( HÓ-€FÜ ¨Ð.×.×.Õ.Ô ¨×.×.×.×.×.Ñ.Ô ×.×.Ó.Ô ×.×.×.×.×.Ò.¨×.×.Ó.¨×.×.×.×.×.×.Ñ.Ü&¨&Ð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Ò0r9   c                óÒ  — t        | «      }t        d„ |j                  «       D «       «      }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  }t        t	        j                  |«      «      ‚d }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  }t        t	        j                  |«      «      ‚d }y )Nc              3  ó`   K  — | ]&  }|j                  «       j                  d «      sŒ#|–— Œ( y­w)zWARN  sandbox_limitsN)ÚlstripÚ
startswith)Ú.0Úlines     r7   ú	<genexpr>zXtest_doctor_sandbox_limits_check_does_not_claim_unconfined_workspaces.<locals>.<genexpr>„   s$   è ø€ Òp ¸t¿{¹{»}×?WÑ?WÐXnÕ?o”tÑpùs   ‚$.§.rT   r�   r   Úsandbox_rowr‚   rƒ   rC   r   r„   r   )r   ÚnextÚ
splitlinesr   r'   r(   r)   r*   r+   r,   r-   r.   r   )r[   r/   rž   r0   r�   rG   s         r7   ÚEtest_doctor_sandbox_limits_check_does_not_claim_unconfined_workspacesr¡   €   sý   € ô ˜(Ó#€FÜÑp¨×(9Ñ(9Ó(;ÔpÓp€KÜ ¨Ð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Ü&¨+Ð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Ò5r9   c           	     ó\	  — t        | «      }|j                  }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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  d
   }t        | «      }t        |«      }	||	k(  }
|
�sSt        j                  d|
fd||	f«      t        j                  |«      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                  | «      rt        j                  | «      ndt        j                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}
x}}	|j                  d   }d}||u }
|
slt        j                  d|
fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}
}|j                  }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t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}y )Nr   r   )z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)sr   r   r   r   Úwarn©z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sÚpath)zN%(py1)s == %(py9)s
{%(py9)s = %(py3)s(%(py7)s
{%(py7)s = %(py4)s(%(py5)s)
})
}r   r[   )r    r!   rC   r   r   rg   rh   ri   ÚexistsF©Úis©z%(py1)s is %(py4)s©r    rC   rD   rE   r   ©z.%(py0)s in %(py4)s
{%(py4)s = %(py2)s.detail
}r   rB   )r   Únamer'   r(   r)   r*   r+   r,   r-   r.   ÚstatusÚmetadatar   r   Údetailr   )r[   r   r0   r1   r2   r3   r4   r5   ru   rv   r6   rw   rx   rG   rH   s                  r7   Ú5test_workspaces_root_check_warns_when_root_is_missingr°   ‰   s’  € Ü# HÓ-€FØ�;‰;Ð+Ð+Ð+ˆ;Ð+Ñ+×+×+Õ+ˆ;Ð+×+×+×+×+×+Ñ+ˆ6×+×+Ó+ˆ6×+×+Ô+ˆ;×+×+Ò+Ð+×+×+×+×+×+×+Ó+Ø�=‰=Ð"˜FÐ"ˆ=˜FÑ"×"×"Õ"ˆ=˜F×"×"×"×"×"Ñ"ˆ6×"×"Ó"ˆ6×"×"Ô"ˆ=×"×"Ò"˜F×"×"×"×"×"×"Ó"Ø�?‰?˜6Ñ"ÐD¬/¸(Ó*CÐD¤cÐ*CÓ&DÐDÐ"Ð&DÑD×D×DÖDÐ"Ð&D×D×DÓDÐ"×D×D×D×D×DÐD¤c×D×DÓD¤c×D×D×D×D×DÒD¬/×D×DÓD¬/×D×D×D×D×DÒD¸(×D×DÓD¸(×D×DÔDÐ*C×D×DÒDÐ&D×D×D×D×D×D×DÕDØ�?‰?˜8Ñ$Ð-¨Ð-Ð$¨Ð-×-×-Õ-Ð$¨×-×-Ó-Ð$×-×-Ò-¨×-×-×-×-×-×-Ó-Ø*0¯-©-Ð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Ò7r9   c                ó|  — t        | «      }|j                  d¬«       |j                  d«       t        | «      }|j                  }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                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  d   }d}t        |«      }	||	k(  }
|
sÉt        j                  d|
fd||	f«      t        j                  |«      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}
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}
}|j                  }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t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}y )NT©Úparentséí  r£   r   r¤   r   r   r   r   Úmode©z0%(py1)s == %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}Úoct©r    r!   r   r   úassert %(py9)srg   z
owner-onlyr   )z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.detail
}r   r«   r   rB   rD   rE   ©r   ÚmkdirÚchmodr   r­   r'   r(   r)   r*   r+   r,   r-   r.   r®   r·   r¯   r   ©r[   Úrootr   r0   r1   r2   r3   r4   r5   ru   r6   rw   rG   rH   s                 r7   Ú<test_workspaces_root_check_warns_when_root_is_world_readabler¿   ’   s  € Ü˜8Ó$€DØ‡J�J�t€JÔØ‡J�JˆuÔÜ# HÓ-€FØ�=‰=Ð"˜FÐ"ˆ=˜FÑ"×"×"Õ"ˆ=˜F×"×"×"×"×"Ñ"ˆ6×"×"Ó"ˆ6×"×"Ô"ˆ=×"×"Ò"˜F×"×"×"×"×"×"Ó"Ø�?‰?˜6Ñ"Ð0¨%Ð0¤c¨%£jÐ0Ð" jÑ0×0×0Õ0Ð" j×0×0Ó0Ð"×0×0×0×0×0Ð0¤c×0×0Ó0¤c×0×0Ô0¨%×0×0Ò0 j×0×0×0×0×0×0Õ0ØÐ(˜6Ÿ=™=Ð(ˆ<˜=Ð(×(×(Õ(ˆ<˜=×(×(Ó(ˆ<×(×(×(×(×(Ð(˜6×(×(Ó(˜6×(×(Ô(˜=×(×(×(×(×(×(Ó(Ø*0¯-©-Ð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Ò7r9   c                óî  — t        | «      }|j                  d¬«       |j                  d«       t        | «      }|j                  }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                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  d   }d}t        |«      }	||	k(  }
|
sÉt        j                  d|
fd||	f«      t        j                  |«      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}
x}}	|j                  }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t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}y )NTr²   éÀ  Úpassr   r¤   r   r   r   r   rµ   r¶   r·   r¸   r¹   rg   r   r«   r   rB   rD   rE   rº   r½   s                 r7   Ú9test_workspaces_root_check_passes_when_root_is_owner_onlyrÃ   �   s¦  € Ü˜8Ó$€DØ‡J�J�t€JÔØ‡J�JˆuÔÜ# HÓ-€FØ�=‰=Ð"˜FÐ"ˆ=˜FÑ"×"×"Õ"ˆ=˜F×"×"×"×"×"Ñ"ˆ6×"×"Ó"ˆ6×"×"Ô"ˆ=×"×"Ò"˜F×"×"×"×"×"×"Ó"Ø�?‰?˜6Ñ"Ð0¨%Ð0¤c¨%£jÐ0Ð" jÑ0×0×0Õ0Ð" j×0×0Ó0Ð"×0×0×0×0×0Ð0¤c×0×0Ó0¤c×0×0Ô0¨%×0×0Ò0 j×0×0×0×0×0×0Õ0Ø*0¯-©-Ð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Ò7r9   c                óô  — |dz  }|j                  «        |j                  d«       | j                  t        t	        |«      «       t        |«      }|j                  }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                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  d
   }	t	        |«      }
|	|
k(  }|söt        j                  d|fd|	|
f«      t        j                  |	«      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t        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}}
|j                  d   }	|	t        k(  }|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}	}y )NÚ	elsewhererÁ   rÂ   r   r¤   r   r   r   r   r¥   ©z0%(py1)s == %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}r   Ú
configured©r    r!   rC   rE   úassert %(py8)sÚpy8Úsource)z%(py1)s == %(py3)sr	   ©r    r!   rm   r   )r»   r¼   rY   r	   r   r   r­   r'   r(   r)   r*   r+   r,   r-   r.   r®   )rZ   r[   rÇ   r   r0   r1   r2   r3   r4   r5   Ú@py_assert5r6   rH   Ú@py_format9r{   s                  r7   Ú2test_workspaces_root_check_honours_configured_rootrÏ   §   sµ  € ð ˜KÑ'€JØ×ÑÔØ×Ñ�UÔØ×ÑÔ*¬C°
«OÔ<Ü# HÓ-€FØ�=‰=Ð"˜FÐ"ˆ=˜FÑ"×"×"Õ"ˆ=˜F×"×"×"×"×"Ñ"ˆ6×"×"Ó"ˆ6×"×"Ô"ˆ=×"×"Ò"˜F×"×"×"×"×"×"Ó"Ø�?‰?˜6Ñ"Ð5¤c¨*£oÐ5Ð" oÑ5×5×5Õ5Ð" o×5×5Ó5Ð"×5×5×5×5×5Ð5¤c×5×5Ó5¤c×5×5×5×5×5Ò5¨*×5×5Ó5¨*×5×5Ô5 o×5×5×5×5×5×5Ó5Ø�?‰?˜8Ñ$Ð;Ð$Ô(;Ñ;×;×;Õ;Ð$Ô(;×;×;Ó;Ð$×;×;×;×;×;Ð;Ô(;×;×;Ó;Ô(;×;×;×;×;×;×;Ô;r9   c                óh  — t        | «      }|j                  }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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}t        | «      }|j                  } |«       }| }	|	sêd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
t        j                  |«      t        j                  |«      t        j                  |«      dœz  }
t        t        j                  |
«      «      ‚d x}x}x}}	d}| |z  }|j                  } |«       }| }	|	s¡dd
t	        j
                  «       v st        j                  | «      rt        j                  | «      nd
t        j                  |«      t        j                  |«      t        j                  |«      dœz  }
t        t        j                  |
«      «      ‚d x}x}x}x}}	y )Nr£   r   r¤   r   r   r   r   zcassert not %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.exists
}()
}r   r[   )r   r    r!   r   r   zcyberbrain.sqlite3zQassert not %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
})r   r   r   r   )r   r­   r'   r(   r)   r*   r+   r,   r-   r.   r   r¦   )r[   r   r0   r1   r2   r3   r4   r6   ru   rv   rÎ   s              r7   Ú1test_workspaces_root_check_never_creates_the_rootrÑ   ´   s�  € Ü# HÓ-€FØ�=‰=Ð"˜FÐ"ˆ=˜FÑ"×"×"Õ"ˆ=˜F×"×"×"×"×"Ñ"ˆ6×"×"Ó"ˆ6×"×"Ô"ˆ=×"×"Ò"˜F×"×"×"×"×"×"Ó"Ü˜xÓ(Ð1Ð(×/Ñ/Ð1Ñ/Ó1Ð1Ð1Ð1Ð1Ñ1×1×1×1×1Õ1Œ×1×1Ó1Œ×1×1×1×1×1Ò1˜x×1×1Ó1˜x×1×1Ô1Ð(×1×1Ò1Ð/×1×1Ò1Ð1×1×1×1×1×1Ö1Ø/Ð9�Ð/Ñ/Ð9Ð/×7Ñ7Ð9Ñ7Ó9Ð9Ð9Ð9Ð9Ñ9×9×9×9×9Õ9�×9×9Ó9�×9×9Ô9Ð/×9×9Ò9Ð7×9×9Ò9Ð9×9×9×9×9×9×9Ñ9r9   c                ó¼  — t        | ¬«      D �cg c]  }|j                  ‘Œ }}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}}|j                  }d	} ||«      }	|j                  }
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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}	x}x}
x}}d}t        | «      }	||	v }|söt        j                  d|fd||	f«      t        j                  |«      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t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}	y c c}w )Nrj   r   r   )z%(py1)s in %(py3)sÚnamesrÌ   rm   r   Úsandbox_limits)ú<)zˆ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.index
}(%(py4)s)
} < %(py14)s
{%(py14)s = %(py10)s
{%(py10)s = %(py8)s.index
}(%(py12)s)
})r   r   rC   rE   rÊ   r‡   rˆ   r‰   zassert %(py16)sÚpy16)z0%(py1)s in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}r   r[   rÈ   rÉ   rÊ   )r   r¬   r'   r(   r,   r)   r*   r+   r-   r.   Úindexr   )r[   rK   rÓ   r5   r6   r{   r3   r0   r2   rÍ   rŽ   r�   Ú@py_assert13Ú@py_assert7r‘   Ú@py_format17rH   rÎ   s                     r7   Ú/test_workspaces_root_check_is_reported_in_orderrÛ   »   sü  € Ü%/¸Ô%BÖC˜EˆU�Z‹ZÐC€EÐCØÐ%Ð Ð%×%×%Õ%Ð ×%×%Ó%Ð×%×%×%×%×%Ð% ×%×%Ó% ×%×%×%×%×%×%Ó%Ø�;‰;ÐIÐ'ÐI‰;Ð'Ó(ÐI¨5¯;©;ÐIÐ7HÐI©;Ð7HÓ+IÐIÐ(Ð+IÑI×I×IÖIÐ(Ð+I×I×I×I×I×IÑIˆ5×I×IÓIˆ5×I×IÔIˆ;×I×IÒIÐ'×I×IÒIÐ(×I×I×I×I×IÐI¨5×I×IÓI¨5×I×IÔI¨;×I×IÒIÐ7H×I×IÒIÐ+I×I×I×I×I×I×I×IÓIØÐ6¤¨XÓ 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¨X×6×6Ó6¨X×6×6Ô6Ð 6×6×6×6×6×6×6Ô6ùò Ds   �Mc           	     ó€  — t        |«      }|j                  d¬«       |j                  d«       | j                  t        t        |«      «       t        j                  t        dddt        |«      dg«      }|j                  }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                  |«      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}
}t        j                  t        dddt        |«      ddg«      }|j                  }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                  |«      dœz  }dd|iz  }t!        t        j"                  |«      «      ‚d x}x}}t'        j(                  |j$                  «      }t+        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   }	t        |«      }|	|k(  }
|
söt        j                  d	|
fd|	|f«      t        j                  |	«      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!t        j                  |«      d"œz  }d#d$|iz  }t!        t        j"                  |«      «      ‚d x}	x}
}|d%   }	d}|	|u }
|
slt        j                  d&|
fd'|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t!        t        j"                  |«      «      ‚d x}	x}
}|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}
}y )*NTr²   r´   r"   rK   rP   z--strictrR   r   r   Ústrict_resultr   r   r   zWARN  workspaces_rootr   r   r   rW   Újson_resultc              3  ó2   K  — | ]  }|d    dk(  sŒ|–— Œ y­w)r¬   r   N© )r›   Úitems     r7   r�   zItest_workspaces_root_row_counts_toward_strict_and_json.<locals>.<genexpr>Ó   s   è ø€ ÒW˜°T¸&±\ÐEVÓ5VŒtÑWùs   ‚�Úchecksr­   r£   )z%(py1)s == %(py4)srª   rD   rE   r®   r¥   rÆ   r   r¾   rÈ   rÉ   rÊ   Ústrictr§   r©   Úoverall_statusÚfail)r   r»   r¼   rY   r	   r   r$   r%   r   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   ÚjsonÚloadsrŸ   )rZ   r[   r¾   rÝ   r0   r1   r2   r3   r4   r5   r6   rÞ   ÚpayloadÚrowrG   rH   rÍ   rÎ   s                     r7   Ú6test_workspaces_root_row_counts_toward_strict_and_jsonrê   Â   s”  € ô ˜8Ó$€DØ‡J�J�t€JÔØ‡J�JˆuÔØ×ÑÔ*¬C°«IÔ6Ü—M‘MÜˆh˜ ¬s°8«}¸jÐIó€Mð ×"Ñ"Ð' aÐ'Ð" aÑ'×'×'Õ'Ð" a×'×'×'×'×'Ñ'ˆ=×'×'Ó'ˆ=×'×'Ô'Ð"×'×'Ò' a×'×'×'×'×'×'Ó'Ø"Ð: m×&:Ñ&:Ð:Ð"Ð&:Ð:×:×:Õ:Ð"Ð&:×:×:Ó:Ð"×:×:×:×:×:Ð: m×:×:Ó: m×:×:Ô:Ð&:×:×:×:×:×:×:Ó:Ü—-‘-Üˆh˜ ¬s°8«}¸hÈ
ÐSó€Kð × Ñ Ð% AÐ%Ð  AÑ%×%×%Õ%Ð  A×%×%×%×%×%Ñ%ˆ;×%×%Ó%ˆ;×%×%Ô%Ð ×%×%Ò% A×%×%×%×%×%×%Ó%Ü�j‰j˜×+Ñ+Ó,€GÜ
ÑW ¨Ñ 1ÔWÓ
W€CØˆx‰=Ð"˜FÐ"ˆ=˜FÑ"×"×"Õ"ˆ=˜F×"×"Ó"ˆ=×"×"Ò"˜F×"×"×"×"×"×"Ó"Øˆz‰?˜6Ñ"Ð/¤c¨$£iÐ/Ð" iÑ/×/×/Õ/Ð" i×/×/Ó/Ð"×/×/×/×/×/Ð/¤c×/×/Ó/¤c×/×/×/×/×/Ò/¨$×/×/Ó/¨$×/×/Ô/ i×/×/×/×/×/×/Ó/Ø�8ÑÐ$ Ð$Ð Ð$×$×$Õ$Ð ×$×$Ó$Ð×$×$Ò$ ×$×$×$×$×$×$Ó$ØÐ#Ñ$Ð.¨Ð.Ð$¨Ñ.×.×.Õ.Ð$¨×.×.Ó.Ð$×.×.Ò.¨×.×.×.×.×.×.Ô.r9   )ÚreturnÚNone)rZ   zpytest.MonkeyPatchr[   r   rë   rì   )r[   r   rë   rì   )r[   r   r~   r   rë   r   ).Ú__doc__Ú
__future__r   Úbuiltinsr)   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter'   ræ   rp   Úpathlibr   ÚpytestÚtyper.testingr   Úcyberbrain26.clir   Úcyberbrain26.product.doctorr   r   Ú cyberbrain26.product.local_storer	   r
   r   r$   r   Ú__annotations__r   r8   rI   rM   r\   rd   r|   r   r”   r–   r¡   r°   r¿   rÃ   rÏ   rÑ   rÛ   rê   rà   r9   r7   ú<module>rú      s  ðÚ Eå "ç  „ ƒÛ Ý ã Ý #å  ß J÷ñ ñ 
‹€ð
 4Ð �sÓ 3à#KÐ ˜SÓ Kó%ó$ó$ð2Ø#ð2Ø/3ð2à	ó2ó,óó<ð;Øð;à	ó;ð1Øð1à	ó1ð6Øð6à	ó6ó8ó8ó8ð
<Ø#ð
<Ø/3ð
<à	ó
<ó:ó7ð/Ø#ð/Ø/3ð/à	ô/r9   