Ë
    çµêjî3  ã                  óJ  — 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
mZ ddlZddlmZ ddlmZmZmZmZmZmZmZmZmZmZm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*d!d„Z+d!d„Z,d!d„Z-d!d„Z.d d„Z/d!d„Z0d d„Z1d d„Z2y)#aÓ  Independent memory tests for knowledge plane components.

These tests run without external services (Ollama, LanceDB daemon). They cover:

- TextChunker: text splitting into chunks
- DeduplicationEngine: content-hash and URL duplicate detection
- KnowledgeNavigator: topic/tag navigation, clustering, keyword search
- SQLiteKnowledgeRepository: idempotent metadata persistence
- EmbeddingConfig: configuration validation
- KnowledgeDocument/KnowledgeSource contracts
é    )ÚannotationsN)ÚPath)ÚSQLiteDatabase)ÚDeduplicationEngineÚDocumentRegistrationÚDocumentStatusÚDocumentTrustÚEmbeddingConfigÚKnowledgeDocumentÚKnowledgeNavigatorÚKnowledgeSourceÚSensitivityÚSQLiteKnowledgeRepositoryÚTextChunkerc                 óZ   — t        ddt        j                  t        j                  d¬«      S )Nzlocal-noteszfile:///knowledge/notesT)Ú	source_idÚ
source_uriÚtrustÚsensitivityÚapproved)r   r	   ÚREVIEWEDr   ÚPERSONAL© ó    ú?/home/oem/CyberBrain26-unified/tests/test_independent_memory.pyÚ_approved_sourcer   )   s*   € ÜØØ,Ü×$Ñ$Ü×(Ñ(Øôð r   c                 ó   — t        dd¬«      S )NÚunknownzfile:///unknown©r   r   )r   r   r   r   Ú_unapproved_sourcer    3   s   € ÜØØ$ôð r   c                 óH  — t        dd¬«      } t        | «      }|j                  dd¬«      }t        |«      }d}||kD  }|söt	        j
                  d|fd	||f«      d
t        j                  «       v st	        j                  t        «      rt	        j                  t        «      nd
dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}d„ |D «       }t        |«      }	|	s•ddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      t	        j                  |	«      dœz  }
t        t	        j                  |
«      «      ‚d x}}	d„ t        |«      D «       }t        |«      }	|	s•ddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      t	        j                  |	«      dœz  }
t        t	        j                  |
«      «      ‚d x}}	y )Né   é   ©Úchunk_size_tokensÚchunk_overlap_tokensúdword word word word word word word word word word word word word word word word word word word word ú<memory>©Úsource_pathé   ©ú>©z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sÚlenÚchunks©Úpy0Úpy1Úpy3Úpy6úassert %(py8)sÚpy8c              3  óP   K  — | ]  }t        |j                  t        «      –— Œ  y ­w©N)Ú
isinstanceÚtextÚstr)Ú.0Úcs     r   ú	<genexpr>zEtest_chunker_splits_long_text_into_multiple_chunks.<locals>.<genexpr>D   s   è ø€ Ò7¨1Œz˜!Ÿ&™&¤#×&Ñ7ùs   ‚$&ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall©r2   Úpy2Úpy4c              3  ó@   K  — | ]  \  }}|j                   |k(  –— Œ y ­wr9   )Úchunk_index)r=   Úir>   s      r   r?   zEtest_chunker_splits_long_text_into_multiple_chunks.<locals>.<genexpr>E   s   è ø€ Ò@¡d a¨ˆq�}‰} Õ!Ñ@ùs   ‚)r
   r   Ú
chunk_textr/   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationrA   Ú	enumerate)ÚconfigÚchunkerr0   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9Ú@py_assert1Ú@py_assert3Ú@py_format5s              r   Ú2test_chunker_splits_long_text_into_multiple_chunksr\   ?   s{  € Ü¨qÀqÔI€FÜ˜&Ó!€GØ×Ñ ¸*ÐÓE€FÜˆv‹;Ð˜Ðˆ;˜‰?××Õˆ;˜×××××ÑŒ3××ÓŒ3×××××Òˆv××Óˆv××Ôˆ;××Ò˜××××××ÓÙ7°Ô7Ð7Œ3Ð7Ó7Ð7Ñ7×7×7×7×7Õ7Œ3×7×7Ó7Œ3×7×7Ô7Ð7×7×7Ò7Ð7×7×7×7×7×7Ò7Ù@¬i¸Ó.?Ô@Ð@Œ3Ð@Ó@Ð@Ñ@×@×@×@×@Õ@Œ3×@×@Ó@Œ3×@×@Ô@Ð@×@×@Ò@Ð@×@×@×@×@×@Ó@r   c                 ó  — t        dd¬«      } t        | «      }|j                  dd¬«      }t        |«      }d}||kD  }|söt	        j
                  d|fd||f«      d	t        j                  «       v st	        j                  t        «      rt	        j                  t        «      nd	d
