[ https://issues.apache.org/jira/browse/CB-12361?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16058168#comment-16058168 ]
ASF GitHub Bot commented on CB-12361: ------------------------------------- Github user filmaj commented on a diff in the pull request: https://github.com/apache/cordova-lib/pull/567#discussion_r123354297 --- Diff: spec-cordova/prepare.spec.js --- @@ -17,175 +17,265 @@ under the License. */ -var shell = require('shelljs'), - PlatformJson = require('cordova-common').PlatformJson, - path = require('path'), - util = require('../src/cordova/util'), - prepare = require('../src/cordova/prepare'), - lazy_load = require('../src/cordova/lazy_load'), - ConfigParser = require('cordova-common').ConfigParser, - platforms = require('../src/platforms/platforms'), - HooksRunner = require('../src/hooks/HooksRunner'), - xmlHelpers = require('cordova-common').xmlHelpers, - et = require('elementtree'), - Q = require('q'); +/* eslint-env jasmine */ -var project_dir = '/some/path'; -var supported_platforms = Object.keys(platforms).filter(function(p) { return p != 'www'; }); - -var TEST_XML = '<?xml version="1.0" encoding="UTF-8"?>\n' + - '<widget xmlns = "http://www.w3.org/ns/widgets"\n' + - ' xmlns:cdv = "http://cordova.apache.org/ns/1.0"\n' + - ' id = "io.cordova.hellocordova"\n' + - ' version = "0.0.1">\n' + - ' <name>Hello Cordova</name>\n' + - ' <description>\n' + - ' A sample Apache Cordova application that responds to the deviceready event.\n' + - ' </description>\n' + - ' <author href="http://cordova.io" email="d...@cordova.apache.org">\n' + - ' Apache Cordova Team\n' + - ' </author>\n' + - ' <content src="index.html" />\n' + - ' <access origin="*" />\n' + - ' <preference name="fullscreen" value="true" />\n' + - ' <preference name="webviewbounce" value="true" />\n' + - '</widget>\n'; +var path = require('path'); +var rewire = require('rewire'); +var util = require('../src/cordova/util'); +var cordova_config = require('../src/cordova/config'); +var prepare = rewire('../src/cordova/prepare'); +var restore = require('../src/cordova/restore-util'); +var platforms = require('../src/platforms/platforms'); +var HooksRunner = require('../src/hooks/HooksRunner'); +var Q = require('q'); +var PlatformJson = require('cordova-common').PlatformJson; +var PluginInfoProvider = require('cordova-common').PluginInfoProvider; -describe('prepare command', function() { - var is_cordova, - cd_project_root, - list_platforms, - fire, - parsers = {}, - find_plugins, - cp, - mkdir, - load, platformApi, getPlatformApi; +var project_dir = '/some/path'; +describe('cordova/prepare', function () { + let platform_api_prepare_mock; + let platform_api_add_mock; + let platform_api_remove_mock; beforeEach(function () { - getPlatformApi = spyOn(platforms, 'getPlatformApi').and.callFake(function (platform, rootDir) { + platform_api_prepare_mock = jasmine.createSpy('prepare').and.returnValue(Q()); + platform_api_add_mock = jasmine.createSpy('add').and.returnValue(Q()); + platform_api_remove_mock = jasmine.createSpy('remove').and.returnValue(Q()); + spyOn(platforms, 'getPlatformApi').and.callFake(function (platform, rootDir) { return { - prepare: jasmine.createSpy('prepare').and.returnValue(Q()), + prepare: platform_api_prepare_mock, getPlatformInfo: jasmine.createSpy('getPlatformInfo').and.returnValue({ locations: { www: path.join(project_dir, 'platforms', platform, 'www') } }), + removePlugin: platform_api_add_mock, + addPlugin: platform_api_remove_mock }; }); - is_cordova = spyOn(util, 'isCordova').and.returnValue(project_dir); - cd_project_root = spyOn(util, 'cdProjectRoot').and.returnValue(project_dir); - list_platforms = spyOn(util, 'listPlatforms').and.returnValue(supported_platforms); - fire = spyOn(HooksRunner.prototype, 'fire').and.returnValue(Q()); - - find_plugins = spyOn(util, 'findPlugins').and.returnValue([]); - spyOn(PlatformJson, 'load').and.returnValue(new PlatformJson(null, null, {})); - spyOn(PlatformJson.prototype, 'save'); - load = spyOn(lazy_load, 'based_on_config').and.returnValue(Q()); - cp = spyOn(shell, 'cp').and.returnValue(true); - mkdir = spyOn(shell, 'mkdir'); - spyOn(ConfigParser.prototype, 'write'); - spyOn(xmlHelpers, 'parseElementtreeSync').and.callFake(function() { - return new et.ElementTree(et.XML(TEST_XML)); - }); + spyOn(PlatformJson, 'load'); + spyOn(HooksRunner.prototype, 'fire').and.returnValue(Q()); + spyOn(util, 'isCordova').and.returnValue(true); }); - describe('failure', function() { - it('Test 001 : should not run outside of a cordova-based project by calling util.isCordova', function(done) { - is_cordova.and.returnValue(false); - cd_project_root.and.callThrough(); // undo spy here because prepare depends on cdprojectRoot for isCordova check - prepare().then(function() { - expect('this call').toBe('fail'); - }, function(err) { - expect('' + err).toContain('Current working directory is not a Cordova-based project.'); - }).fin(done); + describe('main method', function () { + beforeEach(function () { + spyOn(cordova_config, 'read').and.returnValue({}); + spyOn(restore, 'installPlatformsFromConfigXML').and.returnValue(Q()); + spyOn(restore, 'installPluginsFromConfigXML').and.returnValue(Q()); + + spyOn(prepare, 'preparePlatforms').and.returnValue(Q); + }); + describe('failure', function () { + it('should invoke util.preProcessOptions as preflight task checker, which, if fails, should trigger promise rejection and only fire the before_prepare hook', function(done) { + spyOn(util, 'cdProjectRoot').and.returnValue(project_dir); + spyOn(util, 'preProcessOptions').and.throwError(); + prepare({}).fail(function(err) { + expect(err).toBeDefined(); + expect(HooksRunner.prototype.fire.calls.count()).toBe(1); + expect(HooksRunner.prototype.fire.calls.argsFor(0)[0]).toEqual('before_prepare'); + done(); + }); + }); + it('should invoke util.cdProjectRoot as a preflight task checker, which, if fails, should trigger a promise rejection and fire no hooks', function(done) { + spyOn(util, 'cdProjectRoot').and.throwError(); + prepare({}).fail(function(err) { + expect(err).toBeDefined(); + expect(HooksRunner.prototype.fire.calls.any()).toBe(false); + done(); + }); + }); }); - it('Test 002 : should not run inside a cordova-based project with no platforms', function(done) { - list_platforms.and.returnValue([]); - prepare().then(function() { - expect('this call').toBe('fail'); - }, function(err) { - expect('' + err).toContain('No platforms added to this project. Please use `cordova platform add <platform>`.'); - }).fin(done); + + describe('success', function () { + beforeEach(function () { + spyOn(util, 'cdProjectRoot').and.returnValue(project_dir); + spyOn(util, 'preProcessOptions').and.callFake(function(options) { + let platforms = options.platforms || []; + return {'platforms':platforms}; + }); + }); + it('should fire the before_prepare hook and provide platform and path information as arguments', function(done) { + prepare({}).then(function() { + expect(HooksRunner.prototype.fire.calls.argsFor(0)[0]).toEqual('before_prepare'); + done(); + }); + }); + it('should invoke restore module\'s installPlatformsFromConfigXML method', function(done) { + prepare({}).then(function() { + expect(restore.installPlatformsFromConfigXML).toHaveBeenCalled(); + done(); + }).fail(function(err){ + expect(err).toBeUndefined(); + done(); + }); + }); + it('should retrieve PlatformApi instances for each platform provided', function(done) { + prepare({'platforms':['android', 'ios']}).then(function() { + expect(platforms.getPlatformApi.calls.count()).toBe(4); + expect(platforms.getPlatformApi.calls.argsFor(0)[0]).toBe('android'); + expect(platforms.getPlatformApi.calls.argsFor(0)[1]).toBe('/some/path/platforms/android'); + expect(platforms.getPlatformApi.calls.argsFor(1)[0]).toBe('ios'); + expect(platforms.getPlatformApi.calls.argsFor(1)[1]).toBe('/some/path/platforms/ios'); + expect(platforms.getPlatformApi.calls.argsFor(2)[0]).toBe('android'); + expect(platforms.getPlatformApi.calls.argsFor(3)[0]).toBe('ios'); + done(); + }).fail(function(err){ + expect(err).toBeUndefined(); + done(); --- End diff -- Ditto, factor the dones into a `.done(done);` please 💝 > Speed up cordova-lib tests > -------------------------- > > Key: CB-12361 > URL: https://issues.apache.org/jira/browse/CB-12361 > Project: Apache Cordova > Issue Type: Improvement > Components: cordova-lib > Reporter: Steve Gill > Assignee: Steve Gill > Labels: cordova-next > > * Split out e2e tests into own folder > * stub i/o and network requests > * use local fixtures when possible & makes sense -- This message was sent by Atlassian JIRA (v6.4.14#64029) --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@cordova.apache.org For additional commands, e-mail: issues-h...@cordova.apache.org