Files
SnapOtter/tests/e2e-analytics/seven-day-reminder.spec.ts
T

122 lines
4.6 KiB
TypeScript
Raw Normal View History

import { expect, test } from "@playwright/test";
import { login } from "./helpers";
// Tests the 7-day reminder lifecycle. Since we can't wait 7 real days,
// we verify the DB state transitions via the API and confirm the UI
// behavior is consistent with shouldShowConsent() logic.
test.describe("7-day Reminder Lifecycle", () => {
test.use({ storageState: { cookies: [], origins: [] } });
test.describe.configure({ mode: "serial" });
let token: string;
test("login and obtain auth token", async ({ page }) => {
await login(page);
await page.waitForURL(/analytics-consent|\//, { timeout: 15_000 });
// Accept consent if shown so we can use the API
if (page.url().includes("analytics-consent")) {
await page.getByRole("button", { name: /sure, sounds good/i }).click();
await page.waitForURL("/", { timeout: 30_000 });
}
token = await page.evaluate(() => localStorage.getItem("snapotter-token") ?? "");
expect(token).toBeTruthy();
});
test("remindLater via API sets remindAt 7 days in the future", async ({ page }) => {
await login(page);
await page.waitForURL(/analytics-consent|\//, { timeout: 15_000 });
if (page.url().includes("analytics-consent")) {
await page.getByRole("button", { name: /sure, sounds good/i }).click();
await page.waitForURL("/", { timeout: 30_000 });
}
token = await page.evaluate(() => localStorage.getItem("snapotter-token") ?? "");
const before = Date.now();
const apiBase = process.env.API_URL || "http://localhost:13491";
await page.request.put(`${apiBase}/api/v1/user/analytics`, {
headers: { Authorization: `Bearer ${token}` },
data: { remindLater: true },
});
const sessionRes = await page.request.get(`${apiBase}/api/auth/session`, {
headers: { Authorization: `Bearer ${token}` },
});
const session = await sessionRes.json();
expect(session.user.analyticsEnabled).toBeNull();
expect(session.user.analyticsConsentRemindAt).toBeGreaterThanOrEqual(before);
const sevenDays = 7 * 24 * 60 * 60 * 1000;
expect(session.user.analyticsConsentRemindAt).toBeGreaterThanOrEqual(before + sevenDays - 2000);
expect(session.user.analyticsConsentRemindAt).toBeLessThanOrEqual(
Date.now() + sevenDays + 2000,
);
});
test("after remindLater, user can still accept via API", async ({ page }) => {
await login(page);
await page.waitForURL(/analytics-consent|\//, { timeout: 15_000 });
if (page.url().includes("analytics-consent")) {
await page.getByRole("button", { name: /sure, sounds good/i }).click();
await page.waitForURL("/", { timeout: 30_000 });
}
token = await page.evaluate(() => localStorage.getItem("snapotter-token") ?? "");
const apiBase = process.env.API_URL || "http://localhost:13491";
// Set remind later
await page.request.put(`${apiBase}/api/v1/user/analytics`, {
headers: { Authorization: `Bearer ${token}` },
data: { remindLater: true },
});
// Now accept
await page.request.put(`${apiBase}/api/v1/user/analytics`, {
headers: { Authorization: `Bearer ${token}` },
data: { enabled: true },
});
const sessionRes = await page.request.get(`${apiBase}/api/auth/session`, {
headers: { Authorization: `Bearer ${token}` },
});
const session = await sessionRes.json();
expect(session.user.analyticsEnabled).toBe(true);
expect(session.user.analyticsConsentRemindAt).toBeNull();
});
test("after remindLater, user can explicitly decline via API", async ({ page }) => {
await login(page);
await page.waitForURL(/analytics-consent|\//, { timeout: 15_000 });
if (page.url().includes("analytics-consent")) {
await page.getByRole("button", { name: /sure, sounds good/i }).click();
await page.waitForURL("/", { timeout: 30_000 });
}
token = await page.evaluate(() => localStorage.getItem("snapotter-token") ?? "");
const apiBase = process.env.API_URL || "http://localhost:13491";
await page.request.put(`${apiBase}/api/v1/user/analytics`, {
headers: { Authorization: `Bearer ${token}` },
data: { remindLater: true },
});
await page.request.put(`${apiBase}/api/v1/user/analytics`, {
headers: { Authorization: `Bearer ${token}` },
data: { enabled: false },
});
const sessionRes = await page.request.get(`${apiBase}/api/auth/session`, {
headers: { Authorization: `Bearer ${token}` },
});
const session = await sessionRes.json();
expect(session.user.analyticsEnabled).toBe(false);
expect(session.user.analyticsConsentRemindAt).toBeNull();
});
});