| /** |
| 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. |
| */ |
| |
| 'use strict'; |
| |
| const fs = require('fs'); |
| const path = require('path'); |
| const rewire = require('rewire'); |
| |
| const logger = require('cordova-common').CordovaLogger.get(); |
| const telemetry = require('../src/telemetry'); |
| const cli = rewire('../src/cli'); |
| |
| const lib = require('cordova-lib'); |
| const events = lib.events; |
| const cordova = lib.cordova; |
| |
| // avoid node complaining of too many event listener added |
| process.setMaxListeners(0); |
| |
| describe('cordova cli', () => { |
| beforeEach(() => { |
| // Event registration is currently process-global. Since all jasmine |
| // tests in a directory run in a single process (and in parallel), |
| // logging events registered as a result of the "--verbose" flag in |
| // CLI testing below would cause lots of logging messages printed out by other specs. |
| |
| // This is required so that fake events chaining works (events.on('log').on('verbose')...) |
| spyOn(events, 'on').and.returnValue({ on () { return this; } }); |
| |
| // Spy and mute output |
| spyOn(logger, 'results'); |
| spyOn(logger, 'warn'); |
| spyOn(console, 'log'); |
| |
| // Prevent accidentally turning telemetry on/off during testing |
| telemetry.turnOn = () => {}; |
| telemetry.turnOff = () => {}; |
| telemetry.track = () => {}; |
| }); |
| |
| describe('options', () => { |
| describe('version', () => { |
| const version = require('../package').version; |
| |
| it('Test#001 : will spit out the version with -v', () => { |
| return cli(['node', 'cordova', '-v']).then(() => { |
| expect(logger.results.calls.mostRecent().args[0]).toMatch(version); |
| }); |
| }, 60000); |
| |
| it('Test#002 : will spit out the version with --version', () => { |
| return cli(['node', 'cordova', '--version']).then(() => { |
| expect(logger.results.calls.mostRecent().args[0]).toMatch(version); |
| }); |
| }, 60000); |
| |
| it('Test#003 : will spit out the version with -v anywhere', () => { |
| return cli(['node', 'cordova', 'one', '-v', 'three']).then(() => { |
| expect(logger.results.calls.mostRecent().args[0]).toMatch(version); |
| }); |
| }, 60000); |
| }); |
| }); |
| |
| describe('Test#004 : project commands other than plugin and platform', () => { |
| beforeEach(() => { |
| spyOn(cordova, 'build').and.returnValue(Promise.resolve()); |
| }); |
| |
| it('Test#005 : will call command with all arguments passed through', () => { |
| return cli(['node', 'cordova', 'build', 'blackberry10', '--', '-k', 'abcd1234']).then(() => { |
| expect(cordova.build).toHaveBeenCalledWith({ platforms: ['blackberry10'], options: { argv: ['-k', 'abcd1234'] }, verbose: false, silent: false, browserify: false, fetch: true, nohooks: [ ], searchpath: undefined }); |
| }); |
| }, 60000); |
| |
| it('Test#006 : will consume the first instance of -d', () => { |
| return cli(['node', 'cordova', '-d', 'build', 'blackberry10', '--', '-k', 'abcd1234', '-d']).then(() => { |
| expect(cordova.build).toHaveBeenCalledWith({ platforms: ['blackberry10'], options: { verbose: true, argv: ['-k', 'abcd1234', '-d'] }, verbose: true, silent: false, browserify: false, fetch: true, nohooks: [ ], searchpath: undefined }); |
| }); |
| }); |
| |
| it('Test#007 : will consume the first instance of --verbose', () => { |
| return cli(['node', 'cordova', '--verbose', 'build', 'blackberry10', '--', '-k', 'abcd1234', '--verbose']).then(() => { |
| expect(cordova.build).toHaveBeenCalledWith({ platforms: ['blackberry10'], options: { verbose: true, argv: ['-k', 'abcd1234', '--verbose'] }, verbose: true, silent: false, browserify: false, fetch: true, nohooks: [ ], searchpath: undefined }); |
| }); |
| }); |
| |
| it('Test#008 : will consume the first instance of either --verbose or -d', () => { |
| return cli(['node', 'cordova', '--verbose', 'build', 'blackberry10', '--', '-k', 'abcd1234', '-d']).then(() => { |
| expect(cordova.build).toHaveBeenCalledWith({ platforms: ['blackberry10'], options: { verbose: true, argv: ['-k', 'abcd1234', '-d'] }, verbose: true, silent: false, browserify: false, fetch: true, nohooks: [ ], searchpath: undefined }); |
| }); |
| }); |
| |
| it('Test#009 : will consume the first instance of either --verbose or -d', () => { |
| return cli(['node', 'cordova', '-d', 'build', 'blackberry10', '--', '-k', 'abcd1234', '--verbose']).then(() => { |
| expect(cordova.build).toHaveBeenCalledWith({ platforms: ['blackberry10'], options: { verbose: true, argv: ['-k', 'abcd1234', '--verbose'] }, verbose: true, silent: false, browserify: false, fetch: true, nohooks: [ ], searchpath: undefined }); |
| }); |
| }); |
| |
| it('Test#010 : will consume the first instance of --silent', () => { |
| return cli(['node', 'cordova', '--silent', 'build', 'blackberry10', '--', '-k', 'abcd1234', '--silent']).then(() => { |
| expect(cordova.build).toHaveBeenCalledWith({ platforms: ['blackberry10'], options: { silent: true, argv: ['-k', 'abcd1234', '--silent'] }, verbose: false, silent: true, browserify: false, fetch: true, nohooks: [ ], searchpath: undefined }); |
| }); |
| }); |
| }); |
| |
| describe('create', () => { |
| beforeEach(() => { |
| spyOn(cordova, 'create').and.returnValue(Promise.resolve()); |
| }); |
| |
| it('Test#011 : calls cordova create', () => { |
| return cli(['node', 'cordova', 'create', 'a', 'b', 'c', '--link-to', 'c:\\personalWWW']).then(() => { |
| expect(cordova.create).toHaveBeenCalledWith('a', 'b', 'c', jasmine.any(Object), jasmine.any(Object)); |
| }); |
| }); |
| }); |
| |
| describe('plugin', () => { |
| beforeEach(() => { |
| spyOn(cordova, 'plugin').and.returnValue(Promise.resolve()); |
| }); |
| |
| it('Test#012 : will pass variables', () => { |
| return cli(['node', 'cordova', 'plugin', 'add', 'facebook', '--variable', 'FOO=foo']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'add', |
| ['facebook'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.cli_variables.FOO).toBe('foo'); |
| }); |
| }); |
| |
| it('Test#013 : will support variables with =', () => { |
| return cli(['node', 'cordova', 'plugin', 'add', 'facebook', '--variable', 'MOTO=DELTA=WAS=HERE']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'add', |
| ['facebook'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.cli_variables.MOTO).toBe('DELTA=WAS=HERE'); |
| }); |
| }); |
| |
| it('Test#014 : will pass hook patterns to suppress', () => { |
| return cli(['node', 'cordova', 'plugin', 'add', 'facebook', '--nohooks', 'before_plugin_add']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'add', |
| ['facebook'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.nohooks[0]).toBe('before_plugin_add'); |
| }); |
| }); |
| |
| it('Test #015 : (add) will pass save:true', () => { |
| return cli(['node', 'cordova', 'plugin', 'add', 'device']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'add', |
| ['device'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.save).toBe(true); |
| }); |
| }); |
| |
| it('Test #016 : (add) will pass save:false', () => { |
| return cli(['node', 'cordova', 'plugin', 'add', 'device', '--nosave']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'add', |
| ['device'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.save).toBe(false); |
| }); |
| }); |
| |
| it('Test #017: (remove) will pass save:false', () => { |
| return cli(['node', 'cordova', 'plugin', 'remove', 'device', '--nosave']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'remove', |
| ['device'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.save).toBe(false); |
| }); |
| }); |
| |
| it('Test #018 : (remove) autosave is default and will pass save:true', () => { |
| return cli(['node', 'cordova', 'plugin', 'remove', 'device']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'remove', |
| ['device'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.save).toBe(true); |
| }); |
| }); |
| |
| it('Test #020 : (add) fetch is true by default and will pass fetch:true', () => { |
| return cli(['node', 'cordova', 'plugin', 'add', 'device']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'add', |
| ['device'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.fetch).toBe(true); |
| }); |
| }); |
| |
| it('(add) will pass save-exact:true', () => { |
| return cli(['node', 'cordova', 'plugin', 'add', 'device', '--save-exact']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'add', |
| ['device'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.save_exact).toBe(true); |
| }); |
| }); |
| |
| it('Test #021 : (remove) fetch is true by default and will pass fetch:true', () => { |
| return cli(['node', 'cordova', 'plugin', 'remove', 'device']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'remove', |
| ['device'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.fetch).toBe(true); |
| }); |
| }); |
| |
| it('(add) will pass noprod:true and production:false', () => { |
| return cli(['node', 'cordova', 'plugin', 'add', 'device', '--noprod']).then(() => { |
| expect(cordova.plugin).toHaveBeenCalledWith( |
| 'add', |
| ['device'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.plugin.calls.argsFor(0)[2]; |
| expect(opts.production).toBe(false); |
| }); |
| }); |
| }); |
| |
| describe('telemetry', () => { |
| it("Test#023 : skips prompt when user runs 'cordova telemetry X'", () => { |
| let wasPromptShown = false; |
| spyOn(telemetry, 'showPrompt').and.callFake(() => { |
| wasPromptShown = true; |
| }); |
| |
| return Promise.resolve() |
| .then(_ => cli(['node', 'cordova', 'telemetry', 'on'])) |
| .then(_ => cli(['node', 'cordova', 'telemetry', 'off'])) |
| .then(() => { |
| expect(wasPromptShown).toBeFalsy(); |
| }); |
| }); |
| |
| it("Test#024 : is NOT collected when user runs 'cordova telemetry on' while NOT opted-in", () => { |
| spyOn(telemetry, 'isOptedIn').and.returnValue(false); |
| spyOn(telemetry, 'isCI').and.returnValue(false); |
| spyOn(telemetry, 'track'); |
| |
| return cli(['node', 'cordova', 'telemetry', 'on']).then(() => { |
| expect(telemetry.track).not.toHaveBeenCalled(); |
| }); |
| }); |
| |
| it("Test#025 : is collected when user runs 'cordova telemetry off' while opted-in", () => { |
| spyOn(telemetry, 'isOptedIn').and.returnValue(true); |
| spyOn(telemetry, 'isCI').and.returnValue(false); |
| spyOn(telemetry, 'track'); |
| |
| return cli(['node', 'cordova', 'telemetry', 'off']).then(() => { |
| expect(telemetry.track).toHaveBeenCalledWith('telemetry', 'off', 'via-cordova-telemetry-cmd', 'successful'); |
| }); |
| }); |
| |
| it('Test#026 : tracks platforms/plugins subcommands', () => { |
| spyOn(telemetry, 'isOptedIn').and.returnValue(true); |
| spyOn(telemetry, 'isCI').and.returnValue(false); |
| spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true); |
| spyOn(cordova, 'platform').and.returnValue(Promise.resolve()); |
| spyOn(telemetry, 'track'); |
| |
| return cli(['node', 'cordova', 'platform', 'add', 'ios']).then(() => { |
| expect(telemetry.track).toHaveBeenCalledWith('platform', 'add', 'successful'); |
| }); |
| }); |
| |
| it('Test#027 : shows prompt if user neither opted in or out yet', () => { |
| spyOn(cordova, 'prepare').and.returnValue(Promise.resolve()); |
| spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(false); |
| spyOn(telemetry, 'isCI').and.returnValue(false); |
| spyOn(telemetry, 'isNoTelemetryFlag').and.returnValue(false); |
| spyOn(telemetry, 'showPrompt').and.returnValue(Promise.resolve(false)); |
| |
| return cli(['node', 'cordova', 'prepare']).then(() => { |
| expect(telemetry.showPrompt).toHaveBeenCalled(); |
| }); |
| }); |
| |
| // note: we override telemetry timeout here so we don't need to wait 30 seconds |
| it('Test#028 : opts-out if prompt times out AND it tracks opt-out', () => { |
| // Remove any optOut settings that might have been saved |
| // ... and force prompt to be shown |
| telemetry.clear(); |
| spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(false); |
| spyOn(telemetry, 'isCI').and.returnValue(false); |
| spyOn(telemetry, 'track'); |
| |
| telemetry.timeoutInSecs = 1; |
| return cli(['node', 'cordova', '--version']).then(() => { |
| if (process.env.CI) { |
| expect(telemetry.isOptedIn()).toBeTruthy(); |
| } else { |
| expect(telemetry.isOptedIn()).toBeFalsy(); |
| } |
| expect(telemetry.track).toHaveBeenCalledWith('telemetry', 'off', 'via-cli-prompt-choice', 'successful'); |
| }); |
| }); |
| |
| it("Test#029 : is NOT collected in CI environments and doesn't prompt", () => { |
| spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true); |
| spyOn(telemetry, 'isOptedIn').and.returnValue(true); |
| spyOn(telemetry, 'isCI').and.returnValue(true); |
| spyOn(telemetry, 'showPrompt'); |
| spyOn(telemetry, 'track'); |
| |
| return cli(['node', 'cordova', '--version']).then(() => { |
| expect(telemetry.showPrompt).not.toHaveBeenCalled(); |
| expect(telemetry.track).not.toHaveBeenCalled(); |
| }); |
| }); |
| |
| it("Test#030 : is NOT collected when --no-telemetry flag found and doesn't prompt", () => { |
| spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(false); |
| spyOn(telemetry, 'isOptedIn').and.returnValue(true); |
| spyOn(telemetry, 'isCI').and.returnValue(false); |
| spyOn(telemetry, 'showPrompt'); |
| spyOn(telemetry, 'track'); |
| |
| return cli(['node', 'cordova', '--version', '--no-telemetry']).then(() => { |
| expect(telemetry.showPrompt).not.toHaveBeenCalled(); |
| expect(telemetry.track).not.toHaveBeenCalled(); |
| }); |
| }); |
| |
| it('Test#031 : is NOT collected if user opted out', () => { |
| spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true); |
| spyOn(telemetry, 'isOptedIn').and.returnValue(false); |
| spyOn(telemetry, 'isCI').and.returnValue(false); |
| spyOn(telemetry, 'showPrompt'); |
| spyOn(telemetry, 'track'); |
| |
| return cli(['node', 'cordova', '--version']).then(() => { |
| expect(telemetry.showPrompt).not.toHaveBeenCalled(); |
| expect(telemetry.track).not.toHaveBeenCalled(); |
| }); |
| }); |
| |
| it('Test#032 : is collected if user opted in', () => { |
| spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true); |
| spyOn(telemetry, 'isOptedIn').and.returnValue(true); |
| spyOn(telemetry, 'isCI').and.returnValue(false); |
| spyOn(telemetry, 'showPrompt'); |
| spyOn(telemetry, 'track'); |
| |
| return cli(['node', 'cordova', '--version']).then(() => { |
| expect(telemetry.showPrompt).not.toHaveBeenCalled(); |
| expect(telemetry.track).toHaveBeenCalled(); |
| }); |
| }); |
| |
| it("Test#033 : track opt-out that happened via 'cordova telemetry off' even if user is NOT opted-in ", () => { |
| spyOn(telemetry, 'isCI').and.returnValue(false); |
| spyOn(telemetry, 'isOptedIn').and.returnValue(false); // same as calling `telemetry.turnOff();` |
| spyOn(telemetry, 'hasUserOptedInOrOut').and.returnValue(true); |
| spyOn(telemetry, 'track'); |
| |
| expect(telemetry.isOptedIn()).toBeFalsy(); |
| |
| return cli(['node', 'cordova', 'telemetry', 'off']).then(() => { |
| expect(telemetry.isOptedIn()).toBeFalsy(); |
| expect(telemetry.track).toHaveBeenCalledWith('telemetry', 'off', 'via-cordova-telemetry-cmd', 'successful'); |
| }); |
| }); |
| }); |
| }); |
| |
| describe('platform', () => { |
| |
| beforeEach(() => { |
| spyOn(cordova, 'platform').and.returnValue(Promise.resolve()); |
| logger.setLevel('error'); |
| }); |
| |
| it('Test #034 : (add) autosave is the default setting for platform add', () => { |
| return cli(['node', 'cordova', 'platform', 'add', 'ios']).then(() => { |
| expect(cordova.platform).toHaveBeenCalledWith( |
| 'add', |
| ['ios'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.platform.calls.argsFor(0)[2]; |
| expect(opts.save).toBe(true); |
| }); |
| }); |
| |
| it('Test #035 : (add) platform is not saved when --nosave is passed in', () => { |
| return cli(['node', 'cordova', 'platform', 'add', 'ios', '--nosave']).then(() => { |
| expect(cordova.platform).toHaveBeenCalledWith( |
| 'add', |
| ['ios'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.platform.calls.argsFor(0)[2]; |
| expect(opts.save).toBe(false); |
| }); |
| }); |
| |
| it('Test #036 : (remove) autosave is the default setting for platform remove', () => { |
| return cli(['node', 'cordova', 'platform', 'remove', 'ios']).then(() => { |
| expect(cordova.platform).toHaveBeenCalledWith( |
| 'remove', |
| ['ios'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.platform.calls.argsFor(0)[2]; |
| expect(opts.save).toBe(true); |
| }); |
| }); |
| |
| it('Test #037 : (remove) platform is not removed when --nosave is passed in', () => { |
| return cli(['node', 'cordova', 'platform', 'remove', 'ios', '--nosave']).then(() => { |
| expect(cordova.platform).toHaveBeenCalledWith( |
| 'remove', |
| ['ios'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.platform.calls.argsFor(0)[2]; |
| expect(opts.save).toBe(false); |
| }); |
| }); |
| |
| it('Test #039 : (add) fetch is true by default and will pass fetch:true', () => { |
| return cli(['node', 'cordova', 'platform', 'add', 'device']).then(() => { |
| expect(cordova.platform).toHaveBeenCalledWith( |
| 'add', |
| ['device'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.platform.calls.argsFor(0)[2]; |
| expect(opts.fetch).toBe(true); |
| }); |
| }); |
| |
| it('Test #040 : (remove) fetch is true by default and will pass fetch:true', () => { |
| return cli(['node', 'cordova', 'platform', 'remove', 'device']).then(() => { |
| expect(cordova.platform).toHaveBeenCalledWith( |
| 'remove', |
| ['device'], |
| jasmine.any(Object) |
| ); |
| const opts = cordova.platform.calls.argsFor(0)[2]; |
| expect(opts.fetch).toBe(true); |
| }); |
| }); |
| }); |
| |
| describe('config', () => { |
| let clirevert, confrevert, editorArgs, confHolder; |
| const cordovaConfig = {}; |
| |
| const confMock = { |
| set (key, value) { |
| cordovaConfig[key] = value; |
| }, |
| del (key) { |
| delete cordovaConfig[key]; |
| }, |
| path () { |
| confHolder = 'Pathcalled'; |
| return 'some/path/cordova-config.json'; |
| }, |
| get (key) { |
| confHolder = cordovaConfig[key]; |
| return cordovaConfig[key]; |
| } |
| }; |
| |
| beforeEach(() => { |
| clirevert = cli.__set__('editor', (path1, cb) => { |
| editorArgs = path1(); |
| cb(); |
| }); |
| |
| confrevert = cli.__set__('conf', confMock); |
| logger.setLevel('error'); |
| // spyOn(console, 'log'); |
| }); |
| |
| afterEach(() => { |
| clirevert(); |
| confrevert(); |
| confHolder = undefined; |
| }); |
| |
| it('Test#042 : config set autosave is called with true', () => { |
| return cli(['node', 'cordova', 'config', 'set', 'autosave', 'true', '--silent']).then(() => { |
| expect(cordovaConfig.autosave).toBe('true'); |
| }); |
| }); |
| |
| it('Test#043 : config delete autosave is called', () => { |
| return cli(['node', 'cordova', 'config', 'delete', 'autosave']).then(() => { |
| expect(cordovaConfig.autosave).toBeUndefined(); |
| }); |
| }); |
| |
| it('Test#044 : config set is called even without value, defaults to true', () => { |
| return cli(['node', 'cordova', 'config', 'set', 'autosave']).then(() => { |
| expect(cordovaConfig.autosave).toBe(true); |
| }); |
| }); |
| |
| it('Test #045 : config get is called', () => { |
| return cli(['node', 'cordova', 'config', 'get', 'autosave']).then(() => { |
| expect(confHolder).toBe(true); |
| }); |
| }); |
| |
| it('Test #046 : config edit is called', () => { |
| return cli(['node', 'cordova', 'config', 'edit']).then(() => { |
| expect(path.basename(editorArgs)).toEqual('cordova-config.json'); |
| expect(confHolder).toEqual('Pathcalled'); |
| }); |
| }); |
| |
| it('Test #047 : config ls is called', () => { |
| spyOn(fs, 'readFile').and.callFake((confPath, cb) => { |
| confHolder = confPath(); |
| }); |
| |
| return cli(['node', 'cordova', 'config', 'ls']).then(() => { |
| expect(path.basename(confHolder)).toEqual('cordova-config.json'); |
| }); |
| }); |
| |
| }); |