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