Ë
    KÞêjÚ  ã                   óÚ   — d 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ZddlmZ ddlmZmZ ddlmZ ddlmZ ej*                  defd	„«       Zd
efd„Zd
efd„Zd
efd„Zd„ Zd
efd„Zy)z¯Tests for graph-based retrieval (MemGraphRAG pattern).

Tests entity relationship graph traversal and document retrieval
through co-occurrence and named entity relationships.
é    N)ÚPath)ÚSQLiteDatabase)ÚKnowledgeDocumentÚDocumentStatus)ÚMemoryService)ÚKnowledgeNavigatorÚreturnc                  ó>  — ddl m}  ddlm} t	        t
        j                  j                  dd«      «      }t	        t
        j                  j                  dd«      «      } | d|d	z  ¬
«      } |t        t        |«      «      ¬«      }t        t        |«      ||d¬«      S )z*Provide a MemoryService with isolated env.r   )ÚEmbeddingConfig)ÚAuditLogÚCYBERBRAIN_DATA_DIRz/tmpÚCYBERBRAIN_DB_PATHz/tmp/cyberbrain.sqlite3i   Úlancedb)Ú
vector_dimÚlancedb_directory)ÚdatabaseF)r   Ú	audit_logÚconfigÚauto_classify)Ú-cyberbrain26.knowledge_plane.embedding_configr   Ú!cyberbrain26.security_plane.auditr   r   ÚosÚenvironÚgetr   Ústrr   )r   r   Údata_dirÚdb_pathr   r   s         úC/home/oem/CyberBrain26-unified/tests/test_knowledge_graph_search.pyÚmsr      s‚   € õ NÝ:ä”B—J‘J—N‘NÐ#8¸&ÓAÓB€HÜ”2—:‘:—>‘>Ð"6Ð8QÓRÓS€Gá¨ÀÈ9Ñ@TÔU€FÙ¤.´°W³Ó">Ô?€IäÜ Ó(ØØØô	ð ó    r   c           	      ó¦  — | j                  ddddddgddg¬«      \  }}| j                  dd	ddd
dgd
dg¬«      \  }}| j                  ddddddgddg¬«      \  }}| j                  d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}}|D �]M  }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}}�ŒP y)&zJTest that MemoryService.graph_search finds documents via entity traversal.s    Apple develops iPhone technologyúmemory://doc1útest-entitiesÚ
technologyÚappleÚiphone©ÚcontentÚ
source_uriÚ	source_idÚtopicÚtagsÚentitiess   Microsoft releases Windows OSzmemory://doc2Ú	microsoftÚwindowss   Google search engine AIzmemory://doc3ÚaiÚgoogleÚsearchÚAppleé
   é   ©ÚlimitÚdepthé   ©ú>=©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sÚlenÚresults©Úpy0Úpy1Úpy3Úpy6úassert %(py8)sÚpy8NÚid©Úin©z%(py1)s in %(py3)sÚr©rA   rB   úassert %(py5)sÚpy5Úscore©Úregister_textÚgraph_searchr=   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)r   Údoc1Ú_Údoc2Údoc3r>   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9rJ   Ú@py_assert0Ú@py_format4Ú@py_format6s                  r   Ú&test_memory_service_graph_search_basicrf   *   s  € à×ÑØ3Ø"Ø!ØØ�xÐ Ø˜8Ð$ð ó �G€Dˆ!ð ×ÑØ0Ø"Ø!ØØ˜9Ð%Ø˜yÐ)ð ó �G€Dˆ!ð ×ÑØ*Ø"Ø!ØØ˜Ð!Ø˜HÐ%ð ó �G€Dˆ!ð �o‰o˜g¨R°qˆoÓ9€GÜˆw‹<Ð˜1Ðˆ<˜1Ñ××Õˆ<˜1×××××ÑŒ3××ÓŒ3×××××Òˆw××Óˆw××Ôˆ<××Ò˜1××××××Óàó ˆØÐˆt�qˆy××Õˆt�q××Óˆt×××××Ð�q××Ó�q××××××ÓØÐˆw˜!ˆ|××Õˆw˜!××Óˆw×××××Ð˜!××Ó˜!××××××Õñr    c                 óL  — | j                  d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)z?Test that graph_search returns empty when no matching entities.ÚNonExistentEntity123r4   r5   r6   r   )ú==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr=   r>   r?   rD   rE   N)
