personal-lifecycle-tracker / e2e / reminders-digest.spec.ts
reminders-digest.spec.ts
Raw
import { test, expect } from '@playwright/test';
import { resetDatabase } from './helpers';

test.describe('Reminders & Daily Email Digest Flow (@spec.md Decision 6, 15, 22, 31, 32, 33, Question 34)', () => {
  test.beforeEach(async () => {
    await resetDatabase();
  });

  test('should open In-App Reminders drawer from Navbar bell and show active items', async ({ page }) => {
    await page.goto('/');

    // Bell button should exist
    const bellBtn = page.getByRole('button', { name: /Open Reminders/i });
    await expect(bellBtn).toBeVisible();

    // Open Reminders drawer
    await bellBtn.click();

    // Drawer should appear
    const drawer = page.locator('.fixed.inset-0').filter({ hasText: /In-App Reminders/i });
    await expect(drawer).toBeVisible();
    await expect(drawer.getByText(/Overdue \(/i)).toBeVisible();
    await expect(drawer.getByText(/Upcoming Within 30 Days/i)).toBeVisible();

    // Close drawer
    await drawer.getByRole('button', { name: /Close drawer/i }).click();
    await expect(drawer).toBeHidden();
  });

  test('should configure daily digest delivery time and simulate email generation', async ({ page }) => {
    await page.goto('/');

    // Navigate to Daily Digest tab
    await page.getByRole('button', { name: 'Daily Digest', exact: true }).click();

    // Verify header and permanent dual-channel notice (Decision 22)
    await expect(page.getByRole('heading', { name: 'Reminders & Daily Email Digest' })).toBeVisible();
    await expect(page.getByText('Dual Channel Enabled')).toBeVisible();

    // Verify Question 34 delivery time options
    await expect(page.getByText('Option A')).toBeVisible();
    await expect(page.getByText('6:00 AM')).toBeVisible();
    await expect(page.getByText('Option B')).toBeVisible();
    await expect(page.getByText('8:00 AM')).toBeVisible();
    await expect(page.getByText('Option C')).toBeVisible();
    await expect(page.getByText('Option D')).toBeVisible();

    // Select Option A (6:00 AM)
    const optionA = page.locator('button').filter({ hasText: 'Option A' }).first();
    await optionA.click();

    // Verify saved indicator
    await expect(page.getByText('Saved')).toBeVisible();

    // Trigger Simulate / Send Digest Now
    const sendBtn = page.getByRole('button', { name: /Simulate \/ Send Digest Now/i });
    await sendBtn.click();

    // Wait for generation to finish
    await expect(page.getByText('Email Digest Preview')).toBeVisible();
    await expect(page.getByText(/\[Action Required\]|\[Upcoming Actions\]|\[Lifecycle Tracker\]/i).first()).toBeVisible();

    // Check preview switcher between HTML and Plain Text
    const textTab = page.getByRole('button', { name: /Plain Text/i });
    if (await textTab.isVisible()) {
      await textTab.click();
      await expect(page.locator('pre')).toBeVisible();
    }
  });
});