2023-09-05 15:31:31 +02:00
|
|
|
import { fireEvent, render, screen } from '@testing-library/react';
|
|
|
|
import { useRef } from 'react';
|
|
|
|
import { useOnClickOutside } from './useOnClickOutside';
|
|
|
|
|
|
|
|
function TestComponent(props: { outsideClickHandler: () => void }) {
|
|
|
|
const divRef = useRef(null);
|
|
|
|
useOnClickOutside([divRef], props.outsideClickHandler);
|
|
|
|
|
|
|
|
return (
|
2023-10-02 14:25:46 +02:00
|
|
|
<div data-testid='wrapper'>
|
|
|
|
<div data-testid='inside' ref={divRef}>
|
2023-09-05 15:31:31 +02:00
|
|
|
Inside
|
|
|
|
</div>
|
2023-10-02 14:25:46 +02:00
|
|
|
<div data-testid='outside'>Outside</div>
|
2023-09-05 15:31:31 +02:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
test('should not call the callback when clicking inside', () => {
|
|
|
|
let mockCallbackCallCount = 0;
|
|
|
|
const mockCallback = () => mockCallbackCallCount++;
|
|
|
|
|
|
|
|
render(<TestComponent outsideClickHandler={mockCallback} />);
|
|
|
|
|
|
|
|
const insideDiv = screen.getByTestId('inside');
|
|
|
|
|
|
|
|
// Simulate a click inside the div
|
|
|
|
fireEvent.click(insideDiv);
|
|
|
|
|
|
|
|
expect(mockCallbackCallCount).toBe(0);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('should call the callback when clicking outside', () => {
|
|
|
|
let mockCallbackCallCount = 0;
|
|
|
|
const mockCallback = () => mockCallbackCallCount++;
|
|
|
|
|
|
|
|
render(<TestComponent outsideClickHandler={mockCallback} />);
|
|
|
|
|
|
|
|
const outsideDiv = screen.getByTestId('outside');
|
|
|
|
|
|
|
|
fireEvent.click(outsideDiv);
|
|
|
|
|
|
|
|
expect(mockCallbackCallCount).toBe(1);
|
|
|
|
});
|