import { openDatabase } from "../../src/features/storage/database.server"; import { expect, test } from "../fixtures"; const origin = "http://127.0.0.1:4173"; test("creates the owner once and enters onboarding with a real session", async ({ page, context, a11y, }) => { const db = openDatabase(process.env.TWITTER_LITE_E2E_DB_PATH ?? ""); db.$client.exec("DELETE FROM workspace_owner; DELETE FROM auth_throttle;"); db.$client.close(); await context.clearCookies(); await page.goto("/", { waitUntil: "networkidle" }); await expect(page).toHaveURL(/\/setup$/); expect((await a11y().analyze()).violations).toEqual([]); await page.getByLabel("Your name", { exact: true }).fill("Yuta"); await page.getByLabel("Email address").fill("owner@workspace.invalid"); await page.getByLabel("Password", { exact: true }).fill("E2E-only-passphrase-2026"); await page.getByLabel("Confirm password", { exact: true }).fill("E2E-only-passphrase-2026"); await page.getByLabel("Setup code").fill("isolated-e2e-setup-token-not-for-production"); await page.getByRole("button", { name: "Create account", exact: true }).click(); await expect(page).toHaveURL(/\/onboarding$/); await page.waitForLoadState("networkidle"); await page.getByRole("button", { name: "Continue", exact: true }).click(); await page.getByRole("button", { name: "Open workspace" }).click(); await expect(page.getByRole("heading", { name: "Good morning, Yuta" })).toBeVisible(); }); test("requires login for documents, server functions, and live updates", async ({ page, context, }) => { const serverRequest = page.waitForRequest((request) => request.url().includes("/_serverFn/")); await page.goto("/deck"); const serverUrl = (await serverRequest).url(); await context.clearCookies(); for (const path of ["/api/research/events", serverUrl]) { const result = await context.request.get(path, { headers: { Origin: origin, "Sec-Fetch-Site": "same-origin" }, }); expect(result.status()).toBe(401); } await page.goto("/journal"); await expect(page).toHaveURL(/\/login(?:\?|$)/); await expect(page.getByRole("heading", { name: "Welcome back." })).toBeVisible(); await expect(page.getByRole("link", { name: "Journal", exact: true })).toHaveCount(0); }); test("signs in and revokes the session on sign out", async ({ page, context, a11y }) => { await context.clearCookies(); await page.goto("/login", { waitUntil: "networkidle" }); expect((await a11y().analyze()).violations).toEqual([]); await page.getByLabel("Email address").fill("owner@workspace.invalid"); await page.getByLabel("Password", { exact: true }).fill("Wrong-passphrase-2026"); await page.getByRole("button", { name: "Sign in", exact: true }).click(); await expect(page.getByRole("alert")).toContainText("Invalid email or password."); await page.getByLabel("Password", { exact: true }).fill("E2E-only-passphrase-2026"); await page.getByRole("button", { name: "Sign in", exact: true }).click(); await expect(page).toHaveURL(`${origin}/`); await page.waitForLoadState("networkidle"); const token = (await context.cookies()).find((cookie) => cookie.name === "workspace_session"); expect(token?.httpOnly).toBe(true); expect(token?.sameSite).toBe("Lax"); await page.getByRole("button", { name: "Manage connected accounts" }).click(); await page.getByRole("button", { name: "Sign out", exact: true }).click(); await expect(page).toHaveURL(/\/login(?:\?|$)/); const replay = await context.request.get("/api/auth", { headers: { Cookie: `workspace_session=${token?.value}` }, }); expect((await replay.json()).owner).toBeNull(); await page.goBack(); await expect(page.getByRole("link", { name: "Home", exact: true })).toHaveCount(0); }); test("requires onboarding and remembers its completion and name", async ({ page, request, a11y, }) => { const db = openDatabase(process.env.TWITTER_LITE_E2E_DB_PATH ?? ""); db.$client .prepare("UPDATE workspace_owner SET onboarding_completed_at = NULL WHERE id = 1") .run(); try { expect((await request.get("/api/research/events")).status()).toBe(403); await page.goto("/", { waitUntil: "networkidle" }); await expect(page).toHaveURL(/\/onboarding$/); expect((await a11y().analyze()).violations).toEqual([]); await page.getByLabel("What should we call you?").fill("Yuta Test"); await page.getByRole("button", { name: "Continue", exact: true }).click(); await page.getByRole("button", { name: "Open workspace" }).click(); await expect(page.getByRole("heading", { name: "Good morning, Yuta Test" })).toBeVisible(); await page.reload(); await expect(page.getByRole("heading", { name: "Good morning, Yuta Test" })).toBeVisible(); await page.goto("/onboarding"); await expect(page).toHaveURL(`${origin}/`); } finally { db.$client .prepare("UPDATE workspace_owner SET name = ?, onboarding_completed_at = ? WHERE id = 1") .run("Yuta", Date.now()); db.$client.close(); } }); test("rejects cross-origin login and further account registration", async ({ request, page, context, }) => { expect( ( await request.post("/api/auth", { headers: { Origin: "https://other.invalid" }, data: { action: "logout" }, }) ).status(), ).toBe(403); const result = await request.post("/api/auth", { headers: { Origin: origin }, data: { action: "setup", email: "intruder@example.com", name: "Intruder", password: "Long-enough-password", setupToken: "arbitrary-token", }, }); expect(result.status()).toBe(409); await context.clearCookies(); await page.goto("/setup"); await expect(page).toHaveURL(/\/login(?:\?|$)/); });