blob: 2871a3a6182c80ab55b23efd9523b4120d5f963b [file] [log] [blame]
/*
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 path = require('node:path');
const fs = require('node:fs');
const os = require('node:os');
const { ConfigParser, events } = require('cordova-common');
const rootDir = path.resolve(__dirname, '../../../..');
const fixturesDir = path.join(rootDir, 'tests/spec/fixtures');
const PackageJsonParser = require(path.join(rootDir, 'lib/PackageJsonParser'));
// Create a real config object before mocking out everything.
const cfg = new ConfigParser(path.join(fixturesDir, 'test-config-1.xml'));
const cfgEmpty = new ConfigParser(path.join(fixturesDir, 'test-config-empty.xml'));
const cfgNoAuthorCustomEmail = new ConfigParser(path.join(fixturesDir, 'test-config-no-author-custom-email.xml'));
const defaultMockProjectPackageJson = {
name: 'io.cordova.electronTest',
displayName: 'electronTest',
version: '1.0.0',
description: 'A Sample Apache Cordova Electron Application.',
author: 'Apache Cordova Team',
license: 'Apache-2.0',
dependencies: {
'cordova-electron': '^1.0.0',
'cordova-plugin-camera': '^1.0.0'
},
devDependencies: {},
cordova: {
plugins: {},
platforms: ['electron']
}
};
const defaultInitPackageObj = { main: 'cdv-electron-main.js' };
describe('PackageJsonParser class', () => {
let packageJsonParser;
let locations;
let tmpDir;
beforeEach(() => {
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cordovaElectronTest-'));
locations = {
buildRes: path.join(tmpDir, 'build-res'),
www: path.join(tmpDir, 'www'),
configXml: path.join(tmpDir, 'config.xml')
};
packageJsonParser = new PackageJsonParser(locations.www, '/root/project');
spyOn(events, 'emit');
});
afterAll(() => {
fs.rmSync(tmpDir, { recursive: true, force: true });
});
it('should have been constructed with initial values.', () => {
expect(packageJsonParser).toBeDefined();
expect(packageJsonParser.path).toEqual(path.join(locations.www, 'package.json'));
expect(packageJsonParser.www).toEqual(locations.www);
expect(packageJsonParser.package).toEqual(defaultInitPackageObj);
});
it('should not modify the package object when config is not provided.', () => {
packageJsonParser.configure();
// the package object should be the same as it was initialized
expect(packageJsonParser.package).toEqual(defaultInitPackageObj);
});
it('should not modify the package object when config is not provided.', () => {
packageJsonParser.configure();
// the package object should be the same as it was initialized
expect(packageJsonParser.package).toEqual(defaultInitPackageObj);
});
it('should not add dev tools extension when enable argument = false.', () => {
packageJsonParser.enableDevTools(false);
// the package object should be the same as it was initialized
expect(packageJsonParser.package.dependencies).not.toBeDefined();
});
it('should remove dev tools extension when enable argument = false.', () => {
packageJsonParser.package.dependencies = packageJsonParser.package.dependencies || {
'electron-devtools-installer': '1.0.0' // test
};
// Ensure mock was set, this is acting as if it was set before.
expect(packageJsonParser.package.dependencies['electron-devtools-installer']).toBeDefined();
// This should remove the mock
packageJsonParser.enableDevTools(false);
// the dependency should have been removed.
expect(packageJsonParser.package.dependencies['electron-devtools-installer']).not.toBeDefined();
});
it('should not add dev tools extension when enable argument = undefined.', () => {
packageJsonParser.enableDevTools();
// the package object should be the same as it was initialized
expect(packageJsonParser.package.dependencies).not.toBeDefined();
});
it('should add dev tools extension when enable argument = true.', () => {
packageJsonParser.enableDevTools(true);
// the package object should be the same as it was initialized
expect(packageJsonParser.package.dependencies).toBeDefined();
expect(packageJsonParser.package.dependencies['electron-devtools-installer']).toBeDefined();
});
it('should not create dependencies object if it exists an enable argument = true.', () => {
packageJsonParser.package.dependencies = {}; // mocking that the object already exists
packageJsonParser.enableDevTools(true);
// the package object should be the same as it was initialized
expect(packageJsonParser.package.dependencies).toBeDefined();
expect(packageJsonParser.package.dependencies['electron-devtools-installer']).toBeDefined();
});
it('should update the package object with default values, when config.xml is empty.', () => {
packageJsonParser.configure(cfgEmpty, defaultMockProjectPackageJson);
// Expected Mock Package Object
const packageJsonObj = Object.assign({}, defaultInitPackageObj, {
name: 'io.cordova.hellocordova',
displayName: 'HelloCordova',
version: '1.0.0',
description: 'A sample Apache Cordova application that responds to the deviceready event.',
homepage: 'https://cordova.io',
license: 'Apache-2.0',
author: 'Apache Cordova Team'
});
expect(packageJsonParser.package).toEqual(packageJsonObj);
});
it('should update package object with values from config.xml.', () => {
packageJsonParser.configure(cfg, defaultMockProjectPackageJson);
// Expected Mock Package Object
const packageJsonObj = Object.assign({}, defaultInitPackageObj, {
name: 'whatever',
displayName: 'HelloWorld',
version: '1.1.1',
description: 'A sample Apache Cordova application.',
homepage: 'http://cordova.io',
license: 'Apache 2.0 License',
author: { name: 'Cordova Team', email: 'dev@cordova.com' }
});
expect(packageJsonParser.package).toEqual(packageJsonObj);
});
it('should set default author when missing but author email is defined.', () => {
packageJsonParser.configure(cfgNoAuthorCustomEmail, defaultMockProjectPackageJson);
expect(packageJsonParser.package.author).toEqual({
name: 'Apache Cordova Team',
email: 'dev@cordova.com'
});
});
it('should write something.', () => {
spyOn(fs, 'writeFileSync').and.returnValue(true);
packageJsonParser.write();
expect(fs.writeFileSync).toHaveBeenCalledWith(
jasmine.any(String),
JSON.stringify(defaultInitPackageObj, null, 2),
'utf8'
);
});
it('should write package object out with user custom defined values.', () => {
spyOn(fs, 'writeFileSync').and.returnValue(true);
packageJsonParser.configure(cfg, defaultMockProjectPackageJson)
.write();
expect(fs.writeFileSync).toHaveBeenCalledWith(
jasmine.any(String),
jasmine.stringMatching(/whatever/),
'utf8'
);
});
});
describe('PackageJsonParser (2) class', () => {
it('should have constructed and already detected directories and files', () => {
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cordovaElectronTest-'));
const locations = {
buildRes: path.join(tmpDir, 'build-res'),
www: path.join(tmpDir, 'www'),
configXml: path.join(tmpDir, 'config.xml')
};
const wwwDir = locations.www;
const pkgFile = path.join(wwwDir, 'package.json');
fs.mkdirSync(wwwDir, { recursive: true });
fs.writeFileSync(pkgFile, '{}', 'utf8');
spyOn(events, 'emit');
spyOn(fs, 'readFileSync');
// files & directories should already exisy
expect(fs.existsSync(wwwDir)).toBeTruthy();
expect(fs.existsSync(pkgFile)).toBeTruthy();
/* eslint-disable-next-line */
const packageJsonParser = new PackageJsonParser(wwwDir, '/root/project');
expect(fs.readFileSync).toHaveBeenCalled();
// There should be no change in truthy values.
expect(fs.existsSync(wwwDir)).toBeTruthy();
expect(fs.existsSync(pkgFile)).toBeTruthy();
expect(packageJsonParser.package).toBeDefined();
fs.rmSync(tmpDir, { recursive: true, force: true });
});
});