2
0
Files
cal/calcom/apps/web/playwright/fixtures/regularBookings.ts
2024-08-09 00:39:27 +02:00

205 lines
7.9 KiB
TypeScript

import { expect, type Page } from "@playwright/test";
import type { MembershipRole } from "@calcom/prisma/enums";
import { localize } from "../lib/testUtils";
import type { createUsersFixture } from "./users";
export const scheduleSuccessfullyText = "This meeting is scheduled";
type UserFixture = ReturnType<typeof createUsersFixture>;
export async function loginUser(users: UserFixture) {
const pro = await users.create({ name: "testuser" });
await pro.apiLogin();
}
export async function loginUserWithTeam(users: UserFixture, role: MembershipRole) {
const pro = await users.create(
{ name: "testuser" },
{ hasTeam: true, teamRole: role, isOrg: true, hasSubteam: true }
);
await pro.apiLogin();
}
export function createBookingPageFixture(page: Page) {
return {
goToEventType: async (eventType: string) => {
await page.getByRole("link", { name: eventType }).click();
},
goToPage: async (pageName: string, page: Page) => {
await page.getByRole("link", { name: pageName }).click();
},
backToBookings: async (page: Page) => {
await page.getByTestId("back-to-bookings").click();
},
goToTab: async (tabName: string) => {
await page.getByTestId(`vertical-tab-${tabName}`).click();
},
goToEventTypesPage: async () => {
await page.goto("/event-types");
},
updateEventType: async () => {
await page.getByTestId("update-eventtype").click();
const toast = await page.waitForSelector('[data-testid="toast-success"]');
expect(toast).toBeTruthy();
},
previewEventType: async () => {
const eventtypePromise = page.waitForEvent("popup");
await page.getByTestId("preview-button").click();
return eventtypePromise;
},
checkRequiresConfirmation: async () => {
// Check existence of the icon
await expect(page.getByTestId("requires-confirmation-title").locator("svg")).toBeVisible();
const confirmationSwitch = page.getByTestId("requires-confirmation");
await expect(confirmationSwitch).toBeVisible();
await confirmationSwitch.click();
},
checkRequiresBookerEmailVerification: async () => {
await expect(page.getByTestId("requires-booker-email-verification-title").locator("svg")).toBeVisible();
const emailSwitch = page.getByTestId("requires-booker-email-verification");
await expect(emailSwitch).toBeVisible();
await emailSwitch.click();
},
checkHideNotes: async () => {
await expect(page.getByTestId("disable-notes-title").locator("svg")).toBeVisible();
const hideNotesSwitch = page.getByTestId("disable-notes");
await expect(hideNotesSwitch).toBeVisible();
await hideNotesSwitch.click();
},
checkRedirectOnBooking: async () => {
await expect(page.getByTestId("redirect-success-booking-title").locator("svg")).toBeVisible();
const redirectSwitch = page.getByTestId("redirect-success-booking");
await expect(redirectSwitch).toBeVisible();
await redirectSwitch.click();
await expect(page.getByTestId("external-redirect-url")).toBeVisible();
await page.getByTestId("external-redirect-url").fill("https://cal.com");
await expect(page.getByTestId("redirect-url-warning")).toBeVisible();
},
checkEnablePrivateUrl: async () => {
await expect(page.getByTestId("hashedLinkCheck-title").locator("label div")).toBeVisible();
await expect(page.getByTestId("hashedLinkCheck-info")).toBeVisible();
await expect(page.getByTestId("hashedLinkCheck")).toBeVisible();
await page.getByTestId("hashedLinkCheck").click();
await expect(page.getByTestId("generated-hash-url")).toBeVisible();
},
toggleOfferSeats: async () => {
await expect(page.getByTestId("offer-seats-toggle-title").locator("svg")).toBeVisible();
await page.getByTestId("offer-seats-toggle").click();
const seatSwitchField = page.getByTestId("seats-per-time-slot");
await seatSwitchField.fill("3");
await expect(seatSwitchField).toHaveValue("3");
await expect(page.getByTestId("show-attendees")).toBeVisible();
},
checkLockTimezone: async () => {
await expect(page.getByTestId("lock-timezone-toggle-title").locator("svg")).toBeVisible();
const lockSwitch = page.getByTestId("lock-timezone-toggle");
await expect(lockSwitch).toBeVisible();
await lockSwitch.click();
},
checkEventType: async () => {
await expect(page.getByTestId("requires-confirmation-badge").last()).toBeVisible();
},
checkBufferTime: async () => {
const minutes = (await localize("en"))("minutes");
const fieldPlaceholder = page.getByPlaceholder("0");
await page
.locator("div")
.filter({ hasText: /^No buffer time$/ })
.nth(1)
.click();
await page.getByTestId("select-option-15").click();
await expect(page.getByText(`15 ${minutes}`, { exact: true })).toBeVisible();
await page
.locator("div")
.filter({ hasText: /^No buffer time$/ })
.nth(2)
.click();
await page.getByTestId("select-option-10").click();
await expect(page.getByText(`10 ${minutes}`, { exact: true })).toBeVisible();
await fieldPlaceholder.fill("10");
await expect(fieldPlaceholder).toHaveValue("10");
await page
.locator("div")
.filter({ hasText: /^Use event length \(default\)$/ })
.first()
.click();
// select a large interval to check if the time slots for a day reduce on the preview page
await page.getByTestId("select-option-60").click();
await expect(page.getByText(`60 ${minutes}`, { exact: true })).toBeVisible();
},
checkLimitBookingFrequency: async () => {
const fieldPlaceholder = page.getByPlaceholder("1").nth(1);
const limitFrequency = (await localize("en"))("limit_booking_frequency");
const addlimit = (await localize("en"))("add_limit");
const limitFrequencySwitch = page
.locator("fieldset")
.filter({ hasText: limitFrequency })
.getByRole("switch");
await limitFrequencySwitch.click();
await page.getByRole("button", { name: addlimit }).click();
await fieldPlaceholder.fill("12");
await expect(fieldPlaceholder).toHaveValue("12");
await limitFrequencySwitch.click();
},
checkLimitBookingDuration: async () => {
const limitDuration = (await localize("en"))("limit_total_booking_duration");
const addlimit = (await localize("en"))("add_limit");
const limitDurationSwitch = page
.locator("fieldset")
.filter({ hasText: limitDuration })
.getByRole("switch");
await limitDurationSwitch.click();
await page.getByRole("button", { name: addlimit }).click();
await expect(page.getByTestId("add-limit")).toHaveCount(2);
await limitDurationSwitch.click();
},
checkLimitFutureBookings: async () => {
const limitFutureBookings = (await localize("en"))("limit_future_bookings");
const limitBookingsSwitch = page
.locator("fieldset")
.filter({ hasText: limitFutureBookings })
.getByRole("switch");
await limitBookingsSwitch.click();
await page.locator("#RANGE").click();
await expect(page.locator("#RANGE")).toBeChecked();
await limitBookingsSwitch.click();
},
checkOffsetTimes: async () => {
const offsetStart = (await localize("en"))("offset_start");
const offsetStartTimes = (await localize("en"))("offset_toggle");
const offsetLabel = page.getByLabel(offsetStart);
await page.locator("fieldset").filter({ hasText: offsetStartTimes }).getByRole("switch").click();
await offsetLabel.fill("10");
await expect(offsetLabel).toHaveValue("10");
await expect(
page.getByText("e.g. this will show time slots to your bookers at 9:10 AM instead of 9:00 AM")
).toBeVisible();
},
checkTimeSlotsCount: async (eventTypePage: Page, count: number) => {
await expect(eventTypePage.getByTestId("time")).toHaveCount(count);
},
};
}