| /** |
| 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 cordova = require('../cordova'), |
| path = require('path'), |
| shell = require('shelljs'), |
| plugman = require('plugman'), |
| fs = require('fs'), |
| util = require('../src/util'), |
| config = require('../src/config'), |
| hooker = require('../src/hooker'), |
| platforms = require('../platforms'); |
| |
| var cwd = process.cwd(); |
| var supported_platforms = Object.keys(platforms).filter(function(p) { return p != 'www'; }); |
| var sample_plugins = ['one','two']; |
| var project_dir = path.join('some','path'); |
| var plugins_dir = path.join(project_dir, 'plugins'); |
| |
| describe('plugin command', function() { |
| var is_cordova, list_platforms, fire, find_plugins, rm, mkdir, existsSync, exec, prep_spy, plugman_install, plugman_fetch, parsers = {}, uninstall; |
| beforeEach(function() { |
| is_cordova = spyOn(util, 'isCordova').andReturn(project_dir); |
| fire = spyOn(hooker.prototype, 'fire').andCallFake(function(e, opts, cb) { |
| if (cb === undefined) cb = opts; |
| cb(false); |
| }); |
| supported_platforms.forEach(function(p) { |
| parsers[p] = jasmine.createSpy(p + ' update_project').andCallFake(function(cfg, cb) { |
| cb(); |
| }); |
| spyOn(platforms[p], 'parser').andReturn({ |
| staging_dir:function(){return ''} |
| }); |
| }); |
| list_platforms = spyOn(util, 'listPlatforms').andReturn(supported_platforms); |
| find_plugins = spyOn(util, 'findPlugins').andReturn(sample_plugins); |
| rm = spyOn(shell, 'rm'); |
| mkdir = spyOn(shell, 'mkdir'); |
| existsSync = spyOn(fs, 'existsSync').andReturn(false); |
| exec = spyOn(shell, 'exec').andCallFake(function(cmd, opts, cb) { |
| cb(0, ''); |
| }); |
| prep_spy = spyOn(cordova, 'prepare').andCallFake(function(t, cb) { |
| cb(); |
| }); |
| plugman_install = spyOn(plugman, 'install'); |
| plugman_fetch = spyOn(plugman, 'fetch').andCallFake(function(target, plugins_dir, opts, cb) { cb(false, path.join(plugins_dir, target)); }); |
| uninstall = spyOn(plugman, 'uninstall'); |
| }); |
| |
| describe('failure', function() { |
| it('should not run outside of a Cordova-based project by calling util.isCordova', function() { |
| is_cordova.andReturn(false); |
| expect(function() { |
| cordova.plugin(); |
| expect(is_cordova).toHaveBeenCalled(); |
| }).toThrow('Current working directory is not a Cordova-based project.'); |
| }); |
| it('should report back an error if used with `add` and no plugin is specified', function() { |
| expect(function() { |
| cordova.plugin('add'); |
| }).toThrow('You need to qualify `add` or `remove` with one or more plugins!'); |
| }); |
| it('should report back an error if used with `rm` and no plugin is specified', function() { |
| expect(function() { |
| cordova.plugin('rm'); |
| }).toThrow('You need to qualify `add` or `remove` with one or more plugins!'); |
| }); |
| }); |
| |
| describe('success', function() { |
| it('should run inside a Cordova-based project by calling util.isCordova', function() { |
| cordova.plugin(); |
| expect(is_cordova).toHaveBeenCalled(); |
| }); |
| |
| describe('`ls`', function() { |
| afterEach(function() { |
| cordova.removeAllListeners('results'); |
| }); |
| it('should list out no plugins for a fresh project', function(done) { |
| find_plugins.andReturn([]); |
| cordova.on('results', function(res) { |
| expect(res).toEqual('No plugins added. Use `cordova plugin add <plugin>`.'); |
| done(); |
| }); |
| cordova.plugin('list'); |
| }); |
| |
| it('should list out added plugins in a project', function(done) { |
| cordova.on('results', function(res) { |
| expect(res).toEqual(sample_plugins); |
| done(); |
| }); |
| cordova.plugin('list'); |
| }); |
| }); |
| describe('`add`', function() { |
| it('should call plugman.fetch for each plugin', function() { |
| cordova.plugin('add', sample_plugins); |
| sample_plugins.forEach(function(p) { |
| expect(plugman_fetch).toHaveBeenCalledWith(p, plugins_dir, {}, jasmine.any(Function)); |
| }); |
| }); |
| it('should call plugman.install, for each plugin, for every platform', function() { |
| cordova.plugin('add', sample_plugins); |
| sample_plugins.forEach(function(plug) { |
| supported_platforms.forEach(function(plat) { |
| expect(plugman_install).toHaveBeenCalledWith((plat=='blackberry'?'blackberry10':plat), path.join(project_dir, 'platforms', plat), plug, plugins_dir, jasmine.any(Object)); |
| }); |
| }); |
| }); |
| }); |
| describe('`remove`',function() { |
| var plugin_parser; |
| var subset = ['android', 'wp7']; |
| beforeEach(function() { |
| plugin_parser = spyOn(util, 'plugin_parser').andReturn({ |
| platforms:subset |
| }); |
| }); |
| it('should throw if plugin is not installed', function() { |
| expect(function() { |
| cordova.plugin('rm', 'somethingrandom'); |
| }).toThrow('Plugin "somethingrandom" not added to project.'); |
| }); |
| |
| it('should call plugman.uninstall for every matching installedplugin-supportedplatform pair', function() { |
| cordova.plugin('rm', sample_plugins); |
| sample_plugins.forEach(function(plug) { |
| subset.forEach(function(plat) { |
| expect(uninstall).toHaveBeenCalledWith(plat, path.join(project_dir, 'platforms', plat), plug, plugins_dir, jasmine.any(Object)); |
| }); |
| }); |
| }); |
| }); |
| }); |
| describe('hooks', function() { |
| var plugin_parser; |
| beforeEach(function() { |
| plugin_parser = spyOn(util, 'plugin_parser').andReturn({ |
| platforms:supported_platforms |
| }); |
| }); |
| describe('list (ls) hooks', function() { |
| it('should fire before hooks through the hooker module', function() { |
| cordova.plugin(); |
| expect(fire).toHaveBeenCalledWith('before_plugin_ls', jasmine.any(Function)); |
| }); |
| it('should fire after hooks through the hooker module', function() { |
| cordova.plugin(); |
| expect(fire).toHaveBeenCalledWith('after_plugin_ls', jasmine.any(Function)); |
| }); |
| }); |
| describe('remove (rm) hooks', function() { |
| it('should fire before hooks through the hooker module', function() { |
| cordova.plugin('rm', 'two'); |
| expect(fire).toHaveBeenCalledWith('before_plugin_rm', {plugins:['two']}, jasmine.any(Function)); |
| }); |
| it('should fire after hooks through the hooker module', function() { |
| cordova.plugin('rm', 'one'); |
| expect(fire).toHaveBeenCalledWith('after_plugin_rm', {plugins:['one']}, jasmine.any(Function)); |
| }); |
| }); |
| describe('add hooks', function() { |
| it('should fire before and after hooks through the hooker module', function() { |
| cordova.plugin('add', 'android'); |
| expect(fire).toHaveBeenCalledWith('before_plugin_add', {plugins:['android']}, jasmine.any(Function)); |
| expect(fire).toHaveBeenCalledWith('after_plugin_add', {plugins:['android']}, jasmine.any(Function)); |
| }); |
| }); |
| }); |
| }); |