jest.mock('./Commons/Logger/Logger.ts'); jest.mock('./HelperFunctions.ts'); import { IRequest, sendRegisterRequestToFramework, setPostListener, IResponse, sendRequestToFramework, getUrlParameterByName } from './HelperFunctions'; import { PluginType, Operations } from './models/Commons'; describe('HelperFunctions', () => { test('setPostListener', () => { const addEventListener = jest.fn(); global.addEventListener = addEventListener; setPostListener(); expect(addEventListener).toHaveBeenCalledTimes(1); expect(addEventListener).toHaveBeenLastCalledWith('message', expect.any(Function), false); }); describe('getUrlParameterByName', () => { test('basic', () => { const url = 'https://example.com?test=123'; expect(getUrlParameterByName('test', url)).toBe('123'); }); test('multiple', () => { const url = 'https://example.com?test1=111&test2=222&test3=333'; expect(getUrlParameterByName('test1', url)).toBe('111'); expect(getUrlParameterByName('test2', url)).toBe('222'); expect(getUrlParameterByName('test3', url)).toBe('333'); }); test('missing parameter', () => { const url = 'https://example.com?test1=111&test2=222&test3=333'; expect(getUrlParameterByName('test4', url)).toBeNull(); }); test('special chars', () => { const parameter = '`1234567890-=~!@#$%^&*()_+[]\\{}|;\':",./<>?'; const url = 'https://example.com?test=' + encodeURIComponent(parameter); expect(getUrlParameterByName('test', url)).toBe(parameter); }); }); describe('sendRegisterRequestToFramework', () => { let similatedRequest: IRequest; let postMessageResolveData: any; let postMessageRejectData: any; let eventCallback: Function; beforeAll(() => { global.addEventListener = (msg: string, cb: Function, bool?: boolean) => { eventCallback = cb; }; }); beforeEach(() => { setPostListener(); postMessageResolveData = undefined; postMessageRejectData = undefined; similatedRequest = undefined; global.postMessage = jest.fn().mockImplementation((data: string, targetOrigin: string) => { const message = JSON.parse(data); if (message.registerOperation) { const response: IResponse = { request: message, isResponse: true, reject: postMessageRejectData, resolve: postMessageResolveData }; setTimeout(() => { eventCallback({ data: JSON.stringify(response) }); if (similatedRequest) { eventCallback({ data: JSON.stringify(similatedRequest) }); } }, 1); } }); }); test('resolves', () => { const eventHandler = jest.fn(); const regRequest = sendRegisterRequestToFramework(eventHandler, Operations.CONTEXTUAL_EVENT); return expect(regRequest).resolves.toBeUndefined(); }); test('rejects', () => { postMessageRejectData = ['Error one', 'Error two']; const eventHandler = jest.fn(); const regRequest = sendRegisterRequestToFramework(eventHandler, Operations.CONTEXTUAL_EVENT); return expect(regRequest).rejects.toEqual(postMessageRejectData); }); test('eventHandler receives event and resolves with data', () => { similatedRequest = { operation: Operations.CONTEXTUAL_EVENT, data: ['Hello', 'World!'] }; const eventHandler = jest.fn().mockImplementation(function (...strs: string[]) { const response = strs.join(' '); return new Promise((resolve, reject) => { setTimeout(() => { resolve(response); }, 1); }); }); const regRequest = sendRegisterRequestToFramework(eventHandler, Operations.CONTEXTUAL_EVENT); const timeoutPromise = new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 1000); }); return timeoutPromise.then(() => { expect(eventHandler).toHaveBeenCalledTimes(1); expect(eventHandler).toHaveBeenCalledWith(...similatedRequest.data); expect(JSON.parse(global.postMessage.mock.calls[global.postMessage.mock.calls.length - 1][0])).toEqual({ request: similatedRequest, isResponse: true, reject: undefined, resolve: similatedRequest.data.join(' ') }); }); }); test('eventHandler receives event and resolves without data', () => { similatedRequest = { operation: Operations.CONTEXTUAL_EVENT, data: ['Hello', 'World!'] }; const eventHandler = jest.fn().mockImplementation(function (...strs: string[]) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 1); }); }); const regRequest = sendRegisterRequestToFramework(eventHandler, Operations.CONTEXTUAL_EVENT); const timeoutPromise = new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 1000); }); return timeoutPromise.then(() => { expect(eventHandler).toHaveBeenCalledTimes(1); expect(eventHandler).toHaveBeenCalledWith(...similatedRequest.data); expect(JSON.parse(global.postMessage.mock.calls[global.postMessage.mock.calls.length - 1][0])).toEqual({ request: similatedRequest, isResponse: true, reject: undefined, resolve: undefined }); }); }); test('eventHandler receives event and rejects', () => { similatedRequest = { operation: Operations.CONTEXTUAL_EVENT, data: ['Hello', 'World!'] }; const eventHandler = jest.fn().mockImplementation(function (...strs: string[]) { const response = strs.join(' '); return new Promise((resolve, reject) => { setTimeout(() => { reject(response); }, 1); }); }); const regRequest = sendRegisterRequestToFramework(eventHandler, Operations.CONTEXTUAL_EVENT); const timeoutPromise = new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 1000); }); return timeoutPromise.then(() => { expect(eventHandler).toHaveBeenCalledTimes(1); expect(eventHandler).toHaveBeenCalledWith(...similatedRequest.data); expect(JSON.parse(global.postMessage.mock.calls[global.postMessage.mock.calls.length - 1][0])).toMatchObject({ request: similatedRequest, isResponse: true, reject: similatedRequest.data.join(' ') }); }); }); }); describe('sendRequestToFramework', () => { let postMessageResolveData: any; let postMessageRejectData: any; let eventCallback: Function; beforeAll(() => { global.addEventListener = (msg: string, cb: Function, bool?: boolean) => { eventCallback = cb; }; global.postMessage = (data: string, targetOrigin: string) => { const message = JSON.parse(data); const response: IResponse = { request: message, isResponse: true, reject: postMessageRejectData, resolve: postMessageResolveData }; setTimeout(() => { eventCallback({ data: JSON.stringify(response) }); }, 1); }; }); beforeEach(() => { setPostListener(); postMessageResolveData = undefined; postMessageRejectData = undefined; }); test('resolves', () => expect(sendRequestToFramework(Operations.ADD_CONTEXTUAL_ACCESS_LIST, [{ hi: 1 }, 'bye'])).resolves.toBeUndefined()); test('resolves with data', () => { postMessageResolveData = ['Hello', 'world!']; return expect(sendRequestToFramework(Operations.ADD_CONTEXTUAL_ACCESS_LIST, [{ hi: 1 }, 'bye'])).resolves.toEqual(postMessageResolveData); }); test('rejects', () => { postMessageRejectData = ['Hello', 'world!']; return expect(sendRequestToFramework(Operations.ADD_CONTEXTUAL_ACCESS_LIST, [{ hi: 1 }, 'bye'])).rejects.toEqual(postMessageRejectData); }); }); });