diff --git a/app/reports.py b/app/reports.py index 2d7bf93..9ea26b1 100644 --- a/app/reports.py +++ b/app/reports.py @@ -6,7 +6,7 @@ from __future__ import annotations -from datetime import datetime +from datetime import datetime, timezone from typing import Iterable from app.data import all_reports @@ -16,6 +16,14 @@ _SORTABLE_FIELDS = {"id", "title", "status", "owner", "amount", "created_at"} +def _normalize_datetime(value: datetime | None) -> datetime | None: + if value is None: + return None + if value.tzinfo is None: + return value.replace(tzinfo=timezone.utc) + return value.astimezone(timezone.utc) + + def query( *, status: ReportStatus | None = None, @@ -29,6 +37,9 @@ def query( if sort not in _SORTABLE_FIELDS: raise ValueError(f"Unsupported sort field: {sort!r}") + date_from = _normalize_datetime(date_from) + date_to = _normalize_datetime(date_to) + rows: Iterable[Report] = all_reports() if status is not None: diff --git a/app/test_main.py b/app/test_main.py new file mode 100644 index 0000000..5ddd99c --- /dev/null +++ b/app/test_main.py @@ -0,0 +1,45 @@ +from fastapi.testclient import TestClient + +from app.main import app + + +client = TestClient(app) + + +def test_health_endpoint() -> None: + response = client.get("/health") + assert response.status_code == 200 + assert response.json() == {"status": "ok"} + + +def test_reports_endpoint_supports_query_params() -> None: + response = client.get( + "/reports", + params={ + "status": "approved", + "date_from": "2026-01-10T00:00:00Z", + "date_to": "2026-03-01T00:00:00Z", + "sort": "amount", + "descending": "false", + "offset": 1, + "limit": 3, + }, + ) + assert response.status_code == 200 + payload = response.json() + assert payload["offset"] == 1 + assert payload["limit"] == 3 + assert payload["total"] >= 0 + assert len(payload["items"]) <= 3 + assert all(item["status"] == "approved" for item in payload["items"]) + + +def test_reports_endpoint_accepts_date_only_strings() -> None: + response = client.get( + "/reports", + params={"date_from": "2026-01-05", "date_to": "2026-01-10", "limit": 1}, + ) + assert response.status_code == 200 + payload = response.json() + assert payload["limit"] == 1 + assert len(payload["items"]) <= 1