mock-child_process.js
1 "use strict"; 2 Object.defineProperty(exports, "__esModule", { value: true }); 3 exports.mockSpawn = void 0; 4 const child_process = require("child_process"); 5 const events = require("events"); 6 if (!child_process.spawn.mockImplementationOnce) { 7 throw new Error('Call "jest.mock(\'child_process\');" at the top of the test file!'); 8 } 9 function mockSpawn(...invocations) { 10 let mock = child_process.spawn; 11 for (const _invocation of invocations) { 12 const invocation = _invocation; // Mirror into variable for closure 13 mock = mock.mockImplementationOnce((binary, args, options) => { 14 var _a, _b; 15 if (invocation.prefix) { 16 // Match command line prefix 17 expect([binary, ...args].slice(0, invocation.commandLine.length)).toEqual(invocation.commandLine); 18 } 19 else { 20 // Match full command line 21 expect([binary, ...args]).toEqual(invocation.commandLine); 22 } 23 if (invocation.cwd != null) { 24 expect(options.cwd).toBe(invocation.cwd); 25 } 26 if (invocation.sideEffect) { 27 invocation.sideEffect(); 28 } 29 const child = new events.EventEmitter(); 30 child.stdin = new events.EventEmitter(); 31 child.stdin.write = jest.fn(); 32 child.stdin.end = jest.fn(); 33 child.stdout = new events.EventEmitter(); 34 child.stderr = new events.EventEmitter(); 35 if (invocation.stdout) { 36 mockEmit(child.stdout, 'data', invocation.stdout); 37 } 38 mockEmit(child, 'close', (_a = invocation.exitCode) !== null && _a !== void 0 ? _a : 0); 39 mockEmit(child, 'exit', (_b = invocation.exitCode) !== null && _b !== void 0 ? _b : 0); 40 return child; 41 }); 42 } 43 mock.mockImplementation((binary, args, _options) => { 44 throw new Error(`Did not expect call of ${JSON.stringify([binary, ...args])}`); 45 }); 46 } 47 exports.mockSpawn = mockSpawn; 48 /** 49 * Must do this on the next tick, as emitter.emit() expects all listeners to have been attached already 50 */ 51 function mockEmit(emitter, event, data) { 52 setImmediate(() => { 53 emitter.emit(event, data); 54 }); 55 } 56 //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay1jaGlsZF9wcm9jZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibW9jay1jaGlsZF9wcm9jZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUErQztBQUMvQyxpQ0FBaUM7QUFFakMsSUFBSSxDQUFFLGFBQXFCLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFO0lBQ3hELE1BQU0sSUFBSSxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQztDQUN0RjtBQW1CRCxTQUFnQixTQUFTLENBQUMsR0FBRyxXQUF5QjtJQUNwRCxJQUFJLElBQUksR0FBSSxhQUFhLENBQUMsS0FBYSxDQUFDO0lBQ3hDLEtBQUssTUFBTSxXQUFXLElBQUksV0FBVyxFQUFFO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLG1DQUFtQztRQUNuRSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBYyxFQUFFLElBQWMsRUFBRSxPQUFtQyxFQUFFLEVBQUU7O1lBQ3pHLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDckIsNEJBQTRCO2dCQUM1QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ25HO2lCQUFNO2dCQUNMLDBCQUEwQjtnQkFDMUIsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzNEO1lBRUQsSUFBSSxVQUFVLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDMUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzFDO1lBRUQsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO2dCQUN6QixVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDekI7WUFFRCxNQUFNLEtBQUssR0FBUSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM3QyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUIsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXpDLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDckIsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNuRDtZQUNELFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxRQUFFLFVBQVUsQ0FBQyxRQUFRLG1DQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25ELFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxRQUFFLFVBQVUsQ0FBQyxRQUFRLG1DQUFJLENBQUMsQ0FBQyxDQUFDO1lBRWxELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQWMsRUFBRSxJQUFjLEVBQUUsUUFBYSxFQUFFLEVBQUU7UUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQXpDRCw4QkF5Q0M7QUFFRDs7R0FFRztBQUNILFNBQVMsUUFBUSxDQUFDLE9BQTRCLEVBQUUsS0FBYSxFQUFFLElBQVM7SUFDdEUsWUFBWSxDQUFDLEdBQUcsRUFBRTtRQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2V2ZW50cyc7XG5cbmlmICghKGNoaWxkX3Byb2Nlc3MgYXMgYW55KS5zcGF3bi5tb2NrSW1wbGVtZW50YXRpb25PbmNlKSB7XG4gIHRocm93IG5ldyBFcnJvcignQ2FsbCBcImplc3QubW9jayhcXCdjaGlsZF9wcm9jZXNzXFwnKTtcIiBhdCB0aGUgdG9wIG9mIHRoZSB0ZXN0IGZpbGUhJyk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2NhdGlvbiB7XG4gIGNvbW1hbmRMaW5lOiBzdHJpbmdbXTtcbiAgY3dkPzogc3RyaW5nO1xuICBleGl0Q29kZT86IG51bWJlcjtcbiAgc3Rkb3V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPbmx5IG1hdGNoIGEgcHJlZml4IG9mIHRoZSBjb21tYW5kIChkb24ndCBjYXJlIGFib3V0IHRoZSBkZXRhaWxzIG9mIHRoZSBhcmd1bWVudHMpXG4gICAqL1xuICBwcmVmaXg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSdW4gdGhpcyBmdW5jdGlvbiBhcyBhIHNpZGUgZWZmZWN0LCBpZiBwcmVzZW50XG4gICAqL1xuICBzaWRlRWZmZWN0PzogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tTcGF3biguLi5pbnZvY2F0aW9uczogSW52b2NhdGlvbltdKSB7XG4gIGxldCBtb2NrID0gKGNoaWxkX3Byb2Nlc3Muc3Bhd24gYXMgYW55KTtcbiAgZm9yIChjb25zdCBfaW52b2NhdGlvbiBvZiBpbnZvY2F0aW9ucykge1xuICAgIGNvbnN0IGludm9jYXRpb24gPSBfaW52b2NhdGlvbjsgLy8gTWlycm9yIGludG8gdmFyaWFibGUgZm9yIGNsb3N1cmVcbiAgICBtb2NrID0gbW9jay5tb2NrSW1wbGVtZW50YXRpb25PbmNlKChiaW5hcnk6IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM6IGNoaWxkX3Byb2Nlc3MuU3Bhd25PcHRpb25zKSA9PiB7XG4gICAgICBpZiAoaW52b2NhdGlvbi5wcmVmaXgpIHtcbiAgICAgICAgLy8gTWF0Y2ggY29tbWFuZCBsaW5lIHByZWZpeFxuICAgICAgICBleHBlY3QoW2JpbmFyeSwgLi4uYXJnc10uc2xpY2UoMCwgaW52b2NhdGlvbi5jb21tYW5kTGluZS5sZW5ndGgpKS50b0VxdWFsKGludm9jYXRpb24uY29tbWFuZExpbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTWF0Y2ggZnVsbCBjb21tYW5kIGxpbmVcbiAgICAgICAgZXhwZWN0KFtiaW5hcnksIC4uLmFyZ3NdKS50b0VxdWFsKGludm9jYXRpb24uY29tbWFuZExpbmUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW52b2NhdGlvbi5jd2QgIT0gbnVsbCkge1xuICAgICAgICBleHBlY3Qob3B0aW9ucy5jd2QpLnRvQmUoaW52b2NhdGlvbi5jd2QpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW52b2NhdGlvbi5zaWRlRWZmZWN0KSB7XG4gICAgICAgIGludm9jYXRpb24uc2lkZUVmZmVjdCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZDogYW55ID0gbmV3IGV2ZW50cy5FdmVudEVtaXR0ZXIoKTtcbiAgICAgIGNoaWxkLnN0ZGluID0gbmV3IGV2ZW50cy5FdmVudEVtaXR0ZXIoKTtcbiAgICAgIGNoaWxkLnN0ZGluLndyaXRlID0gamVzdC5mbigpO1xuICAgICAgY2hpbGQuc3RkaW4uZW5kID0gamVzdC5mbigpO1xuICAgICAgY2hpbGQuc3Rkb3V0ID0gbmV3IGV2ZW50cy5FdmVudEVtaXR0ZXIoKTtcbiAgICAgIGNoaWxkLnN0ZGVyciA9IG5ldyBldmVudHMuRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAgIGlmIChpbnZvY2F0aW9uLnN0ZG91dCkge1xuICAgICAgICBtb2NrRW1pdChjaGlsZC5zdGRvdXQsICdkYXRhJywgaW52b2NhdGlvbi5zdGRvdXQpO1xuICAgICAgfVxuICAgICAgbW9ja0VtaXQoY2hpbGQsICdjbG9zZScsIGludm9jYXRpb24uZXhpdENvZGUgPz8gMCk7XG4gICAgICBtb2NrRW1pdChjaGlsZCwgJ2V4aXQnLCBpbnZvY2F0aW9uLmV4aXRDb2RlID8/IDApO1xuXG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfSk7XG4gIH1cblxuICBtb2NrLm1vY2tJbXBsZW1lbnRhdGlvbigoYmluYXJ5OiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBfb3B0aW9uczogYW55KSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGV4cGVjdCBjYWxsIG9mICR7SlNPTi5zdHJpbmdpZnkoW2JpbmFyeSwgLi4uYXJnc10pfWApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBNdXN0IGRvIHRoaXMgb24gdGhlIG5leHQgdGljaywgYXMgZW1pdHRlci5lbWl0KCkgZXhwZWN0cyBhbGwgbGlzdGVuZXJzIHRvIGhhdmUgYmVlbiBhdHRhY2hlZCBhbHJlYWR5XG4gKi9cbmZ1bmN0aW9uIG1vY2tFbWl0KGVtaXR0ZXI6IGV2ZW50cy5FdmVudEVtaXR0ZXIsIGV2ZW50OiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgIGVtaXR0ZXIuZW1pdChldmVudCwgZGF0YSk7XG4gIH0pO1xufVxuIl19