import { renderHook, act } from "@testing-library/react"; import { useEventEmitter } from "../use-event-emitter.hook"; describe("useEventEmitter [Base]", () => { test("should allow to emit data", () => { const eventHandler = jest.fn(); const { result } = renderHook(() => useEventEmitter()); act(() => { result.current.on(eventHandler); result.current.emit("data"); }); expect(eventHandler).toHaveBeenCalledTimes(1); expect(eventHandler).toHaveBeenCalledWith("data"); }); test("should allow to mount event '.on' listener", () => { const eventHandler = jest.fn(); const { result } = renderHook(() => useEventEmitter()); act(() => { result.current.on(eventHandler); result.current.emit("data"); }); expect(eventHandler).toHaveBeenCalledTimes(1); }); test("should allow to receive emitted data", () => { const eventHandler = jest.fn(); const { result } = renderHook(() => useEventEmitter()); act(() => { result.current.on(eventHandler); result.current.emit("data"); }); expect(eventHandler).toHaveBeenCalledTimes(1); expect(eventHandler).toHaveBeenCalledWith("data"); }); test("should allow to unmount listener", () => { const eventHandler = jest.fn(); const { result } = renderHook(() => useEventEmitter()); act(() => { const off = result.current.on(eventHandler); off(); result.current.emit("data"); result.current.on(eventHandler); result.current.off(eventHandler); result.current.emit("data"); }); expect(eventHandler).toHaveBeenCalledTimes(0); }); test("should allow to unmount all listeners", () => { const eventHandler = jest.fn(); const { result } = renderHook(() => useEventEmitter()); act(() => { result.current.on(eventHandler); result.current.on(eventHandler); result.current.on(eventHandler); result.current.offAll(); result.current.emit("data"); }); expect(eventHandler).toHaveBeenCalledTimes(0); }); });