diff --git a/package.json b/package.json index 8704739e1..927490776 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "@rollup/plugin-node-resolve": "13.3.0", "@testing-library/jest-dom": "5.16.4", "@testing-library/react": "13.3.0", - "@testing-library/react-hooks": "8.0.0", "@types/jest": "28.1.1", "@types/node": "17.0.31", "@types/prop-types": "15.7.5", diff --git a/packages/use-gtm/src/__tests__/index.tsx b/packages/use-gtm/src/__tests__/index.tsx index 6bca970fb..daf1b4d0d 100644 --- a/packages/use-gtm/src/__tests__/index.tsx +++ b/packages/use-gtm/src/__tests__/index.tsx @@ -1,5 +1,4 @@ -import { fireEvent } from '@testing-library/react' -import { renderHook } from '@testing-library/react-hooks' +import { fireEvent, renderHook } from '@testing-library/react' import mockdate from 'mockdate' import { ReactNode } from 'react' import GTMProvider, { SendGTM, useGTM } from '..' @@ -48,10 +47,18 @@ describe('GTM hook', () => { }) it('useGTM should not be defined without GTMProvider', () => { - const { result } = renderHook(() => useGTM()) - expect(() => { - expect(result.current).toBe(undefined) - }).toThrow(Error('useGTM must be used within a GTMProvider')) + const orignalConsoleError = console.error + console.error = jest.fn + + try { + renderHook(() => useGTM()) + } catch (error) { + expect((error as Error)?.message).toBe( + 'useGTM must be used within a GTMProvider', + ) + } + + console.error = orignalConsoleError }) it('Provider should call onLoadError if script fail to load', () => { diff --git a/packages/use-i18n/src/__tests__/usei18n.tsx b/packages/use-i18n/src/__tests__/usei18n.tsx index 14c140fad..8da9de890 100644 --- a/packages/use-i18n/src/__tests__/usei18n.tsx +++ b/packages/use-i18n/src/__tests__/usei18n.tsx @@ -1,4 +1,4 @@ -import { act, renderHook } from '@testing-library/react-hooks' +import { act, renderHook, waitFor } from '@testing-library/react' import mockdate from 'mockdate' import { ReactNode } from 'react' import I18n, { useI18n, useTranslation } from '..' @@ -45,45 +45,70 @@ describe('i18n hook', () => { }) it('useTranslation should not be defined without I18nProvider', () => { - const { result } = renderHook(() => useTranslation(), { - wrapper: ({ children }: { children: ReactNode }) =>
{children}
, - }) - expect(() => { - expect(result.current).toBe(undefined) - }).toThrow(Error('useTranslation must be used within a I18nProvider')) + const orignalConsoleError = console.error + console.error = jest.fn + + try { + renderHook(() => useTranslation(), { + wrapper: ({ children }: { children: ReactNode }) => ( +
{children}
+ ), + }) + } catch (error) { + expect((error as Error)?.message).toBe( + 'useTranslation must be used within a I18nProvider', + ) + } + + console.error = orignalConsoleError }) it('useI18n should not be defined without I18nProvider', () => { - const { result } = renderHook(() => useI18n(), { - wrapper: ({ children }: { children: ReactNode }) =>
{children}
, - }) - expect(() => { - expect(result.current).toBe(undefined) - }).toThrow(Error('useI18n must be used within a I18nProvider')) + const orignalConsoleError = console.error + console.error = jest.fn + + try { + renderHook(() => useI18n(), { + wrapper: ({ children }: { children: ReactNode }) => ( +
{children}
+ ), + }) + } catch (error) { + expect((error as Error)?.message).toBe( + 'useI18n must be used within a I18nProvider', + ) + } + + console.error = orignalConsoleError }) it('should use defaultLoad, useTranslation, switch local and translate', async () => { - const { result, waitForNextUpdate } = renderHook(() => useTranslation([]), { + const { result } = renderHook(() => useTranslation([]), { wrapper: wrapper({ defaultLocale: 'en' }), }) // first render there is no load expect(result.current.t('title')).toEqual('') - // after load of en locale - await waitForNextUpdate() - expect(result.current.t('title')).toEqual(en.title) + + await waitFor(() => { + // after load of en locale + expect(result.current.t('title')).toEqual(en.title) + }) + act(() => { result.current.switchLocale('fr') }) - await waitForNextUpdate() - expect(result.current.t('title')).toEqual(fr.title) + await waitFor(() => { + expect(result.current.t('title')).toEqual(fr.title) + }) act(() => { result.current.switchLocale('es') }) - await waitForNextUpdate() - expect(result.current.t('title')).toEqual(es.title) + await waitFor(() => { + expect(result.current.t('title')).toEqual(es.title) + }) }) it('should use specific load on useTranslation', async () => { @@ -95,7 +120,7 @@ describe('i18n hook', () => { namespace: string }) => import(`./locales/namespaces/${locale}/${namespace}.json`) - const { result, waitForNextUpdate } = renderHook( + const { result } = renderHook( () => useTranslation(['user', 'profile'], load), { wrapper: wrapper({ @@ -104,16 +129,17 @@ describe('i18n hook', () => { }), }, ) - // await load of locales - await waitForNextUpdate() - expect(result.current.translations).toStrictEqual({ - en: { - 'profile.lastName': 'Last Name', - 'profile.name': 'Name', - 'user.languages': 'Languages', - 'user.lastName': 'Last Name', - 'user.name': 'Name', - }, + + await waitFor(() => { + expect(result.current.translations).toStrictEqual({ + en: { + 'profile.lastName': 'Last Name', + 'profile.name': 'Name', + 'user.languages': 'Languages', + 'user.lastName': 'Last Name', + 'user.name': 'Name', + }, + }) }) expect(result.current.t('user.name')).toEqual('Name') @@ -124,22 +150,22 @@ describe('i18n hook', () => { result.current.switchLocale('fr') }) - await waitForNextUpdate() - - expect(result.current.translations).toStrictEqual({ - en: { - 'profile.lastName': 'Last Name', - 'profile.name': 'Name', - 'user.languages': 'Languages', - 'user.lastName': 'Last Name', - 'user.name': 'Name', - }, - fr: { - 'profile.lastName': 'Nom', - 'profile.name': 'Prénom', - 'user.lastName': 'Nom', - 'user.name': 'Prénom', - }, + await waitFor(() => { + expect(result.current.translations).toStrictEqual({ + en: { + 'profile.lastName': 'Last Name', + 'profile.name': 'Name', + 'user.languages': 'Languages', + 'user.lastName': 'Last Name', + 'user.name': 'Name', + }, + fr: { + 'profile.lastName': 'Nom', + 'profile.name': 'Prénom', + 'user.lastName': 'Nom', + 'user.name': 'Prénom', + }, + }) }) expect(result.current.t('user.name')).toEqual('Prénom') @@ -159,39 +185,37 @@ describe('i18n hook', () => { namespace: string }) => import(`./locales/namespaces/${locale}/${namespace}.json`) - const { result, waitForNextUpdate } = renderHook( - () => useTranslation(['user'], load), - { - wrapper: wrapper({ - defaultLocale: 'fr', - enableDefaultLocale: true, - supportedLocales: ['en', 'fr'], - }), - }, - ) + const { result } = renderHook(() => useTranslation(['user'], load), { + wrapper: wrapper({ + defaultLocale: 'fr', + enableDefaultLocale: true, + supportedLocales: ['en', 'fr'], + }), + }) // current local will be 'en' based on navigator // await load of locales act(() => { result.current.switchLocale('fr') }) - await waitForNextUpdate() - expect(result.current.translations).toStrictEqual({ - en: { - 'user.languages': 'Languages', - 'user.lastName': 'Last Name', - 'user.name': 'Name', - }, - fr: { - 'user.lastName': 'Nom', - 'user.name': 'Prénom', - }, - }) + await waitFor(() => { + expect(result.current.translations).toStrictEqual({ + en: { + 'user.languages': 'Languages', + 'user.lastName': 'Last Name', + 'user.name': 'Name', + }, + fr: { + 'user.lastName': 'Nom', + 'user.name': 'Prénom', + }, + }) - expect(result.current.t('user.languages')).toEqual('') - expect(result.current.t('user.lastName')).toEqual('Nom') - expect(result.current.t('user.name')).toEqual('Prénom') + expect(result.current.t('user.languages')).toEqual('') + expect(result.current.t('user.lastName')).toEqual('Nom') + expect(result.current.t('user.name')).toEqual('Prénom') + }) }) it('should set current locale from navigator languages', async () => { @@ -202,14 +226,16 @@ describe('i18n hook', () => { languages: ['en-US', 'en'], } as unknown as Navigator), ) - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'fr', supportedLocales: ['en', 'fr', 'es'], }), }) - await waitForNextUpdate() - expect(result.current.currentLocale).toEqual('en') + + await waitFor(() => { + expect(result.current.currentLocale).toEqual('en') + }) }) it('should set current locale from navigator language', async () => { @@ -220,18 +246,20 @@ describe('i18n hook', () => { languages: undefined, } as unknown as Navigator), ) - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'fr', supportedLocales: ['en', 'fr', 'es'], }), }) - await waitForNextUpdate() - expect(result.current.currentLocale).toEqual('en') + + await waitFor(() => { + expect(result.current.currentLocale).toEqual('en') + }) }) it('should switch locale', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'en', supportedLocales: ['en', 'fr', 'es'], @@ -243,18 +271,20 @@ describe('i18n hook', () => { act(() => { result.current.switchLocale('fr') }) - await waitForNextUpdate() - expect(result.current.currentLocale).toEqual('fr') - expect(localStorage.getItem(LOCALE_ITEM_STORAGE)).toBe('fr') + await waitFor(() => { + expect(result.current.currentLocale).toEqual('fr') + expect(localStorage.getItem(LOCALE_ITEM_STORAGE)).toBe('fr') + }) act(() => { result.current.switchLocale('es') }) - await waitForNextUpdate() - expect(result.current.currentLocale).toEqual('es') - expect(localStorage.getItem(LOCALE_ITEM_STORAGE)).toBe('es') + await waitFor(() => { + expect(result.current.currentLocale).toEqual('es') + expect(localStorage.getItem(LOCALE_ITEM_STORAGE)).toBe('es') + }) act(() => { result.current.switchLocale('test') @@ -264,7 +294,7 @@ describe('i18n hook', () => { }) it('should translate correctly with enableDebugKey', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'en', defaultTranslations: { en }, @@ -273,31 +303,33 @@ describe('i18n hook', () => { }), }) expect(result.current.t('test')).toEqual('test') - await waitForNextUpdate() - expect(result.current.t('title')).toEqual(en.title) - expect(result.current.t('subtitle')).toEqual(en.subtitle) - expect(result.current.t('plurals', { numPhotos: 0 })).toEqual( - 'You have no photos.', - ) - expect(result.current.t('plurals', { numPhotos: 1 })).toEqual( - 'You have one photo.', - ) - expect(result.current.t('plurals', { numPhotos: 2 })).toEqual( - 'You have 2 photos.', - ) + await waitFor(() => { + expect(result.current.t('title')).toEqual(en.title) + expect(result.current.t('subtitle')).toEqual(en.subtitle) + expect(result.current.t('plurals', { numPhotos: 0 })).toEqual( + 'You have no photos.', + ) + expect(result.current.t('plurals', { numPhotos: 1 })).toEqual( + 'You have one photo.', + ) + expect(result.current.t('plurals', { numPhotos: 2 })).toEqual( + 'You have 2 photos.', + ) + }) }) it('should use namespaceTranslation', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'en', defaultTranslations: { en }, }), }) - await waitForNextUpdate() - const identiqueTranslate = result.current.namespaceTranslation('') - expect(identiqueTranslate('title')).toEqual(result.current.t('title')) + await waitFor(() => { + const identiqueTranslate = result.current.namespaceTranslation('') + expect(identiqueTranslate('title')).toEqual(result.current.t('title')) + }) const translate = result.current.namespaceTranslation('tests.test') expect(translate('namespaces')).toEqual('test') @@ -309,7 +341,7 @@ describe('i18n hook', () => { }) it('should use formatNumber', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'en', }), @@ -334,17 +366,18 @@ describe('i18n hook', () => { act(() => { result.current.switchLocale('fr') }) - await waitForNextUpdate() // https://stackoverflow.com/questions/58769806/identical-strings-not-matching-in-jest // https://stackoverflow.com/questions/54242039/intl-numberformat-space-character-does-not-match - expect( - result.current.formatNumber(2, { - currency: 'EUR', - style: 'currency', - }), - ).toEqual('2,00\xa0€') + await waitFor(() => { + expect( + result.current.formatNumber(2, { + currency: 'EUR', + style: 'currency', + }), + ).toEqual('2,00\xa0€') + }) expect( result.current.formatNumber(2, { currency: 'USD', style: 'currency' }), @@ -352,7 +385,7 @@ describe('i18n hook', () => { }) it('should use formatList', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'en', }), @@ -384,14 +417,14 @@ describe('i18n hook', () => { result.current.switchLocale('fr') }) - await waitForNextUpdate() - - expect( - result.current.formatList(vehicles, { - style: 'long', - type: 'conjunction', - }), - ).toEqual('Motorcycle, Bus et Car') + await waitFor(() => { + expect( + result.current.formatList(vehicles, { + style: 'long', + type: 'conjunction', + }), + ).toEqual('Motorcycle, Bus et Car') + }) expect( result.current.formatList(vehicles, { @@ -409,15 +442,16 @@ describe('i18n hook', () => { }) it('should use datetime', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'en', }), }) - await waitForNextUpdate() const date = new Date('December 17, 1995 03:24:00') - expect(result.current.datetime(date)).toEqual('12/17/1995') + await waitFor(() => { + expect(result.current.datetime(date)).toEqual('12/17/1995') + }) expect( result.current.datetime(date, { @@ -456,9 +490,10 @@ describe('i18n hook', () => { act(() => { result.current.switchLocale('fr') }) - await waitForNextUpdate() - expect(result.current.datetime(date)).toEqual('17/12/1995') + await waitFor(() => { + expect(result.current.datetime(date)).toEqual('17/12/1995') + }) expect( result.current.datetime(date, { @@ -479,7 +514,7 @@ describe('i18n hook', () => { }) it('should relativeTime', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'en', }), @@ -492,13 +527,14 @@ describe('i18n hook', () => { act(() => { result.current.switchLocale('fr') }) - await waitForNextUpdate() - expect(result.current.relativeTime(date)).toEqual('il y a plus de 20 ans') + await waitFor(() => { + expect(result.current.relativeTime(date)).toEqual('il y a plus de 20 ans') + }) }) it('should relativeTimeStrict', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'en', }), @@ -510,13 +546,16 @@ describe('i18n hook', () => { act(() => { result.current.switchLocale('fr') }) - await waitForNextUpdate() - expect(result.current.relativeTimeStrict(date)).toEqual('il y a 3499 jours') + await waitFor(() => { + expect(result.current.relativeTimeStrict(date)).toEqual( + 'il y a 3499 jours', + ) + }) }) it('should formatUnit', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'en', }), @@ -528,15 +567,16 @@ describe('i18n hook', () => { act(() => { result.current.switchLocale('fr') }) - await waitForNextUpdate() - expect( - result.current.formatUnit(12, { short: false, unit: 'byte' }), - ).toEqual('12 octets') + await waitFor(() => { + expect( + result.current.formatUnit(12, { short: false, unit: 'byte' }), + ).toEqual('12 octets') + }) }) it('should formatDate', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'en', }), @@ -548,23 +588,25 @@ describe('i18n hook', () => { act(() => { result.current.switchLocale('fr') }) - await waitForNextUpdate() - expect( - result.current.formatDate(new Date(2020, 1, 13, 16, 28), 'numericHour'), - ).toEqual('2020-02-13 16:28') + await waitFor(() => { + expect( + result.current.formatDate(new Date(2020, 1, 13, 16, 28), 'numericHour'), + ).toEqual('2020-02-13 16:28') + }) }) it('should load default datefns locales', async () => { - const { result, waitForNextUpdate } = renderHook(() => useI18n(), { + const { result } = renderHook(() => useI18n(), { wrapper: wrapper({ defaultLocale: 'test', supportedLocales: ['test'], }), }) expect(result.current.dateFnsLocale).toBe(undefined) - await waitForNextUpdate() - expect(result.current.dateFnsLocale?.code).toEqual('en-GB') + await waitFor(() => { + expect(result.current.dateFnsLocale?.code).toEqual('en-GB') + }) }) }) diff --git a/packages/use-media/src/__tests__/useMedia.tsx b/packages/use-media/src/__tests__/useMedia.tsx index c6adae355..4b608c05c 100644 --- a/packages/use-media/src/__tests__/useMedia.tsx +++ b/packages/use-media/src/__tests__/useMedia.tsx @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import { useMedia } from '..' describe('useMedia hook', () => { diff --git a/packages/use-query-params/src/__tests__/index.tsx b/packages/use-query-params/src/__tests__/index.tsx index 17a362555..c897bc469 100644 --- a/packages/use-query-params/src/__tests__/index.tsx +++ b/packages/use-query-params/src/__tests__/index.tsx @@ -1,4 +1,4 @@ -import { act, renderHook } from '@testing-library/react-hooks' +import { act, renderHook } from '@testing-library/react' import { History, createMemoryHistory } from 'history' import { ReactNode, useLayoutEffect, useState } from 'react' import { MemoryRouter, Router } from 'react-router-dom' diff --git a/packages/use-random-name/src/__tests__/index.ts b/packages/use-random-name/src/__tests__/index.ts index 93ede85d9..4cca2045a 100644 --- a/packages/use-random-name/src/__tests__/index.ts +++ b/packages/use-random-name/src/__tests__/index.ts @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks' +import { renderHook } from '@testing-library/react' import useRandomName from '..' describe('useRandomName', () => { diff --git a/packages/use-segment/src/__tests__/index.tsx b/packages/use-segment/src/__tests__/index.tsx index 200888f09..2c15c81ae 100644 --- a/packages/use-segment/src/__tests__/index.tsx +++ b/packages/use-segment/src/__tests__/index.tsx @@ -1,5 +1,5 @@ import { AnalyticsBrowser, Context } from '@segment/analytics-next' -import { renderHook } from '@testing-library/react-hooks' +import { renderHook, waitFor } from '@testing-library/react' import { ReactNode } from 'react' import waitForExpect from 'wait-for-expect' import SegmentProvider, { useSegment } from '..' @@ -67,10 +67,18 @@ describe('segment hook', () => { }) it('useSegment should not be defined without SegmentProvider', () => { - const { result } = renderHook(() => useSegment()) - expect(() => { - expect(result.current).toBe(undefined) - }).toThrow(Error('useSegment must be used within a SegmentProvider')) + const orignalConsoleError = console.error + console.error = jest.fn + + try { + renderHook(() => useSegment()) + } catch (error) { + expect((error as Error)?.message).toBe( + 'useSegment must be used within a SegmentProvider', + ) + } + + console.error = orignalConsoleError }) it('useSegment should not load without settings', () => { @@ -116,26 +124,25 @@ describe('segment hook', () => { .spyOn(AnalyticsBrowser, 'load') .mockResolvedValue([{} as Analytics, {} as Context]) - const { result, waitForNextUpdate } = renderHook( - () => useSegment(), - { - wrapper: wrapper({ - events: defaultEvents, - initOptions: { - integrations: { - testInteg: false, - testInteg2: true, - testInteg3: false, - }, + const { result } = renderHook(() => useSegment(), { + wrapper: wrapper({ + events: defaultEvents, + initOptions: { + integrations: { + testInteg: false, + testInteg2: true, + testInteg3: false, }, - settings: { writeKey: 'sample ' }, - }), - }, - ) + }, + settings: { writeKey: 'sample ' }, + }), + }) - await waitForNextUpdate() expect(mock).toHaveBeenCalledTimes(1) - expect(result.current.analytics).toStrictEqual({}) + + await waitFor(() => { + expect(result.current.analytics).toStrictEqual({}) + }) }) it('Provider should load with key', async () => { @@ -145,20 +152,19 @@ describe('segment hook', () => { const settings = { writeKey: 'helloworld' } - const { result, waitForNextUpdate } = renderHook( - () => useSegment(), - { - wrapper: wrapper({ - events: defaultEvents, - settings, - }), - }, - ) + const { result } = renderHook(() => useSegment(), { + wrapper: wrapper({ + events: defaultEvents, + settings, + }), + }) - await waitForNextUpdate() expect(mock).toHaveBeenCalledTimes(1) expect(mock).toHaveBeenCalledWith(settings, undefined) - expect(result.current.analytics).toStrictEqual({}) + + await waitFor(() => { + expect(result.current.analytics).toStrictEqual({}) + }) }) it('Provider should load with key and cdn', async () => { @@ -168,20 +174,19 @@ describe('segment hook', () => { const settings = { cdn: 'https://cdn.proxy', writeKey: 'helloworld' } - const { result, waitForNextUpdate } = renderHook( - () => useSegment(), - { - wrapper: wrapper({ - events: defaultEvents, - settings, - }), - }, - ) + const { result } = renderHook(() => useSegment(), { + wrapper: wrapper({ + events: defaultEvents, + settings, + }), + }) - await waitForNextUpdate() expect(mock).toHaveBeenCalledTimes(1) expect(mock).toHaveBeenCalledWith(settings, undefined) - expect(result.current.analytics).toStrictEqual({}) + + await waitFor(() => { + expect(result.current.analytics).toStrictEqual({}) + }) }) it('Provider should load and call onError on analytics load error', async () => { @@ -218,23 +223,20 @@ describe('segment hook', () => { const settings = { writeKey: 'pleasethrow' } - const { result, waitForNextUpdate } = renderHook( - () => useSegment(), - { - wrapper: wrapper({ - events: defaultEvents, - onError, - onEventError, - settings, - }), - }, - ) + const { result } = renderHook(() => useSegment(), { + wrapper: wrapper({ + events: defaultEvents, + onError, + onEventError, + settings, + }), + }) expect(mock).toHaveBeenCalledTimes(1) - await waitForNextUpdate() - - await result.current.events.errorEvent() + await waitFor(async () => { + await result.current.events.errorEvent() + }) await waitForExpect(() => { expect(onEventError).toHaveBeenCalledTimes(1) @@ -252,21 +254,20 @@ describe('segment hook', () => { initialPageview: false, } - const { result, waitForNextUpdate } = renderHook( - () => useSegment(), - { - wrapper: wrapper({ - events: defaultEvents, - initOptions, - settings, - }), - }, - ) + const { result } = renderHook(() => useSegment(), { + wrapper: wrapper({ + events: defaultEvents, + initOptions, + settings, + }), + }) - await waitForNextUpdate() expect(mock).toHaveBeenCalledTimes(1) expect(mock).toHaveBeenCalledWith(settings, initOptions) - expect(result.current.analytics).toStrictEqual({}) + + await waitFor(() => { + expect(result.current.analytics).toStrictEqual({}) + }) }) it('useSegment should correctly infer types', async () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8dc12c8b9..f9cb9475f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,6 @@ importers: '@rollup/plugin-node-resolve': 13.3.0 '@testing-library/jest-dom': 5.16.4 '@testing-library/react': 13.3.0 - '@testing-library/react-hooks': 8.0.0 '@types/jest': 28.1.1 '@types/node': 17.0.31 '@types/prop-types': 15.7.5 @@ -55,7 +54,6 @@ importers: '@rollup/plugin-node-resolve': 13.3.0_rollup@2.75.6 '@testing-library/jest-dom': 5.16.4 '@testing-library/react': 13.3.0_ef5jwxihqo6n7gxfmzogljlgcm - '@testing-library/react-hooks': 8.0.0_eurjwfem4ie5nnznw6gmhlbswe '@types/jest': 28.1.1 '@types/node': 17.0.31 '@types/prop-types': 15.7.5 @@ -405,15 +403,9 @@ packages: '@babel/types': 7.18.4 dev: true - /@babel/helper-plugin-utils/7.16.7: - resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} - engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-plugin-utils/7.17.12: resolution: {integrity: sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-remap-async-to-generator/7.16.8: resolution: {integrity: sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==} @@ -798,16 +790,6 @@ packages: '@babel/helper-plugin-utils': 7.17.12 dev: true - /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.18.2: - resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.2 - '@babel/helper-plugin-utils': 7.16.7 - dev: false - /@babel/plugin-syntax-jsx/7.17.12_@babel+core@7.18.2: resolution: {integrity: sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==} engines: {node: '>=6.9.0'} @@ -816,7 +798,6 @@ packages: dependencies: '@babel/core': 7.18.2 '@babel/helper-plugin-utils': 7.17.12 - dev: true /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.18.2: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -1468,11 +1449,11 @@ packages: - supports-color dev: true - /@babel/runtime-corejs3/7.17.9: - resolution: {integrity: sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==} + /@babel/runtime-corejs3/7.18.3: + resolution: {integrity: sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q==} engines: {node: '>=6.9.0'} dependencies: - core-js-pure: 3.22.5 + core-js-pure: 3.22.8 regenerator-runtime: 0.13.9 dev: false @@ -1715,7 +1696,7 @@ packages: dependencies: '@babel/core': 7.18.2 '@babel/helper-module-imports': 7.16.7 - '@babel/plugin-syntax-jsx': 7.16.7_@babel+core@7.18.2 + '@babel/plugin-syntax-jsx': 7.17.12_@babel+core@7.18.2 '@babel/runtime': 7.17.9 '@emotion/hash': 0.8.0 '@emotion/memoize': 0.7.5 @@ -4263,29 +4244,6 @@ packages: redent: 3.0.0 dev: true - /@testing-library/react-hooks/8.0.0_eurjwfem4ie5nnznw6gmhlbswe: - resolution: {integrity: sha512-uZqcgtcUUtw7Z9N32W13qQhVAD+Xki2hxbTR461MKax8T6Jr8nsUvZB+vcBTkzY2nFvsUet434CsgF0ncW2yFw==} - engines: {node: '>=12'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || 18 - react: ^16.9.0 || ^17.0.0 || 18 - react-dom: ^16.9.0 || ^17.0.0 || 18 - react-test-renderer: ^16.9.0 || ^17.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-dom: - optional: true - react-test-renderer: - optional: true - dependencies: - '@babel/runtime': 7.17.9 - '@types/react': 18.0.12 - react: 18.1.0 - react-dom: 18.1.0_react@18.1.0 - react-error-boundary: 3.1.4_react@18.1.0 - dev: true - /@testing-library/react/13.3.0_ef5jwxihqo6n7gxfmzogljlgcm: resolution: {integrity: sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ==} engines: {node: '>=12'} @@ -4403,7 +4361,7 @@ packages: dev: false /@types/json5/0.0.29: - resolution: {integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4=} + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: false /@types/minimatch/3.0.5: @@ -4789,7 +4747,7 @@ packages: engines: {node: '>=6.0'} dependencies: '@babel/runtime': 7.17.9 - '@babel/runtime-corejs3': 7.17.9 + '@babel/runtime-corejs3': 7.18.3 dev: false /aria-query/5.0.0: @@ -4811,7 +4769,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 get-intrinsic: 1.1.1 is-string: 1.0.7 dev: false @@ -4826,7 +4784,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 es-shim-unscopables: 1.0.0 dev: false @@ -4836,7 +4794,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 es-shim-unscopables: 1.0.0 dev: false @@ -4855,7 +4813,7 @@ packages: dev: true /ast-types-flow/0.0.7: - resolution: {integrity: sha1-9wtzXGvKGlycItmCw+Oef+ujva0=} + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: false /astral-regex/2.0.0: @@ -4878,9 +4836,9 @@ packages: hasBin: true dev: true - /axe-core/4.4.1: - resolution: {integrity: sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==} - engines: {node: '>=4'} + /axe-core/4.4.2: + resolution: {integrity: sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==} + engines: {node: '>=12'} dev: false /axobject-query/2.2.0: @@ -5498,8 +5456,8 @@ packages: semver: 7.0.0 dev: true - /core-js-pure/3.22.5: - resolution: {integrity: sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA==} + /core-js-pure/3.22.8: + resolution: {integrity: sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w==} requiresBuild: true dev: false @@ -5677,7 +5635,7 @@ packages: dev: true /decode-uri-component/0.2.0: - resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} + resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} engines: {node: '>=0.10'} /dedent/0.7.0: @@ -5868,8 +5826,8 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract/1.20.0: - resolution: {integrity: sha512-URbD8tgRthKD3YcC39vbvSDrX23upXnPcnGAjQfgxXF5ID75YcENawc9ZX/9iTP9ptUyfCLIxTTuMYoRfiOVKA==} + /es-abstract/1.20.1: + resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -5888,7 +5846,7 @@ packages: is-shared-array-buffer: 1.0.2 is-string: 1.0.7 is-weakref: 1.0.2 - object-inspect: 1.12.0 + object-inspect: 1.12.2 object-keys: 1.1.1 object.assign: 4.1.2 regexp.prototype.flags: 1.4.3 @@ -6088,7 +6046,7 @@ packages: aria-query: 4.2.2 array-includes: 3.1.5 ast-types-flow: 0.0.7 - axe-core: 4.4.1 + axe-core: 4.4.2 axobject-query: 2.2.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 @@ -6361,7 +6319,7 @@ packages: to-regex-range: 5.0.1 /filter-obj/1.1.0: - resolution: {integrity: sha1-mzERErxsYSehbgFsbF1/GeCAXFs=} + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} /find-root/1.1.0: @@ -6369,7 +6327,7 @@ packages: dev: false /find-up/2.1.0: - resolution: {integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c=} + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} dependencies: locate-path: 2.0.0 @@ -6455,7 +6413,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 functions-have-names: 1.2.3 dev: false @@ -6938,7 +6896,7 @@ packages: dev: true /is-arrayish/0.2.1: - resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} @@ -6992,7 +6950,7 @@ packages: dev: true /is-extglob/2.1.1: - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} /is-fullwidth-code-point/1.0.0: @@ -7819,7 +7777,7 @@ packages: dev: false /language-tags/1.0.5: - resolution: {integrity: sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=} + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} dependencies: language-subtag-registry: 0.3.21 dev: false @@ -7971,7 +7929,7 @@ packages: dev: true /locate-path/2.0.0: - resolution: {integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=} + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} dependencies: p-locate: 2.0.0 @@ -8051,7 +8009,7 @@ packages: dev: true /lz-string/1.4.4: - resolution: {integrity: sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=} + resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} hasBin: true /magic-string/0.26.2: @@ -8645,15 +8603,11 @@ packages: dev: false /object-assign/4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-inspect/1.12.0: - resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} - /object-inspect/1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} - dev: true /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -8674,7 +8628,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 dev: false /object.fromentries/2.0.5: @@ -8683,14 +8637,14 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 dev: false /object.hasown/1.1.1: resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==} dependencies: define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 dev: false /object.values/1.1.5: @@ -8699,7 +8653,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 dev: false /once/1.4.0: @@ -8784,7 +8738,7 @@ packages: dev: true /p-locate/2.0.0: - resolution: {integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=} + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} dependencies: p-limit: 1.3.0 @@ -8841,7 +8795,7 @@ packages: dev: true /p-try/1.0.0: - resolution: {integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=} + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} /p-try/2.2.0: @@ -8942,7 +8896,7 @@ packages: dev: true /path-exists/3.0.0: - resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} /path-exists/4.0.0: @@ -9176,16 +9130,6 @@ packages: react: 18.1.0 scheduler: 0.22.0 - /react-error-boundary/3.1.4_react@18.1.0: - resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} - engines: {node: '>=10', npm: '>=6'} - peerDependencies: - react: '>=16.13.1 || 18' - dependencies: - '@babel/runtime': 7.17.9 - react: 18.1.0 - dev: true - /react-is/16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false @@ -9622,7 +9566,7 @@ packages: dependencies: call-bind: 1.0.2 get-intrinsic: 1.1.1 - object-inspect: 1.12.0 + object-inspect: 1.12.2 /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -9866,7 +9810,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 get-intrinsic: 1.1.1 has-symbols: 1.0.3 internal-slot: 1.0.3 @@ -9879,7 +9823,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 dev: false /string.prototype.trimstart/1.0.5: @@ -9887,7 +9831,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 dev: false /string_decoder/1.1.1: