mirror of
https://github.com/basicmachines-co/basic-memory
synced 2026-06-21 13:47:35 +00:00
173 lines
5.3 KiB
Python
173 lines
5.3 KiB
Python
"""Tests for open_nodes MCP tool."""
|
|
|
|
import pytest
|
|
|
|
from basic_memory.mcp.tools.search import open_nodes
|
|
from basic_memory.mcp.tools.knowledge import create_entities
|
|
from basic_memory.schemas import EntityListResponse
|
|
from basic_memory.schemas.base import Entity
|
|
from basic_memory.schemas.request import CreateEntityRequest, OpenNodesRequest
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_open_multiple_entities(client):
|
|
"""Test opening multiple entities."""
|
|
# Create some test entities
|
|
entity_request = CreateEntityRequest(
|
|
entities=[
|
|
Entity(
|
|
name="Entity1",
|
|
entity_type="test",
|
|
description="First test entity"
|
|
),
|
|
Entity(
|
|
name="Entity2",
|
|
entity_type="test",
|
|
description="Second test entity"
|
|
)
|
|
]
|
|
)
|
|
create_result = await create_entities(entity_request)
|
|
path_ids = [e.path_id for e in create_result.entities]
|
|
|
|
# Open the nodes
|
|
request = OpenNodesRequest(path_ids=path_ids)
|
|
result = await open_nodes(request)
|
|
assert isinstance(result, EntityListResponse)
|
|
response = EntityListResponse.model_validate(result)
|
|
|
|
# Verify we got a dictionary with both entities
|
|
assert len(response.entities) == 2
|
|
|
|
for response_entity in response.entities:
|
|
assert response_entity.path_id in path_ids
|
|
assert response_entity.name in ["Entity1", "Entity2"]
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_open_nodes_with_details(client):
|
|
"""Test that opened nodes have all their details."""
|
|
# Create an entity with observations
|
|
entity_request = CreateEntityRequest(
|
|
entities=[
|
|
Entity(
|
|
name="DetailedEntity",
|
|
entity_type="test",
|
|
description="Test entity with details",
|
|
observations=["First observation", "Second observation"]
|
|
)
|
|
]
|
|
)
|
|
create_result = await create_entities(entity_request)
|
|
path_id = create_result.entities[0].path_id
|
|
|
|
# Open the node
|
|
request = OpenNodesRequest(path_ids=[path_id])
|
|
result = await open_nodes(request)
|
|
response = EntityListResponse.model_validate(result)
|
|
|
|
# Verify all details are present
|
|
entity = response.entities[0]
|
|
assert entity.name == "DetailedEntity"
|
|
assert entity.entity_type == "test"
|
|
assert entity.description == "Test entity with details"
|
|
assert len(entity.observations) == 2
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_open_nodes_with_relations(client):
|
|
"""Test opening nodes that have relations."""
|
|
# Create related entities
|
|
entity_request = CreateEntityRequest(
|
|
entities=[
|
|
Entity(
|
|
name="Service",
|
|
entity_type="test",
|
|
description="A service"
|
|
),
|
|
Entity(
|
|
name="Database",
|
|
entity_type="test",
|
|
description="A database"
|
|
)
|
|
]
|
|
)
|
|
create_result = await create_entities(entity_request)
|
|
path_ids = [e.path_id for e in create_result.entities]
|
|
|
|
# Add a relation between them
|
|
from basic_memory.mcp.tools.knowledge import create_relations
|
|
from basic_memory.schemas.request import CreateRelationsRequest
|
|
from basic_memory.schemas.base import Relation
|
|
|
|
relation_request = CreateRelationsRequest(
|
|
relations=[
|
|
Relation(
|
|
from_id=path_ids[0],
|
|
to_id=path_ids[1],
|
|
relation_type="depends_on"
|
|
)
|
|
]
|
|
)
|
|
await create_relations(relation_request)
|
|
|
|
# Open both nodes
|
|
request = OpenNodesRequest(path_ids=path_ids)
|
|
result = await open_nodes(request)
|
|
response = EntityListResponse.model_validate(result)
|
|
|
|
# Verify relations are present
|
|
assert len(response.entities[0].relations) == 1
|
|
assert len(response.entities[1].relations) == 1
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_open_nonexistent_nodes(client):
|
|
"""Test behavior when some requested nodes don't exist."""
|
|
# First create one real entity
|
|
entity_request = CreateEntityRequest(
|
|
entities=[
|
|
Entity(
|
|
name="RealEntity",
|
|
entity_type="test"
|
|
)
|
|
]
|
|
)
|
|
create_result = await create_entities(entity_request)
|
|
real_path_id = create_result.entities[0].path_id
|
|
|
|
# Try to open both real and non-existent
|
|
request = OpenNodesRequest(
|
|
path_ids=[real_path_id, "test/nonexistent"]
|
|
)
|
|
result = await open_nodes(request)
|
|
response = EntityListResponse.model_validate(result)
|
|
|
|
# Should only get the real entity back
|
|
assert len(response.entities) == 1
|
|
assert real_path_id in response.entities[0].path_id
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_open_single_node(client):
|
|
"""Test behavior with single path_id."""
|
|
# Create an entity
|
|
entity_request = CreateEntityRequest(
|
|
entities=[
|
|
Entity(
|
|
name="SingleEntity",
|
|
entity_type="test"
|
|
)
|
|
]
|
|
)
|
|
create_result = await create_entities(entity_request)
|
|
path_id = create_result.entities[0].path_id
|
|
|
|
# Open just one node
|
|
request = OpenNodesRequest(path_ids=[path_id])
|
|
result = await open_nodes(request)
|
|
response = EntityListResponse.model_validate(result)
|
|
|
|
# Should get just that entity
|
|
assert len(response.entities) == 1
|
|
assert path_id in response.entities[0].path_id |