calcom/apps/web/playwright/auth/auth-index.test.ts
Agusti Fernandez 8bc5a75249
Feature: Verify login on signup with magic link. (#2122)
* 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>
2022-04-21 14:32:25 -06:00

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");