Skip to main content
Glama

basic-memory

test_importer_base.py4.33 kB
"""Tests for the base importer class.""" import pytest from unittest.mock import AsyncMock from basic_memory.importers.base import Importer from basic_memory.markdown.markdown_processor import MarkdownProcessor from basic_memory.markdown.schemas import EntityMarkdown from basic_memory.schemas.importer import ImportResult # Create a concrete implementation of the abstract class for testing class TestImporter(Importer[ImportResult]): """Test implementation of Importer base class.""" async def import_data(self, source_data, destination_folder: str, **kwargs): """Implement the abstract method for testing.""" try: # Test implementation that returns success self.ensure_folder_exists(destination_folder) return ImportResult( import_count={"files": 1}, success=True, error_message=None, ) except Exception as e: return self.handle_error("Test import failed", e) def handle_error(self, message: str, error=None) -> ImportResult: """Implement the abstract handle_error method.""" import logging logger = logging.getLogger(__name__) error_message = f"{message}" if error: error_message += f": {str(error)}" logger.error(error_message) return ImportResult( import_count={}, success=False, error_message=error_message, ) @pytest.fixture def mock_markdown_processor(): """Mock MarkdownProcessor for testing.""" processor = AsyncMock(spec=MarkdownProcessor) processor.write_file = AsyncMock() return processor @pytest.fixture def test_importer(tmp_path, mock_markdown_processor): """Create a TestImporter instance for testing.""" return TestImporter(tmp_path, mock_markdown_processor) @pytest.mark.asyncio async def test_import_data_success(test_importer, tmp_path): """Test successful import_data implementation.""" result = await test_importer.import_data({}, "test_folder") assert result.success assert result.import_count == {"files": 1} assert result.error_message is None # Verify folder was created folder_path = tmp_path / "test_folder" assert folder_path.exists() assert folder_path.is_dir() @pytest.mark.asyncio async def test_write_entity(test_importer, mock_markdown_processor, tmp_path): """Test write_entity method.""" # Create test entity entity = EntityMarkdown( title="Test Entity", content="Test content", frontmatter={}, observations=[], relations=[], ) # Call write_entity file_path = tmp_path / "test_entity.md" await test_importer.write_entity(entity, file_path) # Verify markdown processor was called with correct arguments mock_markdown_processor.write_file.assert_called_once_with(file_path, entity) def test_ensure_folder_exists(test_importer, tmp_path): """Test ensure_folder_exists method.""" # Test with simple folder folder_path = test_importer.ensure_folder_exists("test_folder") assert folder_path.exists() assert folder_path.is_dir() assert folder_path == tmp_path / "test_folder" # Test with nested folder nested_path = test_importer.ensure_folder_exists("nested/folder/path") assert nested_path.exists() assert nested_path.is_dir() assert nested_path == tmp_path / "nested" / "folder" / "path" # Test with existing folder (should not raise error) existing_path = test_importer.ensure_folder_exists("test_folder") assert existing_path.exists() assert existing_path.is_dir() @pytest.mark.asyncio async def test_handle_error(test_importer): """Test handle_error method.""" # Test with message only result = test_importer.handle_error("Test error message") assert not result.success assert result.error_message == "Test error message" assert result.import_count == {} # Test with message and exception test_exception = ValueError("Test exception") result = test_importer.handle_error("Error occurred", test_exception) assert not result.success assert "Error occurred" in result.error_message assert "Test exception" in result.error_message assert result.import_count == {}

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/basicmachines-co/basic-memory'

If you have feedback or need assistance with the MCP directory API, please join our Discord server