75 lines
2 KiB
TypeScript
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")
|
|
})
|
|
})
|