t        j                  «       v st	        j                  |«      rt	        j                  |«      nd
t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}|d   }|j                  }d}||k(  }|s€t	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}x}}|d   }|j                  }d}||k(  }|s€t	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}x}}y )Né   r+   r$   zone two three four five sixr(   r)   r,   r.   r/   r0   r1   r6   r7   r   zone two three four©ú==)z,%(py3)s
{%(py3)s = %(py1)s.text
} == %(py6)s©r3   r4   r5   zfour five six)r
   r   rH   r/   rI   rJ   rK   rL   rM   rN   rO   rP   r;   )	rR   rS   r0   rT   rU   rV   rW   rX   Ú@py_assert0s	            r   Útest_chunker_overlap_preservedrc   H   s�  € Ü¨qÀqÔI€FÜ˜&Ó!€GØ×ÑÐ =È:ÐÓV€FÜˆv‹;Ð˜Ðˆ;˜‰?××Õˆ;˜×××××ÑŒ3××ÓŒ3×××××Òˆv××Óˆv××Ôˆ;××Ò˜××××××ÓØ�!‰9Ð1ˆ9�>‰>Ð1Ð1Ð1ˆ>Ð1Ñ1×1×1Õ1ˆ>Ð1×1×1Ó1ˆ9×1×1Ò1ˆ>×1×1Ò1Ð1×1×1×1×1×1×1Õ1Ø�!‰9Ð,ˆ9�>‰>Ð,˜_Ð,ˆ>˜_Ñ,×,×,Õ,ˆ>˜_×,×,Ó,ˆ9×,×,Ò,ˆ>×,×,Ò,˜_×,×,×,×,×,×,Ö,r   c                 óz  — t        dd¬«      } t        | «      }|j                  d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
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}}y )Nr"   é
   r$   za b c d e f g h i jr(   r)   r+   r_   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr/   r0   r1   r6   r7   )r
   r   rH   r/   rI   rJ   rK   rL   rM   rN   rO   rP   )rR   rS   r0   rT   rU   rV   rW   rX   s           r   Ú=test_chunker_overlap_not_exceeding_size_produces_single_chunkrg   Q   sº   € Ü¨qÀrÔJ€FÜ˜&Ó!€GØ×ÑÐ 5À:ÐÓN€FÜˆv‹;Ð˜!Ðˆ;˜!Ñ××Õˆ;˜!×××××ÑŒ3××ÓŒ3×××××Òˆv××Óˆv××Ôˆ;××Ò˜!××××××Ôr   c                ó
  ‡— | dz  Š‰j                  dd¬«       t        dd¬«      }t        |«      }|j                  ‰«      }t	        |«      }d}||kD  }|söt        j                  d	|fd
||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}ˆfd„|D «       }	t        |	«      }
|
s•ddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |	«      t        j                  |
«      dœz  }t        t        j                  |«      «      ‚d x}	}
y )Nztest.txtr'   zutf-8)Úencodingr"   r#   r$   r+   r,   r.   r/   r0   r1   r6   r7   c              3  óN   •K  — | ]  }|j                   t        ‰«      k(  –— Œ y ­wr9   )r*   r<   )r=   r>   Ú	file_paths     €r   r?   z)test_chunker_from_file.<locals>.<genexpr>_   s   øè ø€ Ò?°1ˆq�}‰}¤ I£Õ.Ñ?ùs   ƒ"%r@   rA   rB   )Ú
write_textr
   r   Ú
chunk_filer/   rI   rJ   rK   rL   rM   rN   rO   rP   rA   )Útmp_pathrR   rS   r0   rT   rU   rV   rW   rX   rY   rZ   r[   rk   s               @r   Útest_chunker_from_filero   X   s0  ø€ Ø˜:Ñ%€IØ×Ñ˜°ÐÔ8Ü¨qÀqÔI€FÜ˜&Ó!€GØ×Ñ 	Ó*€FÜˆv‹;Ð˜Ðˆ;˜‰?××Õˆ;˜×××××ÑŒ3××ÓŒ3×××××Òˆv××Óˆv××Ôˆ;××Ò˜××××××ÓÛ?¸Ô?Ð?Œ3Ð?Ó?Ð?Ñ?×?×?×?×?Õ?Œ3×?×?Ó?Œ3×?×?Ô?Ð?×?×?Ò?Ð?×?×?×?×?×?Ó?r   c                óÄ   — t        | d|t        j                  |«      j                  «       dt        j
                  t        j                  t        j                  i dd¬«      S )NÚsrc1ú
text/plainç        ©Údocument_idr   r   Úcontent_sha256Ú
media_typer   r   ÚstatusÚmetadataÚ
created_atÚ
updated_at)
r   ÚhashlibÚsha256Ú	hexdigestr	   ÚEXTERNALr   r   r   Ú
REGISTERED)ru   Úcontentr   s      r   Ú_docr‚   g   sT   € ÜØØØÜ—~‘~ gÓ.×8Ñ8Ó:ØÜ×$Ñ$Ü×(Ñ(Ü×(Ñ(ØØØôð r   c                 ó:  — t        «       } d}t        d|d«      }| j                  |d|g«      }|j                  }d}||u }|s­t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }d	d
|iz  }t        t	        j                  |«      «      ‚d x}x}}|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                  }	t        |	«      }d}
||
k(  }|�s
t	        j
                  d|fd||
