add reporting foundation: multipage nav, auth gate, date-range fetch
First increment of the clinical reporting feature (see docs/requirements-reporting.md and docs/design-reporting.md): moves the existing live view to pages/1_Live.py, adds a password gate since the dashboard URL will be shared with the diabetes team, adds fetch_entries_range/fetch_treatments_range for multi-day report queries, and adds reporting.py with the core clinical calculations (GMI, %CV, 5-band time-in-range, hypo/hyper event detection per the Battelino et al. 2019 persistence rule). No report pages wired up yet — that's next. Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from datetime import date, datetime, timedelta, timezone
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -96,3 +96,41 @@ def pd_isna(value):
|
||||
import pandas as pd
|
||||
|
||||
return pd.isna(value)
|
||||
|
||||
|
||||
def test_fetch_entries_range_filters_to_date_boundaries(monkeypatch):
|
||||
monkeypatch.setenv("NIGHTSCOUT_URL", "https://example.com")
|
||||
monkeypatch.delenv("NIGHTSCOUT_TOKEN", raising=False)
|
||||
monkeypatch.delenv("NIGHTSCOUT_API_SECRET", raising=False)
|
||||
|
||||
payload = [
|
||||
{"date": int(datetime(2026, 1, 15, 12, 0, tzinfo=timezone.utc).timestamp() * 1000), "sgv": 126},
|
||||
{"date": int(datetime(2026, 1, 1, 12, 0, tzinfo=timezone.utc).timestamp() * 1000), "sgv": 90},
|
||||
{"date": int(datetime(2026, 2, 1, 12, 0, tzinfo=timezone.utc).timestamp() * 1000), "sgv": 100},
|
||||
]
|
||||
monkeypatch.setattr(ns.requests, "get", lambda *a, **k: FakeResponse(payload))
|
||||
|
||||
result = ns.fetch_entries_range(date(2026, 1, 1), date(2026, 1, 31))
|
||||
assert len(result) == 2 # de 1 feb-meting valt buiten het bereik
|
||||
assert list(result.columns) == ["timestamp", "mmol"]
|
||||
|
||||
|
||||
def test_fetch_entries_range_handles_empty_response(monkeypatch):
|
||||
monkeypatch.setenv("NIGHTSCOUT_URL", "https://example.com")
|
||||
monkeypatch.setattr(ns.requests, "get", lambda *a, **k: FakeResponse([]))
|
||||
|
||||
result = ns.fetch_entries_range(date(2026, 1, 1), date(2026, 1, 31))
|
||||
assert result.empty
|
||||
|
||||
|
||||
def test_fetch_treatments_range_filters_to_date_boundaries(monkeypatch):
|
||||
monkeypatch.setenv("NIGHTSCOUT_URL", "https://example.com")
|
||||
payload = [
|
||||
{"created_at": "2026-01-15T12:00:00Z", "eventType": "Meal Bolus", "insulin": 4.0, "carbs": 40},
|
||||
{"created_at": "2026-02-01T12:00:00Z", "eventType": "Meal Bolus", "insulin": 3.0, "carbs": 30},
|
||||
]
|
||||
monkeypatch.setattr(ns.requests, "get", lambda *a, **k: FakeResponse(payload))
|
||||
|
||||
result = ns.fetch_treatments_range(date(2026, 1, 1), date(2026, 1, 31))
|
||||
assert len(result) == 1
|
||||
assert result.iloc[0]["insulin"] == pytest.approx(4.0)
|
||||
|
||||
Reference in New Issue
Block a user