diff --git a/spec/__mocks__/electron.ts b/spec/__mocks__/electron.ts index a9c894e1..6b89d720 100644 --- a/spec/__mocks__/electron.ts +++ b/spec/__mocks__/electron.ts @@ -24,8 +24,9 @@ interface IIpcMain { interface IIpcRenderer { sendSync(event: any, cb: any): any; on(eventName: any, cb: any): void; - send(event: any, cb: any): void; + send(event: any, ...cb: any[]): void; removeListener(eventName: any, cb: any): void; + once(eventName: any, cb: any): void; } interface IPowerMonitor { querySystemIdleTime(): void; @@ -91,15 +92,16 @@ export const ipcRenderer: IIpcRenderer = { } return null; }, - send: (event, args) => { + send: (event, ...args) => { const senderEvent = { sender: { - send: (eventSend, arg) => { - ipcEmitter.emit(eventSend, arg); + send: (eventSend, ...arg) => { + ipcEmitter.emit(eventSend, ...arg); }, }, + preventDefault: jest.fn(), }; - ipcEmitter.emit(event, senderEvent, args); + ipcEmitter.emit(event, senderEvent, ...args); }, on: (eventName, cb) => { ipcEmitter.on(eventName, cb); @@ -107,12 +109,21 @@ export const ipcRenderer: IIpcRenderer = { removeListener: (eventName, cb) => { ipcEmitter.removeListener(eventName, cb); }, + once: (eventName, cb) => { + ipcEmitter.on(eventName, cb); + }, }; export const shell = { openExternal: jest.fn(), }; +// tslint:disable-next-line:variable-name +export const BrowserWindow = { + fromWebContents: (arg) => arg, + getAllWindows: jest.fn(() => []), +}; + // tslint:disable-next-line:variable-name export const Menu = { buildFromTemplate: jest.fn(), diff --git a/spec/childWindowHandle.spec.ts b/spec/childWindowHandle.spec.ts new file mode 100644 index 00000000..84958c18 --- /dev/null +++ b/spec/childWindowHandle.spec.ts @@ -0,0 +1,90 @@ +import { handleChildWindow } from '../src/app/child-window-handler'; +import { windowHandler } from '../src/app/window-handler'; +import { injectStyles } from '../src/app/window-utils'; +import { ipcRenderer } from './__mocks__/electron'; + +const getMainWindow = { + isDestroyed: jest.fn(() => false), + getBounds: jest.fn(() => { + return { + x: 11, + y: 22, + }; + }), + isAlwaysOnTop: jest.fn(() => true), + setMenuBarVisibility: jest.fn(), + setAlwaysOnTop: jest.fn(), +}; + + +jest.mock('../src/common/env', () => { + return { + isWindowsOS: true, + isMac: false, + }; +}); + +jest.mock('../src/app/window-utils', () => { + return { + injectStyles: jest.fn(), + preventWindowNavigation: jest.fn(), + }; +}); + +jest.mock('../src/app/window-handler', () => { + return { + windowHandler: { + url: 'https://test.symphony.com', + getMainWindow: jest.fn(() => { + return getMainWindow; + }), + openUrlInDefaultBrowser: jest.fn(), + addWindow: jest.fn(), + }, + }; +}); + +jest.mock('../src/app/window-actions', () => { + return { + monitorWindowActions: jest.fn(), + }; +}); + +describe('child window handle', () => { + const frameName = { }; + const disposition = 'new-window'; + const newWinOptions = { + webPreferences: jest.fn(), + webContents: { ...ipcRenderer, ...getMainWindow, webContents: ipcRenderer}, + }; + + it('should call `did-start-loading` correctly on WindowOS', () => { + const newWinUrl = 'about:blank'; + const args = [newWinUrl, frameName, disposition, newWinOptions]; + const spy = jest.spyOn(getMainWindow, 'setMenuBarVisibility'); + handleChildWindow(ipcRenderer as any); + ipcRenderer.send('new-window', ...args); + ipcRenderer.send('did-start-loading'); + expect(spy).toBeCalledWith(false); + }); + + it('should call `did-finish-load` correctly on WindowOS', () => { + const newWinUrl = 'about:blank'; + const args = [newWinUrl, frameName, disposition, newWinOptions]; + const spy = jest.spyOn(newWinOptions.webContents.webContents, 'send'); + handleChildWindow(ipcRenderer as any); + ipcRenderer.send('new-window', ...args); + ipcRenderer.send('did-finish-load'); + expect(spy).lastCalledWith('page-load', { isWindowsOS: true}); + expect(injectStyles).toBeCalled(); + }); + + it('should call `windowHandler.openUrlInDefaultBrowser` when url in invalid', () => { + const newWinUrl = 'invalid'; + const args = [newWinUrl, frameName, disposition, newWinOptions]; + const spy = jest.spyOn(windowHandler, 'openUrlInDefaultBrowser'); + handleChildWindow(ipcRenderer as any); + ipcRenderer.send('new-window', ...args); + expect(spy).toBeCalledWith('invalid'); + }); +});