f«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      nddt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |	«      t	        j                  |«      t	        j                  |
«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}	x}x}}
|j                  d   }|j                  }	d}|	|k(  }|s€t	        j
                  d|fd|	|f«      t	        j                  |«      t	        j                  |	«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}	x}}y )Nó   hello worldÚdoc1úfile:///test.txtT©Úis©z4%(py2)s
{%(py2)s = %(py0)s.is_duplicate
} is %(py5)sÚresult©r2   rC   Úpy5úassert %(py7)sÚpy7Úskipr_   ©z:%(py2)s
{%(py2)s = %(py0)s.recommended_action
} == %(py5)sr+   )zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.candidates
})
} == %(py8)sr/   )r2   r3   r4   rŒ   r7   zassert %(py10)sÚpy10r   Ú
exact_hash)z2%(py3)s
{%(py3)s = %(py1)s.match_type
} == %(py6)sra   r6   r7   )r   r‚   Úcheck_duplicateÚis_duplicaterI   rJ   rK   rL   rM   rN   rO   rP   Úrecommended_actionÚ
candidatesr/   Ú
match_type)Úenginer�   ÚdocrŠ   rY   rV   rZ   Ú@py_format6Ú@py_format8rT   Ú@py_assert7Ú@py_assert6rX   Ú@py_format11rb   rU   rW   s                    r   Útest_deduplication_exact_hashrŸ   w   s1  € Ü Ó"€FØ€GÜ
ˆv�wÐ 2Ó
3€CØ×#Ñ# GÐ-?À#ÀÓG€FØ×ÑÐ& $Ð&Ð $Ð&×&×&Õ&Ð $×&×&×&×&×&Ñ&ˆ6×&×&Ó&ˆ6×&×&Ô&Ð×&×&Ò& $×&×&×&×&×&×&Ó&Ø×$Ñ$Ð.¨Ð.Ð$¨Ñ.×.×.Õ.Ð$¨×.×.×.×.×.Ñ.ˆ6×.×.Ó.ˆ6×.×.Ô.Ð$×.×.Ò.¨×.×.×.×.×.×.Ó.Ø× Ñ Ð&Œ3Ð Ó!Ð& QÐ&Ð! QÑ&×&×&Ö&Ð! Q×&×&×&×&×&Ñ&Œ3×&×&Ó&Œ3×&×&×&×&×&Ò&ˆv×&×&Ó&ˆv×&×&Ô&Ð ×&×&Ò&Ð!×&×&Ò& Q×&×&×&×&×&×&Õ&Ø×Ñ˜QÑÐ:Ð×*Ñ*Ð:¨lÐ:Ð*¨lÑ:×:×:Õ:Ð*¨l×:×:Ó:Ð×:×:Ò:Ð*×:×:Ò:¨l×:×:×:×:×:×:Ö:r   c                 ó`  — t        «       } d}| j                  |dg «      }|j                  }d}||u }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}}|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}}y )Nr„   r†   Fr‡   r‰   rŠ   r‹   r�   rŽ   Úregisterr_   r�   )r   r“   r”   rI   rJ   rK   rL   rM   rN   rO   rP   r•   )r˜   r�   rŠ   rY   rV   rZ   rš   r›   s           r   Útest_deduplication_no_duplicater¢   ‚   s  € Ü Ó"€FØ€GØ×#Ñ# GÐ-?ÀÓD€FØ×ÑÐ' %Ð'Ð %Ð'×'×'Õ'Ð %×'×'×'×'×'Ñ'ˆ6×'×'Ó'ˆ6×'×'Ô'Ð×'×'Ò' %×'×'×'×'×'×'Ó'Ø×$Ñ$Ð2¨
Ð2Ð$¨
Ñ2×2×2Õ2Ð$¨
×2×2×2×2×2Ñ2ˆ6×2×2Ó2ˆ6×2×2Ô2Ð$×2×2Ò2¨
×2×2×2×2×2×2Ô2r   c                 ó<  — t        «       } g d¢}| j                  |g «      }t        |«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}}|d
   d   }|j                  }d}||u }|s€t        j                  d|fd||f«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}x}}|d   d   }|j                  }d}||u }|s€t        j                  d|fd||f«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}x}}|d   d   }|j                  }d}||u }|s€t        j                  d|fd||f«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}x}}y )N))ó   helloÚurl1)s   worldÚurl2)r¤   Úurl3é   r_   rf   r/   Úresultsr1   r6   r7   r   r+   Fr‡   )z4%(py3)s
{%(py3)s = %(py1)s.is_duplicate
} is %(py6)sra   r#   T)r   Údeduplicate_batchr/   rI   rJ   rK   rL   rM   rN   rO   rP   r”   )	r˜   Úitemsr©   rT   rU   rV   rW   rX   rb   s	            r   Útest_deduplication_batchr¬   Š   sî  € Ü Ó"€FÚH€EØ×&Ñ& u¨bÓ1€GÜˆw‹<Ð˜1Ðˆ<˜1Ñ××Õˆ<˜1×××××ÑŒ3××ÓŒ3×××××Òˆw××Óˆw××Ôˆ<××Ò˜1××××××ÓØ�1‰:�a‰=Ð.ˆ=×%Ñ%Ð.¨Ð.Ð%¨Ð.×.×.Õ.Ð%¨×.×.Ó.ˆ=×.×.Ò.Ð%×.×.Ò.¨×.×.×.×.×.×.Õ.Ø�1‰:�a‰=Ð.ˆ=×%Ñ%Ð.¨Ð.Ð%¨Ð.×.×.Õ.Ð%¨×.×.Ó.ˆ=×.×.Ò.Ð%×.×.Ò.¨×.×.×.×.×.×.Õ.Ø�1‰:�a‰=Ð-ˆ=×%Ñ%Ð-¨Ð-Ð%¨Ð-×-×-Õ-Ð%¨×-×-Ó-ˆ=×-×-Ò-Ð%×-×-Ò-¨×-×-×-×-×-×-Ö-r   c                 ó  — t        «       } t        dddddt        j                  t        j
                  t        j                  dddœd	d	¬
