mirror of
https://github.com/basicmachines-co/basic-memory
synced 2026-06-21 13:47:35 +00:00
d3b6c85184
Documents recent fixes and features including: - Docker container support with volume mounting - #151: Reset command project configuration fix - #148: MCP/CLI project state consistency fix - FastMCP compatibility improvements - Comprehensive integration testing 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
159 lines
6.5 KiB
Python
159 lines
6.5 KiB
Python
"""Integration test for database reset command.
|
|
|
|
This test validates the fix for GitHub issue #151 where the reset command
|
|
was only removing the SQLite database but leaving project configuration
|
|
intact in ~/.basic-memory/config.json.
|
|
|
|
The test verifies that the reset command now:
|
|
1. Removes the SQLite database
|
|
2. Resets project configuration to default state (main project only)
|
|
3. Recreates empty database
|
|
"""
|
|
|
|
import json
|
|
import pytest
|
|
import tempfile
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_reset_config_file_behavior(config_manager):
|
|
"""Test that reset command properly updates the config.json file."""
|
|
|
|
# Step 1: Set up initial state with multiple projects in config
|
|
original_projects = {
|
|
"project1": "/path/to/project1",
|
|
"project2": "/path/to/project2",
|
|
"user-project": "/home/user/documents",
|
|
}
|
|
config_manager.config.projects = original_projects.copy()
|
|
config_manager.config.default_project = "user-project"
|
|
|
|
# Step 2: Save the config to a temporary file to simulate the real config file
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
temp_config_file = Path(temp_dir) / "config.json"
|
|
config_manager.config_file = temp_config_file
|
|
config_manager.save_config(config_manager.config)
|
|
|
|
# Step 3: Verify the config file contains the multiple projects
|
|
config_json = json.loads(temp_config_file.read_text())
|
|
assert len(config_json["projects"]) == 3
|
|
assert config_json["default_project"] == "user-project"
|
|
assert "project1" in config_json["projects"]
|
|
assert "project2" in config_json["projects"]
|
|
assert "user-project" in config_json["projects"]
|
|
|
|
# Step 4: Simulate the reset command's configuration reset behavior
|
|
# This is the exact fix for issue #151
|
|
with patch("pathlib.Path.home") as mock_home:
|
|
mock_home.return_value = Path("/home/testuser")
|
|
|
|
# Apply the reset logic from the reset command
|
|
config_manager.config.projects = {"main": str(Path.home() / "basic-memory")}
|
|
config_manager.config.default_project = "main"
|
|
config_manager.save_config(config_manager.config)
|
|
|
|
# Step 5: Read the config file and verify it was properly reset
|
|
updated_config_json = json.loads(temp_config_file.read_text())
|
|
|
|
# Should now only have the main project
|
|
assert len(updated_config_json["projects"]) == 1
|
|
assert "main" in updated_config_json["projects"]
|
|
assert updated_config_json["projects"]["main"] == "/home/testuser/basic-memory"
|
|
assert updated_config_json["default_project"] == "main"
|
|
|
|
# All original projects should be gone from the file
|
|
assert "project1" not in updated_config_json["projects"]
|
|
assert "project2" not in updated_config_json["projects"]
|
|
assert "user-project" not in updated_config_json["projects"]
|
|
|
|
# This validates that issue #151 is fixed:
|
|
# Before the fix, these projects would persist in config.json after reset
|
|
# After the fix, only the default "main" project remains
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_reset_command_source_code_validation():
|
|
"""Validate that the reset command source contains the required fix."""
|
|
# This test ensures the fix for issue #151 is present in the source code
|
|
reset_source_path = (
|
|
Path(__file__).parent.parent.parent / "src" / "basic_memory" / "cli" / "commands" / "db.py"
|
|
)
|
|
reset_source = reset_source_path.read_text()
|
|
|
|
# Verify the key components of the fix are present
|
|
required_lines = [
|
|
"# Reset project configuration",
|
|
'config_manager.config.projects = {"main": str(Path.home() / "basic-memory")}',
|
|
'config_manager.config.default_project = "main"',
|
|
"config_manager.save_config(config_manager.config)",
|
|
'logger.info("Project configuration reset to default")',
|
|
]
|
|
|
|
for line in required_lines:
|
|
assert line in reset_source, f"Required fix line not found: {line}"
|
|
|
|
# Verify the fix is in the correct location (after database deletion, before recreation)
|
|
lines = reset_source.split("\n")
|
|
|
|
# Find key markers
|
|
db_deletion_line = None
|
|
config_reset_line = None
|
|
db_recreation_line = None
|
|
|
|
for i, line in enumerate(lines):
|
|
if "db_path.unlink()" in line:
|
|
db_deletion_line = i
|
|
elif "config_manager.config.projects = {" in line:
|
|
config_reset_line = i
|
|
elif "asyncio.run(db.run_migrations" in line:
|
|
db_recreation_line = i
|
|
|
|
# Verify the order is correct
|
|
assert db_deletion_line is not None, "Database deletion code not found"
|
|
assert config_reset_line is not None, "Config reset code not found"
|
|
assert db_recreation_line is not None, "Database recreation code not found"
|
|
|
|
# Config reset should be after db deletion and before db recreation
|
|
assert db_deletion_line < config_reset_line < db_recreation_line, (
|
|
"Config reset is not in the correct order in the reset command"
|
|
)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_config_reset_behavior_simulation(config_manager):
|
|
"""Test the specific configuration reset behavior that fixes issue #151."""
|
|
|
|
# Step 1: Set up the problem state (multiple projects in config)
|
|
original_projects = {
|
|
"project1": "/path/to/project1",
|
|
"project2": "/path/to/project2",
|
|
"user-project": "/home/user/documents",
|
|
}
|
|
config_manager.config.projects = original_projects.copy()
|
|
config_manager.config.default_project = "user-project"
|
|
|
|
# Verify the problem state
|
|
assert len(config_manager.config.projects) == 3
|
|
assert config_manager.config.default_project == "user-project"
|
|
|
|
# Step 2: Apply the reset fix (simulate what reset command does)
|
|
with patch("pathlib.Path.home") as mock_home:
|
|
mock_home.return_value = Path("/home/testuser")
|
|
|
|
# This is the exact code from the reset command that fixes issue #151
|
|
config_manager.config.projects = {"main": str(Path.home() / "basic-memory")}
|
|
config_manager.config.default_project = "main"
|
|
# Note: We don't call save_config in test to avoid file operations
|
|
|
|
# Step 3: Verify the fix worked
|
|
assert len(config_manager.config.projects) == 1
|
|
assert "main" in config_manager.config.projects
|
|
assert config_manager.config.projects["main"] == "/home/testuser/basic-memory"
|
|
assert config_manager.config.default_project == "main"
|
|
|
|
# Step 4: Verify original projects are gone
|
|
for project_name in original_projects:
|
|
assert project_name not in config_manager.config.projects
|