From 1e4b48aa075e6131a7244cd4726ddb5ba75fcecf Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Wed, 1 Nov 2023 16:10:31 +0100 Subject: refactor(hooks): rewrite useOnClickOutside hook * remove `useCapture` parameter (it does not make sense to use bubbling here) * return a MutableRefObject instead of a RefObject to be able to test the hook --- .../use-on-click-outside.test.ts | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/utils/hooks/use-on-click-outside/use-on-click-outside.test.ts (limited to 'src/utils/hooks/use-on-click-outside/use-on-click-outside.test.ts') diff --git a/src/utils/hooks/use-on-click-outside/use-on-click-outside.test.ts b/src/utils/hooks/use-on-click-outside/use-on-click-outside.test.ts new file mode 100644 index 0000000..982c0ee --- /dev/null +++ b/src/utils/hooks/use-on-click-outside/use-on-click-outside.test.ts @@ -0,0 +1,42 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { renderHook } from '@testing-library/react'; +import { userEvent } from '@testing-library/user-event'; +import { useOnClickOutside } from './use-on-click-outside'; + +describe('useOnClickOutside', () => { + it('can execute a function on click outside the given ref', async () => { + const user = userEvent.setup(); + const cb = jest.fn(); + const wrapper = document.createElement('div'); + const el = document.createElement('div'); + + wrapper.append(el); + document.body.append(wrapper); + + const { result } = renderHook(() => useOnClickOutside(cb)); + + result.current.current = el; + + await user.click(wrapper); + + expect(cb).toHaveBeenCalledTimes(1); + }); + + it('does not execute the callback on click inside the given ref', async () => { + const user = userEvent.setup(); + const cb = jest.fn(); + const wrapper = document.createElement('div'); + const el = document.createElement('div'); + + wrapper.append(el); + document.body.append(wrapper); + + const { result } = renderHook(() => useOnClickOutside(cb)); + + result.current.current = wrapper; + + await user.click(el); + + expect(cb).not.toHaveBeenCalled(); + }); +}); -- cgit v1.2.3