Skip to content
This repository has been archived by the owner on Feb 1, 2023. It is now read-only.

Commit

Permalink
update tests for turning into async call
Browse files Browse the repository at this point in the history
  • Loading branch information
horike37 committed Sep 3, 2017
1 parent c3c15c6 commit 27fb1c4
Show file tree
Hide file tree
Showing 6 changed files with 489 additions and 1,705 deletions.
8 changes: 3 additions & 5 deletions lib/plugins/plugin/install/install.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,9 @@ class PluginInstall {
}

install() {
if (this.options.name) {
const pluginInfo = _.split(this.options.name, '@', 2);
this.options.pluginName = pluginInfo[0];
this.options.pluginVersion = pluginInfo[1] || 'latest';
}
const pluginInfo = _.split(this.options.name, '@', 2);
this.options.pluginName = pluginInfo[0];
this.options.pluginVersion = pluginInfo[1] || 'latest';

return BbPromise.bind(this)
.then(this.validate)
Expand Down
170 changes: 55 additions & 115 deletions lib/plugins/plugin/install/install.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ const path = require('path');
const childProcess = BbPromise.promisifyAll(require('child_process'));
const fs = require('fs');
const fse = require('fs-extra');
const proxyquire = require('proxyquire');
const chalk = require('chalk');
const PluginInstall = require('./install');
const Serverless = require('../../../Serverless');
const CLI = require('../../../classes/CLI');
Expand Down Expand Up @@ -52,6 +50,7 @@ describe('PluginInstall', () => {

afterEach(() => {
serverless.cli.consoleLog.restore();
serverless.classes.Error.restore();
});

describe('#constructor()', () => {
Expand Down Expand Up @@ -151,8 +150,8 @@ describe('PluginInstall', () => {
expect(pluginInstallStub.calledOnce).to.equal(true);
expect(consoleLogStub.called).to.equal(true);
expect(serverlessErrorStub.calledOnce).to.equal(false);
expect(addPluginToServerlessFileStub.called).to.equal(true);
expect(installPeerDependenciesStub.called).to.equal(true);
expect(addPluginToServerlessFileStub.calledOnce).to.equal(true);
expect(installPeerDependenciesStub.calledOnce).to.equal(true);
});
});

Expand All @@ -172,8 +171,8 @@ describe('PluginInstall', () => {
expect(pluginInstallStub.calledOnce).to.equal(false);
expect(consoleLogStub.called).to.equal(false);
expect(serverlessErrorStub.calledOnce).to.equal(true);
expect(addPluginToServerlessFileStub.called).to.equal(false);
expect(installPeerDependenciesStub.called).to.equal(false);
expect(addPluginToServerlessFileStub.calledOnce).to.equal(false);
expect(installPeerDependenciesStub.calledOnce).to.equal(false);
});
});

Expand Down Expand Up @@ -280,10 +279,12 @@ describe('PluginInstall', () => {

describe('#addPluginToServerlessFile()', () => {
let servicePath;
let serverlessYmlFilePath;

beforeEach(() => {
servicePath = testUtils.getTmpDirPath();
pluginInstall.serverless.config.servicePath = servicePath;
serverlessYmlFilePath = path.join(servicePath, 'serverless.yml');
});

it('should add the plugin to the service file if plugins array is not present', () => {
Expand All @@ -295,27 +296,12 @@ describe('PluginInstall', () => {
};
serverless.utils
.writeFileSync(serverlessYmlFilePath, YAML.dump(serverlessYml));
// package.json file
const packageJsonFileContent = {
devDependencies: {
'serverless-plugin-1': '0.1.0',
},
};
fse.writeJsonSync(packageJsonFilePath, packageJsonFileContent);

pluginInstall.options.name = 'serverless-plugin-1';
jsonParseStub.returns({ devDependencies: { 'serverless-plugin-1': true } });
pluginInstall.options.pluginName = 'serverless-plugin-1';

return expect(pluginInstall.install()).to.be.fulfilled.then(() => {
expect(validateStub.calledOnce).to.equal(true);
expect(getPluginsStub.calledOnce).to.equal(true);
expect(npmInstallStub.calledWithExactly(
`npm install --save-dev ${pluginInstall.options.name}@latest`,
{ stdio: 'ignore' }
)).to.equal(true);
expect(consoleLogStub.called).to.equal(true);
expect(addPluginToServerlessFileStub.called).to.equal(true);
expect(installPeerDependenciesStub.called).to.equal(true);
return expect(pluginInstall.addPluginToServerlessFile()).to.be.fulfilled.then(() => {
expect(serverless.utils.readFileSync(serverlessYmlFilePath, 'utf8').plugins)
.to.deep.equal(['serverless-plugin-1']);
});
});

Expand All @@ -328,98 +314,50 @@ describe('PluginInstall', () => {
};
serverless.utils
.writeFileSync(serverlessYmlFilePath, YAML.dump(serverlessYml));
// package.json file
const packageJsonFileContent = {
devDependencies: {
'serverless-plugin-1': '0.1.0',
},
};
fse.writeJsonSync(packageJsonFilePath, packageJsonFileContent);

pluginInstall.options.name = 'serverless-plugin-1';
jsonParseStub.returns({ devDependencies: { 'serverless-plugin-1': true } });
pluginInstall.options.pluginName = 'serverless-plugin-1';

return expect(pluginInstall.install()).to.be.fulfilled.then(() => {
expect(validateStub.calledOnce).to.equal(true);
expect(getPluginsStub.calledOnce).to.equal(true);
expect(npmInstallStub.calledWithExactly(
`npm install --save-dev ${pluginInstall.options.name}@latest`,
{ stdio: 'ignore' }
)).to.equal(true);
expect(consoleLogStub.called).to.equal(true);
expect(addPluginToServerlessFileStub.called).to.equal(true);
expect(installPeerDependenciesStub.called).to.equal(true);
return expect(pluginInstall.addPluginToServerlessFile()).to.be.fulfilled.then(() => {
expect(serverless.utils.readFileSync(serverlessYmlFilePath, 'utf8').plugins)
.to.deep.equal(['serverless-existing-plugin', 'serverless-plugin-1']);
});
});

it('should push the plugin to the service files plugin array if it is empty', () => {
// serverless.yml
it('should add the plugin to serverless file path for a .yaml file', () => {
const serverlessYamlFilePath = path.join(servicePath, 'serverless.yaml');
const serverlessYml = {
service: 'plugin-service',
provider: 'aws',
plugins: [], // empty plugins array
};
serverless.utils
.writeFileSync(serverlessYmlFilePath, YAML.dump(serverlessYml));
// package.json file
const packageJsonFileContent = {
devDependencies: {
'serverless-plugin-1': '0.1.0',
},
};
fse.writeJsonSync(packageJsonFilePath, packageJsonFileContent);

pluginInstall.options.name = 'serverless-plugin-1';
jsonParseStub.returns({ devDependencies: { 'serverless-plugin-1': true } });

return expect(pluginInstall.install()).to.be.fulfilled.then(() => {
expect(validateStub.calledOnce).to.equal(true);
expect(getPluginsStub.calledOnce).to.equal(true);
expect(npmInstallStub.calledWithExactly(
`npm install --save-dev ${pluginInstall.options.name}@latest`,
{ stdio: 'ignore' }
)).to.equal(true);
expect(consoleLogStub.called).to.equal(true);
expect(addPluginToServerlessFileStub.called).to.equal(true);
expect(installPeerDependenciesStub.called).to.equal(true);
.writeFileSync(serverlessYamlFilePath, YAML.dump(serverlessYml));
pluginInstall.options.pluginName = 'serverless-plugin-1';
return expect(pluginInstall.addPluginToServerlessFile()).to.be.fulfilled.then(() => {
expect(serverless.utils.readFileSync(serverlessYamlFilePath, 'utf8').plugins)
.to.deep.equal(['serverless-plugin-1']);
});
});

it('should add the pluginName to serverless file path for a .yml file', () => {
const serverlessYmlFilePath = path.join(servicePath, 'serverless.yml');
const serverlessYml = {
service: 'plugin-service',
provider: 'aws',
plugins: [
'serverless-plugin-1',
],
};
serverless.utils
.writeFileSync(serverlessYmlFilePath, YAML.dump(serverlessYml));
pluginInstall.options.name = 'serverless-plugin-2';
pluginInstall.addPluginToServerlessFile();
expect(serverless.utils.readFileSync(serverlessYmlFilePath, 'utf8').plugins)
.to.include.members(['serverless-plugin-2']);
});

it('should add the pluginName to serverless file path for a .json file', () => {
it('should add the plugin to serverless file path for a .json file', () => {
const serverlessJsonFilePath = path.join(servicePath, 'serverless.json');
const serverlessJson = {
service: 'plugin-service',
provider: 'aws',
};
serverless.utils
.writeFileSync(serverlessJsonFilePath, serverlessJson);
pluginInstall.options.name = 'serverless-plugin-1';
pluginInstall.addPluginToServerlessFile();
expect(serverless.utils.readFileSync(serverlessJsonFilePath, 'utf8').plugins)
.to.include.members(['serverless-plugin-1']);
pluginInstall.options.name = 'serverless-plugin-2';
pluginInstall.addPluginToServerlessFile();
expect(serverless.utils.readFileSync(serverlessJsonFilePath, 'utf8').plugins)
.to.include.members(['serverless-plugin-1']);
expect(serverless.utils.readFileSync(serverlessJsonFilePath, 'utf8').plugins)
.to.include.members(['serverless-plugin-2']);
pluginInstall.options.pluginName = 'serverless-plugin-1';
return expect(pluginInstall.addPluginToServerlessFile()).to.be.fulfilled.then(() => {
expect(serverless.utils.readFileSync(serverlessJsonFilePath, 'utf8').plugins)
.to.deep.equal(['serverless-plugin-1']);
})
.then(() => {
pluginInstall.options.pluginName = 'serverless-plugin-2';
return expect(pluginInstall.addPluginToServerlessFile()).to.be.fulfilled.then(() => {
expect(serverless.utils.readFileSync(serverlessJsonFilePath, 'utf8').plugins)
.to.deep.equal(['serverless-plugin-1', 'serverless-plugin-2']);
});
});
});
});

Expand All @@ -434,7 +372,7 @@ describe('PluginInstall', () => {

beforeEach(() => {
pluginName = 'some-plugin';
pluginInstall.options.name = pluginName;
pluginInstall.options.pluginName = pluginName;
servicePath = testUtils.getTmpDirPath();
fse.ensureDirSync(servicePath);
pluginInstall.serverless.config.servicePath = servicePath;
Expand All @@ -447,14 +385,14 @@ describe('PluginInstall', () => {
fse.ensureDirSync(pluginPath);
pluginPackageJsonFilePath = path.join(pluginPath, 'package.json');
npmInstallStub = sinon
.stub(childProcess, 'execSync')
.returns();
.stub(childProcess, 'execAsync')
.returns(BbPromise.resolve());
savedCwd = process.cwd();
process.chdir(servicePath);
});

afterEach(() => {
childProcess.execSync.restore();
childProcess.execAsync.restore();
process.chdir(savedCwd);
});

Expand All @@ -464,24 +402,26 @@ describe('PluginInstall', () => {
'some-package': '*',
},
});
pluginInstall.installPeerDependencies();
expect(fse.readJsonSync(servicePackageJsonFilePath))
.to.be.deep.equal({ devDependencies: { 'some-package': '*' } });
expect(npmInstallStub.calledWithExactly(
'npm install',
{ stdio: 'ignore' }
)).to.equal(true);
return expect(pluginInstall.installPeerDependencies()).to.be.fulfilled.then(() => {
expect(fse.readJsonSync(servicePackageJsonFilePath))
.to.be.deep.equal({ devDependencies: { 'some-package': '*' } });
expect(npmInstallStub.calledWithExactly(
'npm install',
{ stdio: 'ignore' }
)).to.equal(true);
});
});

it('should not install peerDependencies if an installed plugin does not have ones', () => {
fse.writeJsonSync(pluginPackageJsonFilePath, {});
pluginInstall.installPeerDependencies();
expect(fse.readJsonSync(servicePackageJsonFilePath))
.to.be.deep.equal({ devDependencies: {} });
expect(npmInstallStub.calledWithExactly(
'npm install',
{ stdio: 'ignore' }
)).to.equal(false);
return expect(pluginInstall.installPeerDependencies()).to.be.fulfilled.then(() => {
expect(fse.readJsonSync(servicePackageJsonFilePath))
.to.be.deep.equal({ devDependencies: {} });
expect(npmInstallStub.calledWithExactly(
'npm install',
{ stdio: 'ignore' }
)).to.equal(false);
});
});
});
});
Loading

0 comments on commit 27fb1c4

Please sign in to comment.