rQ   r=   rR   rS   rT   rU   rV   rW   rX   rY   )r   r>   r^   r_   r`   ra   rb   s          r   Ú)test_memory_service_graph_search_no_matchrj   O   s£   € à�o‰oÐ4¸BÀaˆoÓH€GÜˆw‹<Ð˜1Ðˆ<˜1Ñ××Õˆ<˜1×××××ÑŒ3××ÓŒ3×××××Òˆw××Óˆw××Ôˆ<××Ò˜1××××××Ôr    c           	      óÐ  — | j                  ddddg d¢g d¢¬«      \  }}| j                  dd	d
¬«      }| j                  d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}}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)zBTest that graph_search depth parameter controls traversal breadth.s'   Apple Microsoft partnership AI researchr"   r#   r$   )r%   r.   r0   )r%   r.   r0   Úpartnershipr'   r3   r4   r9   r6   r5   r:   r<   r=   Úresults_shallowr?   rD   rE   NÚresults_deeprO   )
r   rZ   r[   rm   rn   r^   r_   r`   ra   rb   s
             r   Ú.test_memory_service_graph_search_depth_controlro   U   sw  € à×ÑØ:Ø"Ø!ØÚ)Ú<ð ó �G€Dˆ!ð —o‘o g°R¸q�oÓA€OØ—?‘? 7°"¸A�?Ó>€LäˆÓÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$×$×$×$Ñ$Œ3×$×$Ó$Œ3×$×$×$×$×$Ò$ˆ×$×$Ó$ˆ×$×$Ô$Ð×$×$Ò$ 1×$×$×$×$×$×$Ó$Üˆ|ÓÐ! Ð!Ð Ñ!×!×!Õ!Ð ×!×!×!×!×!Ñ!Œ3×!×!Ó!Œ3×!×!×!×!×!Ò!ˆ|×!×!Ó!ˆ|×!×!Ô!Ð×!×!Ò! ×!×!×!×!×!×!Ô!r    c                  ó  — t        «       } t        dddddddt        j                  dd	d
