* Create env file workflow * Add env-cache * Fix env setter * Fix * Another fix * Fix * Fix * Fixes * FFS * Fix * Fix * Fix * Fix * Fix * Cache fixes * Fixes * Adds skipping steps * db-cache fixes * Test * Cache fixes * e2e * Possible caching conflicts * Running out of ideas * Caching is hard * One more time * cache-build not skipping * Fingers crossed * a * Test * Pls * Please * LFG * Build fix * fix * Whitespace!! * Zomars/cal 884 paid events not sending the link (#7318) * WIP * Sends correct emails for paid bookings * Update PaymentService.ts * Update webhook.ts * Update webhook.ts * Update settings back button redirect link (#7403) * fix(schedule): close on click #7143 * fix(EventSetupTab): validLocations length will always match validLocations length #7138 * fix(SettingsLayout): go back to right route #7379 * feat: get country code from ip geolocation (#6880) * feat: get coutnry code from ip geolocation Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in> * fix: create new api route for fetching code Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in> * chore: replace city with country Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in> * refactor: create hook for country Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in> --------- Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in> * Team Workflows (#7038) Co-authored-by: Hariom Balhara <hariombalhara@gmail.com> Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: zomars <zomars@me.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> * Add destination calendar name to DestinationCalendarSelector (#6701) * Add destination calendar name * Type fix * Search through calendars only for destination calendar credential * Refactor get connected calendars * Clean up --------- Co-authored-by: zomars <zomars@me.com> * Update viewer.tsx (#7428) * Fix - add team members to emails (#7207) * On booking add team members & translation * Add team members to round robin create * Only update calendars on reschedule if there is a calendar reference * Send email on reschedules * Send team email on cancelled event * Add team members to calendar event description * Clean up * Convert other emails to organizer & teams * Type check fixes * More type fixes * Change organizer scheduled input to an object * early return updateCalendarEvent * Introduce team member type * Fix type errors * Put team members before attendees * Remove lodash cloneDeep * Update packages/core/EventManager.ts Co-authored-by: Omar López <zomars@me.com> * Remove booking select object * Revert "Remove booking select object" This reverts commit 9f121ff4ebbaec9a0643111f96c5337b930ddd5b. * Refactor email manager (#7270) Co-authored-by: zomars <zomars@me.com> * Type change * Remove conditional check for updateAllCalendarEvents --------- Co-authored-by: zomars <zomars@me.com> * Typefix * Updates webhook response * Update pr.yml * Update action.yml * Update action.yml * Update action.yml * Update action.yml * Update action.yml * Is this redundant? * Removed setup * Update action.yml * Update action.yml * Consolitades setup step * Revert "Consolitades setup step" This reverts commit 5e8d1983cc5ac309fa6875a2fee77aa6287b7151. * Fix? * One more time * Revert "One more time" This reverts commit fd8b559a135820567f40dbb47a4b4dfc2ef44755. * Benchmarking buildjet * Update action.yml * Re-introduce setup * Adds embeds to missing pro cache * Lint fixes * Adds prettier ignore * Upgrades to yarn 3 * Updates lockfile * Reverts CI to ubuntu * Testing new yarn install * We cannot use immutable due to our private submodules * Adds CI skip * Fixes * Adds plugin * Forces local embed package * Moves eslint to root * Update yarn.lock * Playwright fixes * Embed test fixes * Splits embed react tests * Splits embed react tests * Removes install step to benchmark * Update playwright.config.ts * One playwright config for all * More test fixes * Update basic.e2e.ts * Added typescript as a global monorepo dev * Update to v18 * Update yarn.lock * Update env-create-file.yml * Update .github/workflows/pr.yml --------- Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in> Co-authored-by: Esaú Morais <55207584+esau-morais@users.noreply.github.com> Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> Co-authored-by: Carina Wollendorfer <30310907+CarinaWolli@users.noreply.github.com> Co-authored-by: Hariom Balhara <hariombalhara@gmail.com> Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com>
135 lines
4.6 KiB
TypeScript
135 lines
4.6 KiB
TypeScript
import type { Page } from "@playwright/test";
|
|
import { expect } from "@playwright/test";
|
|
|
|
import { test } from "@calcom/web/playwright/lib/fixtures";
|
|
import type { Fixtures } from "@calcom/web/playwright/lib/fixtures";
|
|
|
|
import {
|
|
todo,
|
|
getEmbedIframe,
|
|
bookFirstEvent,
|
|
getBooking,
|
|
deleteAllBookingsByEmail,
|
|
rescheduleEvent,
|
|
} from "../lib/testUtils";
|
|
|
|
async function bookFirstFreeUserEventThroughEmbed({
|
|
addEmbedListeners,
|
|
page,
|
|
getActionFiredDetails,
|
|
}: {
|
|
addEmbedListeners: Fixtures["addEmbedListeners"];
|
|
page: Page;
|
|
getActionFiredDetails: Fixtures["getActionFiredDetails"];
|
|
}) {
|
|
const embedButtonLocator = page.locator('[data-cal-link="free"]').first();
|
|
await page.goto("/");
|
|
// Obtain cal namespace from the element being clicked itself, so that addEmbedListeners always listen to correct namespace
|
|
const calNamespace = (await embedButtonLocator.getAttribute("data-cal-namespace")) || "";
|
|
await addEmbedListeners(calNamespace);
|
|
// Goto / again so that initScript attached using addEmbedListeners can work now.
|
|
await page.goto("/");
|
|
|
|
await embedButtonLocator.click();
|
|
|
|
const embedIframe = await getEmbedIframe({ page, pathname: "/free" });
|
|
|
|
await expect(embedIframe).toBeEmbedCalLink(calNamespace, getActionFiredDetails, {
|
|
pathname: "/free",
|
|
});
|
|
if (!embedIframe) {
|
|
throw new Error("Embed iframe not found");
|
|
}
|
|
const booking = await bookFirstEvent("free", embedIframe, page);
|
|
return booking;
|
|
}
|
|
|
|
test.describe("Popup Tests", () => {
|
|
test.afterEach(async () => {
|
|
await deleteAllBookingsByEmail("embed-user@example.com");
|
|
});
|
|
test("should open embed iframe on click - Configured with light theme", async ({
|
|
page,
|
|
addEmbedListeners,
|
|
getActionFiredDetails,
|
|
}) => {
|
|
await deleteAllBookingsByEmail("embed-user@example.com");
|
|
|
|
const calNamespace = "prerendertestLightTheme";
|
|
await addEmbedListeners(calNamespace);
|
|
await page.goto("/?only=prerender-test");
|
|
let embedIframe = await getEmbedIframe({ page, pathname: "/free" });
|
|
expect(embedIframe).toBeFalsy();
|
|
|
|
await page.click('[data-cal-link="free?light&popup"]');
|
|
|
|
embedIframe = await getEmbedIframe({ page, pathname: "/free" });
|
|
|
|
await expect(embedIframe).toBeEmbedCalLink(calNamespace, getActionFiredDetails, {
|
|
pathname: "/free",
|
|
});
|
|
expect(await page.screenshot()).toMatchSnapshot("event-types-list.png");
|
|
if (!embedIframe) {
|
|
throw new Error("Embed iframe not found");
|
|
}
|
|
const { uid: bookingId } = await bookFirstEvent("free", embedIframe, page);
|
|
const booking = await getBooking(bookingId);
|
|
|
|
expect(booking.attendees.length).toBe(1);
|
|
await deleteAllBookingsByEmail("embed-user@example.com");
|
|
});
|
|
|
|
test("should be able to reschedule", async ({ page, addEmbedListeners, getActionFiredDetails }) => {
|
|
const booking = await test.step("Create a booking", async () => {
|
|
return await bookFirstFreeUserEventThroughEmbed({
|
|
page,
|
|
addEmbedListeners,
|
|
getActionFiredDetails,
|
|
});
|
|
});
|
|
|
|
await test.step("Reschedule the booking", async () => {
|
|
await addEmbedListeners("popupReschedule");
|
|
await page.goto(`/?popupRescheduleId=${booking.uid}`);
|
|
await page.click('[data-cal-namespace="popupReschedule"]');
|
|
|
|
const embedIframe = await getEmbedIframe({ page, pathname: booking.eventSlug });
|
|
if (!embedIframe) {
|
|
throw new Error("Embed iframe not found");
|
|
}
|
|
await rescheduleEvent("free", embedIframe, page);
|
|
});
|
|
});
|
|
|
|
todo("Floating Button Test with Dark Theme");
|
|
|
|
todo("Floating Button Test with Light Theme");
|
|
|
|
todo("Add snapshot test for embed iframe");
|
|
|
|
test("should open Routing Forms embed on click", async ({
|
|
page,
|
|
addEmbedListeners,
|
|
getActionFiredDetails,
|
|
}) => {
|
|
await deleteAllBookingsByEmail("embed-user@example.com");
|
|
|
|
const calNamespace = "routingFormAuto";
|
|
await addEmbedListeners(calNamespace);
|
|
await page.goto("/?only=prerender-test");
|
|
let embedIframe = await getEmbedIframe({ page, pathname: "/forms/948ae412-d995-4865-875a-48302588de03" });
|
|
expect(embedIframe).toBeFalsy();
|
|
await page.click(
|
|
`[data-cal-namespace=${calNamespace}][data-cal-link="forms/948ae412-d995-4865-875a-48302588de03"]`
|
|
);
|
|
embedIframe = await getEmbedIframe({ page, pathname: "/forms/948ae412-d995-4865-875a-48302588de03" });
|
|
if (!embedIframe) {
|
|
throw new Error("Routing Form embed iframe not found");
|
|
}
|
|
await expect(embedIframe).toBeEmbedCalLink(calNamespace, getActionFiredDetails, {
|
|
pathname: "/forms/948ae412-d995-4865-875a-48302588de03",
|
|
});
|
|
await expect(embedIframe.locator("text=Seeded Form - Pro")).toBeVisible();
|
|
});
|
|
});
|