Repository: cordova-lib Updated Branches: refs/heads/master e50c9b60e -> a4d91e401
CB-12361 : added tests for plugin/save.js Project: http://git-wip-us.apache.org/repos/asf/cordova-lib/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-lib/commit/a4d91e40 Tree: http://git-wip-us.apache.org/repos/asf/cordova-lib/tree/a4d91e40 Diff: http://git-wip-us.apache.org/repos/asf/cordova-lib/diff/a4d91e40 Branch: refs/heads/master Commit: a4d91e4011e47d44f1c70a1f44e3d6d40decb986 Parents: e50c9b6 Author: Audrey So <[email protected]> Authored: Wed Jul 26 15:51:44 2017 -0700 Committer: Audrey So <[email protected]> Committed: Mon Sep 25 10:03:14 2017 -0700 ---------------------------------------------------------------------- integration-tests/HooksRunner.spec.js | 4 +- spec/cordova/plugin/save.spec.js | 142 +++++++++++++++++++++++++++-- 2 files changed, 135 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/a4d91e40/integration-tests/HooksRunner.spec.js ---------------------------------------------------------------------- diff --git a/integration-tests/HooksRunner.spec.js b/integration-tests/HooksRunner.spec.js index 7847443..fe2c010 100644 --- a/integration-tests/HooksRunner.spec.js +++ b/integration-tests/HooksRunner.spec.js @@ -285,7 +285,7 @@ describe('HooksRunner', function () { }).then(function () { done(); }); - }); + }, 60000); it('Test 006 : should execute hook scripts serially from config.xml', function (done) { var test_event = 'before_build'; @@ -636,7 +636,7 @@ describe('HooksRunner', function () { hooksRunner.fire(test_event, hookOptions).then(function () { done(); }); - }, 60000); + }, 80000); it('Test 022 : should pass data object that fire calls into sync handlers', function (done) { var async = function (opts) { http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/a4d91e40/spec/cordova/plugin/save.spec.js ---------------------------------------------------------------------- diff --git a/spec/cordova/plugin/save.spec.js b/spec/cordova/plugin/save.spec.js index aa4be04..d51cf11 100644 --- a/spec/cordova/plugin/save.spec.js +++ b/spec/cordova/plugin/save.spec.js @@ -24,6 +24,7 @@ var rewire = require('rewire'); var fs = require('fs'); var save = rewire('../../../src/cordova/plugin/save'); var cordova_util = require('../../../src/cordova/util'); +var semver = require('semver'); describe('cordova/plugin/save', function () { var projectRoot = '/some/path'; @@ -31,15 +32,22 @@ describe('cordova/plugin/save', function () { var cfg_parser_revert_mock; var fake_plugin_list = ['VRPlugin', 'MastodonSocialPlugin']; var fake_fetch_json = {'VRPlugin': {}, 'MastodonSocialPlugin': {}}; + var plugin_info_provider_mock = function () {}; + var plugin_info_provider_revert_mock; + beforeEach(function () { - cfg_parser_mock.prototype = jasmine.createSpyObj('config parser protytpe mock', ['getPluginIdList', 'removePlugin']); + cfg_parser_mock.prototype = jasmine.createSpyObj('config parser protytpe mock', ['getPluginIdList', 'removePlugin', 'write', 'addPlugin']); cfg_parser_mock.prototype.getPluginIdList.and.returnValue(fake_plugin_list); cfg_parser_revert_mock = save.__set__('ConfigParser', cfg_parser_mock); spyOn(cordova_util, 'projectConfig').and.returnValue(projectRoot + '/config.xml'); spyOn(fs, 'readFileSync').and.returnValue(JSON.stringify(fake_fetch_json)); + spyOn(save, 'versionString'); + plugin_info_provider_mock.prototype = jasmine.createSpyObj('plugin info provider mock', ['get']); + plugin_info_provider_revert_mock = save.__set__('PluginInfoProvider', plugin_info_provider_mock); }); afterEach(function () { cfg_parser_revert_mock(); + plugin_info_provider_revert_mock(); }); describe('error conditions', function () { it('should explode if there was an issue parsing or reading from fetch.json file', function (done) { @@ -54,15 +62,131 @@ describe('cordova/plugin/save', function () { }); }); describe('happy path', function () { - it('should remove all plugins from config.xml and re-add new ones based on those retrieved from fetch.json'); - it('should only add top-level plugins to config.xml'); - it('should write individual plugin specs to config.xml'); - it('should write individual plugin variables to config.xml'); + it('check that existing plugins are getting removed', function (done) { + save(projectRoot).then(function () { + expect(cfg_parser_mock.prototype.removePlugin).toHaveBeenCalledWith('VRPlugin'); + expect(cfg_parser_mock.prototype.removePlugin).toHaveBeenCalledWith('MastodonSocialPlugin'); + }).fail(function (e) { + expect(e).toBeUndefined(); + fail('did not expect fail handler to be invoked'); + }).done(done); + }); + + it('plugins are being removed first and then only top level plugins are being restored', function (done) { + var fake_fetch_json = + {'VRPlugin': {'source': { + 'type': 'registry', + 'id': 'id' + }, + 'is_top_level': true + }, + 'MastodonSocialPlugin': { 'source': { + 'type': 'registry', + 'id': 'id' + }, + 'is_top_level': false }}; + + fs.readFileSync.and.returnValue(JSON.stringify(fake_fetch_json)); + save(projectRoot).then(function () { + expect(cfg_parser_mock.prototype.removePlugin).toHaveBeenCalledWith('VRPlugin'); + expect(cfg_parser_mock.prototype.removePlugin).toHaveBeenCalledWith('MastodonSocialPlugin'); + expect(cfg_parser_mock.prototype.addPlugin).toHaveBeenCalledWith(Object({ name: 'VRPlugin' }), [ ]); + expect(cfg_parser_mock.prototype.addPlugin).not.toHaveBeenCalledWith(Object({ name: 'MastodonSocialPlugin' }), [ ]); + expect(cfg_parser_mock.prototype.write).toHaveBeenCalled(); + }).fail(function (e) { + expect(e).toBeUndefined(); + fail('did not expect fail handler to be invoked'); + }).done(done); + }); + + it('should write individual plugin specs to config.xml', function (done) { + var fake_fetch_json = + {'VRPlugin': {'source': { + 'type': 'registry', + 'id': 'id' + }, + 'is_top_level': true }}; + fs.readFileSync.and.returnValue(JSON.stringify(fake_fetch_json)); + spyOn(save, 'getSpec').and.returnValue('1.0.0'); + save(projectRoot).then(function () { + expect(cfg_parser_mock.prototype.addPlugin).toHaveBeenCalledWith(Object({ name: 'VRPlugin', spec: '1.0.0' }), jasmine.any(Object)); + expect(cfg_parser_mock.prototype.write).toHaveBeenCalled(); + }).fail(function (e) { + expect(e).toBeUndefined(); + fail('did not expect fail handler to be invoked'); + }).done(done); + }); + + it('should write individual plugin variables to config.xml', function (done) { + var fake_fetch_json = + {'VRPlugin': {'source': { + 'type': 'registry', + 'id': 'id' + }, + 'is_top_level': true, + 'variables': { + 'var 1': ' ' + }}}; + fs.readFileSync.and.returnValue(JSON.stringify(fake_fetch_json)); + save(projectRoot).then(function () { + expect(cfg_parser_mock.prototype.addPlugin).toHaveBeenCalledWith(jasmine.any(Object), [ Object({ name: 'var 1', value: ' ' }) ]); + expect(cfg_parser_mock.prototype.write).toHaveBeenCalled(); + }).fail(function (e) { + expect(e).toBeUndefined(); + fail('did not expect fail handler to be invoked'); + }).done(done); + }); }); describe('getSpec helper method', function () { - it('should return a plugin source\'s url or path property immediately'); - it('should return a version if a version was provided to plugin id'); - it('should return a version that includes scope if scope was part of plugin id'); - it('should fall back to using PluginInfoProvider to retrieve a version as last resort'); + it('should return a plugin source\'s url or path property immediately', function () { + spyOn(save, 'getSpec').and.callThrough(); + save.getSpec({ url: 'https://git-wip-us.apache.org/repos/asf/cordova-plugin-camera.git' }, '/some/path', 'VRPlugin'); + expect(save.getSpec).toHaveBeenCalledWith(Object({ url: 'https://git-wip-us.apache.org/repos/asf/cordova-plugin-camera.git' }), '/some/path', 'VRPlugin'); + expect(save.getSpec({ url: 'https://git-wip-us.apache.org/repos/asf/cordova-plugin-camera.git' }, '/some/path', 'VRPlugin')).toEqual('https://git-wip-us.apache.org/repos/asf/cordova-plugin-camera.git'); + }); + + it('getSpec should return a version if a version was provided to plugin id', function () { + save.versionString.and.callThrough(); + expect(save.getSpec({id: 'cordova-plugin-camera@^1.1.0'}, '/some/path', 'cordova-plugin-camera')).toEqual('^1.1.0'); + }); + + it('should return a version that includes scope if scope was part of plugin id', function () { + save.versionString.and.callThrough(); + expect(save.getSpec({ type: 'registry', id: '@scoped/package@^1.0.0' }, '/some/path', 'cordova-plugin-camera')).toEqual('@scoped/package@^1.0.0'); + }); + + it('should fall back to using PluginInfoProvider to retrieve a version as last resort', function () { + expect(save.getSpec({ id: 'cordova-plugin-camera' }, '/some/path', 'cordova-plugin-camera')).toEqual(null); + expect(plugin_info_provider_mock.prototype.get).toHaveBeenCalled(); + }); + }); + + describe('getPluginVariables helper method', function () { + it('if no variables are passed in, should return empty', function () { + expect(save.getPluginVariables()).toEqual([]); + }); + it('if variables are passed in, should return result & get added to name and value', function () { + expect(save.getPluginVariables({ variable: 'var 1' })).toEqual([ { name: 'variable', value: 'var 1' } ]); + }); + }); + + describe('versionString helper method', function () { + it('if no version, should return null', function () { + save.versionString.and.callThrough(); + spyOn(semver, 'valid').and.returnValue(null); + spyOn(semver, 'validRange').and.returnValue(null); + expect(save.versionString()).toBe(null); + }); + it('return version passed in, if it is within the valid range', function () { + save.versionString.and.callThrough(); + spyOn(semver, 'valid').and.returnValue(null); + spyOn(semver, 'validRange').and.returnValue('^1.3.2'); + expect(save.versionString('^1.3.2')).toBe('^1.3.2'); + }); + it('should check and return a valid version', function () { + save.versionString.and.callThrough(); + spyOn(semver, 'valid').and.returnValue('1.3.2'); + expect(save.versionString('1.3.2')).toBe('~1.3.2'); + }); }); }); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
