* wip * update layoutHOC * wip * remove app router related code no longer used * remove more * await cookies, headers, params, serachparams * update yarn.lock * await cookies, headers, params, serachparams more * update yarn lock again * downgrade next-auth to 4.22.1 * update yarn lock * fix * update yarn lock * fix type checks * update yarn lock * await headers and cookies * restore pages folder * restore yarn.lock * update yarn.lock * await headers and cookies * remove * await params in API routes * updates * restore next.config.js * remove i18n from next.config.js * Fixed tests * Fixed types * Removed duplicate favicon.ico * Fixing more types * ImageResponse moved to next/og * Fixed prisma import issues * dynamic import for @ewsjs/xhr * remove deasync dep * dynamic import for @tryvital/vital-node * fix type checks * add back turbopack command * Type fix * Removed unneeded file * fix turbopack relative path errors * add comments * remove unneeded code * Fixed build errors * await apis * use Promise<Params> type in defaultResponderForAppDir util * refactor scim api route * fix type checks * separate app-routing.config into client-config and server-config * wip * refactor routing forms components * revert unneeded changes for easier review * fix * fix * use CustomTrans * fix type * fix unit tests * fix type error * fix build error * fix build error * fix build error * fix warnings * fix warnings * upgrade @tremor/react and tailwindcss * numCols -> numItems * fix forgot-password e2e test * fix 1 more e2e test * fix login e2e test * fix e2e tests * fix e2e tests * clean up * remove error * use tremor/react 2.11.0 * fix * rename CustomTrans to ServerTrans * address comment * fix test * fix ServerTrans * fix * fix type * fix ServerTrans usages 1 * fix translations * fix type checks * fix type checks * link styling * fix --------- Co-authored-by: Keith Williams <keithwillcode@gmail.com> Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
88 lines
3.6 KiB
TypeScript
88 lines
3.6 KiB
TypeScript
import { expect } from "@playwright/test";
|
|
|
|
import { IS_TEAM_BILLING_ENABLED } from "@calcom/lib/constants";
|
|
import { prisma } from "@calcom/prisma";
|
|
import { MembershipRole } from "@calcom/prisma/enums";
|
|
|
|
import { test } from "../lib/fixtures";
|
|
import { fillStripeTestCheckout } from "../lib/testUtils";
|
|
|
|
test.describe("Teams", () => {
|
|
test.afterEach(({ orgs, users }) => {
|
|
orgs.deleteAll();
|
|
users.deleteAll();
|
|
});
|
|
|
|
test("Can create teams via Wizard", async ({ page, users, orgs }) => {
|
|
const org = await orgs.create({
|
|
name: "TestOrg",
|
|
});
|
|
const user = await users.create({
|
|
organizationId: org.id,
|
|
roleInOrganization: MembershipRole.ADMIN,
|
|
});
|
|
const inviteeEmail = `${user.username}+invitee@example.com`;
|
|
await user.apiLogin();
|
|
await page.goto("/teams");
|
|
|
|
await test.step("Can create team", async () => {
|
|
// Click text=Create Team
|
|
await page.locator("text=Create a new Team").click();
|
|
await page.waitForURL((url) => url.pathname === "/settings/teams/new");
|
|
// Fill input[name="name"]
|
|
await page.locator('input[name="name"]').fill(`${user.username}'s Team`);
|
|
// Click text=Continue
|
|
await page.click("[type=submit]");
|
|
// TODO: Figure out a way to make this more reliable
|
|
// eslint-disable-next-line playwright/no-conditional-in-test
|
|
if (IS_TEAM_BILLING_ENABLED) await fillStripeTestCheckout(page);
|
|
await expect(page).toHaveURL(/\/settings\/teams\/(\d+)\/onboard-members.*$/i);
|
|
await page.waitForSelector('[data-testid="pending-member-list"]');
|
|
await expect(page.getByTestId("pending-member-item")).toHaveCount(1);
|
|
});
|
|
|
|
await test.step("Can add members", async () => {
|
|
await page.getByTestId("new-member-button").click();
|
|
await page.locator('[placeholder="email\\@example\\.com"]').fill(inviteeEmail);
|
|
await page.getByTestId("invite-new-member-button").click();
|
|
await expect(page.getByTestId("pending-member-item").filter({ hasText: inviteeEmail })).toBeVisible();
|
|
|
|
// locator.count() does not await for the expected number of elements
|
|
// https://github.com/microsoft/playwright/issues/14278
|
|
// using toHaveCount() is more reliable
|
|
await expect(page.getByTestId("pending-member-item")).toHaveCount(2);
|
|
});
|
|
|
|
await test.step("Can remove members", async () => {
|
|
await expect(page.getByTestId("pending-member-item")).toHaveCount(2);
|
|
const lastRemoveMemberButton = page.getByTestId("remove-member-button").last();
|
|
await lastRemoveMemberButton.click();
|
|
await expect(page.getByTestId("pending-member-item")).toHaveCount(1);
|
|
|
|
// Cleanup here since this user is created without our fixtures.
|
|
await prisma.user.delete({ where: { email: inviteeEmail } });
|
|
});
|
|
|
|
await test.step("Can finish team invitation", async () => {
|
|
await page.getByTestId("publish-button").click();
|
|
await expect(page).toHaveURL(/\/settings\/teams\/(\d+)\/event-type$/i);
|
|
});
|
|
|
|
await test.step("Can finish team creation", async () => {
|
|
const locator = page.locator('div:has(input[value="ROUND_ROBIN"]) > button');
|
|
await expect(locator).toBeVisible();
|
|
await locator.click();
|
|
await page.fill("[name=title]", "roundRobin");
|
|
await page.getByTestId("finish-button").click();
|
|
await page.waitForURL(/\/settings\/teams\/(\d+)\/profile$/i);
|
|
});
|
|
|
|
await test.step("Can disband team", async () => {
|
|
await page.getByTestId("disband-team-button").click();
|
|
await page.getByTestId("dialog-confirmation").click();
|
|
await page.waitForURL("/teams");
|
|
expect(await page.locator(`text=${user.username}'s Team`).count()).toEqual(0);
|
|
});
|
|
});
|
|
});
|