dœt	        j                  «       t	        j                  «       t	        j                  «       dd¬«      }t        dddddddt        j                  ddddœt	        j                  «       t	        j                  «       t	        j                  «       dd¬«      }| j                  |«       | 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}}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}}| j                  d«      }	d}||	v }|s™t        j                  d|fd||	f«      t        j                  |«      dt        j                  «       v st        j                  |	«      rt        j                  |	«      ndd œz  }
d!d"|
iz  }t        t        j                  |«      «      ‚dx}}d}||	v }|s™t        j                  d|fd||	f«      t        j                  |«      dt        j                  «       v st        j                  |	«      rt        j                  |	«      ndd œz  }
d!d"|
iz  }t        t        j                  |«      «      ‚dx}}| j!                  d«      }d}||v }|s™t        j                  d|fd||f«      t        j                  |«      d#t        j                  «       v st        j                  |«      rt        j                  |«      nd#d œz  }
d!d"|
iz  }t        t        j                  |«      «      ‚dx}}d}||v}|s™t        j                  d$|fd%||f«      t        j                  |«      d#t        j                  «       v st        j                  |«      rt        j                  |«      nd#d œz  }
d!d"|
iz  }t        t        j                  |«      «      ‚dx}}| j!                  d«      }d}||v }|s™t        j                  d|fd||f«      t        j                  |«      d&t        j                  «       v st        j                  |«      rt        j                  |«      nd&d œz  }
d!d"|
iz  }t        t        j                  |«      «      ‚dx}}d}||v }|s™t        j                  d|fd||f«      t        j                  |«      d&t        j                  «       v st        j                  |«      rt        j                  |«      nd&d œz  }
d!d"|
iz  }t        t        j                  |«      «      ‚dx}}| j!                  d«      }d}||v }|s™t        j                  d|fd||f«      t        j                  |«      d't        j                  «       v st        j                  |«      rt        j                  |«      nd'd œz  }
d!d"|
iz  }t        t        j                  |«      «      ‚dx}}d}||v }|s™t        j                  d|fd||f«      t        j                  |«      d't        j                  «       v st        j                  |«      rt        j                  |«      nd'd œz  }
d!d"|
iz  }t        t        j                  |«      «      ‚dx}}y)(z>Test that KnowledgeNavigator correctly maintains entity graph.rZ   Útestzfile:///doc1.txtÚabcz
text/plainÚreviewedÚpersonalr$   zapple,microsoftzapple,microsoft,partnership)r+   r,   r-   g        Ú )Údocument_idr*   r)   Úcontent_sha256Ú
media_typeÚtrustÚsensitivityÚstatusÚmetadataÚ
created_atÚ
updated_atÚ
valid_fromÚvalid_toÚsuperseded_byr\   zfile:///doc2.txtÚdefzmicrosoft,windowszmicrosoft,windows,partnershipr%   rG   )zK%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.get_all_tags
}()
}Ú	navigator)rA   rB   rM   Úpy7zassert %(py9)sÚpy9Nr.   rl   rI   Úapple_neighborsrK   rL   rM   Ú
apple_docs)únot in)z%(py1)s not in %(py3)sÚmicrosoft_docsÚpartnership_docs)r   r   r   ÚINDEXEDÚtimeÚadd_documentÚget_all_tagsrR   rS   rW   rT   rU   rV   rX   rY   Úget_entity_neighborsÚget_entity_documents)rƒ   rZ   r\   rc   r`   Ú@py_assert6r^   Ú@py_format8Ú@py_format10r†   rd   re   r‡   r‰   rŠ   s                  r   Ú%test_knowledge_navigator_entity_graphr”   g   sˆ  € ä"Ó$€IäØØØ%ØØØØÜ×%Ñ%à!Ø%Ø5ñ
ô
 —9‘9“;Ü—9‘9“;Ü—9‘9“;ØØô%€Dô* ØØØ%ØØØØÜ×%Ñ%à!Ø'Ø7ñ
ô
 —9‘9“;Ü—9‘9“;Ü—9‘9“;ØØô%€Dð* ×Ñ˜4Ô Ø×Ñ˜4Ô àÐ.�i×,Ñ,Ð.Ñ,Ó.Ð.ˆ7Ð.Ð.×.×.Õ.ˆ7Ð.×.×.Ó.ˆ7×.×.×.×.×.Ð.�i×.×.Ó.�i×.×.Ô.Ð,×.×.Ò.Ð.×.×.×.×.×.×.Õ.ØÐ2˜)×0Ñ0Ð2Ñ0Ó2Ð2ˆ;Ð2Ð2×2×2Õ2ˆ;Ð2×2×2Ó2ˆ;×2×2×2×2×2Ð2˜)×2×2Ó2˜)×2×2Ô2Ð0×2×2Ò2Ð2×2×2×2×2×2×2Õ2ØÐ4˜I×2Ñ2Ð4Ñ2Ó4Ð4ˆ=Ð4Ð4×4×4Õ4ˆ=Ð4×4×4Ó4ˆ=×4×4×4×4×4Ð4˜I×4×4Ó4˜I×4×4Ô4Ð2×4×4Ò4Ð4×4×4×4×4×4×4Õ4à×4Ñ4°WÓ=€OØÐ)ˆ;˜/Ð)×)×)Õ)ˆ;˜/×)×)Ó)ˆ;×)×)×)×)×)Ð)˜/×)×)Ó)˜/×)×)×)×)×)×)Ó)ØÐ+ˆ=˜OÐ+×+×+Õ+ˆ=˜O×+×+Ó+ˆ=×+×+×+×+×+Ð+˜O×+×+Ó+˜O×+×+×+×+×+×+Ó+ð ×/Ñ/°Ó8€JØÐˆ6�ZÐ××Õˆ6�Z××Óˆ6×××××Ð�Z××Ó�Z××××××ÓØÐ#ˆ6˜Ð#×#×#Õ#ˆ6˜×#×#Ó#ˆ6×#×#×#×#×#Ð#˜×#×#Ó#˜×#×#×#×#×#×#Ó#ð ×3Ñ3°KÓ@€NØÐ#ˆ6�^Ð#×#×#Õ#ˆ6�^×#×#Ó#ˆ6×#×#×#×#×#Ð#�^×#×#Ó#�^×#×#×#×#×#×#Ó#ØÐ#ˆ6�^Ð#×#×#Õ#ˆ6�^×#×#Ó#ˆ6×#×#×#×#×#Ð#�^×#×#Ó#�^×#×#×#×#×#×#Ó#ð !×5Ñ5°mÓDÐØÐ%ˆ6Ð%Ð%×%×%Õ%ˆ6Ð%×%×%Ó%ˆ6×%×%×%×%×%Ð%Ð%×%×%Ó%Ð%×%×%×%×%×%×%Ó%ØÐ%ˆ6Ð%Ð%×%×%Õ%ˆ6Ð%×%×%Ó%ˆ6×%×%×%×%×%Ð%Ð%×%×%Ó%Ð%×%×%×%×%×%×%Ô%r    c           	      óŠ  — | j                  ddddg d¢g d¢¬«      \  }}| j                  dd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)z9Test graph_search with optional relationship_type filter.s$   Apple and Microsoft partnership 2024r"   r#   r$   )r%   r.   rl   r'   r3   r4   r5   Úco_reference)r7   r8   Úrelationship_typer9   r:   r<   r=   r>   r?   rD   rE   NrO   )	r   rZ   r[   r>   r^   r_   r`   ra   rb   s	            r   Ú7test_memory_service_graph_search_with_relationship_typer˜   °   sÑ   € à×ÑØ7Ø"Ø!ØÚ2Ú6ð ó �G€Dˆ!ð �o‰o˜g¨R°qÈNˆoÓ[€GÜˆw‹<Ð˜1Ðˆ<˜1Ñ××Õˆ<˜1×××××ÑŒ3××ÓŒ3×××××Òˆw××Óˆw××Ôˆ<××Ò˜1××××××Ôr    )Ú__doc__ÚbuiltinsrT   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterR   r   Úpathlibr   rŒ   ÚpytestÚ$cyberbrain26.data_plane.sqlite_storer   Ú&cyberbrain26.knowledge_plane.contractsr   r   Ú+cyberbrain26.knowledge_plane.memory_servicer   Ú'cyberbrain26.knowledge_plane.navigationr   Úfixturer   rf   rj   ro   r”   r˜   © r    r   ú<module>r¦      s„   ðñ÷ „ ƒ	Ý Û ã å ?÷õ FÝ Fð ‡�ðˆMò ó ðð&"¨}ó "ðJ°-ó ð"°}ó "ò$F&ðRÀô r    