From abca49120ce4b631e47938646d3e0ddd9d3e3069 Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Tue, 29 Sep 2026 00:33:43 +0200 Subject: [PATCH] test(e2e): cover the settings pages Old addresses redirect, the name saves on blur, Export everything downloads a zip, the theme applies at once, and a new key is shown once and revoked with Undo. --- tests/e2e/specs/settings.spec.ts | 54 ++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/e2e/specs/settings.spec.ts diff --git a/tests/e2e/specs/settings.spec.ts b/tests/e2e/specs/settings.spec.ts new file mode 100644 index 000000000..e87ad5240 --- /dev/null +++ b/tests/e2e/specs/settings.spec.ts @@ -0,0 +1,54 @@ +import { expect, test } from "../fixtures/test"; + +test("three settings pages that save as you go; keys shown once and revoked with undo", async ({ authPage: page }) => { + test.setTimeout(60_000); + + // Old addresses land on the new pages. + await page.goto("/dashboard/settings/profile"); + await page.waitForURL(/\/dashboard\/settings\/account$/); + await page.goto("/dashboard/settings/api-keys"); + await page.waitForURL(/\/dashboard\/settings\/ai$/); + await page.goto("/dashboard/settings"); + await page.waitForURL(/\/dashboard\/settings\/account$/); + + // Name saves on blur. + const name = page.getByLabel("Name", { exact: true }); + await name.fill("Dana Reyes"); + await name.blur(); + await expect + .poll(async () => (await page.request.get("/api/auth/get-session")).json()) + .toMatchObject({ + user: { name: "Dana Reyes" }, + }); + + // Export everything downloads one zip. + const download = page.waitForEvent("download"); + await page.getByRole("button", { name: "Export", exact: true }).click(); + expect((await download).suggestedFilename()).toMatch(/^reactive-resume-\d{4}-\d{2}-\d{2}\.zip$/); + + // Appearance applies at once. + await page.getByRole("link", { name: "Preferences" }).click(); + // The tiles are labels around visually hidden radios. + await page.locator("label", { hasText: "Dark" }).click(); + await expect(page.getByRole("radio", { name: "Dark" })).toBeChecked(); + await expect(page.locator("html")).toHaveClass(/dark/); + await page.locator("label", { hasText: "Light" }).click(); + + // A new key is shown once; revoking it offers Undo. + await page.getByRole("link", { name: "AI & developer" }).click(); + await page.getByRole("button", { name: "New key" }).click(); + const dialog = page.getByRole("dialog", { name: "New API key" }); + await dialog.getByLabel("What's it for?").fill("E2E script"); + await dialog.locator("label", { hasText: "Never" }).click(); + await expect(dialog.getByRole("radio", { name: "Never" })).toBeChecked(); + await dialog.getByRole("button", { name: "Create key" }).click(); + await expect(dialog.getByText("Copy it now. For your security, it won't be shown again.")).toBeVisible(); + await dialog.getByRole("button", { name: "Done" }).click(); + + const row = page.getByRole("row", { name: /E2E script/ }); + await expect(row).toBeVisible(); + await row.getByRole("button", { name: "Revoke E2E script" }).click(); + await expect(row).toBeHidden(); + await page.getByRole("button", { name: "Undo" }).click(); + await expect(page.getByRole("row", { name: /E2E script/ })).toBeVisible(); +});