from __future__ import annotations import httpx import pytest @pytest.mark.integration def test_reminders_summary_aggregates_overdue_and_upcoming( api_client: httpx.Client, create_test_user, ): """ Scenario: Reminders summary calculations. Validates that /api/v1/reminders/summary calculates overdue and upcoming items. """ user = create_test_user(email_prefix="rem_summary") # Create an overdue item api_client.post( "/api/v1/items", json={"name": "Overdue Passport", "lifecycleType": "renewal", "dueDate": "2020-01-01"}, headers=user["headers"], ) # Create an upcoming item (due in 5 days, or within upcoming window) api_client.post( "/api/v1/items", json={"name": "Upcoming Car Checkup", "lifecycleType": "maintenance", "dueDate": "2026-10-14"}, headers=user["headers"], ) res = api_client.get("/api/v1/reminders/summary", headers=user["headers"]) assert res.status_code == 200 data = res.json() assert "overdue" in data assert "upcoming" in data assert "totalActiveReminders" in data assert data["totalActiveReminders"] >= 1 assert any(it["name"] == "Overdue Passport" for it in data["overdue"]) @pytest.mark.integration def test_daily_digest_config_crud(api_client: httpx.Client, alex_auth_headers): """ Scenario: Daily digest configuration retrieval and updating. """ # 1. Fetch current config get_res = api_client.get("/api/v1/reminders/digest/config", headers=alex_auth_headers) assert get_res.status_code == 200 config = get_res.json() assert "timeZone" in config assert "deliveryTime" in config assert config["enabled"] is True # 2. Update config patch_res = api_client.patch( "/api/v1/reminders/digest/config", json={"deliveryTime": "09:00", "timeZone": "America/New_York"}, headers=alex_auth_headers, ) assert patch_res.status_code == 200 updated = patch_res.json() assert updated["deliveryTime"] == "09:00" assert updated["timeZone"] == "America/New_York" @pytest.mark.integration def test_generate_daily_digest_email_and_history(api_client: httpx.Client, alex_auth_headers): """ Scenario: Daily digest generation and history logging. """ # Generate digest email gen_res = api_client.post("/api/v1/reminders/digest/generate", headers=alex_auth_headers) assert gen_res.status_code == 200 digest = gen_res.json() assert "subject" in digest assert "htmlContent" in digest assert "textContent" in digest assert "overdueCount" in digest assert "upcomingCount" in digest assert digest["recipientEmail"] == "alex@example.com" digest_id = digest["id"] # Verify digest appears in history hist_res = api_client.get("/api/v1/reminders/digest/history", headers=alex_auth_headers) assert hist_res.status_code == 200 history_list = hist_res.json() assert any(item["id"] == digest_id for item in history_list)