* test: add test cases to `window.getEmbedNamespace` * test: add test cases when window.name doesn't have cal-embed= * test: add test case to `getembedTheme` returning the theme from embedStore * test: add test to `getEmbedTheme` returning the theme from query params * Small refactor to reduce the time taken by tests and fix missing typings for embed functions on window * Fix weird test failure * Fix type import error caught by api.test.test --------- Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
124 lines
4.2 KiB
TypeScript
124 lines
4.2 KiB
TypeScript
import { expect } from "@playwright/test";
|
|
|
|
import { test } from "@calcom/web/playwright/lib/fixtures";
|
|
|
|
import "../../src/types";
|
|
|
|
test.describe("Embed Pages", () => {
|
|
test("Event Type Page: should not have margin top on embed page", async ({ page }) => {
|
|
await page.goto("http://localhost:3000/free/30min/embed");
|
|
// Checks the margin from top by checking the distance between the div inside main from the viewport
|
|
const marginFromTop = await page.evaluate(async () => {
|
|
return await new Promise((resolve) => {
|
|
(function tryGettingBoundingRect() {
|
|
const mainElement = document.querySelector(".main");
|
|
|
|
if (mainElement) {
|
|
// This returns the distance of the div element from the viewport
|
|
const mainElBoundingRect = mainElement.getBoundingClientRect();
|
|
resolve(mainElBoundingRect.top);
|
|
} else {
|
|
setTimeout(tryGettingBoundingRect, 500);
|
|
}
|
|
})();
|
|
});
|
|
});
|
|
|
|
expect(marginFromTop).toBe(0);
|
|
});
|
|
|
|
test("Event Type Page: should have margin top on non embed page", async ({ page }) => {
|
|
await page.goto("http://localhost:3000/free/30min");
|
|
|
|
// Checks the margin from top by checking the distance between the div inside main from the viewport
|
|
const marginFromTop = await page.evaluate(() => {
|
|
const mainElement = document.querySelector("main");
|
|
const divElement = mainElement?.querySelector("div");
|
|
|
|
if (mainElement && divElement) {
|
|
// This returns the distance of the div element from the viewport
|
|
const divRect = divElement.getBoundingClientRect();
|
|
return divRect.top;
|
|
}
|
|
|
|
return null;
|
|
});
|
|
|
|
expect(marginFromTop).not.toBe(0);
|
|
});
|
|
|
|
test.describe("isEmbed, getEmbedNamespace, getEmbedTheme testing", () => {
|
|
test("when `window.name` is set to 'cal-embed=' and `theme` is supplied as a query param", async ({
|
|
page,
|
|
}) => {
|
|
const queryParamTheme = "dark";
|
|
await page.evaluate(() => {
|
|
window.name = "cal-embed=";
|
|
});
|
|
|
|
await page.goto(`http://localhost:3000/free/30min?theme=${queryParamTheme}`);
|
|
|
|
const isEmbed = await page.evaluate(() => {
|
|
return window?.isEmbed?.();
|
|
});
|
|
|
|
const embedNamespace = await page.evaluate(() => {
|
|
return window?.getEmbedNamespace?.();
|
|
});
|
|
|
|
expect(embedNamespace).toBe("");
|
|
expect(isEmbed).toBe(true);
|
|
const embedTheme = await page.evaluate(() => {
|
|
return window?.getEmbedTheme?.();
|
|
});
|
|
expect(embedTheme).toBe(queryParamTheme);
|
|
const embedStoreTheme = await page.evaluate(() => {
|
|
return window.CalEmbed.embedStore.theme;
|
|
});
|
|
// Verify that the theme is set on embedStore.
|
|
expect(embedStoreTheme).toBe(queryParamTheme);
|
|
});
|
|
|
|
test("when `window.name` does not contain `cal-embed=`", async ({ page }) => {
|
|
await page.evaluate(() => {
|
|
window.name = "testing";
|
|
});
|
|
await page.goto(`http://localhost:3000/free/30min`);
|
|
const isEmbed = await page.evaluate(() => {
|
|
return window?.isEmbed?.();
|
|
});
|
|
const embedNamespace = await page.evaluate(() => {
|
|
return window?.getEmbedNamespace?.();
|
|
});
|
|
expect(isEmbed).toBe(false);
|
|
expect(embedNamespace).toBe(null);
|
|
});
|
|
|
|
test("`getEmbedTheme` should use `window.CalEmbed.embedStore.theme` instead of `theme` query param if set", async ({
|
|
page,
|
|
}) => {
|
|
const theme = "dark";
|
|
await page.evaluate(() => {
|
|
window.name = "cal-embed=";
|
|
});
|
|
await page.goto("http://localhost:3000/free/30min?theme=dark");
|
|
let embedTheme = await page.evaluate(() => {
|
|
return window?.getEmbedTheme?.();
|
|
});
|
|
expect(embedTheme).toBe(theme);
|
|
|
|
// Fake a scenario where theme query param is lost during navigation
|
|
await page.evaluate(() => {
|
|
history.pushState({}, "", "/free/30min");
|
|
});
|
|
|
|
embedTheme = await page.evaluate(() => {
|
|
return window?.getEmbedTheme?.();
|
|
});
|
|
|
|
// Theme should still remain same as it's read from `window.CalEmbed.embedStore.theme` which is updated by getEmbedTheme itself
|
|
expect(embedTheme).toBe(theme);
|
|
});
|
|
});
|
|
});
|