blob: a07d14a93144b23acaa1dcbe49d32350f0e6b2e8 [file] [log] [blame]
/* eslint-disable no-template-curly-in-string */
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
const rewire = require('rewire');
const path = require('path');
const rootDir = path.resolve(__dirname, '../../../..');
const Api = rewire(path.join(rootDir, 'lib/Api'));
const check_reqs = require(path.join(rootDir, 'lib/check_reqs'));
describe('Testing build.js:', () => {
let build;
beforeEach(() => {
build = rewire(path.join(rootDir, 'lib/build'));
});
describe('Build class', () => {
let ElectronBuilder;
let electronBuilder;
let requireSpy;
let existsSyncSpy;
let emitSpy;
const emptyObj = {};
const api = new Api(null);
beforeEach(() => {
ElectronBuilder = build.__get__('ElectronBuilder');
build.__set__({ require: requireSpy });
spyOn(process, 'env');
emitSpy = jasmine.createSpy('emit');
build.__set__('events', { emit: emitSpy });
});
it('should should be defined.', () => {
expect(ElectronBuilder).toBeDefined();
});
it('should set isDevelopment to undefined and buildConfig to false, when buildOptions is empty.', () => {
electronBuilder = new ElectronBuilder(emptyObj, emptyObj);
expect(electronBuilder.api).toEqual(emptyObj);
expect(electronBuilder.isDevelopment).toEqual(undefined);
expect(electronBuilder.buildConfig).toEqual(false);
});
it('should set isDevelopment to true and buildConfig to false, when buildOptions is not empty.', () => {
// mock buildOptions Objecet
const buildOptions = { debug: true, argv: [] };
electronBuilder = new ElectronBuilder(buildOptions, emptyObj);
expect(electronBuilder.api).toEqual(emptyObj);
expect(electronBuilder.isDevelopment).toEqual(true);
expect(electronBuilder.buildConfig).toEqual(false);
});
it('should set isDevelopment to true and buildConfig to false, when buildOptions.buildCofing is defined, but does not exist.', () => {
// mock buildOptions Objecet
const buildOptions = { debug: true, buildConfig: 'build.xml', argv: [] };
// create spy
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, emptyObj);
expect(existsSyncSpy).toHaveBeenCalled();
expect(electronBuilder.api).toEqual(emptyObj);
expect(electronBuilder.isDevelopment).toEqual(true);
expect(electronBuilder.buildConfig).toEqual(false);
});
it('should set isDevelopment to true and buildConfig to true, when buildOptions.buildCofing is defined and does exist.', () => {
// mock buildOptions Objecet
const buildOptions = { debug: true, buildConfig: {}, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(true);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
electronBuilder = new ElectronBuilder(buildOptions, emptyObj);
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
expect(electronBuilder.api).toEqual(emptyObj);
expect(electronBuilder.isDevelopment).toEqual(true);
expect(electronBuilder.buildConfig).toEqual(true);
});
it('should set isDevelopment is true and buildConfig to actual config, when buildOptions.buildCofing is actual cofing and does exist.', () => {
// mock BuildConfig and buildOptions Object
const buildConfig = {
electron: 'electron',
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: true, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configure();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
expect(electronBuilder.buildSettings).toEqual(buildConfig);
});
it('should set isDevelopment to false and buildConfig to actual config, when buildOptions.buildCofing is actual cofing and does exist.', () => {
// mock BuildConfig and buildOptions Object
const buildConfig = {
electron: 'electron',
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configure();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
expect(electronBuilder.buildSettings).toEqual(buildConfig);
});
it('should set isDevelopment to false and buildConfig to actual config, when buildOptions.buildCofing file does not exist.', () => {
// mock BuildConfig and buildOptions Object
const buildConfig = {
electron: 'electron',
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', { existsSync: existsSyncSpy });
expect(() => {
electronBuilder = new ElectronBuilder(buildOptions, api).configure();
expect(existsSyncSpy).toHaveBeenCalled();
expect(electronBuilder.buildSettings).toEqual(buildConfig);
}).toThrowError(/not supported as a default target platform/);
});
it('should set configureUserBuildSettings (release mode) for all 3 platforms and one invalid one.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { package: ['package', 'package2'], arch: 'arch', signing: { debug: 'debug', release: 'release', store: 'store' } },
win: { package: ['package', 'package2'], arch: 'arch', signing: { debug: 'debug', release: 'release' } },
linux: { package: ['package', 'package2'], arch: 'arch', category: 'Game' },
darwin: {}
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedMac = {
target: [
{ target: 'package', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
type: '${BUILD_TYPE}',
icon: '${APP_INSTALLER_ICON}'
};
const expectedLinux = {
target: [
{ target: 'package', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
icon: '${APP_INSTALLER_ICON}',
category: 'Game'
};
expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
expect(electronBuilder.userBuildSettings.config.linux).toEqual(expectedLinux);
expect(electronBuilder.userBuildSettings.config.win).toEqual(undefined);
});
it('should continue to use defaults with supplied valid configs.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { signing: { provisioningProfile: 'release' } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig: 'LOAD_MY_FAKE_DATA', argv: [] };
// create spies
build.__set__('fs', {
existsSync: jasmine.createSpy('existsSync').and.returnValue(true)
});
build.__set__('require', (file) => {
if (file === 'LOAD_MY_FAKE_DATA') return buildConfig;
return require(file);
});
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
const expectedMac = [
{ target: 'dmg', arch: ['x64'] },
{ target: 'zip', arch: ['x64'] }
];
expect(electronBuilder.userBuildSettings.config.mac.target).toEqual(expectedMac);
});
it('should use all default options when no options supplied.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig: 'LOAD_MY_FAKE_DATA', argv: [] };
// create spies
build.__set__('fs', {
existsSync: jasmine.createSpy('existsSync').and.returnValue(true)
});
build.__set__('require', (file) => {
if (file === 'LOAD_MY_FAKE_DATA') return buildConfig;
return require(file);
});
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
const expectedMac = [
{ target: 'dmg', arch: ['x64'] },
{ target: 'zip', arch: ['x64'] }
];
expect(electronBuilder.userBuildSettings.config.mac.target).toEqual(expectedMac);
});
it('should set configureUserBuildSettings (debug mode) for all 3 platforms and one invalid one.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { package: ['package', 'package2'], arch: 'arch', signing: { debug: 'debug', release: 'release', store: 'store' } },
win: { package: ['package', 'package2'], arch: 'arch', signing: { debug: 'debug', release: 'release' } },
linux: { package: ['package', 'package2'], arch: 'arch' },
darwin: {}
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: true, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedMac = {
target: [
{ target: 'package', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
type: '${BUILD_TYPE}',
icon: '${APP_INSTALLER_ICON}'
};
const expectedLinux = {
target: [
{ target: 'package', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
icon: '${APP_INSTALLER_ICON}'
};
expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
expect(electronBuilder.userBuildSettings.config.linux).toEqual(expectedLinux);
expect(electronBuilder.userBuildSettings.config.win).toEqual(undefined);
});
it('should set configureUserBuildSettings for all 3 platforms without package.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { arch: ['arch1', 'arch2'], signing: { debug: 'debug', release: 'release', store: 'store' } },
windows: { arch: ['arch1', 'arch2'], signing: { debug: 'debug', release: 'release' } },
linux: { arch: ['arch1', 'arch2'] }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig: 'LOAD_MY_FAKE_DATA', argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
// requireSpy = jasmine.createSpy('require').and.returnValue();
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__('require', (file) => {
if (file === 'LOAD_MY_FAKE_DATA') return buildConfig;
return require(file);
});
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
const expected = {
linux: [],
mac: [],
win: [],
config: {
linux: {
icon: '${APP_INSTALLER_ICON}',
target: [
{
target: 'tar.gz',
arch: ['arch1', 'arch2']
}
]
},
mac: {
type: '${BUILD_TYPE}',
icon: '${APP_INSTALLER_ICON}',
target: [
{
target: 'dmg',
arch: ['arch1', 'arch2']
},
{
target: 'zip',
arch: ['arch1', 'arch2']
}
]
},
win: {
icon: '${APP_INSTALLER_ICON}',
target: [
{
target: 'nsis',
arch: ['arch1', 'arch2']
}
]
}
}
};
expect(electronBuilder.userBuildSettings).toEqual(expected);
});
it('should not set this.userBuildSettings.', () => {
const buildConfig = {
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig: 'LOAD_MY_FAKE_DATA', argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
// requireSpy = jasmine.createSpy('require').and.returnValue();
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__('require', (file) => {
if (file === 'LOAD_MY_FAKE_DATA') return buildConfig;
return require(file);
});
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(electronBuilder.userBuildSettings).toBe(undefined);
});
it('should set configureUserBuildSettings for all 3 platforms without arch.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release', store: 'store' } },
win: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release' } },
linux: { package: ['package', 'package2'] }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedMac = {
target: [
{ target: 'package', arch: ['x64'] },
{ target: 'package2', arch: ['x64'] }
],
type: '${BUILD_TYPE}',
icon: '${APP_INSTALLER_ICON}'
};
const expectedLinux = {
target: [
{ target: 'package', arch: ['x64'] },
{ target: 'package2', arch: ['x64'] }
],
icon: '${APP_INSTALLER_ICON}'
};
expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
expect(electronBuilder.userBuildSettings.config.linux).toEqual(expectedLinux);
expect(electronBuilder.userBuildSettings.config.win).toEqual(undefined);
});
it('should set configureUserBuildSettings for all 3 platforms without signing.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { package: ['package', 'package2'], arch: 'arch' },
win: { package: ['package', 'package2'], arch: 'arch' },
linux: { package: ['package', 'package2'], arch: 'arch' }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: true, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedMac = {
target: [
{ target: 'package', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
type: '${BUILD_TYPE}',
icon: '${APP_INSTALLER_ICON}'
};
const expectedLinux = {
target: [
{ target: 'package', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
icon: '${APP_INSTALLER_ICON}'
};
expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
expect(electronBuilder.userBuildSettings.config.linux).toEqual(expectedLinux);
expect(electronBuilder.userBuildSettings.config.win).toEqual(undefined);
});
it('should set configureUserBuildSettings for mac when platform configs is empty.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: {}
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
});
it('should throw new Error mac with incorrect platform build properties.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { pack: ['package', 'package2'], architecture: 'arch', sign: 'signing' }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
electronBuilder = new ElectronBuilder(buildOptions, api);
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
expect(() => { electronBuilder.configureUserBuildSettings(); }).toThrow(
new Error('The platform "mac" contains an invalid property. Valid properties are: package, arch, signing')
);
});
it('should set configureUserBuildSettings for when using windows instead of win.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
windows: { package: ['mas', 'package2'], arch: 'arch', signing: 'signing' }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedWin = {
target: [
{ target: 'mas', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
icon: '${APP_INSTALLER_ICON}'
};
expect(electronBuilder.userBuildSettings.config.mac).toEqual(undefined);
expect(electronBuilder.userBuildSettings.config.linux).toEqual(undefined);
expect(electronBuilder.userBuildSettings.config.win).toEqual(expectedWin);
});
it('should append package top-level key options if the object is empty.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { package: ['pkg', { dmg: { } }], arch: 'arch', signing: 'signing' }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedMac = {
target: [
{ target: 'pkg', arch: 'arch' },
{ target: 'dmg', arch: 'arch' }
],
type: '${BUILD_TYPE}',
icon: '${APP_INSTALLER_ICON}'
};
expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
expect(electronBuilder.userBuildSettings.config.dmg).toEqual({ });
expect(electronBuilder.userBuildSettings.config.linux).toEqual(undefined);
expect(electronBuilder.userBuildSettings.config.windows).toEqual(undefined);
});
it('should append package top-level key options.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { package: ['pkg', { dmg: { format: 'UDZO' } }], arch: 'arch', signing: 'signing' }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedMac = {
target: [
{ target: 'pkg', arch: 'arch' },
{ target: 'dmg', arch: 'arch' }
],
type: '${BUILD_TYPE}',
icon: '${APP_INSTALLER_ICON}'
};
const expectedDmgOptions = {
format: 'UDZO'
};
expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
expect(electronBuilder.userBuildSettings.config.dmg).toEqual(expectedDmgOptions);
expect(electronBuilder.userBuildSettings.config.linux).toEqual(undefined);
expect(electronBuilder.userBuildSettings.config.windows).toEqual(undefined);
});
it('should append package top-level key nested options.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { package: ['pkg', { dmg: { format: { UDZO: '' } } }], arch: 'arch', signing: 'signing' }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedMac = {
target: [
{ target: 'pkg', arch: 'arch' },
{ target: 'dmg', arch: 'arch' }
],
type: '${BUILD_TYPE}',
icon: '${APP_INSTALLER_ICON}'
};
const expectedDmgOptions = {
format: { UDZO: '' }
};
expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
expect(electronBuilder.userBuildSettings.config.dmg).toEqual(expectedDmgOptions);
expect(electronBuilder.userBuildSettings.config.linux).toEqual(undefined);
expect(electronBuilder.userBuildSettings.config.windows).toEqual(undefined);
});
it('should set overridable per platform options.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: {
package: ['package', 'package2'],
arch: 'arch',
appId: 'com.test.app',
artifactName: '${productName}-${version}.${ext}',
compression: 'normal',
files: [
'test/files/file1',
'test/files/file2'
],
extraResources: [
'test/resources/file1',
'test/resources/file2'
],
extraFiles: [
'test/extra/files/file1',
'test/extra/files/file2'
],
asar: false,
fileAssociations: [
{
ext: 'png',
name: 'PNG'
}
],
forceCodeSigning: false,
electronUpdaterCompatibility: '>=2.15',
publish: ['github', 'bintray'],
detectUpdateChannel: false,
generateUpdatesFilesForAllChannels: false
}
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: true, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedMac = {
target: [
{ target: 'package', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
type: '${BUILD_TYPE}',
icon: '${APP_INSTALLER_ICON}',
appId: 'com.test.app',
artifactName: '${productName}-${version}.${ext}',
compression: 'normal',
files: [
'test/files/file1',
'test/files/file2'
],
extraResources: [
'test/resources/file1',
'test/resources/file2'
],
extraFiles: [
'test/extra/files/file1',
'test/extra/files/file2'
],
asar: false,
fileAssociations: [
{
ext: 'png',
name: 'PNG'
}
],
forceCodeSigning: false,
electronUpdaterCompatibility: '>=2.15',
publish: ['github', 'bintray'],
detectUpdateChannel: false,
generateUpdatesFilesForAllChannels: false
};
expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
});
it('should set top-level macOS specific.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: {
package: ['package', 'package2'],
arch: 'arch',
category: 'public.app-category.developer-tools',
icon: 'build/icon.icns',
bundleVersion: 'CFBundleVersion',
bundleShortVersion: 'CFBundleShortVersionString',
darkModeSupport: true,
helperBundleId: '${appBundleIdentifier}.helper',
extendInfo: 'Info.plist',
binaries: [
'test/binaries/file1',
'test/binaries/file2'
],
minimumSystemVersion: '10.0.10',
electronLanguages: [
'en',
'jp',
'ru'
],
extraDistFiles: [
'test/extraDist/file1',
'test/extraDist/file2'
]
}
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: true, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedMac = {
target: [
{ target: 'package', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
type: '${BUILD_TYPE}',
category: 'public.app-category.developer-tools',
icon: 'build/icon.icns',
bundleVersion: 'CFBundleVersion',
bundleShortVersion: 'CFBundleShortVersionString',
darkModeSupport: true,
helperBundleId: '${appBundleIdentifier}.helper',
extendInfo: 'Info.plist',
binaries: [
'test/binaries/file1',
'test/binaries/file2'
],
minimumSystemVersion: '10.0.10',
electronLanguages: [
'en',
'jp',
'ru'
],
extraDistFiles: [
'test/extraDist/file1',
'test/extraDist/file2'
]
};
expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
});
it('should set top-level Windows specific.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
windows: {
package: ['package', 'package2'],
arch: 'arch',
icon: 'build/icon.icns',
legalTrademarks: 'trademarks and registered trademarks',
rfc3161TimeStampServer: 'http://timestamp.comodoca.com/rfc3161',
timeStampServer: 'http://timestamp.verisign.com/scripts/timstamp.dll',
publisherName: 'publisher name',
verifyUpdateCodeSignature: true,
requestedExecutionLevel: 'asInvoker',
signAndEditExecutable: true,
signDlls: false
}
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: true, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedWindows = {
target: [
{ target: 'package', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
icon: 'build/icon.icns',
legalTrademarks: 'trademarks and registered trademarks',
rfc3161TimeStampServer: 'http://timestamp.comodoca.com/rfc3161',
timeStampServer: 'http://timestamp.verisign.com/scripts/timstamp.dll',
publisherName: 'publisher name',
verifyUpdateCodeSignature: true,
requestedExecutionLevel: 'asInvoker',
signAndEditExecutable: true,
signDlls: false
};
expect(electronBuilder.userBuildSettings.config.win).toEqual(expectedWindows);
});
it('should set top-level Linux specific.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
linux: {
package: ['package', 'package2'],
arch: 'arch',
maintainer: 'maintainer',
vendor: 'vendor',
executableName: 'productName',
icon: 'path to icon set directory or one png file',
synopsis: 'short description',
description: 'description',
category: 'Utility',
mimeTypes: [
'type1',
'type2'
],
desktop: 'desktop file entries'
}
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: true, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
const expectedLinux = {
target: [
{ target: 'package', arch: 'arch' },
{ target: 'package2', arch: 'arch' }
],
maintainer: 'maintainer',
vendor: 'vendor',
executableName: 'productName',
icon: 'path to icon set directory or one png file',
synopsis: 'short description',
description: 'description',
category: 'Utility',
mimeTypes: [
'type1',
'type2'
],
desktop: 'desktop file entries'
};
expect(electronBuilder.userBuildSettings.config.linux).toEqual(expectedLinux);
});
it('should fetchPlatformDefaults true.', () => {
// mock buildOptions Objecet and platformFile path
const buildOptions = { debug: true, buildConfig: 'build.xml', argv: [] };
const platformFile = path.join(__dirname, 'build', 'platform.json');
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
requireSpy = jasmine.createSpy('require').and.returnValue(platformFile);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__({ require: requireSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).fetchPlatformDefaults('electron');
expect(existsSyncSpy).toHaveBeenCalled();
expect(requireSpy).toHaveBeenCalled();
expect(electronBuilder).toEqual(platformFile);
});
it('should fetchPlatformDefaults false.', () => {
// mock buildOptions Object
const buildOptions = { debug: true, buildConfig: 'build.xml', argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api);
expect(existsSyncSpy).toHaveBeenCalled();
expect(() => { electronBuilder.fetchPlatformDefaults('name'); }).toThrow(new Error('Your platform "name" is not supported as a default target platform for Electron.'));
});
it('should __appendUserSigning linux signing.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
linux: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release' } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).__appendUserSigning('linux', platformConfig.linux.signing, buildOptions);
expect(existsSyncSpy).toHaveBeenCalled();
expect(emitSpy).toHaveBeenCalled();
const actual = emitSpy.calls.argsFor(0)[1];
const expected = 'The provided signing information for the Linux platform is ignored. Linux does not support signing.';
expect(actual).toEqual(expected);
});
it('should __appendUserSigning mac with masconfig.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
mac: { package: ['package', 'package2'], signing: { store: { requirements: 'requirements' } } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
// config.mas is appeneded to build options to spoof what __formatAppendUserSettings method would have performed.
const buildOptions = { debug: false, buildConfig, argv: [], config: { mas: {} } };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).__appendUserSigning('mac', platformConfig.mac.signing, buildOptions);
expect(existsSyncSpy).toHaveBeenCalled();
expect(buildOptions.buildConfig.electron.mac.signing.store.requirements).toBe(undefined);
});
it('should format nsis-web taget with nsisWeb top-level configs in __formatAppendUserSettings.', () => {
// Sample target configuration option
const appPackageUrl = 'https://foo.bar/apps/win/web';
// The settings which will be populated by `__formatAppendUserSettings`
const userBuildSettings = {};
// platform config partial from `build.json`
const platformConfig = {
package: [
{ 'nsis-web': { appPackageUrl } }
]
};
// the mock `build.json`
const buildConfig = { electron: { windows: platformConfig } };
// the build options which is passed from CLI/Lib to Platform Build
const buildOptions = { argv: [], buildConfig };
// // create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api)
.__formatAppendUserSettings('win', platformConfig, userBuildSettings);
expect(existsSyncSpy).toHaveBeenCalled();
expect(userBuildSettings.config.nsisWeb.appPackageUrl).toBe(appPackageUrl);
});
it('should append user singing for windows', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
win: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release' } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).__appendUserSigning('win', platformConfig, buildOptions);
expect(existsSyncSpy).toHaveBeenCalled();
});
it('should set buildConfigs __appendMacUserSigning when files exist.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
darwin: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release', store: { requirements: 'requirements' } } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
const config = {
debug: 'debug',
release: 'release',
identity: 'identify',
entitlements: 'entitlements',
entitlementsInherit: 'entitlementsInherit',
requirements: 'requirements',
provisioningProfile: 'provisioningProfile',
store: 'store'
};
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).__appendMacUserSigning(config, buildConfig);
expect(existsSyncSpy).toHaveBeenCalled();
expect(buildConfig.identity).toEqual(config.identity);
expect(buildConfig.entitlements).toEqual(config.entitlements);
expect(buildConfig.entitlementsInherit).toEqual(config.entitlementsInherit);
expect(buildConfig.requirements).toEqual(config.requirements);
expect(buildConfig.provisioningProfile).toEqual(config.provisioningProfile);
});
it('should emit warning when in __appendMacUserSigning when files does not exist and set identity to process env link.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
darwin: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release', store: { requirements: 'requirements' } } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
const config = {
debug: 'debug',
release: 'release',
entitlements: 'entitlements',
entitlementsInherit: 'entitlementsInherit',
requirements: 'requirements',
provisioningProfile: 'provisioningProfile',
store: 'store'
};
// set process.env.CSC_LINK
process.env.CSC_LINK = 'csc_link';
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).__appendMacUserSigning(config, buildConfig);
expect(existsSyncSpy).toHaveBeenCalled();
expect(emitSpy).toHaveBeenCalled();
expect(buildConfig.identity).toEqual('csc_link');
expect(buildConfig.entitlements).toEqual(undefined);
expect(buildConfig.entitlementsInherit).toEqual(undefined);
expect(buildConfig.requirements).toEqual(undefined);
expect(buildConfig.provisioningProfile).toEqual(undefined);
const actualEntitlements = emitSpy.calls.argsFor(0)[1];
const expectedEntitlements = 'The provided entitlements file does not exist';
expect(actualEntitlements).toContain(expectedEntitlements);
const actualEntitlementsInherits = emitSpy.calls.argsFor(1)[1];
const expectedEntitlementsInherits = 'The provided entitlements inherit file does not exist';
expect(actualEntitlementsInherits).toContain(expectedEntitlementsInherits);
const actualRequirements = emitSpy.calls.argsFor(2)[1];
const expectedRequirements = 'The provided requirements file does not exist';
expect(actualRequirements).toContain(expectedRequirements);
const actualProvisioningProfile = emitSpy.calls.argsFor(3)[1];
const expectedProvisioningProfiles = 'The provided provisioning profile does not exist';
expect(actualProvisioningProfile).toContain(expectedProvisioningProfiles);
});
it('should emit warning when in __appendMacUserSigning when files does not exist and set identity to process env name.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
darwin: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release', store: { requirements: 'requirements' } } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
const config = {
debug: 'debug',
release: 'release',
entitlements: 'entitlements',
entitlementsInherit: 'entitlementsInherit',
requirements: 'requirements',
provisioningProfile: 'provisioningProfile',
store: 'store'
};
// set process.env.CSC_NAME
process.env.CSC_NAME = 'csc_name';
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).__appendMacUserSigning(config, buildConfig);
expect(existsSyncSpy).toHaveBeenCalled();
expect(emitSpy).toHaveBeenCalled();
expect(buildConfig.identity).toEqual('csc_name');
expect(buildConfig.entitlements).toEqual(undefined);
expect(buildConfig.entitlementsInherit).toEqual(undefined);
expect(buildConfig.requirements).toEqual(undefined);
expect(buildConfig.provisioningProfile).toEqual(undefined);
const actualEntitlements = emitSpy.calls.argsFor(0)[1];
const expectedEntitlements = 'The provided entitlements file does not exist';
expect(actualEntitlements).toContain(expectedEntitlements);
const actualEntitlementsInherits = emitSpy.calls.argsFor(1)[1];
const expectedEntitlementsInherits = 'The provided entitlements inherit file does not exist';
expect(actualEntitlementsInherits).toContain(expectedEntitlementsInherits);
const actualRequirements = emitSpy.calls.argsFor(2)[1];
const expectedRequirements = 'The provided requirements file does not exist';
expect(actualRequirements).toContain(expectedRequirements);
const actualProvisioningProfile = emitSpy.calls.argsFor(3)[1];
const expectedProvisioningProfiles = 'The provided provisioning profile does not exist';
expect(actualProvisioningProfile).toContain(expectedProvisioningProfiles);
});
it('should set buildConfigs in __appendWindowsUserSigning for windows singning when files exist.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
windows: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release', store: 'requirements' } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
const config = {
debug: 'debug',
release: 'release',
identity: 'identify',
certificateFile: 'certificateFile',
certificatePassword: 'certificatePassword',
certificateSubjectName: 'certificateSubjectName',
certificateSha1: 'certificateSha1',
signingHashAlgorithms: 'signingHashAlgorithms',
additionalCertificateFile: 'additionalCertificateFile'
};
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).__appendWindowsUserSigning(config, buildConfig);
expect(existsSyncSpy).toHaveBeenCalled();
expect(buildConfig.certificateFile).toEqual(config.certificateFile);
expect(buildConfig.certificatePassword).toEqual(config.certificatePassword);
expect(buildConfig.certificateSubjectName).toEqual(config.certificateSubjectName);
expect(buildConfig.certificateSha1).toEqual(config.certificateSha1);
expect(buildConfig.signingHashAlgorithms).toEqual(config.signingHashAlgorithms);
expect(buildConfig.additionalCertificateFile).toEqual(config.additionalCertificateFile);
});
it('should set buildConfigs in __appendWindowsUserSigning for windows singning when files exist, but certificate password does not.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
windows: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release', store: 'requirements' } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
const config = {
debug: 'debug',
release: 'release',
identity: 'identify',
certificateFile: 'certificateFile',
certificateSubjectName: 'certificateSubjectName',
certificateSha1: 'certificateSha1',
signingHashAlgorithms: 'signingHashAlgorithms',
additionalCertificateFile: 'additionalCertificateFile'
};
// set process.env.CSC_KEY_PASSWORD
process.env.CSC_KEY_PASSWORD = 'csc_key_password';
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).__appendWindowsUserSigning(config, buildConfig);
expect(existsSyncSpy).toHaveBeenCalled();
expect(buildConfig.certificateFile).toEqual(config.certificateFile);
expect(buildConfig.certificatePassword).toEqual('csc_key_password');
expect(buildConfig.certificateSubjectName).toEqual(config.certificateSubjectName);
expect(buildConfig.certificateSha1).toEqual(config.certificateSha1);
expect(buildConfig.signingHashAlgorithms).toEqual(config.signingHashAlgorithms);
expect(buildConfig.additionalCertificateFile).toEqual(config.additionalCertificateFile);
});
it('should set buildConfigs in __appendWindowsUserSigning for windows singning when files exist, but certificate and process env password does not.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
windows: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release', store: 'requirements' } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
const config = {
debug: 'debug',
release: 'release',
identity: 'identify',
certificateFile: 'certificateFile',
certificateSubjectName: 'certificateSubjectName',
certificateSha1: 'certificateSha1',
signingHashAlgorithms: 'signingHashAlgorithms',
additionalCertificateFile: 'additionalCertificateFile'
};
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).__appendWindowsUserSigning(config, buildConfig);
expect(existsSyncSpy).toHaveBeenCalled();
expect(buildConfig.certificateFile).toEqual(config.certificateFile);
expect(buildConfig.certificatePassword).toEqual(undefined);
expect(buildConfig.certificateSubjectName).toEqual(config.certificateSubjectName);
expect(buildConfig.certificateSha1).toEqual(config.certificateSha1);
expect(buildConfig.signingHashAlgorithms).toEqual(config.signingHashAlgorithms);
expect(buildConfig.additionalCertificateFile).toEqual(config.additionalCertificateFile);
});
it('should set buildConfigs in __appendWindowsUserSigning for windows singning when files does not exist.', () => {
// mock platformConfig, buildConfig and buildOptions Objects
const platformConfig = {
windows: { package: ['package', 'package2'], signing: { debug: 'debug', release: 'release', store: 'requirements' } }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig, argv: [] };
const config = {
debug: 'debug',
release: 'release',
identity: 'identify',
certificateFile: 'certificateFile',
certificatePassword: 'certificatePassword',
certificateSubjectName: 'certificateSubjectName',
certificateSha1: 'certificateSha1',
signingHashAlgorithms: 'signingHashAlgorithms',
additionalCertificateFile: 'additionalCertificateFile'
};
// create spies
existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', { existsSync: existsSyncSpy });
electronBuilder = new ElectronBuilder(buildOptions, api).__appendWindowsUserSigning(config, buildConfig);
expect(existsSyncSpy).toHaveBeenCalled();
expect(emitSpy).toHaveBeenCalled();
expect(buildConfig.certificateFile).toEqual(undefined);
expect(buildConfig.certificatePassword).toEqual(undefined);
expect(buildConfig.certificateSubjectName).toEqual(config.certificateSubjectName);
expect(buildConfig.certificateSha1).toEqual(config.certificateSha1);
expect(buildConfig.signingHashAlgorithms).toEqual(config.signingHashAlgorithms);
expect(buildConfig.additionalCertificateFile).toEqual(undefined);
const actualCertificateFile = emitSpy.calls.argsFor(0)[1];
const expectedCertificateFile = 'The provided certificate file does not exist';
expect(actualCertificateFile).toContain(expectedCertificateFile);
const actualAdditionalCertificateFile = emitSpy.calls.argsFor(1)[1];
const expectedAdditionalCertificateFile = 'The provided addition certificate file does not exist';
expect(actualAdditionalCertificateFile).toContain(expectedAdditionalCertificateFile);
});
it('should call build method.', () => {
// mock buildOptions Objecet
const buildOptions = { debug: true, buildConfig: 'build.xml', argv: [] };
// create spies
const buildSpy = jasmine.createSpy('build');
build.__set__('require', () => ({
build: buildSpy
}));
electronBuilder = new ElectronBuilder(buildOptions, api).build();
expect(buildSpy).toHaveBeenCalled();
});
});
describe('Module exports run', () => {
it('should have called configure and build.', () => {
const api = new Api(null);
const platformConfig = {
mac: { arch: ['x64'] }
};
const buildConfig = {
electron: platformConfig,
author: 'Apache',
name: 'Guy',
displayName: 'HelloWorld',
APP_BUILD_DIR: api.locations.build,
APP_BUILD_RES_DIR: api.locations.buildRes,
APP_WWW_DIR: api.locations.www
};
const buildOptions = { debug: false, buildConfig: 'LOAD_MY_FAKE_DATA', argv: [] };
// create spies
const existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
build.__set__('fs', { existsSync: existsSyncSpy });
build.__set__('require', (file) => {
if (file === 'LOAD_MY_FAKE_DATA') return buildConfig;
if (file === './check_reqs') return { run: () => Promise.resolve([]) };
return require(file);
});
const configureSpy = jasmine.createSpy('configure');
const buildSpy = jasmine.createSpy('build');
class ElectronBuilderMock {
configure () {
configureSpy();
return this;
}
build () {
buildSpy();
return this;
}
}
build.__set__('ElectronBuilder', ElectronBuilderMock);
build.run(buildOptions, api).then(() => {
expect(configureSpy).toHaveBeenCalled();
expect(buildSpy).toHaveBeenCalled();
});
});
it('should have failed requirement check and thrown error.', () => {
const api = new Api(null);
const buildOptions = { debug: false, buildConfig: 'LOAD_MY_FAKE_DATA', argv: [] };
const errorMsg = 'error';
spyOn(check_reqs, 'run').and.callFake(() => Promise.reject(new Error(errorMsg)));
return build.run(buildOptions, api).then(
() => fail('Unexpectedly resolved'),
error => {
expect(check_reqs.run).toHaveBeenCalled();
expect(error.message).toBe(errorMsg);
}
);
});
});
});