Memory MCP Server

  • tests
"""Tests for validation functionality.""" import pytest from memory_mcp_server.interfaces import Entity, Relation from memory_mcp_server.validation import ( EntityValidationError, KnowledgeGraphValidator, RelationValidationError, ) def test_validate_batch_entities() -> None: """Test batch entity validation.""" # Valid batch entities = [ Entity("test1", "person", ["obs1"]), Entity("test2", "person", ["obs2"]), ] existing_names = {"existing1", "existing2"} KnowledgeGraphValidator.validate_batch_entities(entities, existing_names) # Empty batch with pytest.raises(EntityValidationError, match="Entity list cannot be empty"): KnowledgeGraphValidator.validate_batch_entities([], existing_names) # Duplicate names within batch entities = [ Entity("test1", "person", ["obs1"]), Entity("test1", "person", ["obs2"]), ] with pytest.raises(EntityValidationError, match="Duplicate entity name in batch"): KnowledgeGraphValidator.validate_batch_entities(entities, existing_names) # Conflict with existing names entities = [ Entity("test1", "person", ["obs1"]), Entity("existing1", "person", ["obs2"]), ] with pytest.raises(EntityValidationError, match="Entities already exist"): KnowledgeGraphValidator.validate_batch_entities(entities, existing_names) # Invalid entity type entities = [ Entity("test1", "invalid-type", ["obs1"]), ] with pytest.raises(EntityValidationError, match="Invalid entity type"): KnowledgeGraphValidator.validate_batch_entities(entities, existing_names) def test_validate_batch_relations() -> None: """Test batch relation validation.""" # Valid batch relations = [ Relation(from_="entity1", to="entity2", relationType="knows"), Relation(from_="entity2", to="entity3", relationType="knows"), ] existing_relations = [] entity_names = {"entity1", "entity2", "entity3"} KnowledgeGraphValidator.validate_batch_relations( relations, existing_relations, entity_names ) # Empty batch with pytest.raises(RelationValidationError, match="Relations list cannot be empty"): KnowledgeGraphValidator.validate_batch_relations( [], existing_relations, entity_names ) # Duplicate relations relations = [ Relation(from_="entity1", to="entity2", relationType="knows"), Relation(from_="entity1", to="entity2", relationType="knows"), # Same relation ] with pytest.raises(RelationValidationError, match="Duplicate relation"): KnowledgeGraphValidator.validate_batch_relations( relations, existing_relations, entity_names ) # Missing entities relations = [ Relation("entity1", "nonexistent", "knows"), ] with pytest.raises(RelationValidationError, match="Entities not found"): KnowledgeGraphValidator.validate_batch_relations( relations, existing_relations, entity_names ) # Invalid relation type relations = [ Relation("entity1", "entity2", "invalid-type"), ] with pytest.raises(RelationValidationError, match="Invalid relation type"): KnowledgeGraphValidator.validate_batch_relations( relations, existing_relations, entity_names ) # Self-referential relation relations = [ Relation("entity1", "entity1", "knows"), ] with pytest.raises( RelationValidationError, match="Self-referential relations not allowed" ): KnowledgeGraphValidator.validate_batch_relations( relations, existing_relations, entity_names ) # Cycle detection relations = [ Relation("entity1", "entity2", "knows"), Relation("entity2", "entity3", "knows"), Relation("entity3", "entity1", "knows"), ] with pytest.raises(RelationValidationError, match="Circular dependency detected"): KnowledgeGraphValidator.validate_batch_relations( relations, existing_relations, entity_names ) def test_validate_batch_observations() -> None: """Test batch observation validation.""" # Valid batch existing_entities = { "entity1": Entity("entity1", "person", ["existing1"]), "entity2": Entity("entity2", "person", ["existing2"]), } observations_map = { "entity1": ["new1", "new2"], "entity2": ["new3"], } KnowledgeGraphValidator.validate_batch_observations( observations_map, existing_entities ) # Empty batch with pytest.raises(EntityValidationError, match="Observations map cannot be empty"): KnowledgeGraphValidator.validate_batch_observations({}, existing_entities) # Missing entities observations_map = { "entity1": ["new1"], "nonexistent": ["new2"], } with pytest.raises(EntityValidationError, match="Entities not found"): KnowledgeGraphValidator.validate_batch_observations( observations_map, existing_entities ) # Empty observations list is allowed (skipped) observations_map = { "entity1": [], } KnowledgeGraphValidator.validate_batch_observations( observations_map, existing_entities ) # Invalid observation format observations_map = { "entity1": ["", "new2"], # Empty observation } with pytest.raises(EntityValidationError, match="Empty observation"): KnowledgeGraphValidator.validate_batch_observations( observations_map, existing_entities ) # Duplicate observations observations_map = { "entity1": ["existing1", "new2"], # Duplicate with existing observation } with pytest.raises(EntityValidationError, match="Duplicate observations"): KnowledgeGraphValidator.validate_batch_observations( observations_map, existing_entities )