From 4bd4f6f133d33e10030cf9cd4f136be667f148e3 Mon Sep 17 00:00:00 2001 From: spuentesp Date: Sun, 4 Jan 2026 20:14:46 -0300 Subject: [PATCH 1/2] Fix combat creation Neo4j validation --- .../src/monitor_data/tools/mongodb_tools.py | 14 +++++++------- .../tests/test_tools/test_combat_tools.py | 8 +------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/data-layer/src/monitor_data/tools/mongodb_tools.py b/packages/data-layer/src/monitor_data/tools/mongodb_tools.py index e995ffc2..770354eb 100644 --- a/packages/data-layer/src/monitor_data/tools/mongodb_tools.py +++ b/packages/data-layer/src/monitor_data/tools/mongodb_tools.py @@ -1266,13 +1266,13 @@ def mongodb_create_combat(params: CombatCreate) -> CombatResponse: raise ValueError(f"Scene {params.scene_id} not found") # Validate story exists (via Neo4j) - neo4j = get_neo4j_client() - with neo4j.session() as session: # type: ignore[attr-defined] - result = session.run( - "MATCH (s:Story {id: $story_id}) RETURN s", story_id=str(params.story_id) - ) - if not result.single(): - raise ValueError(f"Story {params.story_id} not found") + neo4j_client = get_neo4j_client() + story_exists = neo4j_client.execute_read( + "MATCH (s:Story {id: $story_id}) RETURN s.id AS story_id", + {"story_id": str(params.story_id)}, + ) + if not story_exists: + raise ValueError(f"Story {params.story_id} not found") now = datetime.now(timezone.utc) encounter_id = uuid4() diff --git a/packages/data-layer/tests/test_tools/test_combat_tools.py b/packages/data-layer/tests/test_tools/test_combat_tools.py index e727163f..420b97ef 100644 --- a/packages/data-layer/tests/test_tools/test_combat_tools.py +++ b/packages/data-layer/tests/test_tools/test_combat_tools.py @@ -71,14 +71,8 @@ def test_create_combat_success( # Mock Neo4j mock_neo4j = MagicMock() - mock_session = MagicMock() - mock_result = MagicMock() - mock_single = MagicMock() - mock_get_neo4j.return_value = mock_neo4j - mock_neo4j.session.return_value.__enter__.return_value = mock_session - mock_session.run.return_value = mock_result - mock_result.single.return_value = mock_single + mock_neo4j.execute_read.return_value = [{"story_id": str(story_id)}] # Test data participants = [ From 896a47497daa3c491df6dce60d01de063b482b4a Mon Sep 17 00:00:00 2001 From: spuentesp Date: Sun, 4 Jan 2026 20:18:54 -0300 Subject: [PATCH 2/2] Add combat story validation test --- .../tests/test_tools/test_combat_tools.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/packages/data-layer/tests/test_tools/test_combat_tools.py b/packages/data-layer/tests/test_tools/test_combat_tools.py index 420b97ef..fda83191 100644 --- a/packages/data-layer/tests/test_tools/test_combat_tools.py +++ b/packages/data-layer/tests/test_tools/test_combat_tools.py @@ -140,6 +140,38 @@ def test_create_combat_scene_not_found( mongodb_create_combat(params) +@patch("monitor_data.tools.mongodb_tools.get_neo4j_client") +@patch("monitor_data.tools.mongodb_tools.get_mongodb_client") +def test_create_combat_story_not_found( + mock_get_mongodb: Mock, + mock_get_neo4j: Mock, +): + """Test creating combat with invalid story_id.""" + scene_id = uuid4() + story_id = uuid4() + + mock_mongodb = MagicMock() + mock_combats = MagicMock() + mock_scenes = MagicMock() + + mock_get_mongodb.return_value = mock_mongodb + mock_mongodb.get_collection.side_effect = lambda name: ( + mock_combats if name == "combat_encounters" else mock_scenes + ) + + # Scene exists but story does not + mock_scenes.find_one.return_value = {"scene_id": str(scene_id)} + mock_get_neo4j.return_value = MagicMock(execute_read=MagicMock(return_value=[])) + + params = CombatCreate( + scene_id=scene_id, + story_id=story_id, + ) + + with pytest.raises(ValueError, match=f"Story {story_id} not found"): + mongodb_create_combat(params) + + # ============================================================================= # TEST: mongodb_get_combat # =============================================================================