integratedhub/tests/e2e/helpers/auth-assertions.ts
2026-02-14 02:20:19 +00:00

69 lines
1.7 KiB
TypeScript

import {
type APIRequestContext,
type APIResponse,
expect,
} from "@playwright/test";
export async function expectPageRedirectsToLogin(
request: APIRequestContext,
path: string,
): Promise<void> {
const response = await request.get(path, { maxRedirects: 0 });
expectRedirectToLogin(response, path);
}
export async function expectApiAuthRequired(
request: APIRequestContext,
path: string,
options?: { method?: "GET" | "POST"; data?: unknown },
): Promise<void> {
const method = options?.method ?? "GET";
const response = await request.fetch(path, {
method,
data: options?.data,
maxRedirects: 0,
});
expect(response.status()).toBe(401);
const body = await response.json();
expect(body).toMatchObject({
error: "Authentication required",
redirectTo: "/auth/login",
});
}
export function expectRedirectToLogin(
response: APIResponse,
returnPath: string,
): void {
expect(response.status()).toBe(302);
const location = response.headers()["location"];
expect(location).toBeTruthy();
const loginUrl = new URL(location!, "http://localhost:8080");
expect(loginUrl.pathname).toBe("/auth/login");
expect(loginUrl.searchParams.get("return_path")).toBe(returnPath);
}
export function getSetCookies(response: APIResponse): string[] {
return response.headersArray()
.filter((header) => header.name.toLowerCase() === "set-cookie")
.map((header) => header.value);
}
export function readCookieFromSetCookieHeader(
setCookies: string[],
cookieName: string,
): string | null {
const pattern = new RegExp(`^${cookieName}=([^;]*)`);
for (const setCookie of setCookies) {
const match = pattern.exec(setCookie);
if (match) {
return match[1];
}
}
return null;
}