import * as React from 'react'; import { act, render } from '@testing-library/react'; /** Mocks */ import { Event, mockSdk } from './testUtils/mockSplitFactory'; jest.mock('@splitsoftware/splitio/client', () => { return { SplitFactory: mockSdk() }; }); import { SplitFactory } from '@splitsoftware/splitio/client'; import { sdkBrowser } from './testUtils/sdkConfigs'; import { getStatus } from '../utils'; /** Test target */ import { SplitFactoryProvider } from '../SplitFactoryProvider'; import { SplitClient } from '../SplitClient'; import { useSplitManager } from '../useSplitManager'; import { EXCEPTION_NO_SFP } from '../constants'; import { INITIAL_STATUS } from './testUtils/utils'; describe('useSplitManager', () => { test('returns the factory manager and its status, and updates on SDK events.', () => { const outerFactory = SplitFactory(sdkBrowser); let hookResult; render( {React.createElement(() => { hookResult = useSplitManager(); return null; })} ); expect(hookResult).toStrictEqual({ ...INITIAL_STATUS, manager: outerFactory.manager(), client: outerFactory.client(), factory: outerFactory, }); act(() => (outerFactory.client() as any).__emitter__.emit(Event.SDK_READY)); expect(hookResult).toStrictEqual({ ...INITIAL_STATUS, manager: outerFactory.manager(), client: outerFactory.client(), factory: outerFactory, hasTimedout: false, isDestroyed: false, isReady: true, isReadyFromCache: true, isTimedout: false, isOperational: true, lastUpdate: getStatus(outerFactory.client()).lastUpdate, }); }); test('throws error if invoked outside of SplitFactoryProvider.', () => { expect(() => { render( React.createElement(() => { useSplitManager(); return null; }) ); }).toThrow(EXCEPTION_NO_SFP); }); // @TODO remove next test case when `SplitClient` is removed. test('returns the factory manager and its status, even if the Split context was updated by an SplitClient component', () => { const outerFactory = SplitFactory(sdkBrowser); let hookResult; render( {React.createElement(() => { hookResult = useSplitManager(); return null; })} ); expect(hookResult).toStrictEqual({ ...INITIAL_STATUS, manager: outerFactory.manager(), client: outerFactory.client(), factory: outerFactory, }); act(() => (outerFactory.client() as any).__emitter__.emit(Event.SDK_READY)); // act(() => (outerFactory.client() as any).__emitter__.emit(Event.SDK_READY)); expect(hookResult).toStrictEqual({ ...INITIAL_STATUS, manager: outerFactory.manager(), client: outerFactory.client(), factory: outerFactory, hasTimedout: false, isDestroyed: false, isReady: true, isReadyFromCache: true, isTimedout: false, isOperational: true, lastUpdate: getStatus(outerFactory.client()).lastUpdate, }); }); });