160 lines
5.5 KiB
Python
160 lines
5.5 KiB
Python
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 |