Files
fleet/frontend/hooks/useBlockNavigation.tests.ts
T

73 lines
2.2 KiB
TypeScript

import { renderHook } from "@testing-library/react";
import useBlockNavigation from "./useBlockNavigation";
describe("useBlockNavigation", () => {
let addSpy: jest.SpyInstance;
let removeSpy: jest.SpyInstance;
beforeEach(() => {
addSpy = jest.spyOn(window, "addEventListener");
removeSpy = jest.spyOn(window, "removeEventListener");
});
afterEach(() => {
addSpy.mockRestore();
removeSpy.mockRestore();
});
it("attaches a beforeunload handler when block is true", () => {
renderHook(() => useBlockNavigation(true));
const beforeunloadAdds = addSpy.mock.calls.filter(
([evt]) => evt === "beforeunload"
);
expect(beforeunloadAdds).toHaveLength(1);
});
it("does not attach a handler when block is false", () => {
renderHook(() => useBlockNavigation(false));
const beforeunloadAdds = addSpy.mock.calls.filter(
([evt]) => evt === "beforeunload"
);
expect(beforeunloadAdds).toHaveLength(0);
});
it("removes the handler on unmount when block was true", () => {
const { unmount } = renderHook(() => useBlockNavigation(true));
unmount();
const beforeunloadRemoves = removeSpy.mock.calls.filter(
([evt]) => evt === "beforeunload"
);
expect(beforeunloadRemoves).toHaveLength(1);
});
it("removes the handler when block flips from true to false", () => {
const { rerender } = renderHook(
({ block }: { block: boolean }) => useBlockNavigation(block),
{ initialProps: { block: true } }
);
rerender({ block: false });
const beforeunloadRemoves = removeSpy.mock.calls.filter(
([evt]) => evt === "beforeunload"
);
expect(beforeunloadRemoves).toHaveLength(1);
});
it("preventDefault and returnValue are set by the attached handler", () => {
renderHook(() => useBlockNavigation(true));
const handler = addSpy.mock.calls.find(
([evt]) => evt === "beforeunload"
)?.[1] as (e: BeforeUnloadEvent) => void;
expect(handler).toBeDefined();
const preventDefault = jest.fn();
const event = ({
preventDefault,
returnValue: false,
} as unknown) as BeforeUnloadEvent;
handler(event);
expect(preventDefault).toHaveBeenCalledTimes(1);
expect(event.returnValue).toBe(true);
});
});