'use strict'; const chai = require('chai'); const sinon = require('sinon'); const PluginSearch = require('../../../../../lib/plugins/plugin/search'); const Serverless = require('../../../../../lib/serverless'); const CLI = require('../../../../../lib/classes/cli'); chai.use(require('chai-as-promised')); const expect = require('chai').expect; describe('PluginSearch', () => { let pluginSearch; let serverless; const plugins = [ { name: 'serverless-plugin-1', description: 'Serverless Plugin 1', githubUrl: 'https://github.com/serverless/serverless-plugin-1', }, { name: 'serverless-plugin-2', description: 'Serverless Plugin 2', githubUrl: 'https://github.com/serverless/serverless-plugin-2', }, { name: 'serverless-existing-plugin', description: 'Serverless Existing plugin', githubUrl: 'https://github.com/serverless/serverless-existing-plugin', }, ]; beforeEach(() => { serverless = new Serverless({ commands: [], options: {} }); serverless.cli = new CLI(serverless); const options = {}; pluginSearch = new PluginSearch(serverless, options); }); describe('#constructor()', () => { let searchStub; beforeEach(() => { searchStub = sinon.stub(pluginSearch, 'search').returns(Promise.resolve()); }); afterEach(() => { pluginSearch.search.restore(); }); it('should have the sub-command "search"', () => { expect(pluginSearch.commands.plugin.commands.search).to.not.equal(undefined); }); it('should have the lifecycle event "search" for the "search" sub-command', () => { expect(pluginSearch.commands.plugin.commands.search.lifecycleEvents).to.deep.equal([ 'search', ]); }); it('should have a required option "query" for the "search" sub-command', () => { // eslint-disable-next-line no-unused-expressions expect(pluginSearch.commands.plugin.commands.search.options.query.required).to.be.true; }); it('should have a "plugin:search:search" hook', () => { expect(pluginSearch.hooks['plugin:search:search']).to.not.equal(undefined); }); it('should run promise chain in order for "plugin:search:search" hook', async () => expect(pluginSearch.hooks['plugin:search:search']()).to.be.fulfilled.then(() => { expect(searchStub.calledOnce).to.equal(true); })); }); describe('#search()', () => { let getPluginsStub; let displayStub; beforeEach(() => { getPluginsStub = sinon.stub(pluginSearch, 'getPlugins').returns(Promise.resolve(plugins)); displayStub = sinon.stub(pluginSearch, 'display').returns(Promise.resolve()); }); afterEach(() => { pluginSearch.getPlugins.restore(); pluginSearch.display.restore(); }); it('should return a list of plugins based on the search query', async () => { pluginSearch.options.query = 'serverless-plugin-1'; return expect(pluginSearch.search()).to.be.fulfilled.then(() => { expect(getPluginsStub.calledOnce).to.equal(true); expect(displayStub.calledOnce).to.equal(true); }); }); }); });