fix(e2e): failsafe if no availabilities (#12168)

pull/12161/head^2
Morgan 2023-10-31 18:10:08 +02:00 committed by GitHub
parent 4de142cb7c
commit 58ab278813
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 9 deletions

View File

@ -1,5 +1,7 @@
import { expect, type Page } from "@playwright/test"; import { expect, type Page } from "@playwright/test";
import dayjs from "@calcom/dayjs";
import type { createUsersFixture } from "./users"; import type { createUsersFixture } from "./users";
const reschedulePlaceholderText = "Let others know why you need to reschedule"; const reschedulePlaceholderText = "Let others know why you need to reschedule";
@ -38,6 +40,12 @@ type fillAndConfirmBookingParams = {
type UserFixture = ReturnType<typeof createUsersFixture>; type UserFixture = ReturnType<typeof createUsersFixture>;
function isLastDayOfMonth(): boolean {
const today = dayjs();
const endOfMonth = today.endOf("month");
return today.isSame(endOfMonth, "day");
}
const fillQuestion = async (eventTypePage: Page, questionType: string, customLocators: customLocators) => { const fillQuestion = async (eventTypePage: Page, questionType: string, customLocators: customLocators) => {
const questionActions: QuestionActions = { const questionActions: QuestionActions = {
phone: async () => { phone: async () => {
@ -114,6 +122,17 @@ export async function loginUser(users: UserFixture) {
await pro.apiLogin(); await pro.apiLogin();
} }
const goToNextMonthIfNoAvailabilities = async (eventTypePage: Page) => {
try {
if (isLastDayOfMonth()) {
await eventTypePage.getByTestId("view_next_month").waitFor({ timeout: 6000 });
await eventTypePage.getByTestId("view_next_month").click();
}
} catch (err) {
console.info("No need to click on view next month button");
}
};
export function createBookingPageFixture(page: Page) { export function createBookingPageFixture(page: Page) {
return { return {
goToEventType: async (eventType: string) => { goToEventType: async (eventType: string) => {
@ -154,19 +173,13 @@ export function createBookingPageFixture(page: Page) {
return eventtypePromise; return eventtypePromise;
}, },
selectTimeSlot: async (eventTypePage: Page) => { selectTimeSlot: async (eventTypePage: Page) => {
while (await eventTypePage.getByRole("button", { name: "View next" }).isVisible()) { await goToNextMonthIfNoAvailabilities(eventTypePage);
await eventTypePage.getByRole("button", { name: "View next" }).click();
}
await eventTypePage.getByTestId("time").first().click(); await eventTypePage.getByTestId("time").first().click();
}, },
clickReschedule: async () => { clickReschedule: async () => {
await page.getByText("Reschedule").click(); await page.getByText("Reschedule").click();
}, },
navigateToAvailableTimeSlot: async () => {
while (await page.getByRole("button", { name: "View next" }).isVisible()) {
await page.getByRole("button", { name: "View next" }).click();
}
},
selectFirstAvailableTime: async () => { selectFirstAvailableTime: async () => {
await page.getByTestId("time").first().click(); await page.getByTestId("time").first().click();
}, },
@ -186,6 +199,7 @@ export function createBookingPageFixture(page: Page) {
}, },
rescheduleBooking: async (eventTypePage: Page) => { rescheduleBooking: async (eventTypePage: Page) => {
await goToNextMonthIfNoAvailabilities(eventTypePage);
await eventTypePage.getByText("Reschedule").click(); await eventTypePage.getByText("Reschedule").click();
while (await eventTypePage.getByRole("button", { name: "View next" }).isVisible()) { while (await eventTypePage.getByRole("button", { name: "View next" }).isVisible()) {
await eventTypePage.getByRole("button", { name: "View next" }).click(); await eventTypePage.getByRole("button", { name: "View next" }).click();

View File

@ -95,7 +95,7 @@ const NoAvailabilityOverlay = ({
return ( return (
<div className="bg-muted border-subtle absolute left-1/2 top-40 -mt-10 w-max -translate-x-1/2 -translate-y-1/2 transform rounded-md border p-8 shadow-sm"> <div className="bg-muted border-subtle absolute left-1/2 top-40 -mt-10 w-max -translate-x-1/2 -translate-y-1/2 transform rounded-md border p-8 shadow-sm">
<h4 className="text-emphasis mb-4 font-medium">{t("no_availability_in_month", { month: month })}</h4> <h4 className="text-emphasis mb-4 font-medium">{t("no_availability_in_month", { month: month })}</h4>
<Button onClick={nextMonthButton} color="primary" EndIcon={ArrowRight}> <Button onClick={nextMonthButton} color="primary" EndIcon={ArrowRight} data-testid="view_next_month">
{t("view_next_month")} {t("view_next_month")}
</Button> </Button>
</div> </div>