Ë
   Yë�'˜ÇlÕã                   óÎ   — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
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)ÚSQLiteDatabase)ÚKnowledgeDocumentÚDocumentStatus)ÚMemoryService)ÚKnowledgeNavigatorÚreturnc                  ó>  — ddl m}  ddlm} t        j
                  j                  dd«      }t        j
                  j                  dd«      } | dt        j                  j                  |d	«      ¬
«      } |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   ÚosÚenvironÚgetÚpathÚjoinr   r   )r
   r   Údata_dirÚdb_pathr   r   s         úC/home/oem/CyberBrain26-unified/tests/test_knowledge_graph_search.pyÚmsr      s   € õ NÝ:ä�z‰z�~‰~Ð3°VÓ<€HÜ�j‰j�n‰nÐ1Ð3LÓM€Gá¨ÄÇÁÇÁÈXÐW`Ó@aÔb€FÙ¤.°Ó"9Ô:€IäÜ Ó(ØØØô	ð ó    r   c                 ó”  — | j                  ddddddg¬«      \  }}| j                  dd	ddd
dg¬«      \  }}| j                  dddd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Útagss   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©r@   rA   ú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_format9rI   Ú@py_assert0Ú@py_format4Ú@py_format6s                  r   Ú&test_memory_service_graph_search_basicre   )   sî  € à×ÑØ3Ø"Ø!ØØ�xÐ ð ó �G€Dˆ!ð ×ÑØ0Ø"Ø!ØØ˜9Ð%ð ó �G€Dˆ!ð ×ÑØ*Ø"Ø!ØØ˜Ð!ð ó �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.ÚNonExistentEntity123r3   r4   r5   r   )ú==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr<   r=   r>   rC   rD   N)
rP   r<   rQ   rR   rS   rT   rU   rV   rW   rX   )r   r=   r]   r^   r_   r`   ra   s          r   Ú)test_memory_service_graph_search_no_matchri   K   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¢¬«      \  }}| 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-   r/   r'   r2   r3   r8   r5   r4   r9   r;   r<   Úresults_shallowr>   rC   rD   NÚresults_deeprN   )
r   rY   rZ   rk   rl   r]   r^   r_   r`   ra   s
             r   Ú.test_memory_service_graph_search_depth_controlrm   Q   st  € à×ÑØ:Ø"Ø!ØÚ)ð ó �G€Dˆ!ð —o‘o g°R¸q�oÓA€OØ—?‘? 7°"¸A�?Ó>€LäˆÓÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$×$×$×$Ñ$Œ3×$×$Ó$Œ3×$×$×$×$×$Ò$ˆ×$×$Ó$ˆ×$×$Ô$Ð×$×$Ò$ 1×$×$×$×$×$×$Ó$Üˆ|ÓÐ! Ð!Ð Ñ!×!×!Õ!Ð ×!×!×!×!×!Ñ!Œ3×!×!Ó!Œ3×!×!×!×!×!Ò!ˆ|×!×!Ó!ˆ|×!×!Ô!Ð×!×!Ò! ×!×!×!×!×!×!Ô!r    c                  óZ  — 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}}| 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.rY   Útestzfile:///doc1.txtÚabcz
text/plainÚreviewedÚpersonalr$   zapple,microsoftzapple,microsoft,partnership)r+   r,   Úentitiesg        Ú )Ú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%   rF   )zK%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.get_all_tags
}()
}Ú	navigator)r@   rA   rL   Úpy7zassert %(py9)sÚpy9Nr-   ÚpartnershiprH   Úapple_neighborsrJ   rK   rL   Ú
apple_docs)r   r   r   ÚINDEXEDÚtimeÚadd_documentÚget_all_tagsrQ   rR   rV   rS   rT   rU   rW   rX   Úget_entity_neighborsÚget_entity_documents)r‚   rY   r[   rb   r_   Ú@py_assert6r]   Ú@py_format8Ú@py_format10r†   rc   rd   r‡   s                r   Ú%test_knowledge_navigator_entity_graphr‘   b   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ØÐ)ˆ;˜/Ð)×)×)Õ)ˆ;˜/×)×)Ó)ˆ;×)×)×)×)×)Ð)˜/×)×)Ó)˜/×)×)×)×)×)×)Ó)à×/Ñ/°Ó8€JØÐˆ6�ZÐ××Õˆ6�Z××Óˆ6×××××Ð�Z××Ó�Z××××××ÓØÐˆ6�ZÐ××Õˆ6�Z××Óˆ6×××××Ð�Z××Ó�Z××××××Ôr    c                 ó„  — | j                  ddd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-   r…   r'   r2   r3   r4   Úco_reference)r6   r7   Úrelationship_typer8   r9   r;   r<   r=   r>   rC   rD   NrN   )	r   rY   rZ   r=   r]   r^   r_   r`   ra   s	            r   Ú7test_memory_service_graph_search_with_relationship_typer•   Ÿ   sÎ   € à×ÑØ7Ø"Ø!ØÚ2ð ó �G€Dˆ!ð �o‰o˜g¨R°qÈNˆoÓ[€GÜˆw‹<Ð˜1Ðˆ<˜1Ñ××Õˆ<˜1×××××ÑŒ3××ÓŒ3×××××Òˆw××Óˆw××Ôˆ<××Ò˜1××××××Ôr    )Ú__doc__ÚbuiltinsrS   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterQ   r   r‰   ÚpytestÚ$cyberbrain26.data_plane.sqlite_storer   Ú&cyberbrain26.knowledge_plane.contractsr   r   Ú+cyberbrain26.knowledge_plane.memory_servicer   Ú'cyberbrain26.knowledge_plane.navigationr   Úfixturer   re   ri   rm   r‘   r•   © r    r   ú<module>r¢      s€   ðñ÷ „ ƒ	Û ã å ?÷õ FÝ Fð ‡�ðˆMò ó ðð&¨}ó ðD°-ó ð"°}ó "ò": ðzÀô r    