130 lines
5.0 KiB
TypeScript
130 lines
5.0 KiB
TypeScript
import { expect } from "@playwright/test";
|
|
|
|
import { WEBAPP_URL } from "@calcom/lib/constants";
|
|
|
|
import { test } from "../lib/fixtures";
|
|
import { localize, getInviteLink } from "../lib/testUtils";
|
|
import { expectInvitationEmailToBeReceived } from "./expects";
|
|
|
|
test.describe.configure({ mode: "parallel" });
|
|
|
|
test.afterEach(async ({ users }) => {
|
|
await users.deleteAll();
|
|
});
|
|
|
|
test.describe("Team", () => {
|
|
test("Invitation (non verified)", async ({ browser, page, users, emails }) => {
|
|
const t = await localize("en");
|
|
const teamOwner = await users.create(undefined, { hasTeam: true });
|
|
const { team } = await teamOwner.getFirstTeamMembership();
|
|
await teamOwner.apiLogin();
|
|
await page.goto(`/settings/teams/${team.id}/members`);
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
await test.step("To the team by email (external user)", async () => {
|
|
const invitedUserEmail = users.trackEmail({
|
|
username: "rick",
|
|
domain: `domain-${Date.now()}.com`,
|
|
});
|
|
await page.locator(`button:text("${t("add")}")`).click();
|
|
await page.locator('input[name="inviteUser"]').fill(invitedUserEmail);
|
|
await page.locator(`button:text("${t("send_invite")}")`).click();
|
|
await page.waitForLoadState("networkidle");
|
|
const inviteLink = await expectInvitationEmailToBeReceived(
|
|
page,
|
|
emails,
|
|
invitedUserEmail,
|
|
`${team.name}'s admin invited you to join the team ${team.name} on BLS cal`,
|
|
"signup?token"
|
|
);
|
|
|
|
//Check newly invited member exists and is pending
|
|
await expect(
|
|
page.locator(`[data-testid="email-${invitedUserEmail.replace("@", "")}-pending"]`)
|
|
).toHaveCount(1);
|
|
|
|
// eslint-disable-next-line playwright/no-conditional-in-test
|
|
if (!inviteLink) return null;
|
|
|
|
// Follow invite link to new window
|
|
const context = await browser.newContext();
|
|
const newPage = await context.newPage();
|
|
await newPage.goto(inviteLink);
|
|
await newPage.waitForLoadState("networkidle");
|
|
|
|
// Check required fields
|
|
const button = newPage.locator("button[type=submit][disabled]");
|
|
await expect(button).toBeVisible(); // email + 3 password hints
|
|
|
|
// Check required fields
|
|
await newPage.locator("input[name=password]").fill(`P4ssw0rd!`);
|
|
await newPage.locator("button[type=submit]").click();
|
|
await newPage.waitForURL("/getting-started?from=signup");
|
|
await newPage.close();
|
|
await context.close();
|
|
|
|
// Check newly invited member is not pending anymore
|
|
await page.bringToFront();
|
|
await page.goto(`/settings/teams/${team.id}/members`);
|
|
await page.waitForLoadState("networkidle");
|
|
await expect(
|
|
page.locator(`[data-testid="email-${invitedUserEmail.replace("@", "")}-pending"]`)
|
|
).toHaveCount(0);
|
|
});
|
|
|
|
await test.step("To the team by invite link", async () => {
|
|
const user = await users.create({
|
|
email: `user-invite-${Date.now()}@domain.com`,
|
|
password: "P4ssw0rd!",
|
|
});
|
|
await page.locator(`button:text("${t("add")}")`).click();
|
|
await page.locator(`[data-testid="copy-invite-link-button"]`).click();
|
|
const inviteLink = await getInviteLink(page);
|
|
|
|
const context = await browser.newContext();
|
|
const inviteLinkPage = await context.newPage();
|
|
await inviteLinkPage.goto(inviteLink);
|
|
await inviteLinkPage.waitForLoadState("domcontentloaded");
|
|
|
|
await inviteLinkPage.locator("button[type=submit]").click();
|
|
await expect(inviteLinkPage.locator('[data-testid="field-error"]')).toHaveCount(2);
|
|
|
|
await inviteLinkPage.locator("input[name=email]").fill(user.email);
|
|
await inviteLinkPage.locator("input[name=password]").fill(user.username || "P4ssw0rd!");
|
|
await inviteLinkPage.locator("button[type=submit]").click();
|
|
|
|
await inviteLinkPage.waitForURL(`${WEBAPP_URL}/teams**`);
|
|
});
|
|
});
|
|
|
|
test("Invitation (verified)", async ({ browser, page, users, emails }) => {
|
|
const t = await localize("en");
|
|
const teamOwner = await users.create({ name: `team-owner-${Date.now()}` }, { hasTeam: true });
|
|
const { team } = await teamOwner.getFirstTeamMembership();
|
|
await teamOwner.apiLogin();
|
|
await page.goto(`/settings/teams/${team.id}/members`);
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
await test.step("To the organization by email (internal user)", async () => {
|
|
const invitedUserEmail = users.trackEmail({
|
|
username: "rick",
|
|
domain: `example.com`,
|
|
});
|
|
await page.locator(`button:text("${t("add")}")`).click();
|
|
await page.locator('input[name="inviteUser"]').fill(invitedUserEmail);
|
|
await page.locator(`button:text("${t("send_invite")}")`).click();
|
|
await page.waitForLoadState("networkidle");
|
|
await expectInvitationEmailToBeReceived(
|
|
page,
|
|
emails,
|
|
invitedUserEmail,
|
|
`${teamOwner.name} invited you to join the team ${team.name} on BLS cal`
|
|
);
|
|
|
|
await expect(
|
|
page.locator(`[data-testid="email-${invitedUserEmail.replace("@", "")}-pending"]`)
|
|
).toHaveCount(1);
|
|
});
|
|
});
|
|
});
|