«      }| j                  |«       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                  |«      t        j                  |«      dœz  }dd|iz  }t!        t        j"                  |«      «      ‚d x}x}x}}| j$                  }d}	 ||	«      }
dg}|
|k(  }|sÕt        j                  d|fd|
|f«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      t        j                  |	«      t        j                  |
«      t        j                  |«      dœz  }dd|iz  }t!        t        j"                  |«      «      ‚d x}x}	x}
x}}d}| j&                  } |«       }||v }|sÁt        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      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                  |«      t        j                  |«      dœz  }dd|iz  }t!        t        j"                  |«      «      ‚d x}x}x}}y )Nr…   rq   r†   Úabcrr   Úresearchzai,ml)ÚtopicÚtagsrs   rt   ©Úin©zI%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.get_topics
}()
}Únav©r3   r4   rŒ   rŽ   úassert %(py9)sÚpy9r_   )z\%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_documents_by_topic
}(%(py4)s)
} == %(py9)s©r2   rC   rD   r5   r¸   úassert %(py11)sÚpy11Úai)zK%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.get_all_tags
}()
}Úml)r   r   r	   r   r   r   r   r€   Úadd_documentÚ
get_topicsrI   rJ   rN   rK   rL   rM   rO   rP   Úget_documents_by_topicÚget_all_tags)rµ   r™   rb   rV   r�   rT   r›   Ú@py_format10rY   rZ   rU   Ú@py_assert8rœ   Ú@py_format12s                 r   Útest_navigator_topics_and_tagsrÅ   ™   sˆ  € Ü
Ó
€CÜ
ØØØ%ØØÜ×$Ñ$Ü×(Ñ(Ü×(Ñ(Ø%¨wÑ7ØØô€Cð ×Ñ�SÔØÐ)˜Ÿ™Ð)™Ó)Ð)ˆ:Ð)Ð)×)×)Õ)ˆ:Ð)×)×)Ó)ˆ:×)×)×)×)×)Ð)˜×)×)Ó)˜×)×)Ô)˜×)×)Ò)Ð)×)×)×)×)×)×)Õ)Ø×%Ñ%Ð= jÐ=Ñ% jÓ1Ð=°f°XÐ=Ð1°XÑ=×=×=Õ=Ð1°X×=×=×=×=×=Ñ=ˆ3×=×=Ó=ˆ3×=×=Ô=Ð%×=×=Ò= j×=×=Ò=Ð1×=×=Ò=°X×=×=×=×=×=×=×=ØÐ%�3×#Ñ#Ð%Ñ#Ó%Ð%ˆ4Ð%Ð%×%×%Õ%ˆ4Ð%×%×%Ó%ˆ4×%×%×%×%×%Ð%�3×%×%Ó%�3×%×%Ô%Ð#×%×%Ò%Ð%×%×%×%×%×%×%Õ%ØÐ%�3×#Ñ#Ð%Ñ#Ó%Ð%ˆ4Ð%Ð%×%×%Õ%ˆ4Ð%×%×%Ó%ˆ4×%×%×%×%×%Ð%�3×%×%Ó%�3×%×%Ô%Ð#×%×%Ò%Ð%×%×%×%×%×%×%Ö%r   c                 ó.  — t        «       } t        dddddt        j                  t        j
                  t        j                  ddidd¬	«      }| j                  |«       | j                  d
|g«      }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}}y )Nr…   rq   r†   r®   rr   ÚdescriptionzAI research paperrs   rt   r¼   r²   ©z%(py1)s in %(py3)sr©   ©r3   r4   úassert %(py5)srŒ   )r   r   r	   r   r   r   r   r€   r¾   Úsearch_by_keywordrI   rJ   rN   rK   rL   rM   rO   rP   )rµ   r™   r©   rb   rT   Ú@py_format4rš   s          r   Ú test_navigator_search_by_keywordrÍ   ¯   sÊ   € Ü
Ó
€CÜ
ØØØ%ØØÜ×$Ñ$Ü×(Ñ(Ü×(Ñ(ØÐ!4Ð5ØØô€Cð ×Ñ�SÔØ×#Ñ# D¨3¨%Ó0€GØÐˆ6�WÐ××Õˆ6�W××Óˆ6×××××Ð�W××Ó�W××××××Ôr   c                 óÎ  — t        «       } t        dddddt        j                  t        j
                  t        j                  i dd¬«      t        dd	d
ddt        j                  t        j
                  t        j                  i dd¬«      g}| 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}}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}}y )Nr…   rq   zhttps://example.com/page1r®   rr   rs   rt   Údoc2Úsrc2zhttps://other.com/page2Údefzexample.comr²   rÈ   ÚclustersrÉ   rÊ   rŒ   z	other.com)r   r   r	   r   r   r   r   r€   Úcluster_by_sourcerI   rJ   rN   rK   rL   rM   rO   rP   )rµ   ÚdocsrÒ   rb   rT   rÌ   rš   s          r   Ú test_navigator_cluster_by_sourcerÕ   Ã   sM  € Ü
Ó
€CäØØØ2Ø Ø#Ü×(Ñ(Ü#×,Ñ,Ü!×,Ñ,ØØØô	
ô 	ØØØ0Ø Ø#Ü×(Ñ(Ü#×,Ñ,Ü!×,Ñ,ØØØô	
ð€Dð8 ×$Ñ$ TÓ*€HØÐ$ˆ=˜HÐ$×$×$Õ$ˆ=˜H×$×$Ó$ˆ=×$×$×$×$×$Ð$˜H×$×$Ó$˜H×$×$×$×$×$×$Ó$ØÐ"ˆ;˜(Ð"×"×"Õ"ˆ;˜(×"×"Ó"ˆ;×"×"×"×"×"Ð"˜(×"×"Ó"˜(×"×"×"×"×"×"Ô"r   c                 ó‚  — t        «       } t        dddddt        j                  t        j
                  t        j                  i dd¬«      }| j                  |«       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                  |«      t        j                  |«      dœz  }dd|iz  }t!        t        j"                  |«      «      ‚d x}x}x}}y )Nr…   rq   r†   r®   rr   rs   rt   Úuncategorizedr²   r´   rµ   r¶   r·   r¸   )r   r   r	   r   r   r   r   r€   r¾   r¿   rI   rJ   rN   rK   rL   rM   rO   rP   )rµ   r™   rb   rV   r�   rT   r›   rÂ   s           r   Ú*test_navigator_default_topic_uncategorizedrØ   æ   sÚ   € Ü
