import React from 'react'; import { mount } from 'enzyme'; import Immutable from 'immutable'; import { act } from 'react-dom/test-utils'; import WorkspaceSelect from '../WorkspaceSelect.jsx'; import EventMessageHandler from '../../handlers/EventMessageHandler.js'; import { WORKSPACE_MESSAGE_TIMEOUT, WORKSPACE_SELECT_CONTEXT_VALUES } from '../../Constants.js'; import GoodDataResource from '../../resources/GoodDataResource.js'; import SettingsResource from '../../resources/SettingsResource.js'; jest.mock('../../resources/SettingsResource.js', () => ({ getConfigurationsCompiled: jest.fn().mockResolvedValue( { "enabled": true, "domainUrl": "https://crm.on.gooddata.com", "workspaceId": "pllqbm9e4mls3njwbkv935nzbg1f6uft", "homeScreen": { "enabled": true, "dashboardId": "aaEmOzfow3UT" }, "dashboards": { "dashboardId": "aabIUFprDzam" }, "customerSummary": { "enabled": true, "dashboardId": "aabIUFprDzam", "customerIdTargetVariable": "label.conta.iddoclientedaconta" }, "integratedLogin": { "enabled": false } } ), })); jest.mock('../../resources/GoodDataResource.js', () => ({ getDefaultWorkspaceTitle: jest.fn().mockResolvedValue('[CRM] WORKSPACE TITLE'), getCurrentUserId: jest.fn().mockResolvedValue('/gdc/account/profile/c6b3a174815cecb895f38636c073b21f'), getCurrentUserWorkspaces: jest.fn().mockResolvedValue({}), })); jest.useFakeTimers(); const MOCKED_EVENT = { origin: 'https://analytics.gooddata.com', data: { type: 'ready', }, }; const MOCKED_VALUE = { id: '89e3becb-5c51-4e9a-8620-69eac007afbe', }; // it finds the message's event handler in the addEventListenerSpy function findHandleEvent(addEventListenerSpy) { return addEventListenerSpy.mock.calls.find((call) => { if (call[0] === 'message') { return call[1]; } })[1]; } describe('WorkspaceSelect', () => { let clearTimeOutSpy; let wrapper; const onSelectionChange = jest.fn(); const events = {}; beforeAll(() => { clearTimeOutSpy = jest.spyOn(window, 'clearTimeout').mockImplementation(() => {}); }); beforeEach(() => { jest.clearAllMocks(); jest.resetAllMocks(); jest.restoreAllMocks(); GoodDataResource.getCurrentUserWorkspaces.mockResolvedValue(Immutable.List([ { id: 'ci30ltrj8y4p8cvemz9a0eszqupg9uzo', title: '[CRM] WORKSPACE TITLE 1', }, { id: 'swxzva7lp9jy8e9i1sb7a8zjfx5zpdcz', title: '[CRM] WORKSPACE TITLE 2', } ])); }); describe('GoodData events', () => { it('should call EventMessageHandler.handleEvent when availableCommands event is triggered', async () => { const settingsResourceSpy = jest .spyOn(SettingsResource, 'getConfigurationsCompiled') .mockResolvedValue({}); const addEventListenerSpy = jest .spyOn(window, 'addEventListener') .mockImplementation((event, handle) => { events[event] = handle; }); const eventMessageHandlerSpy = jest .spyOn(EventMessageHandler, 'handleEvent') .mockReturnValue(WORKSPACE_SELECT_CONTEXT_VALUES.loading); await act(async () => { wrapper = await mount(<WorkspaceSelect onSelectionChange={onSelectionChange} />); }); await act(async () => { const handle = findHandleEvent(addEventListenerSpy); await handle(MOCKED_EVENT); }); jestExpect(wrapper.find('WorkspaceSelect').exists()).toBe(true); jestExpect(addEventListenerSpy).toBeCalled(); jestExpect(eventMessageHandlerSpy).toBeCalledWith(MOCKED_EVENT, {}); jestExpect(settingsResourceSpy).toBeCalledWith(); }); it('should call EventMessageHandler.handleEvent when the loaded event is triggered', async () => { const settingsResourceSpy = jest .spyOn(SettingsResource, 'getConfigurationsCompiled') .mockResolvedValue({}); const addEventListenerSpy = jest .spyOn(window, 'addEventListener') .mockImplementation((event, handle) => { events[event] = handle; }); const eventMessageHandlerSpy = jest .spyOn(EventMessageHandler, 'handleEvent') .mockReturnValue(WORKSPACE_SELECT_CONTEXT_VALUES.ready); MOCKED_EVENT.data.type = 'loaded'; await act(async () => { wrapper = await mount(<WorkspaceSelect onSelectionChange={onSelectionChange} />); }); await act(async () => { const handle = findHandleEvent(addEventListenerSpy); await handle(MOCKED_EVENT); }); jestExpect(wrapper.find('WorkspaceSelect').exists()).toBe(true); jestExpect(addEventListenerSpy).toBeCalled(); jestExpect(eventMessageHandlerSpy).toBeCalledWith(MOCKED_EVENT, {}); jestExpect(settingsResourceSpy).toBeCalledWith(); jestExpect(clearTimeOutSpy).toBeCalled(); }); it('should call clearTimeout event and set contextState to timedOut when 15 seconds pass without receiving the loaded event', async () => { jest.useFakeTimers(); const setTimeoutSpy = jest.spyOn(global, 'setTimeout'); const settingsResourceSpy = jest .spyOn(SettingsResource, 'getConfigurationsCompiled') .mockResolvedValue({}); const addEventListenerSpy = jest .spyOn(window, 'addEventListener') .mockImplementation((event, handle) => { events[event] = handle; }); const eventMessageHandlerSpy = jest.spyOn(EventMessageHandler, 'handleEvent'); await act(async () => { wrapper = await mount(<WorkspaceSelect onSelectionChange={onSelectionChange} />); }); await act(async () => { jest.runAllTimers(); await wrapper.update(); }); jestExpect(setTimeoutSpy).toBeCalledWith( jestExpect.any(Function), WORKSPACE_MESSAGE_TIMEOUT, ); jestExpect(wrapper.find('WorkspaceSelect').exists()).toBe(true); jestExpect(addEventListenerSpy).toBeCalled(); jestExpect(eventMessageHandlerSpy).not.toBeCalled(); jestExpect(settingsResourceSpy).toBeCalledWith(); }); }); describe('handleSelectionChange', () => { describe('should call onSelectionChange when the handleSelectionChange is triggered', () => { it('when the informed value is a string', () => { act(() => { wrapper .find('Select') .props() .onChange(MOCKED_VALUE); }); wrapper.update(); jestExpect(onSelectionChange).toBeCalledWith(MOCKED_VALUE); jestExpect( wrapper .find('#workspace-select-component') .first() .prop('value'), ).toBe(MOCKED_VALUE); }); it('when the informed value is a null', () => { act(() => { wrapper .find('Select') .props() .onChange(null); }); wrapper.update(); jestExpect(onSelectionChange).toBeCalledWith(null); jestExpect( wrapper .find('#workspace-select-component') .first() .prop('value'), ).toBe(null); }); it('when the informed value is an empty object', () => { act(() => { wrapper .find('Select') .props() .onChange({}); }); wrapper.update(); jestExpect(onSelectionChange).toBeCalledWith({}); jestExpect( wrapper .find('#workspace-select-component') .first() .prop('value'), ).toStrictEqual({}); }); }); }); });