Skip to content

Commit

Permalink
Merge pull request #377 from erisu/increase-code-coverage
Browse files Browse the repository at this point in the history
Increase Code Coverage & use nyc
  • Loading branch information
erisu authored Aug 10, 2018
2 parents f628f61 + 7d96cb5 commit c109ce7
Show file tree
Hide file tree
Showing 11 changed files with 388 additions and 18 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -226,4 +226,5 @@ node_modules/color-support/
node_modules/fs.realpath/
node_modules/jasmine-core/
node_modules/jasmine/
node_modules/eslint-*
node_modules/eslint-*
.nyc_output/
5 changes: 0 additions & 5 deletions .istanbul.yml

This file was deleted.

3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ install:
script:
- node --version
- npm --version
- npm run eslint
- npm run unit-tests
- npm run test:component
- npm run e2e-tests
- open -b com.apple.iphonesimulator
- npm run objc-tests
- npm run cover
- npm run eslint

after_script:
- codecov
24 changes: 17 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,16 @@
"cordova:platform"
],
"scripts": {
"test": "npm run e2e-tests && npm run objc-tests && npm run unit-tests",
"test": "npm run unit-tests && npm run test:component && npm run objc-tests && npm run e2e-tests",
"test:component": "jasmine --config=tests/spec/component.json",
"posttest": "npm run eslint",
"cover": "istanbul cover --root bin/templates/scripts/cordova --print detail jasmine -- --config=tests/spec/jasmine.json",
"cover": "nyc jasmine --config=tests/spec/coverage.json",
"e2e-tests": "jasmine tests/spec/create.spec.js",
"objc-tests": "npm run objc-tests-lib && npm run objc-tests-framework",
"objc-tests-lib": "xcodebuild test -workspace tests/cordova-ios.xcworkspace -scheme CordovaLibTests -destination \"platform=iOS Simulator,name=iPhone 5\" CONFIGURATION_BUILD_DIR=\"`mktemp -d 2>/dev/null || mktemp -d -t 'cordova-ios'`\"",
"objc-tests-framework": "xcodebuild test -workspace tests/cordova-ios.xcworkspace -scheme CordovaFrameworkApp -destination \"platform=iOS Simulator,name=iPhone 5\" CONFIGURATION_BUILD_DIR=\"`mktemp -d 2>/dev/null || mktemp -d -t 'cordova-ios'`\"",
"preobjc-tests": "tests/scripts/killsim.js",
"unit-tests": "jasmine --config=tests/spec/jasmine.json",
"unit-tests": "jasmine --config=tests/spec/unit.json",
"eslint": "eslint bin tests"
},
"author": "Apache Software Foundation",
Expand All @@ -39,10 +40,10 @@
"eslint-plugin-node": "^5.1.0",
"eslint-plugin-promise": "^3.5.0",
"eslint-plugin-standard": "^3.0.1",
"istanbul": "^0.4.2",
"jasmine": "~2.6.0",
"jasmine": "^3.1.0",
"nodeunit": "^0.8.7",
"rewire": "^2.5.1",
"nyc": "^12.0.2",
"rewire": "^4.0.1",
"tmp": "^0.0.26"
},
"engines": {
Expand All @@ -68,5 +69,14 @@
"shelljs",
"xcode",
"xml-escape"
]
],
"nyc": {
"include": [
"bin/templates/scripts/**"
],
"reporter": [
"lcov",
"text"
]
}
}
8 changes: 8 additions & 0 deletions tests/spec/component.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"spec_dir": "tests/spec",
"spec_files": [
"component/**/*[sS]pec.js"
],
"stopSpecOnExpectationFailure": false,
"random": false
}
63 changes: 63 additions & 0 deletions tests/spec/component/versions.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/**
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.
*/

var rewire = require('rewire');
var versions = rewire('../../../bin/templates/scripts/cordova/lib/versions');

// These tests can not run on windows.
if (process.platform === 'darwin') {
describe('versions', function () {
describe('get_tool_version method', () => {
it('should not have found tool by name.', (done) => {
versions.get_tool_version('unknown').catch((error) => {
expect(error).toContain('is not valid tool name');
done();
});
});

it('should find xcodebuild version.', (done) => {
versions.get_tool_version('xcodebuild').then((version) => {
expect(version).not.toBe(undefined);
done();
});
});

it('should find ios-sim version.', (done) => {
versions.get_tool_version('ios-sim').then((version) => {
expect(version).not.toBe(undefined);
done();
});
});

it('should find ios-deploy version.', (done) => {
versions.get_tool_version('ios-deploy').then((version) => {
expect(version).not.toBe(undefined);
done();
});
});

it('should find pod version.', (done) => {
versions.get_tool_version('pod').then((version) => {
expect(version).not.toBe(undefined);
done();
});
});
});
});
}
9 changes: 9 additions & 0 deletions tests/spec/coverage.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"spec_dir": "tests/spec",
"spec_files": [
"unit/**/*[sS]pec.js",
"component/**/*[sS]pec.js"
],
"stopSpecOnExpectationFailure": false,
"random": false
}
File renamed without changes.
170 changes: 170 additions & 0 deletions tests/spec/unit/build.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -340,4 +340,174 @@ describe('build', function () {
done();
});
});