Ó
€CÜ
ØØØ%ØØÜ×$Ñ$Ü×(Ñ(Ü×(Ñ(ØØØô€Cð ×Ñ�SÔØÐ.˜cŸn™nÐ.™nÓ.Ð.ˆ?Ð.Ð.×.×.Õ.ˆ?Ð.×.×.Ó.ˆ?×.×.×.×.×.Ð.˜c×.×.Ó.˜c×.×.Ô.˜n×.×.Ò.Ð.×.×.×.×.×.×.Ö.r   c                ó2  — t        | dz  «      }t        |«      }t        «       }d}t        ||dddi¬«      }|j	                  |«      \  }}|j	                  |«      \  }}	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}}
|j                  }|j                  }||k(  }|sît        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }t        j                   }||u }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j"                  }t$        j&                  } ||«      }|j(                  } |«       }||k(  }|�sst        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t$        «      rt        j                  t$        «      nd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}}y )Núknowledge.sqlite3s   Private meeting noterr   Úfilenamezmeeting.txt)Úsourcer�   rw   ry   Tr‡   ©z%(py0)s is %(py3)sÚcreated©r2   r4   rÊ   rŒ   FÚrepeated_createdr_   ©zT%(py2)s
{%(py2)s = %(py0)s.document_id
} == %(py6)s
{%(py6)s = %(py4)s.document_id
}ÚrepeatedÚdocument©r2   rC   rD   r5   r6   r7   )zN%(py2)s
{%(py2)s = %(py0)s.status
} is %(py6)s
{%(py6)s = %(py4)s.REGISTERED
}r   )zª%(py2)s
{%(py2)s = %(py0)s.content_sha256
} == %(py13)s
{%(py13)s = %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py6)s
{%(py6)s = %(py4)s.sha256
}(%(py7)s)
}.hexdigest
}()
}r|   r�   )r2   rC   rD   r5   rŽ   r¸   r»   Úpy13zassert %(py15)sÚpy15)r   r   r   r   r¡   rI   rJ   rK   rL   rM   rN   rO   rP   ru   rx   r   r€   rv   r|   r}   r~   )rn   ÚdatabaseÚ
repositoryrÜ   r�   Úregistrationrã   rÞ   râ   rà   rT   rY   rÌ   rš   rU   rZ   rW   rX   rÃ   Ú@py_assert10Ú@py_assert12Ú@py_format14Ú@py_format16s                          r   Ú#test_repository_register_idempotentrî   þ   sQ  € Ü˜hÐ)<Ñ<Ó=€HÜ*¨8Ó4€JÜÓ€FØ%€GÜ'ØØØØ˜mÐ,ô	€Lð #×+Ñ+¨LÓ9Ñ€HˆgØ!+×!4Ñ!4°\Ó!BÑ€HÐàÐˆ7�dˆ?××Õˆ7�d×××××Ñˆ7××Óˆ7××Ô�d××××××ÑØ$Ð$Ð˜uÐ$×$×$Õ$Ð˜u×$×$×$×$×$Ñ$Ð×$×$Ó$Ð×$×$Ô$˜u×$×$×$×$×$×$Ñ$Ø×ÑÐ7 8×#7Ñ#7Ð7ÐÐ#7Ñ7×7×7Õ7ÐÐ#7×7×7×7×7×7Ñ7ˆ8×7×7Ó7ˆ8×7×7Ô7Ð×7×7×7×7×7Ð7 8×7×7Ó7 8×7×7Ô7Ð#7×7×7×7×7×7×7Ó7Ø�?‰?Ð7œn×7Ñ7Ð7ˆ?Ð7Ð7×7×7Õ7ˆ?Ð7×7×7×7×7×7Ñ7ˆ8×7×7Ó7ˆ8×7×7Ô7ˆ?×7×7×7×7×7Ð7œn×7×7Ó7œn×7×7Ô7Ð7×7×7×7×7×7×7Ó7Ø×"Ñ"ÐI¤g§n¡nÐI¡n°WÓ&=ÐIÐ&=×&GÑ&GÐIÑ&GÓ&IÐIÐ"Ð&IÑI×I×IÖIÐ"Ð&I×I×I×I×I×IÑIˆ8×I×IÓIˆ8×I×IÔIÐ"×I×I×I×I×IÐI¤g×I×IÓI¤g×I×IÔI n×I×I×I×I×IÐI°W×I×IÓI°W×I×IÔIÐ&=×I×IÒIÐ&G×I×IÒIÐ&I×I×I×I×I×I×I×IÒIr   c                ó¦  — t        t        | dz  «      «      }t        «       }|j                  t	        |dd¬«      «      \  }}|j                  t	        |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}}|j                  }|j                  }||k7  }|sît        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }|j                  }||k7  }|sît        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )NrÚ   s   version onerr   ©rÜ   r�   rw   s   version twoTr‡   rÝ   Úfirst_createdrß   rÊ   rŒ   Úsecond_created)ú!=)zT%(py2)s
{%(py2)s = %(py0)s.document_id
} != %(py6)s
{%(py6)s = %(py4)s.document_id
}ÚfirstÚsecondrä   r6   r7   )zZ%(py2)s
{%(py2)s = %(py0)s.content_sha256
} != %(py6)s
{%(py6)s = %(py4)s.content_sha256
})r   r   r   r¡   r   rI   rJ   rK   rL   rM   rN   rO   rP   ru   rv   )rn   rè   rÜ   rô   rñ   rõ   rò   rT   rY   rÌ   rš   rU   rZ   rW   rX   s                  r   Ú.test_repository_changed_content_is_new_versionrö     sK  € Ü*¬>¸(ÐEXÑ:XÓ+YÓZ€JÜÓ€FØ%×.Ñ.Ü F°NÈ|Ô\óÑ€Eˆ=ð (×0Ñ0Ü F°NÈ|Ô\óÑ€FˆNð !Ð ˆ=˜DÐ × × Õ ˆ=˜D× × × × × Ñ ˆ=× × Ó ˆ=× × Ô ˜D× × × × × × Ñ Ø!Ð!ˆ>˜TÐ!×!×!Õ!ˆ>˜T×!×!×!×!×!Ñ!ˆ>×!×!Ó!ˆ>×!×!Ô!˜T×!×!×!×!×!×!Ñ!Ø×ÑÐ2 × 2Ñ 2Ð2ÐÐ 2Ñ2×2×2Õ2ÐÐ 2×2×2×2×2×2Ñ2ˆ5×2×2Ó2ˆ5×2×2Ô2Ð×2×2×2×2×2Ð2 ×2×2Ó2 ×2×2Ô2Ð 2×2×2×2×2×2×2Ó2Ø×ÑÐ8 6×#8Ñ#8Ð8ÐÐ#8Ñ8×8×8Õ8ÐÐ#8×8×8×8×8×8Ñ8ˆ5×8×8Ó8ˆ5×8×8Ô8Ð×8×8×8×8×8Ð8 6×8×8Ó8 6×8×8Ô8Ð#8×8×8×8×8×8×8Ô8r   c                óà   — t        t        | dz  «      «      }t        «       }t        j                  t
        d¬«      5  |j                  t        |dd¬«      «       d d d «       y # 1 sw Y   y xY w)NrÚ   znot approved©Úmatchs   datarr   rð   )r   r   r    ÚpytestÚraisesÚPermissionErrorr¡   r   ©rn   rè   rÜ   s      r   Ú*test_repository_unapproved_source_rejectedrþ   $  s\   € Ü*¬>¸(ÐEXÑ:XÓ+YÓZ€JÜÓ!€FÜ	�‰”¨nÔ	=ñ 
Ø×ÑÜ ¨¸ÈLÔYô	
÷
÷ 
ñ 
úó   ½A$Á$A-c                óà   — t        t        | dz  «      «      }t        «       }t        j                  t
        d¬«      5  |j                  t        |dd¬«      «       d d d «       y # 1 sw Y   y xY w)NrÚ   zcontent must not be emptyrø   r   rr   rð   )r   r   r   rú   rû   Ú
