leaky-ships/leaky-ships/e2e/email.spec.ts

75 lines
2 KiB
TypeScript

import {
test,
type Browser,
type BrowserContext,
type Page,
} from "@playwright/test"
import { createHash, randomBytes } from "crypto"
import prisma from "../lib/prisma"
const callbackUrl = process.env.NEXTAUTH_URL + "/"
const player1Email = (browser: Browser) =>
browser.browserType().name() + "-player-1@example.com"
let context: BrowserContext
let page: Page
test.describe.serial("Check Email auth", () => {
test.beforeAll(async ({ browser }) => {
context = await browser.newContext()
page = await context.newPage()
})
test.afterAll(async () => {
await context.close()
})
test("Email login process...", async ({ browser }) => {
await page.goto(callbackUrl + "signin")
await page.waitForSelector("input#email")
await page.fill("input#email", player1Email(browser))
await page.click("button#email-submit")
await page.waitForURL(
callbackUrl + "api/auth/verify-request?provider=email&type=email",
)
await page.waitForLoadState("domcontentloaded")
})
test("Verify Email...", async ({ browser }) => {
const token = randomBytes(32).toString("hex")
const hash = createHash("sha256")
// Prefer provider specific secret, but use default secret if none specified
.update(`${token}${process.env.NEXTAUTH_SECRET}`)
.digest("hex")
// Use Prisma to fetch the latest token for the email
const latestToken = await prisma.verificationToken.findFirst({
where: { identifier: player1Email(browser) },
orderBy: { expires: "desc" },
})
await prisma.verificationToken.update({
where: {
identifier_token: {
identifier: player1Email(browser),
token: latestToken?.token ?? "",
},
},
data: { token: hash },
})
const params = new URLSearchParams({
callbackUrl,
token,
email: player1Email(browser),
})
const url = callbackUrl + "api/auth/callback/email?" + params
await page.goto(url)
await page.waitForLoadState("domcontentloaded")
})
})