diff --git a/apps/web/playwright/booking/availability.e2e.ts b/apps/web/playwright/booking/availability.e2e.ts new file mode 100644 index 0000000000..426b493a6d --- /dev/null +++ b/apps/web/playwright/booking/availability.e2e.ts @@ -0,0 +1,15 @@ +import { loginUser } from "../fixtures/regularBookings"; +import { test } from "../lib/fixtures"; + +test.describe("Check availability tab in a event-type", () => { + test("Check availability in event type", async ({ eventTypePage, users }) => { + await loginUser(users); + await eventTypePage.goToEventTypesPage(); + + await eventTypePage.goToEventType("30 min"); + await eventTypePage.goToTab("availability"); + await eventTypePage.checkAvailabilityTab(); + await eventTypePage.goToAvailabilityPage(); + await eventTypePage.checkAvailabilityPage(); + }); +}); diff --git a/apps/web/playwright/fixtures/eventTypes.ts b/apps/web/playwright/fixtures/eventTypes.ts new file mode 100644 index 0000000000..23fc4ee956 --- /dev/null +++ b/apps/web/playwright/fixtures/eventTypes.ts @@ -0,0 +1,93 @@ +import { expect, type Page } from "@playwright/test"; + +import { localize } from "../lib/testUtils"; + +export function createEventTypeFixture(page: Page) { + return { + goToEventType: async (eventType: string) => { + await page.getByRole("link", { name: eventType }).click(); + }, + goToTab: async (tabName: string) => { + await page.getByTestId(`vertical-tab-${tabName}`).click(); + }, + goToEventTypesPage: async () => { + await page.goto("/event-types"); + }, + checkAvailabilityTab: async () => { + const editAvailability = (await localize("en"))("edit_availability"); + + // Verify if the icon is rendered + await expect(page.locator("span").filter({ hasText: "Europe/London" }).locator("svg")).toBeVisible(); + await expect(page.getByText("Europe/London")).toBeVisible(); + await page.getByRole("link", { name: editAvailability }).click(); + }, + goToAvailabilityPage: async () => { + const workingHours = (await localize("en"))("default_schedule_name"); + + await page.goto("/availability"); + await page + .getByTestId("schedules") + .locator("div") + .filter({ + hasText: workingHours, + }) + .first() + .click(); + }, + checkAvailabilityPage: async () => { + const sunday = (await localize("en"))("sunday"); + const monday = (await localize("en"))("monday"); + const wednesday = (await localize("en"))("wednesday"); + const saturday = (await localize("en"))("saturday"); + const save = (await localize("en"))("save"); + const copyTimesTo = (await localize("en"))("copy_times_to"); + + await page.getByTestId("availablity-title").click(); + // change availability name + await page.getByTestId("availablity-title").fill("Working Hours test"); + await expect(page.getByTestId("subtitle")).toBeVisible(); + await page.getByTestId(sunday).getByRole("switch").click(); + await page.getByTestId(monday).first().click(); + await page.getByTestId(wednesday).getByRole("switch").click(); + await page.getByTestId(saturday).getByRole("switch").click(); + await page + .locator("div") + .filter({ hasText: "Sunday9:00am - 5:00pm" }) + .getByTestId("add-time-availability") + .first() + .click(); + await expect(page.locator("div").filter({ hasText: "6:00pm" }).nth(1)).toBeVisible(); + await page.getByRole("button", { name: save }).click(); + await expect(page.getByText("Sun - Tue, Thu - Sat, 9:00 AM - 5:00 PM")).toBeVisible(); + await expect(page.getByText("Sun, 5:00 PM - 6:00 PM")).toBeVisible(); + await page + .locator("div") + .filter({ hasText: "Sunday9:00am - 5:00pm" }) + .getByTestId("copy-button") + .first() + .click(); + await expect(page.getByText(copyTimesTo)).toBeVisible(); + await page.getByRole("checkbox", { name: monday }).check(); + await page.getByRole("button", { name: "Apply" }).click(); + await page.getByRole("button", { name: save }).click(); + await page + .locator("#availability-form div") + .filter({ hasText: "TimezoneEurope/London" }) + .locator("svg") + .click(); + await page.locator("#react-select-3-input").fill("bras"); + await page.getByTestId("select-option-America/Sao_Paulo").click(); + await page.getByRole("button", { name: save }).click(); + await expect(page.getByTestId("toast-success").last()).toBeVisible(); + await page.getByTestId("add-override").click(); + await page.getByTestId("incrementMonth").click(); + await page.getByRole("button", { name: "20" }).click(); + await page.getByTestId("date-override-mark-unavailable").click(); + await page.getByTestId("add-override-submit-btn").click(); + await page.getByTestId("dialog-rejection").click(); + await page.getByTestId("date-overrides-list").getByRole("button").nth(1).click(); + await page.getByRole("button", { name: save }).click(); + await expect(page.getByTestId("toast-success").last()).toBeVisible(); + }, + }; +} diff --git a/apps/web/playwright/lib/fixtures.ts b/apps/web/playwright/lib/fixtures.ts index 1b7cb5b3c0..27182300ef 100644 --- a/apps/web/playwright/lib/fixtures.ts +++ b/apps/web/playwright/lib/fixtures.ts @@ -7,6 +7,7 @@ import type { ExpectedUrlDetails } from "../../../../playwright.config"; import { createBookingsFixture } from "../fixtures/bookings"; import { createEmailsFixture } from "../fixtures/emails"; import { createEmbedsFixture } from "../fixtures/embeds"; +import { createEventTypeFixture } from "../fixtures/eventTypes"; import { createFeatureFixture } from "../fixtures/features"; import { createOrgsFixture } from "../fixtures/orgs"; import { createPaymentsFixture } from "../fixtures/payments"; @@ -28,6 +29,7 @@ export interface Fixtures { routingForms: ReturnType; bookingPage: ReturnType; features: ReturnType; + eventTypePage: ReturnType; } declare global { @@ -92,4 +94,8 @@ export const test = base.extend({ await features.init(); await use(features); }, + eventTypePage: async ({ page }, use) => { + const eventTypePage = createEventTypeFixture(page); + await use(eventTypePage); + }, }); diff --git a/packages/features/schedules/components/Schedule.tsx b/packages/features/schedules/components/Schedule.tsx index 4edc981131..16f04d3765 100644 --- a/packages/features/schedules/components/Schedule.tsx +++ b/packages/features/schedules/components/Schedule.tsx @@ -55,7 +55,7 @@ const ScheduleDay = ({ const watchDayRange = watch(name); return ( -
+
{/* Label & switch container */}
@@ -107,6 +107,7 @@ const CopyButton = ({ "text-default", open && "ring-brand-500 !bg-subtle outline-none ring-2 ring-offset-1" )} + data-testid="copy-button" type="button" tooltip={t("copy_times_to_tooltip")} color="minimal" @@ -192,6 +193,7 @@ export const DayRanges = ({ {index === 0 && (