From c0d01b755b7dddb5bfabfc34b5e2fe26cdb5825b Mon Sep 17 00:00:00 2001 From: tlxxxsracer Date: Tue, 6 May 2025 21:07:52 +0000 Subject: [PATCH 1/5] Add server-side evidence uniqueness validation function --- .../database/evidence_validation.py | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 agent-framework/prometheus_swarm/database/evidence_validation.py diff --git a/agent-framework/prometheus_swarm/database/evidence_validation.py b/agent-framework/prometheus_swarm/database/evidence_validation.py new file mode 100644 index 00000000..8434e494 --- /dev/null +++ b/agent-framework/prometheus_swarm/database/evidence_validation.py @@ -0,0 +1,53 @@ +from typing import Any, Dict, List +from .database import get_database_connection + +def validate_evidence_uniqueness(evidence: Dict[str, Any], table_name: str = 'evidence') -> bool: + """ + Validate that an evidence entry is unique across the specified table. + + Args: + evidence (Dict[str, Any]): The evidence dictionary to validate + table_name (str, optional): The database table to check against. Defaults to 'evidence'. + + Returns: + bool: True if the evidence is unique, False otherwise + + Raises: + ValueError: If the evidence is invalid or missing key fields + """ + if not evidence: + raise ValueError("Evidence cannot be empty") + + # Define fields that must be unique + unique_fields = ['hash', 'source', 'type'] + + # Validate presence of unique fields + for field in unique_fields: + if field not in evidence: + raise ValueError(f"Missing required unique field: {field}") + + try: + # Get database connection + db = get_database_connection() + + # Construct query to check uniqueness + query = f"SELECT COUNT(*) as count FROM {table_name} WHERE " + conditions = [f"{field} = ?" for field in unique_fields] + query += " AND ".join(conditions) + + values = [evidence.get(field) for field in unique_fields] + + # Execute query + cursor = db.cursor() + cursor.execute(query, values) + result = cursor.fetchone() + + # If count is 0, the evidence is unique + return result[0] == 0 + + except Exception as e: + # Log the error in a real-world scenario + raise ValueError(f"Error validating evidence uniqueness: {e}") + finally: + if 'db' in locals(): + db.close() \ No newline at end of file From 00c184108b298b6f7675080a7f1cb0d18a97b5cd Mon Sep 17 00:00:00 2001 From: tlxxxsracer Date: Tue, 6 May 2025 21:08:04 +0000 Subject: [PATCH 2/5] Add unit tests for evidence uniqueness validation --- .../tests/unit/test_evidence_validation.py | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 agent-framework/tests/unit/test_evidence_validation.py diff --git a/agent-framework/tests/unit/test_evidence_validation.py b/agent-framework/tests/unit/test_evidence_validation.py new file mode 100644 index 00000000..087adc95 --- /dev/null +++ b/agent-framework/tests/unit/test_evidence_validation.py @@ -0,0 +1,61 @@ +import pytest +from prometheus_swarm.database.evidence_validation import validate_evidence_uniqueness +from unittest.mock import patch, MagicMock + +def test_validate_evidence_uniqueness_valid(): + # Mock an empty database, so evidence should be unique + with patch('prometheus_swarm.database.evidence_validation.get_database_connection') as mock_db: + mock_cursor = MagicMock() + mock_cursor.fetchone.return_value = (0,) + mock_db.return_value.cursor.return_value = mock_cursor + + evidence = { + 'hash': 'unique_hash', + 'source': 'test_source', + 'type': 'test_type', + 'additional_data': 'some_info' + } + + assert validate_evidence_uniqueness(evidence) is True + +def test_validate_evidence_uniqueness_duplicate(): + # Mock a database with existing evidence + with patch('prometheus_swarm.database.evidence_validation.get_database_connection') as mock_db: + mock_cursor = MagicMock() + mock_cursor.fetchone.return_value = (1,) + mock_db.return_value.cursor.return_value = mock_cursor + + evidence = { + 'hash': 'duplicate_hash', + 'source': 'test_source', + 'type': 'test_type' + } + + assert validate_evidence_uniqueness(evidence) is False + +def test_validate_evidence_uniqueness_missing_fields(): + # Test missing unique fields + with pytest.raises(ValueError, match="Missing required unique field"): + validate_evidence_uniqueness({ + 'hash': 'some_hash', + 'source': 'test_source' + }) + +def test_validate_evidence_uniqueness_empty_evidence(): + # Test empty evidence + with pytest.raises(ValueError, match="Evidence cannot be empty"): + validate_evidence_uniqueness({}) + +def test_validate_evidence_uniqueness_database_error(): + # Test database connection error + with patch('prometheus_swarm.database.evidence_validation.get_database_connection') as mock_db: + mock_db.side_effect = Exception("Database connection failed") + + evidence = { + 'hash': 'test_hash', + 'source': 'test_source', + 'type': 'test_type' + } + + with pytest.raises(ValueError, match="Error validating evidence uniqueness"): + validate_evidence_uniqueness(evidence) \ No newline at end of file From cf97d982efa3a3ff99300e64288cc0c17136c163 Mon Sep 17 00:00:00 2001 From: tlxxxsracer Date: Tue, 6 May 2025 21:08:16 +0000 Subject: [PATCH 3/5] Update __init__.py to expose evidence_validation function --- agent-framework/prometheus_swarm/database/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/agent-framework/prometheus_swarm/database/__init__.py b/agent-framework/prometheus_swarm/database/__init__.py index f032618f..b24b77e4 100644 --- a/agent-framework/prometheus_swarm/database/__init__.py +++ b/agent-framework/prometheus_swarm/database/__init__.py @@ -2,6 +2,7 @@ from .database import get_db, get_session, initialize_database from .models import Conversation, Message, Log +from .evidence_validation import validate_evidence_uniqueness __all__ = [ "get_db", @@ -10,4 +11,5 @@ "Conversation", "Message", "Log", -] + "validate_evidence_uniqueness", +] \ No newline at end of file From e6633d0ebf7d25dff4b8b2bcf10fb20e2c7ad2f0 Mon Sep 17 00:00:00 2001 From: tlxxxsracer Date: Tue, 6 May 2025 21:08:33 +0000 Subject: [PATCH 4/5] Update evidence validation to use get_db() method --- .../database/evidence_validation.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/agent-framework/prometheus_swarm/database/evidence_validation.py b/agent-framework/prometheus_swarm/database/evidence_validation.py index 8434e494..e397e8b9 100644 --- a/agent-framework/prometheus_swarm/database/evidence_validation.py +++ b/agent-framework/prometheus_swarm/database/evidence_validation.py @@ -1,5 +1,5 @@ from typing import Any, Dict, List -from .database import get_database_connection +from .database import get_db def validate_evidence_uniqueness(evidence: Dict[str, Any], table_name: str = 'evidence') -> bool: """ @@ -27,23 +27,19 @@ def validate_evidence_uniqueness(evidence: Dict[str, Any], table_name: str = 'ev raise ValueError(f"Missing required unique field: {field}") try: - # Get database connection - db = get_database_connection() + # Get database session + db = get_db() # Construct query to check uniqueness query = f"SELECT COUNT(*) as count FROM {table_name} WHERE " - conditions = [f"{field} = ?" for field in unique_fields] + conditions = [f"{field} = :{field}" for field in unique_fields] query += " AND ".join(conditions) - values = [evidence.get(field) for field in unique_fields] - # Execute query - cursor = db.cursor() - cursor.execute(query, values) - result = cursor.fetchone() + result = db.execute(query, evidence).scalar() # If count is 0, the evidence is unique - return result[0] == 0 + return result == 0 except Exception as e: # Log the error in a real-world scenario From 0649abe89f309943034a99430cd16d34e0752035 Mon Sep 17 00:00:00 2001 From: tlxxxsracer Date: Tue, 6 May 2025 21:09:13 +0000 Subject: [PATCH 5/5] Update evidence validation tests --- .../tests/unit/test_evidence_validation.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/agent-framework/tests/unit/test_evidence_validation.py b/agent-framework/tests/unit/test_evidence_validation.py index 087adc95..a1caca4f 100644 --- a/agent-framework/tests/unit/test_evidence_validation.py +++ b/agent-framework/tests/unit/test_evidence_validation.py @@ -1,13 +1,13 @@ import pytest -from prometheus_swarm.database.evidence_validation import validate_evidence_uniqueness from unittest.mock import patch, MagicMock +from prometheus_swarm.database.evidence_validation import validate_evidence_uniqueness def test_validate_evidence_uniqueness_valid(): # Mock an empty database, so evidence should be unique - with patch('prometheus_swarm.database.evidence_validation.get_database_connection') as mock_db: - mock_cursor = MagicMock() - mock_cursor.fetchone.return_value = (0,) - mock_db.return_value.cursor.return_value = mock_cursor + with patch('prometheus_swarm.database.evidence_validation.get_db') as mock_db: + mock_db_session = MagicMock() + mock_db.return_value = mock_db_session + mock_db_session.execute.return_value.scalar.return_value = 0 evidence = { 'hash': 'unique_hash', @@ -20,10 +20,10 @@ def test_validate_evidence_uniqueness_valid(): def test_validate_evidence_uniqueness_duplicate(): # Mock a database with existing evidence - with patch('prometheus_swarm.database.evidence_validation.get_database_connection') as mock_db: - mock_cursor = MagicMock() - mock_cursor.fetchone.return_value = (1,) - mock_db.return_value.cursor.return_value = mock_cursor + with patch('prometheus_swarm.database.evidence_validation.get_db') as mock_db: + mock_db_session = MagicMock() + mock_db.return_value = mock_db_session + mock_db_session.execute.return_value.scalar.return_value = 1 evidence = { 'hash': 'duplicate_hash', @@ -48,7 +48,7 @@ def test_validate_evidence_uniqueness_empty_evidence(): def test_validate_evidence_uniqueness_database_error(): # Test database connection error - with patch('prometheus_swarm.database.evidence_validation.get_database_connection') as mock_db: + with patch('prometheus_swarm.database.evidence_validation.get_db') as mock_db: mock_db.side_effect = Exception("Database connection failed") evidence = {