ai-lawyer-agent/testing/tests/test_tools.py
2026-03-23 02:55:42 +01:00

152 lines
5.3 KiB
Python

import pytest
import httpx
import respx
from api.fetch_api_data import _cache
from api.config import JUSTICE_API_BASE
from api.tools import (
court_search,
court_id,
court_autocomplete,
judge_search,
judge_id,
judge_autocomplete,
decision_search,
contract_search,
civil_proceedings_search,
admin_proceedings_search,
)
EMPTY_LIST_RESPONSE = {"content": [], "totalElements": 0, "numberOfElements": 0}
@pytest.fixture(autouse=True)
def clear_cache():
_cache.clear()
yield
_cache.clear()
def make_response(body: dict = None):
return httpx.Response(200, json=body or EMPTY_LIST_RESPONSE)
@pytest.mark.asyncio
class TestCourtTools:
@respx.mock
async def test_court_search_calls_correct_url(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/sud").mock(return_value=make_response())
await court_search.on_invoke_tool(None, '{"query": "Bratislava"}')
assert mock.called
@respx.mock
async def test_court_id_calls_correct_url(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/sud/sud_175").mock(
return_value=httpx.Response(200, json={"id": "sud_175", "foto": "data"})
)
await court_id.on_invoke_tool(None, '{"id": "175"}')
assert mock.called
@respx.mock
async def test_court_id_removes_foto_key(self):
respx.get(f"{JUSTICE_API_BASE}/v1/sud/sud_1").mock(
return_value=httpx.Response(200, json={"name": "Súd", "foto": "base64"})
)
result = await court_id.on_invoke_tool(None, '{"id": "1"}')
assert "foto" not in str(result)
@respx.mock
async def test_court_autocomplete_calls_correct_url(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/sud/autocomplete").mock(return_value=make_response())
await court_autocomplete.on_invoke_tool(None, '{"query": "Kraj"}')
assert mock.called
@pytest.mark.asyncio
class TestJudgeTools:
@respx.mock
async def test_judge_search_calls_correct_url(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/sudca").mock(return_value=make_response())
await judge_search.on_invoke_tool(None, '{"query": "Novák"}')
assert mock.called
@respx.mock
async def test_judge_id_normalizes_digit_id(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/sudca/sudca_1").mock(
return_value=httpx.Response(200, json={"id": "sudca_1"})
)
await judge_id.on_invoke_tool(None, '{"id": "1"}')
assert mock.called
@respx.mock
async def test_judge_autocomplete_passes_guid_sud(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/sudca/autocomplete").mock(return_value=make_response())
await judge_autocomplete.on_invoke_tool(None, '{"query": "Novák", "guidSud": "sud_100"}')
assert mock.called
params = dict(mock.calls[0].request.url.params)
assert params.get("guidSud") == "sud_100"
@pytest.mark.asyncio
class TestDecisionTools:
@respx.mock
async def test_decision_search_with_date_range(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/rozhodnutie").mock(return_value=make_response())
await decision_search.on_invoke_tool(
None, '{"vydaniaOd": "01.01.2024", "vydaniaDo": "31.01.2024"}'
)
assert mock.called
params = dict(mock.calls[0].request.url.params)
assert params.get("vydaniaOd") == "01.01.2024"
@respx.mock
async def test_decision_search_with_guid_sudca(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/rozhodnutie").mock(return_value=make_response())
await decision_search.on_invoke_tool(None, '{"guidSudca": "sudca_1"}')
params = dict(mock.calls[0].request.url.params)
assert params.get("guidSudca") == "sudca_1"
@pytest.mark.asyncio
class TestContractTools:
@respx.mock
async def test_contract_search_with_guid_sud(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/zmluvy").mock(return_value=make_response())
await contract_search.on_invoke_tool(None, '{"guidSud": "sud_7"}')
params = dict(mock.calls[0].request.url.params)
assert params.get("guidSud") == "sud_7"
@respx.mock
async def test_contract_search_typ_dokumentu_filter(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/zmluvy").mock(return_value=make_response())
await contract_search.on_invoke_tool(None, '{"typDokumentuFacetFilter": ["ZMLUVA"]}')
assert mock.called
@pytest.mark.asyncio
class TestCivilAndAdminTools:
@respx.mock
async def test_civil_proceedings_search(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/obcianPojednavania").mock(return_value=make_response())
await civil_proceedings_search.on_invoke_tool(None, '{"query": "test"}')
assert mock.called
@respx.mock
async def test_admin_proceedings_search(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/spravneKonanie").mock(return_value=make_response())
await admin_proceedings_search.on_invoke_tool(None, '{"query": "test"}')
assert mock.called
@respx.mock
async def test_civil_proceedings_date_params(self):
mock = respx.get(f"{JUSTICE_API_BASE}/v1/obcianPojednavania").mock(return_value=make_response())
await civil_proceedings_search.on_invoke_tool(
None, '{"pojednavaniaOd": "01.01.2024", "jednotnavaniaDo": "31.01.2024"}'
)
assert mock.called