152 lines
5.3 KiB
Python
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 |