personal-lifecycle-tracker / backend / tests / integration / test_reminders_and_digest.py
test_reminders_and_digest.py
Raw
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)