
* manual migration to rename verificationtoken, maybe it could be dropped and create a new table instead if we're not using it, will consult @zomars * feat: rename verificationRequest --> verificationToken in schema.prisma * fix: rename verificationRequest -> verificationToken in the codebase * feat: add default cookies for next-auth * fix: moves @lib/serverConfig to @calcom/lib so it can be called by website too * fix: make self-certificate work in dev env by not rejecting tls in serverConfig * fix verificationTokenToken typo Co-authored-by: Omar López <zomars@me.com> * Adds domain: .cal.com if not dev env in cookies * Adds default-cookies to apps/web, and nextauth_domain to turbo website build deps"a * update NEXTAUTH_DOMAIN to NEXTAUTH_COOKIE_DOMAIN * Updates website submodule * Removes deprecated env vars * Consolidates auth logic in one place * Updates website module * Signup fixes * Build fixes * Updates example * Updates example * Fixes * Fix Email Verification * fix: move csrf-token cookiePrefix from __Host -> __Secure * Removes console log * Fixes link in email template * Removed irrelevant coment * Testing with a 32 bit secret * Fixes for cookien in E2E * E2E fixes * Fixes Stripe tests locally * Temp fix for E2E Co-authored-by: Agusti Fernandez Pardo <git@agusti.me> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> Co-authored-by: Omar López <zomars@me.com> Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
119 lines
4.3 KiB
TypeScript
119 lines
4.3 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
|
|
import { WEBAPP_URL } from "@lib/config/constants";
|
|
import prisma from "@lib/prisma";
|
|
|
|
import { todo } from "../lib/testUtils";
|
|
|
|
test.describe("Can signup from a team invite", async () => {
|
|
let page;
|
|
let token: string | undefined;
|
|
let signupFromInviteURL = "";
|
|
const team = { name: "Seeded Team", slug: "seeded-team" };
|
|
const testUser = {
|
|
email: "test@test.com",
|
|
password: "secretpassword123",
|
|
validUsername: "test-user",
|
|
};
|
|
const usernameAlreadyTaken = "teampro";
|
|
const emailAlreadyTaken = "teampro@example.com";
|
|
|
|
test.use({ storageState: "playwright/artifacts/teamproStorageState.json" });
|
|
test.beforeAll(async ({ browser }) => {
|
|
page = await browser.newPage();
|
|
|
|
await page.goto("/settings/teams");
|
|
|
|
await page.waitForSelector(`a[title="${team.name}"]`);
|
|
await page.click(`a[title="${team.name}"]`);
|
|
|
|
// Send invite to team
|
|
await page.click('[data-testid="new-member-button"]');
|
|
await page.fill('input[id="inviteUser"]', testUser.email);
|
|
await page.click('[data-testid="invite-new-member-button"]');
|
|
|
|
// Wait for the invite to be sent
|
|
await page.waitForSelector(`[data-testid="member-email"][data-email="${testUser.email}"]`);
|
|
|
|
const tokenObj = await prisma.verificationToken.findFirst({
|
|
where: { identifier: testUser.email },
|
|
select: { token: true },
|
|
});
|
|
token = tokenObj?.token;
|
|
signupFromInviteURL = `/auth/signup?token=${token}&callbackUrl=${WEBAPP_URL}/settings/teams`;
|
|
});
|
|
|
|
test.afterAll(async () => {
|
|
// Delete test user
|
|
await prisma.user.delete({
|
|
where: { email: testUser.email },
|
|
});
|
|
// Delete verification request
|
|
await prisma.verificationToken.delete({
|
|
where: { token },
|
|
});
|
|
});
|
|
|
|
test("Username already taken", async ({ page }) => {
|
|
expect(token).toBeDefined();
|
|
await page.goto(signupFromInviteURL);
|
|
// Fill in form
|
|
await page.fill('input[name="username"]', usernameAlreadyTaken);
|
|
await page.fill('input[name="email"]', testUser.email);
|
|
await page.fill('input[name="password"]', testUser.password);
|
|
await page.fill('input[name="passwordcheck"]', testUser.password);
|
|
await page.press('input[name="passwordcheck"]', "Enter"); // Press Enter to submit
|
|
|
|
await expect(page.locator('text="Username already taken"')).toBeVisible();
|
|
});
|
|
|
|
test("Email address is already registered", async ({ page }) => {
|
|
expect(token).toBeDefined();
|
|
await page.goto(signupFromInviteURL);
|
|
// Fill in form
|
|
await page.fill('input[name="username"]', testUser.validUsername);
|
|
await page.fill('input[name="email"]', emailAlreadyTaken);
|
|
await page.fill('input[name="password"]', testUser.password);
|
|
await page.fill('input[name="passwordcheck"]', testUser.password);
|
|
await page.press('input[name="passwordcheck"]', "Enter"); // Press Enter to submit
|
|
|
|
await expect(page.locator('text="Email address is already registered"')).toBeVisible();
|
|
});
|
|
|
|
test("Successful signup", async ({ page }) => {
|
|
expect(token).toBeDefined();
|
|
await page.goto(signupFromInviteURL);
|
|
// Fill in form
|
|
await page.fill('input[name="username"]', testUser.validUsername);
|
|
await page.fill('input[name="email"]', testUser.email);
|
|
await page.fill('input[name="password"]', testUser.password);
|
|
await page.fill('input[name="passwordcheck"]', testUser.password);
|
|
await page.press('input[name="passwordcheck"]', "Enter"); // Press Enter to submit
|
|
|
|
await page.waitForNavigation();
|
|
|
|
const createdUser = await prisma.user.findUnique({
|
|
where: { email: testUser.email },
|
|
include: {
|
|
teams: {
|
|
include: {
|
|
team: true,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
// Check that the user was created
|
|
expect(createdUser).not.toBeNull();
|
|
expect(createdUser?.username).toBe(testUser.validUsername);
|
|
expect(createdUser?.password).not.toBeNull();
|
|
expect(createdUser?.emailVerified).not.toBeNull();
|
|
// Check that the user accepted the team invite
|
|
expect(createdUser?.teams).toHaveLength(1);
|
|
expect(createdUser?.teams[0].team.name).toBe(team.name);
|
|
expect(createdUser?.teams[0].team.slug).toBe(team.slug);
|
|
expect(createdUser?.teams[0].role).toBe("MEMBER");
|
|
expect(createdUser?.teams[0].accepted).toBe(true);
|
|
});
|
|
});
|
|
|
|
todo("Can login using 2FA");
|