fix: add cleanup and mock embed-iframe to prevent test teardown leak (#26377)
* fix: add cleanup and mock embed-iframe to prevent test teardown leak The CancelBooking.cancellationFee.test.tsx was causing an unhandled jsdom exception during test teardown due to the @calcom/embed-core/embed-iframe module scheduling timers that would fire after the jsdom environment was destroyed. Changes: - Mock @calcom/embed-core/embed-iframe to prevent sdkActionManager from scheduling timers during tests - Add afterEach cleanup to ensure React Testing Library properly cleans up between tests - Remove unused React import Co-Authored-By: keith@cal.com <keithwillcode@gmail.com> * fix: add afterAll cleanup to restore scrollIntoView and unmock embed-iframe Add proper cleanup in afterAll to: - Restore Element.prototype.scrollIntoView to its original value - Call vi.unmock for embed-iframe to avoid polluting other tests in the same worker This prevents cross-test pollution that was causing flaky 'Closing rpc while fetch was pending' errors in other test files running in the same Vitest worker. Co-Authored-By: keith@cal.com <keithwillcode@gmail.com> * fix: add cleanup to TestFormDialog and defer imports in editLocation.handler tests - TestFormDialog.test.tsx: Add fake timers and flush pending timers before cleanup to prevent Radix FocusScope setTimeout from firing after jsdom teardown - editLocation.handler.test.ts: Remove top-level imports to prevent watchlist module loading during test collection (tests are already skipped) Co-Authored-By: keith@cal.com <keithwillcode@gmail.com> * fix: defer imports in confirm.handler.test.ts to prevent Salesforce GraphQL module loading Tests are already skipped, so imports are not needed during collection phase. This prevents 'Closing rpc while fetch was pending' errors from Salesforce GraphQL module imports. Co-Authored-By: keith@cal.com <keithwillcode@gmail.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
co-authored by
keith@cal.com <keithwillcode@gmail.com>
Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
parent
8ef7b56b37
commit
64dcf5d3f6
@@ -1,6 +1,6 @@
|
||||
import { render, screen, fireEvent } from "@testing-library/react";
|
||||
import { render, screen, fireEvent, cleanup } from "@testing-library/react";
|
||||
import type { Mock } from "vitest";
|
||||
import { vi } from "vitest";
|
||||
import { vi, beforeEach, afterEach, describe, expect, it } from "vitest";
|
||||
|
||||
import { findMatchingRoute } from "@calcom/app-store/routing-forms/lib/processRoute";
|
||||
|
||||
@@ -194,6 +194,15 @@ describe("TestFormDialog", () => {
|
||||
beforeEach(() => {
|
||||
resetFindTeamMembersMatchingAttributeLogicResponse();
|
||||
vi.clearAllMocks();
|
||||
vi.useFakeTimers();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// Flush any pending timers (like Radix FocusScope setTimeout) before cleanup
|
||||
// to prevent them from firing after jsdom teardown
|
||||
vi.runOnlyPendingTimers();
|
||||
vi.useRealTimers();
|
||||
cleanup();
|
||||
});
|
||||
|
||||
it("renders the dialog when open", () => {
|
||||
|
||||
@@ -1,15 +1,40 @@
|
||||
import { render, screen } from "@testing-library/react";
|
||||
import * as React from "react";
|
||||
import { describe, expect, it, vi, beforeAll } from "vitest";
|
||||
import { render, screen, cleanup } from "@testing-library/react";
|
||||
import { describe, expect, it, vi, beforeAll, afterAll, afterEach } from "vitest";
|
||||
|
||||
import * as shouldChargeModule from "@calcom/features/bookings/lib/payment/shouldChargeNoShowCancellationFee";
|
||||
|
||||
import CancelBooking from "../CancelBooking";
|
||||
|
||||
// Mock the embed-iframe module to prevent it from scheduling timers/RAF that can cause
|
||||
// teardown issues when jsdom environment is destroyed
|
||||
vi.mock("@calcom/embed-core/embed-iframe", () => ({
|
||||
sdkActionManager: null,
|
||||
}));
|
||||
|
||||
// Store original scrollIntoView to restore later
|
||||
const originalScrollIntoView = Element.prototype.scrollIntoView;
|
||||
|
||||
beforeAll(() => {
|
||||
// jsdom doesn't implement scrollIntoView, so we need to mock it
|
||||
Element.prototype.scrollIntoView = vi.fn();
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
// Restore scrollIntoView to avoid polluting other tests in the same worker
|
||||
if (originalScrollIntoView) {
|
||||
Element.prototype.scrollIntoView = originalScrollIntoView;
|
||||
} else {
|
||||
// If it was originally undefined, delete it
|
||||
delete (Element.prototype as { scrollIntoView?: unknown }).scrollIntoView;
|
||||
}
|
||||
// Clean up module mocks to avoid polluting other tests
|
||||
vi.unmock("@calcom/embed-core/embed-iframe");
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
cleanup();
|
||||
});
|
||||
|
||||
vi.mock("@calcom/trpc/react", () => ({
|
||||
trpc: {
|
||||
viewer: {
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
||||
// @ts-nocheck
|
||||
// TODO: Bring this test back with the correct setup (no illegal imports)
|
||||
// NOTE: All imports except vitest are deferred to inside the skipped describe blocks
|
||||
// to prevent module loading side effects during test collection (which can cause
|
||||
// "Closing rpc while fetch was pending" errors from Salesforce GraphQL module imports)
|
||||
import { describe, beforeEach, vi, expect, test } from "vitest";
|
||||
|
||||
import { BookingStatus } from "@calcom/prisma/enums";
|
||||
|
||||
import type { TrpcSessionUser } from "../../../types";
|
||||
import { confirmHandler } from "./confirm.handler";
|
||||
|
||||
//eslint-disable-next-line playwright/no-skipped-test
|
||||
describe.skip("confirmHandler", () => {
|
||||
beforeEach(() => {
|
||||
|
||||
@@ -1,24 +1,11 @@
|
||||
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
||||
// @ts-nocheck
|
||||
// TODO: Bring this test back with the correct setup (no illegal imports)
|
||||
// NOTE: All imports except vitest are deferred to inside the skipped describe blocks
|
||||
// to prevent module loading side effects during test collection (which can cause
|
||||
// "Closing rpc while fetch was pending" errors from watchlist module imports)
|
||||
import { describe, expect, test, vi, beforeEach } from "vitest";
|
||||
|
||||
import { prisma } from "@calcom/prisma";
|
||||
import { BookingStatus } from "@calcom/prisma/enums";
|
||||
|
||||
import {
|
||||
editLocationHandler,
|
||||
getLocationForOrganizerDefaultConferencingAppInEvtFormat,
|
||||
SystemError,
|
||||
UserError,
|
||||
} from "./editLocation.handler";
|
||||
|
||||
vi.mock("@calcom/prisma", () => {
|
||||
return {
|
||||
prisma: vi.fn(),
|
||||
};
|
||||
});
|
||||
|
||||
describe.skip("getLocationForOrganizerDefaultConferencingAppInEvtFormat", () => {
|
||||
const mockTranslate = vi.fn((key: string) => key);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user