mirror of
https://github.com/basicmachines-co/basic-memory
synced 2026-06-21 13:47:35 +00:00
545804f194
Signed-off-by: phernandez <paul@basicmachines.co> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
103 lines
3.7 KiB
Python
103 lines
3.7 KiB
Python
"""
|
|
Integration tests for read_note MCP tool.
|
|
|
|
Tests the full flow: MCP client -> MCP server -> FastAPI -> database
|
|
"""
|
|
|
|
import pytest
|
|
from fastmcp import Client
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_read_note_after_write(mcp_server, app, test_project):
|
|
"""Test read_note after write_note using real database."""
|
|
|
|
async with Client(mcp_server) as client:
|
|
# First write a note
|
|
write_result = await client.call_tool(
|
|
"write_note",
|
|
{
|
|
"project": test_project.name,
|
|
"title": "Test Note",
|
|
"directory": "test",
|
|
"content": "# Test Note\n\nThis is test content.",
|
|
"tags": "test,integration",
|
|
},
|
|
)
|
|
|
|
assert len(write_result.content) == 1
|
|
assert write_result.content[0].type == "text"
|
|
assert "Test Note.md" in write_result.content[0].text
|
|
|
|
# Then read it back
|
|
read_result = await client.call_tool(
|
|
"read_note",
|
|
{
|
|
"project": test_project.name,
|
|
"identifier": "Test Note",
|
|
},
|
|
)
|
|
|
|
assert len(read_result.content) == 1
|
|
assert read_result.content[0].type == "text"
|
|
result_text = read_result.content[0].text
|
|
|
|
# Should contain the note content and metadata
|
|
assert "# Test Note" in result_text
|
|
assert "This is test content." in result_text
|
|
assert f"{test_project.name}/test/test-note" in result_text # permalink
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_read_note_underscored_folder_by_permalink(mcp_server, app, test_project):
|
|
"""Test read_note with permalink from underscored folder.
|
|
|
|
Reproduces bug #416: read_note fails to find notes when given permalinks
|
|
from underscored folder names (e.g., _archive/, _drafts/), even though
|
|
the permalink is copied directly from the note's YAML frontmatter.
|
|
"""
|
|
|
|
async with Client(mcp_server) as client:
|
|
# Create a note in an underscored folder
|
|
write_result = await client.call_tool(
|
|
"write_note",
|
|
{
|
|
"project": test_project.name,
|
|
"title": "Example Note",
|
|
"directory": "_archive/articles",
|
|
"content": "# Example Note\n\nThis is a test note in an underscored folder.",
|
|
"tags": "test,archive",
|
|
},
|
|
)
|
|
|
|
assert len(write_result.content) == 1
|
|
assert write_result.content[0].type == "text"
|
|
write_text = write_result.content[0].text
|
|
|
|
# Verify the file path includes the underscore
|
|
assert "_archive/articles/Example Note.md" in write_text
|
|
|
|
# Verify the permalink has underscores stripped (this is the expected behavior)
|
|
assert f"{test_project.name}/archive/articles/example-note" in write_text
|
|
|
|
# Now try to read the note using the permalink (without underscores)
|
|
# This is the exact scenario from the bug report - using the permalink
|
|
# that was generated in the YAML frontmatter
|
|
read_result = await client.call_tool(
|
|
"read_note",
|
|
{
|
|
"project": test_project.name,
|
|
"identifier": "archive/articles/example-note", # permalink without underscores
|
|
},
|
|
)
|
|
|
|
# This should succeed - the note should be found by its permalink
|
|
assert len(read_result.content) == 1
|
|
assert read_result.content[0].type == "text"
|
|
result_text = read_result.content[0].text
|
|
|
|
# Should contain the note content
|
|
assert "# Example Note" in result_text
|
|
assert "This is a test note in an underscored folder." in result_text
|
|
assert f"{test_project.name}/archive/articles/example-note" in result_text # permalink
|