import pytest import httpx from api.config import JUSTICE_API_BASE, HTTP_TIMEOUT HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36", "Accept": "application/json, text/plain, */*", "Accept-Language": "sk-SK,sk;q=0.9", "Referer": "https://obcan.justice.sk/", "Origin": "https://obcan.justice.sk", } def api_available() -> bool: try: r = httpx.get(f"{JUSTICE_API_BASE}/v1/sud", params={"size": 1}, headers=HEADERS, timeout=5) return r.status_code == 200 except Exception: return False skip_if_offline = pytest.mark.skipif( not api_available(), reason="justice.sk API is not reachable" ) @pytest.fixture(scope="module") def client(): with httpx.Client(headers=HEADERS, timeout=HTTP_TIMEOUT, follow_redirects=True) as c: yield c @skip_if_offline class TestCourtsEndpoint: def test_returns_200(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sud", params={"size": 5}) assert r.status_code == 200 def test_response_has_results(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sud", params={"size": 5}) data = r.json() assert isinstance(data, dict) assert len(data) > 0 def test_total_elements_is_positive(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sud", params={"size": 1}) data = r.json() total = data.get("numFound") or data.get("totalElements") or data.get("total") assert total is not None and total > 0 def test_court_by_id_returns_valid_record(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sud/sud_175") assert r.status_code == 200 data = r.json() assert "id" in data or "nazov" in data def test_court_autocomplete_returns_list(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sud/autocomplete", params={"query": "Bratislava", "limit": 5}) assert r.status_code == 200 assert isinstance(r.json(), list) def test_nonexistent_court_returns_404(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sud/sud_999999999") assert r.status_code == 404 @skip_if_offline class TestJudgesEndpoint: def test_judge_search_returns_200(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sudca", params={"size": 5}) assert r.status_code == 200 def test_judge_autocomplete_returns_results(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sudca/autocomplete", params={"query": "Novák", "limit": 10}) assert r.status_code == 200 def test_judge_search_by_kraj(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sudca", params={ "krajFacetFilter": "Bratislavský kraj", "size": 5 }) assert r.status_code == 200 def test_judge_search_pagination_without_page(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sudca", params={"size": 10}) assert r.status_code == 200 data = r.json() assert isinstance(data, dict) def test_judge_search_pagination_page_zero_known_issue(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/sudca", params={"page": 0, "size": 10}) assert r.status_code in (200, 500), f"Unexpected status: {r.status_code}" @skip_if_offline class TestDecisionsEndpoint: def test_decision_search_returns_200(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/rozhodnutie", params={"size": 3}) assert r.status_code == 200 def test_decision_search_with_date_range(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/rozhodnutie", params={ "vydaniaOd": "01.01.2023", "vydaniaDo": "31.12.2023", "size": 3, }) assert r.status_code == 200 def test_decision_autocomplete(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/rozhodnutie/autocomplete", params={"query": "Rozsudok", "limit": 5}) assert r.status_code == 200 @skip_if_offline class TestContractsEndpoint: def test_contract_search_returns_200(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/zmluvy", params={"size": 5}) assert r.status_code == 200 def test_contract_search_by_typ_dokumentu(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/zmluvy", params={ "typDokumentuFacetFilter": "ZMLUVA", "size": 3, }) assert r.status_code == 200 @skip_if_offline class TestCivilProceedingsEndpoint: def test_civil_proceedings_returns_200(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/obcianPojednavania", params={"size": 3}) assert r.status_code == 200 def test_civil_proceedings_date_filter_known_issue(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/obcianPojednavania", params={ "pojednavaniaOd": "01.01.2024", "pojednavaniaDo": "31.01.2024", "size": 3, }) # Known server-side bug — accept 200 or 500 assert r.status_code in (200, 500), f"Unexpected status: {r.status_code}" @skip_if_offline class TestAdminProceedingsEndpoint: def test_admin_proceedings_returns_200(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/spravneKonanie", params={"size": 3}) assert r.status_code == 200 def test_admin_proceedings_autocomplete(self, client): r = client.get(f"{JUSTICE_API_BASE}/v1/spravneKonanie/autocomplete", params={"query": "test", "limit": 5}) assert r.status_code == 200