import { test, expect } from "@playwright/test"; import { resolveUrl, getSessionCookie } from "./helpers"; /** * E2E tests for user endpoints: stats, profile, and account management. */ test.describe("User API", () => { let cookie: string; test.beforeEach(async ({ page }) => { cookie = await getSessionCookie(page); }); test("1. User stats returns 200 for authenticated user", async ({ page }) => { const res = await page.request.get(resolveUrl("/api/user/stats"), { headers: { Cookie: cookie }, }); expect(res.status()).toBe(200); const data = await res.json(); expect(data).toHaveProperty("totalComparisons"); expect(data).toHaveProperty("totalViews"); expect(typeof data.totalComparisons).toBe("number"); expect(typeof data.totalViews).toBe("number"); }); test("2. User stats requires auth", async ({ page }) => { const res = await page.request.get(resolveUrl("/api/user/stats")); expect(res.status()).toBe(401); }); test("3. User stats increments after new comparison", async ({ page }) => { const beforeRes = await page.request.get(resolveUrl("/api/user/stats"), { headers: { Cookie: cookie }, }); const before = await beforeRes.json(); const countBefore = before.totalComparisons ?? 0; // Create a new comparison const createRes = await page.request.post(resolveUrl("/api/compare"), { data: { items: ["TypeScript", "JavaScript"] }, headers: { "Content-Type": "application/json", Cookie: cookie, Accept: "text/event-stream", }, timeout: 120_000, }); if (createRes.status() === 200) { // Wait briefly for DB write await new Promise((r) => setTimeout(r, 2000)); const afterRes = await page.request.get(resolveUrl("/api/user/stats"), { headers: { Cookie: cookie }, }); const after = await afterRes.json(); expect(after.totalComparisons).toBeGreaterThanOrEqual(countBefore); } }); test("4. User comparisons list pagination works", async ({ page }) => { const res = await page.request.get(resolveUrl("/api/user/comparisons?page=1&limit=5"), { headers: { Cookie: cookie }, }); expect(res.status()).toBe(200); }); test("5. Auth session is bound to correct user", async ({ page }) => { const res = await page.request.get(resolveUrl("/api/user/stats"), { headers: { Cookie: cookie }, }); const data = await res.json(); // Stats should be non-negative integers expect(data.totalComparisons).toBeGreaterThanOrEqual(0); expect(data.totalViews).toBeGreaterThanOrEqual(0); }); });