fix: all flaky e2e tests (#20476)

* fix: all flaky e2e tests

* update

* Update basic.e2e.ts

* Update basic.e2e.ts

* update

* Update basic.e2e.ts

* update

* update

* push

* update

* final

* update

* fix
This commit is contained in:
Anik Dhabal Babu
2025-04-07 19:43:01 +00:00
committed by GitHub
parent 134086f229
commit 54d98e73a2
13 changed files with 51 additions and 25 deletions
@@ -34,7 +34,7 @@ test.describe("check analytics Apps", () => {
const user = await users.create();
await user.apiLogin();
const eventTypes = await user.getUserEventsAsOwner();
const eventTypesIds = eventTypes.map((item) => item.id);
const eventTypesIds = eventTypes.map((item) => item.id).slice(0, 3);
await page.goto("/apps/categories/analytics");
await appsPage.installAnalyticsApp(app, eventTypesIds);
for (const id of eventTypesIds) {
+3 -2
View File
@@ -357,13 +357,14 @@ test.describe("Bookings", () => {
await page.locator('[data-testid="add-filter-item-userId"]').click();
await page.locator('[data-testid="filter-popover-trigger-userId"]').click();
const bookingsGetResponse2 = page.waitForResponse((response) =>
/\/api\/trpc\/bookings\/get.*/.test(response.url())
const bookingsGetResponse2 = page.waitForResponse(
(response) => response.url().includes("/api/trpc/bookings/get?batch=1") && response.status() === 200
);
await page
.locator(`[data-testid="multi-select-options-userId"] [role="option"]:has-text("${thirdUser.name}")`)
.click();
await bookingsGetResponse2;
await expect(page.locator('text="Cancel event"').nth(0)).toBeVisible();
//expect only 3 bookings (out of 4 total) to be shown in list.
//where ThirdUser is either organizer or attendee
+6 -2
View File
@@ -75,8 +75,12 @@ test.describe("Event Types tests", () => {
const eventTitle = `my recurring event ${nonce}`;
await createNewEventType(page, { eventTitle });
// eslint-disable-next-line playwright/no-wait-for-timeout
await page.waitForTimeout(1000); // waits for 1 second
// fix the race condition
await page.waitForSelector('[data-testid="event-title"]');
await expect(page.getByTestId("vertical-tab-event_setup_tab_title")).toHaveAttribute(
"aria-current",
"page"
);
await page.click("[data-testid=vertical-tab-recurring]");
await expect(page.locator("[data-testid=recurring-event-collapsible]")).toBeHidden();
+1 -1
View File
@@ -123,7 +123,7 @@ export function createAppsFixture(page: Page) {
},
verifyAppsInfoNew: async (app: string, eventTypeId: number) => {
await page.goto(`event-types/${eventTypeId}?tabName=apps`);
await page.waitForLoadState("domcontentloaded");
await expect(page.getByTestId("vertical-tab-event_setup_tab_title")).toContainText("Event Setup"); // fix the race condition
await expect(page.locator(`[data-testid='${app}-app-switch'][data-state="checked"]`)).toBeVisible();
},
};
+3 -2
View File
@@ -34,8 +34,9 @@ test.describe("hash my url", () => {
const $url = await page.locator('//*[@data-testid="generated-hash-url-0"]').inputValue();
// click update
await page.locator('[data-testid="update-eventtype"]').press("Enter");
await submitAndWaitForResponse(page, "/api/trpc/eventTypes/update?batch=1", {
action: () => page.locator("[data-testid=update-eventtype]").click(),
});
// book using generated url hash
await page.goto($url);
await selectFirstAvailableTimeSlotNextMonth(page);
+4
View File
@@ -218,6 +218,10 @@ export const createNewSeatedEventType = async (page: Page, args: { eventTitle: s
const eventTitle = args.eventTitle;
await createNewEventType(page, { eventTitle });
await page.waitForSelector('[data-testid="event-title"]');
await expect(page.getByTestId("vertical-tab-event_setup_tab_title")).toHaveAttribute(
"aria-current",
"page"
);
await page.locator('[data-testid="vertical-tab-event_advanced_tab_title"]').click();
await page.locator('[data-testid="offer-seats-toggle"]').click();
await page.locator('[data-testid="update-eventtype"]').click();
@@ -754,6 +754,7 @@ test.describe("Text area min and max characters text", () => {
await page.waitForSelector('[data-testid="event-types"]');
await createNewEventType(page, { eventTitle });
await page.waitForSelector('[data-testid="event-title"]');
await expect(page.getByTestId("vertical-tab-event_setup_tab_title")).toContainText("Event Setup"); //fix the race condition
await expect(page.getByTestId("vertical-tab-event_setup_tab_title")).toHaveAttribute(
"aria-current",
"page"
@@ -841,7 +842,7 @@ test.describe("Text area min and max characters text", () => {
);
await cancelQuestion();
// Save the event type
await page.locator("[data-testid=update-eventtype]").click();
await saveEventType(page);
// Get the url of data-testid="preview-button"
const previewButton = await page.locator('[data-testid="preview-button"]');
+16 -4
View File
@@ -21,16 +21,23 @@ test.describe("Managed Event Types", () => {
/** We don't use setupManagedEvent here to test the actual creation flow */
test("Can create managed event type", async ({ page, users }) => {
// Creating the owner user of the team
const adminUser = await users.create(null, {
hasTeam: true,
teammates: [{ name: "teammate-1" }],
});
const adminUser = await users.create(
{ name: "Owner" },
{
hasTeam: true,
teammates: [{ name: "teammate-1" }],
}
);
// Creating the member user of the team
// First we work with owner user, logging in
await adminUser.apiLogin();
// Let's create a team
// Going to create an event type
await page.goto("/event-types");
const tabItem = page.getByTestId(`horizontal-tab-Owner`);
await expect(tabItem).toBeVisible();
// We wait until loading is finished
await page.waitForSelector('[data-testid="event-types"]');
await page.getByTestId("new-event-type").click();
await page.getByTestId("option-team-1").click();
// Expecting we can add a managed event type as team owner
@@ -72,6 +79,11 @@ test.describe("Managed Event Types", () => {
const { adminUser, managedEvent } = await setupManagedEvent({ users });
await adminUser.apiLogin();
await page.goto(`/event-types/${managedEvent.id}?tabName=setup`);
await expect(page.getByTestId("vertical-tab-event_setup_tab_title")).toHaveAttribute(
"aria-current",
"page"
); // fix the race condition
await expect(page.getByTestId("vertical-tab-event_setup_tab_title")).toContainText("Event Setup"); //fix the race condition
await page.locator("#location-select").click();
const optionText = await getByKey(page, "organizer_default_conferencing_app");
await expect(optionText).toBeVisible();
@@ -625,6 +625,7 @@ const markPhoneNumberAsRequiredAndEmailAsOptional = async (page: Page, eventId:
const markPhoneNumberAsRequiredField = async (page: Page, eventId: number) => {
await page.goto(`/event-types/${eventId}?tabName=advanced`);
await expect(page.getByTestId("vertical-tab-event_setup_tab_title")).toContainText("Event Setup"); // fix the race condition
await page.locator('[data-testid="field-attendeePhoneNumber"] [data-testid="toggle-field"]').click();
await page.locator('[data-testid="field-attendeePhoneNumber"] [data-testid="edit-field-action"]').click();
+8 -2
View File
@@ -765,7 +765,10 @@ test.describe("Out of office", () => {
//By Default future OOO will be displayed
//1 OOO record should be visible for member3, end=currentDate+4days
expect(await page.locator('[data-testid^="table-redirect-"]').count()).toBe(1);
const oooEntries = page.locator('[data-testid="ooo-actions"]');
const oooEntriesCount = await oooEntries.count();
expect(oooEntriesCount).toBe(1);
await expect(page.locator(`data-testid=table-redirect-n-a`).nth(0)).toBeVisible();
//Default filter 'Last 7 Days' when DateRange Filter is selected
@@ -794,7 +797,10 @@ test.describe("Out of office", () => {
await entriesListRespPromise;
//2 OOO records should be visible end=currentDate-4days, end=currentDate-12days
expect(await page.locator('[data-testid^="table-redirect-"]').count()).toBe(2);
const oooEntries = page.locator('[data-testid="ooo-actions"]');
const oooEntriesCount = await oooEntries.count();
expect(oooEntriesCount).toBe(2);
await expect(
page.locator(`data-testid=table-redirect-${member2User?.username}`).nth(0)
).toBeVisible();
@@ -64,11 +64,10 @@ test.describe("User Avatar", async () => {
);
// verify objectKey is passed to the OG image
// yes, OG image URI encodes at multiple places.. don't want to mess with that.
const ogImageLocator = page.locator('meta[property="og:image"]');
await expect(ogImageLocator).toHaveCount(1);
const searchParam = `meetingImage=${encodeURIComponent(`${CAL_URL}/api/avatar/${objectKey}.png`)}`;
await expect(page.locator('meta[property="og:image"]')).toHaveAttribute(
"content",
new RegExp(encodeURIComponent(searchParam))
);
await expect(ogImageLocator).toHaveAttribute("content", new RegExp(encodeURIComponent(searchParam)));
});
});
});
@@ -439,7 +439,7 @@ test.describe("Routing Forms", () => {
const user = await createUserAndLogin({ users, page });
const routingForm = user.routingForms[0];
await gotoRoutingLink({ page, formId: routingForm.id });
page.click('button[type="submit"]');
await page.click('button[type="submit"]');
const firstInputMissingValue = await page.evaluate(() => {
return document.querySelectorAll("input")[0].validity.valueMissing;
});
@@ -828,11 +828,8 @@ async function addAllTypesOfFieldsAndSaveForm(
page: Page,
form: { description: string; label: string }
) {
const appRoutingFormsRespPromise = page.waitForResponse((response) =>
/\/api\/trpc\/appRoutingForms*/.test(response.url())
);
await page.goto(`apps/routing-forms/form-edit/${formId}`);
await appRoutingFormsRespPromise;
await expect(page.locator('text="Test Preview"')).toBeVisible();
await page.click('[data-testid="add-field"]');
const { optionsInUi: fieldTypesList } = await verifySelectOptions(
@@ -237,7 +237,7 @@ function OutOfOfficeEntriesListContent() {
return (
<>
{row.original && !isPending && !isFetching ? (
<div className="flex flex-row items-center justify-end gap-x-2">
<div className="flex flex-row items-center justify-end gap-x-2" data-testid="ooo-actions">
<Tooltip content={t("edit")}>
<Button
className="self-center rounded-lg border"