ValueErrorr¡   r   rý   s      r   Ú%test_repository_rejects_empty_contentr  -  s]   € Ü*¬>¸(ÐEXÑ:XÓ+YÓZ€JÜÓ€FÜ	�‰”zÐ)DÔ	Eñ 
Ø×ÑÜ ¨¸ÈÔUô	
÷
÷ 
ñ 
úrÿ   c                óV  — t        t        | dz  «      «      }t        «       }|j                  t	        |dd¬«      «      \  }}|j                  |j                  «      }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}}|j                  }|j                  }
||
k(  }|sît        j                  d|fd||
f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}
|j                  }t         j"                  }
d} |
|«      }|j$                  } |«       }||k(  }|�sFt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      nd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}}y )NrÚ   s   find merr   rð   )úis not)z%(py0)s is not %(py3)sÚ	retrievedrß   rÊ   rŒ   r_   rá   rã   rä   r6   r7   )z¬%(py2)s
{%(py2)s = %(py0)s.content_sha256
} == %(py14)s
{%(py14)s = %(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py6)s
{%(py6)s = %(py4)s.sha256
}(%(py8)s)
}.hexdigest
}()
}r|   )r2   rC   rD   r5   r7   r‘   Úpy12Úpy14zassert %(py16)sÚpy16)r   r   r   r¡   r   Úgetru   rI   rJ   rK   rL   rM   rN   rO   rP   rv   r|   r}   r~   )rn   rè   rÜ   rã   Ú_r  rT   rY   rÌ   rš   rU   rZ   rW   rX   rœ   Ú@py_assert9Ú@py_assert11Ú@py_assert13Ú@py_format15Ú@py_format17s                       r   Ú"test_repository_get_by_document_idr  6  s5  € Ü*¬>¸(ÐEXÑ:XÓ+YÓZ€JÜÓ€FØ×%Ñ%Ü F°JÈ<ÔXó�K€Hˆað —‘˜x×3Ñ3Ó4€IØ Ð ˆ9˜DÐ × × Õ ˆ9˜D× × × × × Ñ ˆ9× × Ó ˆ9× × Ô ˜D× × × × × × Ñ Ø× Ñ Ð8 H×$8Ñ$8Ð8Ð Ð$8Ñ8×8×8Õ8Ð Ð$8×8×8×8×8×8Ñ8ˆ9×8×8Ó8ˆ9×8×8Ô8Ð ×8×8×8×8×8Ð8 H×8×8Ó8 H×8×8Ô8Ð$8×8×8×8×8×8×8Ó8Ø×#Ñ#ÐM¤w§~¡~ÐM°jÐM¡~°jÓ'AÐMÐ'A×'KÑ'KÐMÑ'KÓ'MÐMÐ#Ð'MÑM×M×MÖMÐ#Ð'M×M×M×M×M×MÑMˆ9×M×MÓMˆ9×M×MÔMÐ#×M×M×M×M×MÐM¤w×M×MÓM¤w×M×MÔM ~×M×MÒM°j×M×MÒMÐ'A×M×MÒMÐ'K×M×MÒMÐ'M×M×M×M×M×M×M×MÔMr   c                ó,  — t        t        | dz  «      «      }|j                  }d} ||«      }d }||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )	NrÚ   Údocument_nonexistentr‡   )zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} is %(py9)srè   r¹   rº   r»   )r   r   r	  rI   rJ   rK   rL   rM   rN   rO   rP   )	rn   rè   rY   rZ   rU   rÃ   rœ   rÂ   rÄ   s	            r   Ú,test_repository_get_nonexistent_returns_noner  C  s²   € Ü*¬>¸(ÐEXÑ:XÓ+YÓZ€JØ�>‰>Ð9Ð0Ð9‰>Ð0Ó1Ð9°TÐ9Ð1°TÐ9×9×9Õ9Ð1°T×9×9×9×9×9Ñ9ˆ:×9×9Ó9ˆ:×9×9Ô9ˆ>×9×9Ò9Ð0×9×9Ò9Ð1×9×9Ò9°T×9×9×9×9×9×9×9Ð9r   c                 óx	  — 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
}||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}||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}}y )Nzqwen3-embedding:0.6br_   ©z-%(py2)s
{%(py2)s = %(py0)s.model
} == %(py5)srR   r‹   r�   rŽ   i   ©z2%(py2)s
{%(py2)s = %(py0)s.vector_dim
} == %(py5)si }  )z3%(py2)s
{%(py2)s = %(py0)s.max_context
} == %(py5)sé   ©z9%(py2)s
{%(py2)s = %(py0)s.chunk_size_tokens
} == %(py5)séd   )z<%(py2)s
{%(py2)s = %(py0)s.chunk_overlap_tokens
} == %(py5)s©z5%(py2)s
{%(py2)s = %(py0)s.effective_dim
} == %(py5)s)r
   ÚmodelrI   rJ   rK   rL   rM   rN   rO   rP   Ú