describe('help method', () => {
it('should log a bunch of options', () => {
const logSpy = jasmine.createSpy();
const procStub = { exit: _ => null, cwd: _ => '', argv: ['', ''] };
build.__set__({ console: { log: logSpy }, process: procStub });

build.help();
expect(logSpy).toHaveBeenCalledWith(jasmine.stringMatching(/^Usage:/));
});
});

describe('run method', () => {
let rejectSpy;

beforeEach(() => {
rejectSpy = jasmine.createSpy('reject');

build.__set__('Q', {
reject: rejectSpy
});
});

it('should not accept debug and release options together', () => {
build.run({
debug: true,
release: true
});

expect(rejectSpy).toHaveBeenCalledWith('Cannot specify "debug" and "release" options together.');
});

it('should not accept device and emulator options together', () => {
build.run({
device: true,
emulator: true
});

expect(rejectSpy).toHaveBeenCalledWith('Cannot specify "device" and "emulator" options together.');
});

it('should reject when build config file missing', () => {
const existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(false);
build.__set__('fs', {
existsSync: existsSyncSpy
});

build.run({
buildConfig: './some/config/path'
});

expect(rejectSpy).toHaveBeenCalledWith(jasmine.stringMatching(/^Build config file does not exist:/));
});
});

describe('getDefaultSimulatorTarget method', () => {
it('should find iPhone X as the default simulator target.', (done) => {
const mockedEmulators = [{
name: 'iPhone 7',
identifier: 'com.apple.CoreSimulator.SimDeviceType.iPhone-7',
simIdentifier: 'iPhone-7'
},
{
name: 'iPhone 8',
identifier: 'com.apple.CoreSimulator.SimDeviceType.iPhone-8',
simIdentifier: 'iPhone-8'
},
{
name: 'iPhone X',
identifier: 'com.apple.CoreSimulator.SimDeviceType.iPhone-X',
simIdentifier: 'iPhone-X'
}];

// This method will require a module that supports the run method.
build.__set__('require', () => {
return {
run: () => {
return new Promise((resolve, reject) => {
resolve(mockedEmulators);
});
}
};
});

const getDefaultSimulatorTarget = build.__get__('getDefaultSimulatorTarget');
const exec = getDefaultSimulatorTarget();

const expected = {
name: 'iPhone X',
identifier: 'com.apple.CoreSimulator.SimDeviceType.iPhone-X',
simIdentifier: 'iPhone-X'
};

exec.then((actual) => {
expect(actual).toEqual(expected);
done();
});
});
});

describe('findXCodeProjectIn method', () => {
let findXCodeProjectIn;
let shellLsSpy;
let rejectSpy;
let resolveSpy;
let emitSpy;
const fakePath = '/path/foobar';

beforeEach(() => {
findXCodeProjectIn = build.__get__('findXCodeProjectIn');

// Shell Spy
shellLsSpy = jasmine.createSpy('shellLsSpy');
build.__set__('shell', {
ls: shellLsSpy
});

// Q Spy
rejectSpy = jasmine.createSpy('rejectSpy');
resolveSpy = jasmine.createSpy('resolveSpy');
build.__set__('Q', {
reject: rejectSpy,
resolve: resolveSpy
});

// Events spy
emitSpy = jasmine.createSpy('emitSpy');
build.__set__('events', {
emit: emitSpy
});
});

it('should find not find Xcode project', () => {
shellLsSpy.and.returnValue(['README.md']);

findXCodeProjectIn(fakePath);

expect(rejectSpy).toHaveBeenCalledWith('No Xcode project found in ' + fakePath);
});

it('should emit finding multiple Xcode projects', () => {
shellLsSpy.and.returnValue(['Test1.xcodeproj', 'Test2.xcodeproj']);

findXCodeProjectIn(fakePath);

// Emit
let actualEmit = emitSpy.calls.argsFor(0)[1];
expect(emitSpy).toHaveBeenCalled();
expect(actualEmit).toContain('Found multiple .xcodeproj directories in');

// Resolve
let actualResolve = resolveSpy.calls.argsFor(0)[0];
expect(resolveSpy).toHaveBeenCalled();
expect(actualResolve).toContain('Test1');
});

it('should detect and return only one projects', () => {
shellLsSpy.and.returnValue(['Test1.xcodeproj']);

findXCodeProjectIn(fakePath);

// Emit
expect(emitSpy).not.toHaveBeenCalled();

// Resolve
let actualResolve = resolveSpy.calls.argsFor(0)[0];
expect(resolveSpy).toHaveBeenCalled();
expect(actualResolve).toContain('Test1');
});
});
});
Loading

0 comments on commit c109ce7

Please sign in to comment.