import MatomoTracker from '@jonkoops/matomo-tracker' import { fireEvent, render, renderHook } from '@testing-library/react' import React from 'react' import { mocked } from 'ts-jest/utils' import createInstance from './instance' import MatomoProvider from './MatomoProvider' import useMatomo from './useMatomo' jest.mock('@jonkoops/matomo-tracker') describe('useMatomo', () => { const JustAComponent = function () { const { trackPageView, trackEvent } = useMatomo() // Track page view after page load React.useEffect(() => { trackPageView({ documentTitle: 'Hello', }) }, [trackPageView]) const handleOnClick = () => { trackEvent({ category: 'sample-page', action: 'click-event' }) } return ( ) } it('should render, call trackPageView once and call trackEvent when clicking a button', () => { const trackEventMock = jest.fn() const trackPageViewMock = jest.fn() const mockedMatomoTracker = mocked(MatomoTracker) mockedMatomoTracker.mockImplementation( () => ({ trackEvent: trackEventMock, trackPageView: trackPageViewMock, } as unknown as MatomoTracker), ) const instance = createInstance({ urlBase: 'https://LINK.TO.DOMAIN', siteId: 3, }) const Component = function () { return ( ) } expect(MatomoTracker).toHaveBeenCalled() const { getByTestId } = render() expect(trackPageViewMock).toHaveBeenCalled() fireEvent.click(getByTestId('btn')) expect(trackEventMock).toHaveBeenCalledWith({ category: 'sample-page', action: 'click-event', }) }) it('memoizes the methods between renders', () => { const instance = new MatomoTracker({ urlBase: 'https://LINK.TO.DOMAIN', siteId: 3, // optional, default value: `1` }) const { result, rerender } = renderHook(() => useMatomo(), { wrapper: ({ children }) => ( {children} ), }) const originalMethods = result.current rerender() expect(Object.values(originalMethods)).toEqual( Object.values(result.current), ) }) })