Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion app/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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:
Expand Down
45 changes: 45 additions & 0 deletions app/test_main.py
Original file line number Diff line number Diff line change
@@ -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