Files
Recordly/tests/ui/auth.ts
T
webadderall 08f72ef6aa Recordly 2.0 local review stack 5/6
Dependency-ordered review preparation. Not pushed or remotely reviewed.
2026-11-06 05:24:22 +11:00

75 lines
2.7 KiB
TypeScript

import type { Page } from "@playwright/test";
import type { User } from "@supabase/supabase-js";
const user = {
id: "00000000-0000-4000-8000-000000000001",
email: "test@email.com",
aud: "authenticated",
role: "authenticated",
app_metadata: { provider: "email", providers: ["email"] },
user_metadata: { full_name: "Test User" },
created_at: "2026-09-23T00:00:00.000Z",
email_confirmed_at: "2026-09-23T00:00:00.000Z",
is_anonymous: false,
};
export async function installSupabaseAuth(page: Page, { signedIn = true } = {}) {
await page.route("**/cloud/config", (route) =>
route.fulfill({
headers: { "Access-Control-Allow-Origin": "*" },
json: { authCaptcha: { enabled: false } },
}),
);
const account: User = structuredClone(user);
const expiresAt = Math.floor(Date.now() / 1000) + 3600;
const encode = (value: unknown) => Buffer.from(JSON.stringify(value)).toString("base64url");
const session = {
access_token: `${encode({ alg: "HS256", typ: "JWT" })}.${encode({ sub: user.id, exp: expiresAt, role: "authenticated" })}.ui-test-signature`,
refresh_token: "ui-test-refresh-token",
token_type: "bearer",
expires_in: 3600,
expires_at: expiresAt,
user: account,
};
await page.route("https://auth.recordly.test/**", async (route) => {
const path = new URL(route.request().url()).pathname;
if (path === "/auth/v1/settings")
return route.fulfill({
json: { external: { google: true, azure: true, apple: true, email: true } },
});
if (path === "/auth/v1/verify") return route.fulfill({ json: session });
if (path === "/auth/v1/token") return route.fulfill({ json: session });
if (path === "/auth/v1/user") {
if (route.request().method() === "PUT") {
const update = route.request().postDataJSON();
if (update.data)
account.user_metadata = { ...account.user_metadata, ...update.data };
if (update.email) account.new_email = update.email;
}
return route.fulfill({ json: account });
}
if (path === "/auth/v1/otp") return route.fulfill({ json: {} });
if (path === "/auth/v1/logout") return route.fulfill({ status: 204 });
return route.fulfill({ status: 503, json: { message: "Service unavailable in UI tests" } });
});
await page.addInitScript(
({ signedIn, session }) => {
if (sessionStorage.getItem("recordly.ui.auth.initialized")) return;
sessionStorage.setItem("recordly.ui.auth.initialized", "1");
if (signedIn) localStorage.setItem("sb-auth-auth-token", JSON.stringify(session));
else localStorage.removeItem("sb-auth-auth-token");
},
{ signedIn, session },
);
}
export async function completeSupabaseSignIn(page: Page) {
await page.evaluate(() => {
window.dispatchEvent(
new CustomEvent("recordly-test-auth-callback", {
detail: "recordly-dev://auth/callback?code=ui-auth-code",
}),
);
});
}