From d375e5c9f162cbd84a6e6462977db56519d09f75 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Thu, 7 Dec 2023 18:48:53 +0100 Subject: refactor(pages): refine Project pages * refactor ProjectOverview component to let consumers handle the value * extract project overview depending on Github to avoid fetching Github API if the project is not on Github * wrap dynamic import in a useMemo hook to avoid infinite rerender * fix table of contents by adding a useMutationObserver hook to refresh headings tree (without it useHeadingsTree is not retriggered once the dynamic import is done) * add Cypress tests --- .../use-mutation-observer.test.ts | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/utils/hooks/use-mutation-observer/use-mutation-observer.test.ts (limited to 'src/utils/hooks/use-mutation-observer/use-mutation-observer.test.ts') diff --git a/src/utils/hooks/use-mutation-observer/use-mutation-observer.test.ts b/src/utils/hooks/use-mutation-observer/use-mutation-observer.test.ts new file mode 100644 index 0000000..62ed559 --- /dev/null +++ b/src/utils/hooks/use-mutation-observer/use-mutation-observer.test.ts @@ -0,0 +1,42 @@ +import { beforeEach, describe, expect, it, jest } from '@jest/globals'; +import { renderHook } from '@testing-library/react'; +import { useMutationObserver } from './use-mutation-observer'; + +describe('useMutationObserver', () => { + beforeEach(() => { + jest.restoreAllMocks(); + }); + + it('can create a new observer', () => { + const callback = jest.fn(); + const observerSpy = jest.spyOn(MutationObserver.prototype, 'observe'); + const wrapper = document.createElement('div'); + const options: MutationObserverInit = { childList: true }; + + renderHook(() => + useMutationObserver({ + callback, + options, + ref: { current: wrapper }, + }) + ); + + expect(observerSpy).toHaveBeenCalledTimes(1); + expect(observerSpy).toHaveBeenCalledWith(wrapper, options); + }); + + it('does not create a new observer when ref is null', () => { + const callback = jest.fn(); + const observerSpy = jest.spyOn(MutationObserver.prototype, 'observe'); + + renderHook(() => + useMutationObserver({ + callback, + options: { childList: true }, + ref: { current: null }, + }) + ); + + expect(observerSpy).not.toHaveBeenCalled(); + }); +}); -- cgit v1.2.3