You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.8 KiB
121 lines
3.8 KiB
"""Tests for agent database query primitives."""
|
|
|
|
import pytest
|
|
import json
|
|
|
|
pytest.importorskip("duckdb")
|
|
|
|
|
|
class TestQueryMotions:
|
|
def test_returns_motion_rows(self, tmp_duckdb_path):
|
|
from agent_tools.database import query_motions
|
|
|
|
result = query_motions(tmp_duckdb_path)
|
|
assert isinstance(result, list)
|
|
|
|
def test_respects_limit(self, tmp_duckdb_path):
|
|
from agent_tools.database import query_motions
|
|
|
|
result = query_motions(tmp_duckdb_path, limit=5)
|
|
assert len(result) <= 5
|
|
|
|
def test_empty_db_returns_empty_list(self, tmp_duckdb_path):
|
|
from agent_tools.database import query_motions
|
|
|
|
result = query_motions(tmp_duckdb_path)
|
|
assert result == []
|
|
|
|
|
|
class TestQueryVotes:
|
|
def test_returns_vote_counts(self, tmp_duckdb_path):
|
|
from agent_tools.database import query_votes
|
|
|
|
result = query_votes(tmp_duckdb_path, motion_id=1)
|
|
assert isinstance(result, list)
|
|
|
|
def test_filters_by_party(self, tmp_duckdb_path):
|
|
from agent_tools.database import query_votes
|
|
|
|
result = query_votes(tmp_duckdb_path, motion_id=1, party="VVD")
|
|
assert isinstance(result, list)
|
|
|
|
|
|
class TestQuerySvdVectors:
|
|
def test_returns_vectors(self, tmp_duckdb_path):
|
|
from agent_tools.database import query_svd_vectors
|
|
|
|
result = query_svd_vectors(tmp_duckdb_path, window_id="current_parliament")
|
|
assert isinstance(result, list)
|
|
|
|
def test_filters_by_entity_type(self, tmp_duckdb_path):
|
|
from agent_tools.database import query_svd_vectors
|
|
|
|
result = query_svd_vectors(
|
|
tmp_duckdb_path, window_id="current_parliament", entity_type="mp"
|
|
)
|
|
assert isinstance(result, list)
|
|
|
|
|
|
class TestQueryPartyPositions:
|
|
def test_returns_party_scores(self, tmp_duckdb_path):
|
|
from agent_tools.database import query_party_positions
|
|
|
|
result = query_party_positions(tmp_duckdb_path, window_id="current_parliament")
|
|
assert isinstance(result, list)
|
|
|
|
|
|
class TestQueryPipelineStatus:
|
|
def test_returns_status_dict(self, tmp_duckdb_path):
|
|
from agent_tools.database import query_pipeline_status
|
|
|
|
result = query_pipeline_status(tmp_duckdb_path)
|
|
assert isinstance(result, dict)
|
|
assert "motion_count" in result
|
|
assert "latest_motion_date" in result
|
|
assert "svd_window_count" in result
|
|
|
|
|
|
class TestCrudTools:
|
|
def test_create_motion_returns_id(self, tmp_duckdb_path):
|
|
from agent_tools.database import create_motion
|
|
|
|
result = create_motion(
|
|
tmp_duckdb_path,
|
|
title="Test Motion",
|
|
description="A test motion",
|
|
date="2024-06-01",
|
|
policy_area="Test",
|
|
)
|
|
assert isinstance(result, dict)
|
|
assert "motion_id" in result or "error" in result
|
|
|
|
def test_update_motion_changes_field(self, tmp_duckdb_path):
|
|
from agent_tools.database import create_motion, update_motion
|
|
|
|
created = create_motion(
|
|
tmp_duckdb_path,
|
|
title="Original",
|
|
description="Original desc",
|
|
date="2024-06-01",
|
|
)
|
|
if "error" in created:
|
|
pytest.skip("create_motion not supported by schema")
|
|
motion_id = created["motion_id"]
|
|
|
|
result = update_motion(
|
|
tmp_duckdb_path,
|
|
motion_id=motion_id,
|
|
title="Updated",
|
|
)
|
|
assert isinstance(result, dict)
|
|
assert "updated" in result or "error" in result
|
|
|
|
def test_delete_report_removes_file(self, tmp_path):
|
|
from agent_tools.database import delete_report
|
|
|
|
report_path = tmp_path / "test_report.md"
|
|
report_path.write_text("# Test Report\n")
|
|
|
|
result = delete_report(str(report_path))
|
|
assert result.get("deleted") is True
|
|
assert not report_path.exists()
|
|
|