test: Non admin members cannot create team in org (#11525)
Co-authored-by: Peer Richelsen <peeroke@gmail.com>pull/11624/head
parent
e4011b4a23
commit
bab72a5d2e
|
@ -26,6 +26,7 @@ function Teams() {
|
||||||
CTA={
|
CTA={
|
||||||
(!user.organizationId || user.organization.isOrgAdmin) && (
|
(!user.organizationId || user.organization.isOrgAdmin) && (
|
||||||
<Button
|
<Button
|
||||||
|
data-testid="new-team-btn"
|
||||||
variant="fab"
|
variant="fab"
|
||||||
StartIcon={Plus}
|
StartIcon={Plus}
|
||||||
type="button"
|
type="button"
|
||||||
|
|
|
@ -7,6 +7,7 @@ import type { API } from "mailhog";
|
||||||
import dayjs from "@calcom/dayjs";
|
import dayjs from "@calcom/dayjs";
|
||||||
import stripe from "@calcom/features/ee/payments/server/stripe";
|
import stripe from "@calcom/features/ee/payments/server/stripe";
|
||||||
import { DEFAULT_SCHEDULE, getAvailabilityFromSchedule } from "@calcom/lib/availability";
|
import { DEFAULT_SCHEDULE, getAvailabilityFromSchedule } from "@calcom/lib/availability";
|
||||||
|
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||||
import { prisma } from "@calcom/prisma";
|
import { prisma } from "@calcom/prisma";
|
||||||
import { MembershipRole, SchedulingType } from "@calcom/prisma/enums";
|
import { MembershipRole, SchedulingType } from "@calcom/prisma/enums";
|
||||||
|
|
||||||
|
@ -288,6 +289,7 @@ export const createUsersFixture = (page: Page, emails: API | undefined, workerIn
|
||||||
const teamEvent = await createTeamEventType(user, team, scenario);
|
const teamEvent = await createTeamEventType(user, team, scenario);
|
||||||
if (scenario.teammates) {
|
if (scenario.teammates) {
|
||||||
// Create Teammate users
|
// Create Teammate users
|
||||||
|
const teamMatesIds = [];
|
||||||
for (const teammateObj of scenario.teammates) {
|
for (const teammateObj of scenario.teammates) {
|
||||||
const teamUser = await prisma.user.create({
|
const teamUser = await prisma.user.create({
|
||||||
data: createUser(workerInfo, teammateObj),
|
data: createUser(workerInfo, teammateObj),
|
||||||
|
@ -319,8 +321,22 @@ export const createUsersFixture = (page: Page, emails: API | undefined, workerIn
|
||||||
}),
|
}),
|
||||||
store.page
|
store.page
|
||||||
);
|
);
|
||||||
|
teamMatesIds.push(teamUser.id);
|
||||||
store.users.push(teammateFixture);
|
store.users.push(teammateFixture);
|
||||||
}
|
}
|
||||||
|
// Add Teammates to OrgUsers
|
||||||
|
if (scenario.isOrg) {
|
||||||
|
await prisma.team.update({
|
||||||
|
where: {
|
||||||
|
id: team.id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
orgUsers: {
|
||||||
|
connect: teamMatesIds.map((userId) => ({ id: userId })).concat([{ id: user.id }]),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const userFixture = createUserFixture(user, store.page);
|
const userFixture = createUserFixture(user, store.page);
|
||||||
|
@ -543,7 +559,7 @@ export async function apiLogin(
|
||||||
const data = {
|
const data = {
|
||||||
email: user.email ?? `${user.username}@example.com`,
|
email: user.email ?? `${user.username}@example.com`,
|
||||||
password: user.password ?? user.username,
|
password: user.password ?? user.username,
|
||||||
callbackURL: "http://localhost:3000/",
|
callbackURL: WEBAPP_URL,
|
||||||
redirect: "false",
|
redirect: "false",
|
||||||
json: "true",
|
json: "true",
|
||||||
csrfToken,
|
csrfToken,
|
||||||
|
|
|
@ -135,6 +135,40 @@ test.describe("Teams", () => {
|
||||||
expect(teamMatesObj.some(({ name }) => name === chosenUser)).toBe(true);
|
expect(teamMatesObj.some(({ name }) => name === chosenUser)).toBe(true);
|
||||||
// TODO: Assert whether the user received an email
|
// TODO: Assert whether the user received an email
|
||||||
});
|
});
|
||||||
|
test("Non admin team members cannot create team in org", async ({ page, users }) => {
|
||||||
|
const teamMateName = "teammate-1";
|
||||||
|
|
||||||
|
const owner = await users.create(undefined, {
|
||||||
|
hasTeam: true,
|
||||||
|
isOrg: true,
|
||||||
|
teammates: [{ name: teamMateName }],
|
||||||
|
});
|
||||||
|
|
||||||
|
const allUsers = await users.get();
|
||||||
|
const memberUser = allUsers.find((user) => user.name === teamMateName);
|
||||||
|
|
||||||
|
// eslint-disable-next-line playwright/no-conditional-in-test
|
||||||
|
if (memberUser) {
|
||||||
|
await memberUser.apiLogin();
|
||||||
|
|
||||||
|
await page.goto("/teams");
|
||||||
|
await expect(page.locator("[data-testid=new-team-btn]")).toBeHidden();
|
||||||
|
await expect(page.locator("[data-testid=create-team-btn]")).toHaveAttribute("disabled", "");
|
||||||
|
|
||||||
|
const uniqueName = "test-unique-team-name";
|
||||||
|
|
||||||
|
// Go directly to the create team page
|
||||||
|
await page.goto("/settings/teams/new");
|
||||||
|
// Fill input[name="name"]
|
||||||
|
await page.locator('input[name="name"]').fill(uniqueName);
|
||||||
|
await page.locator("text=Continue").click();
|
||||||
|
await expect(page.locator("[data-testid=alert]")).toBeVisible();
|
||||||
|
|
||||||
|
// cleanup
|
||||||
|
const org = await owner.getOrg();
|
||||||
|
await prisma.team.delete({ where: { id: org.teamId } });
|
||||||
|
}
|
||||||
|
});
|
||||||
test("Can create team with same name as user", async ({ page, users }) => {
|
test("Can create team with same name as user", async ({ page, users }) => {
|
||||||
// Name to be used for both user and team
|
// Name to be used for both user and team
|
||||||
const uniqueName = "test-unique-name";
|
const uniqueName = "test-unique-name";
|
||||||
|
|
|
@ -133,6 +133,7 @@ export function TeamsListing() {
|
||||||
buttonRaw={
|
buttonRaw={
|
||||||
<Button
|
<Button
|
||||||
color="secondary"
|
color="secondary"
|
||||||
|
data-testid="create-team-btn"
|
||||||
disabled={!!isCreateTeamButtonDisabled}
|
disabled={!!isCreateTeamButtonDisabled}
|
||||||
tooltip={
|
tooltip={
|
||||||
isCreateTeamButtonDisabled ? t("org_admins_can_create_new_teams") : t("create_new_team")
|
isCreateTeamButtonDisabled ? t("org_admins_can_create_new_teams") : t("create_new_team")
|
||||||
|
|
Loading…
Reference in New Issue