import React from 'react'; import { render } from '@testing-library/react'; import { ResourceBrowserContext, ResourceBrowserContextProps, ResourceBrowserContextProvider } from './ResourceBrowserContext'; import { mockSource } from '../__mocks__/MockModels'; describe('ResourceBrowserContext', () => { it('Should render with expected default value', () => { let defaultContext: ResourceBrowserContextProps | undefined; render( {(value) => { defaultContext = value; return null; }} , ); expect(defaultContext).toEqual({ onRequestSources: expect.any(Function), plugins: [], searchEnabled: false, }); expect(() => defaultContext?.onRequestSources()).toThrow('onRequestSources has not been configured.'); }); it('Should add memoization to data fetching functions', async () => { let context: ResourceBrowserContextProps | undefined; const sources = [mockSource({ id: '10', type: 'dam' }), mockSource({ id: '20', type: 'dam' })]; const onRequestSources = jest.fn().mockResolvedValue(sources); render( {(value) => { context = value; return null; }} , ); const result = await Promise.all([context?.onRequestSources?.(), context?.onRequestSources?.()]); // mocked data should be returned for all invocations of memoized function expect(result).toEqual([sources, sources]); // memoized function should only be called when different arguments are provided expect(onRequestSources).toHaveBeenCalledTimes(1); }); it('Should not cache failures from data fetching functions', async () => { let context: ResourceBrowserContextProps | undefined; const sources = [mockSource({ id: '10' })]; const onRequestSources = jest.fn().mockRejectedValueOnce(new Error('Cannot fetch sources.')).mockResolvedValueOnce(sources); render( {(value) => { context = value; return null; }} , ); await expect(context?.onRequestSources?.()).rejects.toThrow(new Error('Cannot fetch sources.')); await expect(context?.onRequestSources?.()).resolves.toEqual(sources); expect(onRequestSources).toHaveBeenCalledTimes(2); }); });