Visitenbuch/tests/helpers/login.ts
2024-05-14 00:40:10 +02:00

58 lines
1.7 KiB
TypeScript

import { encode } from "@auth/core/jwt";
import { expect, type Page } from "@playwright/test";
import { prisma } from "$lib/server/prisma";
const AUTH_COOKIE = "authjs.session-token";
export const OIDC_BASE_URL = "http://localhost:9090/interaction/";
export const USERNAME = "Tico Testboy";
export const USER_EMAIL = "t.testboy@example.org";
export async function loginIfNecessary(page: Page) {
if (page.url().startsWith(OIDC_BASE_URL)) {
await page.locator('input[name="login"]').fill("Lucy Login");
await page.locator('input[name="password"]').fill("1234");
await page.locator("button.login-submit").click();
await page.getByRole("button", { name: "Continue" }).click();
expect(await isLoggedIn(page)).toBe(true);
}
}
export async function isLoggedIn(page: Page): Promise<boolean> {
const cookies = await page.context().cookies();
return cookies.findIndex((c) => c.name === AUTH_COOKIE) !== -1;
}
/**
* Create a session token (Cookie: authjs.session-token) to use for E2E tests
* so we dont have to step through the login system every time
*/
export async function newSessionToken(user_id: number): Promise<string> {
const user = await prisma.user.findUniqueOrThrow({
select: { email: true, name: true },
where: { id: user_id },
});
return encode({
salt: AUTH_COOKIE,
secret: process.env.AUTH_SECRET!,
token: {
name: user.name,
email: user.email,
sub: user_id.toString(),
id: user_id.toString(),
},
});
}
export async function loginWithToken(page: Page, user_id = 1) {
const token = await newSessionToken(user_id);
await page.context().addCookies([{
name: AUTH_COOKIE,
value: token,
domain: "localhost",
path: "/",
httpOnly: true,
sameSite: "Lax",
}]);
}