import * as sinon from 'sinon'; import * as DataShape from '../../../../ts/data/data'; import { Application } from 'spectron'; const globalAny: any = global; const sandbox = sinon.createSandbox(); // We have to do this in a weird way because Data uses module.exports // which doesn't play well with sinon or ImportMock // tslint:disable-next-line: no-require-imports no-var-requires const Data = require('../../../../ts/data/data'); type DataFunction = typeof DataShape; /** * Stub a function inside Data. * * Note: This uses a custom sandbox. * Please call `restoreStubs()` or `stub.restore()` to restore original functionality. */ export function stubData(fn: K): sinon.SinonStub { return sandbox.stub(Data, fn); } type WindowValue = Partial | undefined; /** * Stub a window object. * * Note: This uses a custom sandbox. * Please call `restoreStubs()` or `stub.restore()` to restore original functionality. */ export function stubWindow( fn: K, value: WindowValue ) { // tslint:disable-next-line: no-typeof-undefined if (typeof globalAny.window === 'undefined') { globalAny.window = {}; } const set = (newValue: WindowValue) => { globalAny.window[fn] = newValue; }; const get = () => { return globalAny.window[fn] as WindowValue; }; globalAny.window[fn] = value; return { get, set, }; } export async function spyMessageQueueSend(app: Application) { await app.webContents.executeJavaScript( "var messageQueueSpy = sinon.spy(window.libsession.getMessageQueue(), 'send'); " ); } export async function getAllMessagesSent(app: Application) { const messageQueueSpy = await app.webContents.executeJavaScript( 'messageQueueSpy.args;' ); if (!messageQueueSpy) { throw new Error( 'Be sure to call spyMessageQueueSend() on the correct app first.' ); } const messages = await app.webContents.executeJavaScript( 'messageQueueSpy.args' ); return messages; } export function restoreStubs() { globalAny.window = undefined; sandbox.restore(); }