@electron-forge/core
Version:
A complete tool for building modern Electron applications
211 lines (190 loc) • 6.67 kB
text/typescript
import { ElectronProcess } from '@electron-forge/shared-types';
import { expect } from 'chai';
import proxyquire from 'proxyquire';
import { SinonStub, stub } from 'sinon';
import { StartOptions } from '../../src/api';
describe('start', () => {
let start: (opts: StartOptions) => Promise<ElectronProcess>;
let packageJSON: Record<string, string>;
let resolveStub: SinonStub;
let spawnStub: SinonStub;
let shouldOverride: false | { on: () => void };
let processOn: SinonStub<['timeout', () => void]>;
beforeEach(() => {
resolveStub = stub();
spawnStub = stub();
shouldOverride = false;
packageJSON = require('../fixture/dummy_app/package.json');
start = proxyquire.noCallThru().load('../../src/api/start', {
'../util/electron-executable': () => Promise.resolve('fake_electron_path'),
'@electron-forge/core-utils': {
getElectronVersion: () => Promise.resolve('1.0.0'),
listrCompatibleRebuildHook: () => Promise.resolve(),
},
'../util/forge-config': async () => ({
pluginInterface: {
overrideStartLogic: async () => shouldOverride,
triggerHook: async () => false,
getHookListrTasks: () => Promise.resolve([]),
},
}),
'../util/resolve-dir': async (dir: string) => resolveStub(dir),
'../util/read-package-json': {
readMutatedPackageJson: () => Promise.resolve(packageJSON),
},
child_process: {
spawn: spawnStub,
},
}).default;
processOn = stub(process.stdin, 'on');
});
afterEach(() => {
processOn.restore();
});
it('should spawn electron in the correct dir', async () => {
resolveStub.returnsArg(0);
await start({
dir: __dirname,
interactive: false,
});
expect(spawnStub.callCount).to.equal(1);
expect(spawnStub.firstCall.args[0]).to.equal('fake_electron_path');
expect(spawnStub.firstCall.args[2]).to.have.property('cwd', __dirname);
expect(spawnStub.firstCall.args[2].env).to.not.have.property('ELECTRON_ENABLE_LOGGING');
});
it('should not spawn if a plugin overrides the start command', async () => {
resolveStub.returnsArg(0);
shouldOverride = {
on: () => {
/* fake emitter */
},
};
await start({
dir: __dirname,
interactive: false,
});
expect(spawnStub.callCount).to.equal(0);
});
it("should pass electron '.' as the app path if not specified", async () => {
resolveStub.returnsArg(0);
await start({
dir: __dirname,
});
expect(spawnStub.callCount).to.equal(1);
expect(spawnStub.firstCall.args[0]).to.equal('fake_electron_path');
expect(spawnStub.firstCall.args[1][0]).to.equal('.');
});
it('should pass electron the app path if specified', async () => {
resolveStub.returnsArg(0);
await start({
dir: __dirname,
appPath: '/path/to/app.js',
});
expect(spawnStub.callCount).to.equal(1);
expect(spawnStub.firstCall.args[0]).to.equal('fake_electron_path');
expect(spawnStub.firstCall.args[1][0]).to.equal('/path/to/app.js');
});
it('should enable electron logging if enableLogging=true', async () => {
resolveStub.returnsArg(0);
await start({
dir: __dirname,
interactive: false,
enableLogging: true,
});
expect(spawnStub.callCount).to.equal(1);
expect(spawnStub.firstCall.args[0]).to.equal('fake_electron_path');
expect(spawnStub.firstCall.args[2].env).to.have.property('ELECTRON_ENABLE_LOGGING', 'true');
});
it('should enable RUN_AS_NODE if runAsNode=true', async () => {
resolveStub.returnsArg(0);
await start({
dir: __dirname,
interactive: false,
runAsNode: true,
});
expect(spawnStub.callCount).to.equal(1);
expect(spawnStub.firstCall.args[2].env).to.have.property('ELECTRON_RUN_AS_NODE', 'true');
});
it('should disable RUN_AS_NODE if runAsNode=false', async () => {
resolveStub.returnsArg(0);
await start({
dir: __dirname,
interactive: false,
runAsNode: false,
});
expect(spawnStub.callCount).to.equal(1);
expect(spawnStub.firstCall.args[2].env).to.not.have.property('ELECTRON_RUN_AS_NODE');
});
it('should throw if no dir could be found', async () => {
resolveStub.returns(null);
await expect(start({})).to.eventually.be.rejectedWith('Failed to locate startable Electron application');
});
it('should throw if no version is in package.json', async () => {
resolveStub.returnsArg(0);
packageJSON = { ...packageJSON };
delete packageJSON.version;
await expect(
start({
dir: __dirname,
interactive: false,
})
).to.eventually.be.rejectedWith(`Please set your application's 'version' in '${__dirname}/package.json'.`);
});
it('should pass all args through to the spawned Electron instance', async () => {
const args = ['magic_arg', 123, 'thingy'];
resolveStub.returnsArg(0);
spawnStub.returns(0);
await start({
args,
dir: __dirname,
interactive: false,
});
expect(spawnStub.callCount).to.equal(1);
expect(spawnStub.firstCall.args[0]).to.equal('fake_electron_path');
expect(spawnStub.firstCall.args[1].slice(1)).to.deep.equal(args);
});
it('should pass --inspect at the start of the args if inspect is set', async () => {
const args = ['magic'];
resolveStub.returnsArg(0);
spawnStub.returns(0);
await start({
args,
dir: __dirname,
interactive: false,
inspect: true,
});
expect(spawnStub.callCount).to.equal(1);
expect(spawnStub.firstCall.args[0]).to.equal('fake_electron_path');
expect(spawnStub.firstCall.args[1].slice(1)).to.deep.equal(['--inspect'].concat(args));
});
it('should pass --inspect-brk at the start of the args if inspectBrk is set', async () => {
const args = ['magic'];
resolveStub.returnsArg(0);
spawnStub.returns(0);
await start({
args,
dir: __dirname,
interactive: false,
inspectBrk: true,
});
expect(spawnStub.callCount).to.equal(1);
expect(spawnStub.firstCall.args[0]).to.equal('fake_electron_path');
expect(spawnStub.firstCall.args[1].slice(1)).to.deep.equal(['--inspect-brk'].concat(args));
});
it('should resolve with a handle to the spawned instance', async () => {
resolveStub.returnsArg(0);
const fakeChild = {
on: () => {
/* fake emitter */
},
};
spawnStub.returns(fakeChild);
await expect(
start({
dir: __dirname,
interactive: false,
enableLogging: true,
})
).to.eventually.equal(fakeChild);
});
});