Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Increase Code Coverage & use nyc #377

Merged
merged 3 commits into from
Aug 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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": {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I would do npm install it writes the following change to package.json:

index 7b21884a..ee6b352a 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,12 @@
     "xml-escape"
   ],
   "nyc": {
-    "include": ["bin/templates/scripts/**"],
-    "reporter": ["lcov", "text"]
+    "include": [
+      "bin/templates/scripts/**"
+    ],
+    "reporter": [
+      "lcov",
+      "text"
+    ]
   }
 }

I would favor having the "nyc" entry committed this way.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you referring to the formatting, each item on its own line? I can make this change.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. I have a few other general remarks coming on this nice PR.

"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