import { useRef } from 'react';
import { act, cleanup, fireEvent } from '@testing-library/react';
import { render } from '../../../utils/theme-render-wrapper';
import { useResizeObserverEffect, useToggleOnFocus, useWindowEventListener } from '.';
beforeEach(() => jest.useFakeTimers());
afterEach(() => {
jest.useRealTimers();
cleanup();
});
const text = 'Lorem ipsum dolor sit amet';
const ToggleOnFocusTestComponent = ({ initialState }: { initialState?: boolean }) => {
const { currentState, eventHandlers } = useToggleOnFocus(initialState);
return (
);
};
const ResizeObserverEffectTestComponent = ({ callback }: { callback: () => void }) => {
const ref = useRef(null);
useResizeObserverEffect(callback, ref?.current);
return {text}
;
};
const WindowEventListenerTestComponent = ({
eventListener
}: {
eventListener: (event?: Event) => void;
}) => {
useWindowEventListener(['click'], eventListener);
return ;
};
describe('Check "utils/common/hooks"', () => {
describe('useToggleOnFocus', () => {
it(`check default`, () => {
const { container } = render();
expect(container.textContent).toBe('blurred');
});
it(`check focused`, () => {
const setTimeoutSpy = jest.spyOn(global, 'setTimeout');
act(() => {
const { queryByRole } = render();
const buttonEl = queryByRole('button');
expect(buttonEl?.textContent).toBe('blurred');
buttonEl && fireEvent.focus(buttonEl);
jest.runAllTimers();
expect(buttonEl?.textContent).toBe('focused');
});
expect(setTimeoutSpy).toHaveBeenCalledTimes(1);
setTimeoutSpy.mockClear();
});
it(`check blurred`, () => {
const setTimeoutSpy = jest.spyOn(global, 'setTimeout');
act(() => {
const { queryByRole } = render();
const buttonEl = queryByRole('button');
expect(buttonEl?.textContent).toBe('focused');
buttonEl && fireEvent.blur(buttonEl);
jest.runAllTimers();
expect(buttonEl?.textContent).toBe('blurred');
});
expect(setTimeoutSpy).toHaveBeenCalledTimes(2);
setTimeoutSpy.mockClear();
});
});
describe('useResizeObserverEffect', () => {
it(`check with ResizeObserver mock`, () => {
const callback = jest.fn();
render();
expect(callback).toHaveBeenCalledTimes(1);
});
});
describe('useWindowEventListener', () => {
it(`check with click event`, () => {
const eventListener = jest.fn();
const { container } = render(
);
container.click();
expect(eventListener).toHaveBeenCalledTimes(1);
});
});
});