vector_dimÚmax_contextr%   r&   Úeffective_dim)rR   rY   rV   rZ   rš   r›   s         r   Útest_embedding_config_defaultsr  M  sµ  € ÜÓ€FØ�<‰<Ð1Ð1Ð1ˆ<Ð1Ñ1×1×1Õ1ˆ<Ð1×1×1×1×1×1Ñ1ˆ6×1×1Ó1ˆ6×1×1Ô1ˆ<×1×1Ò1Ð1×1×1×1×1×1×1Ó1Ø×ÑÐ$ Ð$Ð Ñ$×$×$Õ$Ð ×$×$×$×$×$Ñ$ˆ6×$×$Ó$ˆ6×$×$Ô$Ð×$×$Ò$ ×$×$×$×$×$×$Ó$Ø×ÑÐ' Ð'Ð Ñ'×'×'Õ'Ð ×'×'×'×'×'Ñ'ˆ6×'×'Ó'ˆ6×'×'Ô'Ð×'×'Ò' ×'×'×'×'×'×'Ó'Ø×#Ñ#Ð* sÐ*Ð# sÑ*×*×*Õ*Ð# s×*×*×*×*×*Ñ*ˆ6×*×*Ó*ˆ6×*×*Ô*Ð#×*×*Ò* s×*×*×*×*×*×*Ó*Ø×&Ñ&Ð-¨#Ð-Ð&¨#Ñ-×-×-Õ-Ð&¨#×-×-×-×-×-Ñ-ˆ6×-×-Ó-ˆ6×-×-Ô-Ð&×-×-Ò-¨#×-×-×-×-×-×-Ó-Ø×ÑÐ' 4Ð'Ð 4Ñ'×'×'Õ'Ð 4×'×'×'×'×'Ñ'ˆ6×'×'Ó'ˆ6×'×'Ô'Ð×'×'Ò' 4×'×'×'×'×'×'Ô'r   c                óh  — t        ddd| dz  ¬«      }|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}||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}}y )Nzcustom-modelr  é   Úcustom_lancedb)r  r  r%   Úlancedb_directoryr_   r  rR   r‹   r�   rŽ   r  r  r  )r
   r  rI   rJ   rK   rL   rM   rN   rO   rP   r  r%   r  )rn   rR   rY   rV   rZ   rš   r›   s          r   Útest_embedding_config_customr$  W  sã  € ÜØØØØ"Ð%5Ñ5ô	€Fð �<‰<Ð)˜>Ð)ˆ<˜>Ñ)×)×)Õ)ˆ<˜>×)×)×)×)×)Ñ)ˆ6×)×)Ó)ˆ6×)×)Ô)ˆ<×)×)Ò)˜>×)×)×)×)×)×)Ó)Ø×ÑÐ# Ð#Ð Ñ#×#×#Õ#Ð ×#×#×#×#×#Ñ#ˆ6×#×#Ó#ˆ6×#×#Ô#Ð×#×#Ò# ×#×#×#×#×#×#Ó#Ø×#Ñ#Ð* sÐ*Ð# sÑ*×*×*Õ*Ð# s×*×*×*×*×*Ñ*ˆ6×*×*Ó*ˆ6×*×*Ô*Ð#×*×*Ò* s×*×*×*×*×*×*Ó*Ø×ÑÐ& 3Ð&Ð 3Ñ&×&×&Õ&Ð 3×&×&×&×&×&Ñ&ˆ6×&×&Ó&ˆ6×&×&Ô&Ð×&×&Ò& 3×&×&×&×&×&×&Ô&r   c                 ó$  — t        dd¬«      } | j                  }d}||u }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}| j                  }t        j                  }||u }|söt        j                  d|fd||f«      dt	        j
                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}| j                  }t        j                  }||u }|söt        j                  d|fd||f«      dt	        j
                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )NÚsz	file:///sr   Fr‡   )z0%(py2)s
{%(py2)s = %(py0)s.approved
} is %(py5)srÜ   r‹   r�   rŽ   )zK%(py2)s
{%(py2)s = %(py0)s.trust
} is %(py6)s
{%(py6)s = %(py4)s.EXTERNAL
}r	   rä   r6   r7   )zQ%(py2)s
{%(py2)s = %(py0)s.sensitivity
} is %(py6)s
{%(py6)s = %(py4)s.PERSONAL
}r   )r   r   rI   rJ   rK   rL   rM   rN   rO   rP   r   r	   r   r   r   r   )	rÜ   rY   rV   rZ   rš   r›   rU   rW   rX   s	            r   Útest_knowledge_source_defaultsr'  i  sª  € Ü s°{ÔC€FØ�?‰?Ð#˜eÐ#ˆ?˜eÐ#×#×#Õ#ˆ?˜e×#×#×#×#×#Ñ#ˆ6×#×#Ó#ˆ6×#×#Ô#ˆ?×#×#Ò#˜e×#×#×#×#×#×#Ó#Ø�<‰<Ð1œ=×1Ñ1Ð1ˆ<Ð1Ð1×1×1Õ1ˆ<Ð1×1×1×1×1×1Ñ1ˆ6×1×1Ó1ˆ6×1×1Ô1ˆ<×1×1×1×1×1Ð1œ=×1×1Ó1œ=×1×1Ô1Ð1×1×1×1×1×1×1Ó1Ø×ÑÐ5¤×!5Ñ!5Ð5ÐÐ!5Ð5×5×5Õ5ÐÐ!5×5×5×5×5×5Ñ5ˆ6×5×5Ó5ˆ6×5×5Ô5Ð×5×5×5×5×5Ð5¤×5×5Ó5¤×5×5Ô5Ð!5×5×5×5×5×5×5Ô5r   c                 ó€  — t        dddddt        j                  t        j                  t
        j                  ddid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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}| j                   }t        j                  }||u }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}| j"                  }t        j                  }||u }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}| j$                  }t
        j                  }||u }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      dt        j                  «       v st        j                  t
        «      rt        j                  t
        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}| j&                  }ddi}||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	}||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}}y )Nr…   rq   r†   r®   rr   ÚkeyÚvalueg     À^@g     €|@rt   r_   )z3%(py2)s
{%(py2)s = %(py0)s.document_id
} == %(py5)sr™   r‹   r�   rŽ   r‡   )zJ%(py2)s
{%(py2)s = %(py0)s.trust
} is %(py6)s
{%(py6)s = %(py4)s.TRUSTED
}r	   rä   r6   r7   )zR%(py2)s
{%(py2)s = %(py0)s.sensitivity
} is %(py6)s
{%(py6)s = %(py4)s.SENSITIVE
}r   )zK%(py2)s
{%(py2)s = %(py0)s.status
} is %(py6)s
{%(py6)s = %(py4)s.INDEXED
}r   )z0%(py2)s
{%(py2)s = %(py0)s.metadata
} == %(py5)s)z2%(py2)s
{%(py2)s = %(py0)s.created_at
} == %(py5)s)z2%(py2)s
{%(py2)s = %(py0)s.updated_at
} == %(py5)s)r   r	   ÚTRUSTEDr   Ú	SENSITIVEr   ÚINDEXEDru   rI   rJ   rK   rL   rM   rN   rO   rP   r   r   rx   ry   rz   r{   )	r™   rY   rV   rZ   rš   r›   rU   rW   rX   s	            r   Ú!test_knowledge_document_roundtripr.  p  sÁ  € Ü
ØØØ%ØØÜ×#Ñ#Ü×)Ñ)Ü×%Ñ%Ø˜Ð!ØØô€Cð �?‰?Ð$˜fÐ$ˆ?˜fÑ$×$×$Õ$ˆ?˜f×$×$×$×$×$Ñ$ˆ3×$×$Ó$ˆ3×$×$Ô$ˆ?×$×$Ò$˜f×$×$×$×$×$×$Ó$Ø�9‰9Ð-œ×-Ñ-Ð-ˆ9Ð-Ð-×-×-Õ-ˆ9Ð-×-×-×-×-×-Ñ-ˆ3×-×-Ó-ˆ3×-×-Ô-ˆ9×-×-×-×-×-Ð-œ×-×-Ó-œ×-×-Ô-Ð-×-×-×-×-×-×-Ó-Ø�?‰?Ð3œ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œk×3×3Ó3œk×3×3Ô3Ð3×3×3×3×3×3×3Ó3Ø�:‰:Ð/œ×/Ñ/Ð/ˆ:Ð/Ð/×/×/Õ/ˆ:Ð/×/×/×/×/×/Ñ/ˆ3×/×/Ó/ˆ3×/×/Ô/ˆ:×/×/×/×/×/Ð/œ×/×/Ó/œ×/×/Ô/Ð/×/×/×/×/×/×/Ó/Ø�<‰<Ð+˜E 7Ð+Ð+ˆ<Ð+Ñ+×+×+Õ+ˆ<Ð+×+×+×+×+×+Ñ+ˆ3×+×+Ó+ˆ3×+×+Ô+ˆ<×+×+Ò+Ð+×+×+×+×+×+×+Ó+Ø�>‰>Ð"˜UÐ"ˆ>˜UÑ"×"×"Õ"ˆ>˜U×"×"×"×"×"Ñ"ˆ3×"×"Ó"ˆ3×"×"Ô"ˆ>×"×"Ò"˜U×"×"×"×"×"×"Ó"Ø�>‰>Ð"˜UÐ"ˆ>˜UÑ"×"×"Õ"ˆ>˜U×"×"×"×"×"Ñ"ˆ3×"×"Ó"ˆ3×"×"Ô"ˆ>×"×"Ò"˜U×"×"×"×"×"×"Ô"r   )Úreturnr   )r/  ÚNone)rn   r   r/  r0  )ru   r<   r�   Úbytesr   r<   r/  r   )3Ú__doc__Ú
__future__r   ÚbuiltinsrK   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterI   r|   Úpathlibr   rú   Ú$cyberbrain26.data_plane.sqlite_storer   Úcyberbrain26.knowledge_planer   r   r   r	   r
   r   r   r   r   r   r   r   r    r\   rc   rg   ro   r‚   rŸ   r¢   r¬   rÅ   rÍ   rÕ   rØ   rî   rö   rþ   r  r  r  r  r$  r'  r.  r   r   r   ú<module>r;     s°   ðñ
õ #ç  „ ƒÝ ã å ?÷÷ ÷ ñ ó(óóAó-óó@óó ;ó3ó.ó&ó,ó( #óF/ó0Jó,9ó 
ó
ó
Nó:ó(ó
'ó$6ô#r   