mirror of
https://github.com/serverless/serverless.git
synced 2026-01-18 14:58:43 +00:00
* fix #1854 - added latest version of eslint-config-airbnb-base package * fix #1854 - added latest npm shrinkwrap scheme * fix #1854 - added latest npm coveralls package * fix #1854 - added latest npm eslint package * fix #1854 - added latest npm eslint-config-airbnb package * fix #1854 - added latest npm eslint-plugin-import package * fix #1854 - added latest npm eslint-plugin-jsx-a11y package * fix #1854 - added latest npm eslint-plugin-react package * fix #1854 - fixed estlint new-parens errors for integration test * fix #1854 - fixed estlint new-parens errors for yaml parsers tests * fix #1854 - fixed estlint max-len errors for util tests * fix #1854 - disabled no-extraneous-dependencies on eslintrc for NodeJS 4 incapability on this feature * fix #1854 - fixed eslint new-parens errors for Service tests * fix #1854 - fixed eslint new-parens errors for Serverless tests * fix #1854 - fixed eslint new-parens errors for plugin manager tests * fix #1854 - fixed eslint new-parens errors for plugin tracking tests * fix #1854 - fixed eslint new-parens errors for plugin package zipService lib * fix #1854 - fixed eslint new-parens errors for plugin package zipService tests * fix #1854 - fixed eslint trailing spaces errors for plugin package zipService lib * fix #1854 - fixed eslint new-parens errors for plugin package cleanup tests * fix #1854 - fixed eslint new-parens errors for plugin create tests * fix #1854 - fixed eslint dot same line expectation error on plugin aws logs index * fix #1854 - fixed eslint operator assignment error on plugin aws logs index * fix #1854 - fixed eslint dot location error on plugin aws invoke tests * fix #1854 - fixed eslint new-parens error on plugin aws invoke tests * fix #1854 - fixed eslint new-parens error on plugin aws deployFunction tests * fix #1854 - fixed eslint new-parens error on plugin aws deploy uploadDeploymentPackage tests * fix #1854 - fixed eslint new-parens error on plugin aws deploy updateStack tests * fix #1854 - fixed eslint new-parens error on plugin aws deploy createStack tests * fix #1854 - fixed eslint new-parens error on plugin aws deploy apiGateway lib deployment * fix #1854 - fixed eslint unary typeof whitespace req error on Serverless Service class * fix #1854 - fixed eslint unary typeof whitespace req error on Serverless Service class ( second fix ) * fix #1854 - fixed eslint no-lonely-if req error on Serverless Service class * fix #1854 - disabled react/require-extension on eslintrc because it's deprecated * fix #1854 - AwsCompileApigEvents #constructor() should resolve if no functions are given: Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both. * fix #1854 - createStack #postCreate() should resolve: Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both. * fix #1854 - emptyS3Bucket #deleteObjects() should resolve if objectsInBucket is empty: Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both. * fix #1854 - AwsInvoke #extendedValidate() should resolve if path is not given: Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both. * fix #1854 - #cleanup() should resolve if the .serverless directory is not present: Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both. * fix #1854 -#validate() should resolve if servicePath is given: Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both. * fix #1854 - Service #load() should resolve if no servicePath is found: Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both. * fix #1854 - added latest mocha package * fix #1854 - added latest sinon npm package * fix #1854 - serverless/lib/plugins/aws/deploy/tests/createStack.js 136:48 error Missing semicolon semi * fix #1854 - serverless/lib/plugins/package/tests/cleanup.js 35:7 error Missing semicolon semi * fix #1854 - serverless/lib/plugins/package/tests/validate.js 22:49 error Missing semicolon semi * fix #1854 - added latest npm shrinkwrap * fix #1854 - fixed no-extra-boolean-cast eslint error on aws deploy apiGateway methods * fix #1854 - fixed new-parens eslint error on serverless tests for Service class
251 lines
9.5 KiB
JavaScript
251 lines
9.5 KiB
JavaScript
'use strict';
|
|
|
|
const expect = require('chai').expect;
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const os = require('os');
|
|
const JsZip = require('jszip');
|
|
const Package = require('../index');
|
|
const Serverless = require('../../../../lib/Serverless');
|
|
|
|
describe('#zipService()', () => {
|
|
let serverless;
|
|
let packageService;
|
|
let zip;
|
|
|
|
beforeEach(() => {
|
|
serverless = new Serverless();
|
|
zip = new JsZip();
|
|
packageService = new Package(serverless);
|
|
packageService.serverless.cli = new serverless.classes.CLI();
|
|
|
|
// create a mock service in a temporary directory
|
|
const tmpDirPath = path.join(os.tmpdir(), (new Date()).getTime().toString());
|
|
const handlerPath = path.join(tmpDirPath, 'handler.js');
|
|
serverless.utils.writeFileSync(handlerPath, 'handler.js file content');
|
|
const nestedFunctionPath = path.join(tmpDirPath, 'lib', 'function.js');
|
|
serverless.utils.writeFileSync(nestedFunctionPath, 'function.js content');
|
|
// create the files and folders which should be excluded
|
|
const excludeMeDirectoryPath = path.join(tmpDirPath, 'exclude-me', 'some-file');
|
|
serverless.utils.writeFileSync(excludeMeDirectoryPath, 'some-file content');
|
|
const excludeMeFilePath = path.join(tmpDirPath, 'exclude-me.js');
|
|
serverless.utils.writeFileSync(excludeMeFilePath, 'exclude-me.js file content');
|
|
// create the files and folders which should be included
|
|
const includeMeDirectoryPath = path.join(tmpDirPath, 'include-me', 'some-file');
|
|
serverless.utils.writeFileSync(includeMeDirectoryPath, 'some-file content');
|
|
const includeMeFilePath = path.join(tmpDirPath, 'include-me.js');
|
|
serverless.utils.writeFileSync(includeMeFilePath, 'include-me.js file content');
|
|
// create a executable file
|
|
const executableFilePath = path.join(tmpDirPath, 'bin/some-binary');
|
|
serverless.utils.writeFileSync(executableFilePath, 'some-binary executable file content');
|
|
fs.chmodSync(executableFilePath, 777);
|
|
// create a readonly file
|
|
const readOnlyFilePath = path.join(tmpDirPath, 'bin/read-only');
|
|
serverless.utils.writeFileSync(readOnlyFilePath, 'read-only executable file content');
|
|
fs.chmodSync(readOnlyFilePath, 444);
|
|
// a serverless plugin that should be included
|
|
const includeMe2FilePath = path.join(tmpDirPath, 'a-serverless-plugin.js');
|
|
serverless.utils.writeFileSync(includeMe2FilePath, 'a-serverless-plugin.js file content');
|
|
// create the files and folder which should be ignored by default
|
|
// .gitignore
|
|
const gitignoreFilePath = path.join(tmpDirPath, '.gitignore');
|
|
serverless.utils.writeFileSync(gitignoreFilePath, 'content');
|
|
// .DS_Store
|
|
const dsStoreFilePath = path.join(tmpDirPath, '.DS_Store');
|
|
serverless.utils.writeFileSync(dsStoreFilePath, 'content');
|
|
// serverless.yml
|
|
const serverlessYmlFilePath = path.join(tmpDirPath, 'serverless.yml');
|
|
serverless.utils.writeFileSync(serverlessYmlFilePath, 'serverless.yml file content');
|
|
// serverless.env.yml
|
|
const serverlessEnvYmlFilePath = path.join(tmpDirPath, 'serverless.env.yml');
|
|
serverless.utils.writeFileSync(serverlessEnvYmlFilePath, 'serverless.env.yml file content');
|
|
// .git
|
|
const gitFilePath = path.join(path.join(tmpDirPath, '.git'), 'some-git-file');
|
|
serverless.utils.writeFileSync(gitFilePath, 'some-git-file content');
|
|
|
|
// set the service name
|
|
serverless.service.service = 'first-service';
|
|
|
|
// set the servicePath
|
|
serverless.config.servicePath = tmpDirPath;
|
|
});
|
|
|
|
it('should zip a whole service', () => packageService
|
|
.zipService().then(() => {
|
|
const artifact = packageService.serverless.service.package.artifact;
|
|
const data = fs.readFileSync(artifact);
|
|
|
|
return zip.loadAsync(data);
|
|
}).then(unzippedData => {
|
|
const unzippedFileData = unzippedData.files;
|
|
|
|
expect(Object.keys(unzippedFileData)
|
|
.filter(file => !unzippedFileData[file].dir).length).to.equal(9);
|
|
|
|
expect(unzippedFileData['handler.js'].name)
|
|
.to.equal('handler.js');
|
|
|
|
expect(unzippedFileData['lib/function.js'].name)
|
|
.to.equal('lib/function.js');
|
|
|
|
expect(unzippedFileData['exclude-me.js'].name)
|
|
.to.equal('exclude-me.js');
|
|
|
|
expect(unzippedFileData['exclude-me/some-file'].name)
|
|
.to.equal('exclude-me/some-file');
|
|
|
|
expect(unzippedFileData['include-me.js'].name)
|
|
.to.equal('include-me.js');
|
|
|
|
expect(unzippedFileData['bin/some-binary'].name)
|
|
.to.equal('bin/some-binary');
|
|
expect(unzippedFileData['bin/read-only'].name)
|
|
.to.equal('bin/read-only');
|
|
|
|
expect(unzippedFileData['include-me/some-file'].name)
|
|
.to.equal('include-me/some-file');
|
|
|
|
expect(unzippedFileData['a-serverless-plugin.js'].name)
|
|
.to.equal('a-serverless-plugin.js');
|
|
})
|
|
);
|
|
|
|
it('should keep file permissions', () => packageService
|
|
.zipService().then(() => {
|
|
const artifact = packageService.serverless.service.package.artifact;
|
|
const data = fs.readFileSync(artifact);
|
|
|
|
return zip.loadAsync(data);
|
|
}).then(unzippedData => {
|
|
const unzippedFileData = unzippedData.files;
|
|
|
|
// binary file is set with chmod of 777
|
|
expect(unzippedFileData['bin/some-binary'].unixPermissions)
|
|
.to.equal(Math.pow(2, 15) + 777);
|
|
|
|
// read only file is set with chmod of 444
|
|
expect(unzippedFileData['bin/read-only'].unixPermissions)
|
|
.to.equal(Math.pow(2, 15) + 444);
|
|
})
|
|
);
|
|
|
|
it('should resolve if the user has specified his own artifact', (done) => {
|
|
// create an artifact in a temp directory
|
|
const tmpDirPath = path.join(os.tmpdir(), (new Date()).getTime().toString());
|
|
const handlerPath = path.join(tmpDirPath, 'handler.js');
|
|
serverless.utils.writeFileSync(handlerPath, 'handler.js file content');
|
|
packageService.serverless.utils.walkDirSync(tmpDirPath).forEach((filePath) => {
|
|
const relativeFilePath = path.relative(tmpDirPath, filePath);
|
|
zip.file(relativeFilePath, fs.readFileSync(filePath));
|
|
});
|
|
zip.generateAsync({ type: 'nodebuffer', compression: 'DEFLATE' }).then(data => {
|
|
const artifactFilePath = path.join(tmpDirPath, 'artifact.zip');
|
|
fs.writeFileSync(artifactFilePath, data, 'binary');
|
|
|
|
packageService.serverless.service.package.artifact = artifactFilePath;
|
|
|
|
return packageService.zipService();
|
|
}).then(() => {
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should exclude defined files and folders', () => {
|
|
packageService.serverless.service.package.exclude = ['exclude-me.js', 'exclude-me'];
|
|
|
|
return packageService.zipService().then(() => {
|
|
const artifact = packageService.serverless.service.package.artifact;
|
|
const data = fs.readFileSync(artifact);
|
|
|
|
return zip.loadAsync(data);
|
|
}).then(unzippedData => {
|
|
const unzippedFileData = unzippedData.files;
|
|
|
|
expect(Object.keys(unzippedFileData)
|
|
.filter(file => !unzippedFileData[file].dir).length).to.equal(7);
|
|
|
|
expect(unzippedFileData['handler.js'].name)
|
|
.to.equal('handler.js');
|
|
|
|
expect(unzippedFileData['lib/function.js'].name)
|
|
.to.equal('lib/function.js');
|
|
|
|
expect(unzippedFileData['include-me.js'].name)
|
|
.to.equal('include-me.js');
|
|
|
|
expect(unzippedFileData['include-me/some-file'].name)
|
|
.to.equal('include-me/some-file');
|
|
|
|
expect(unzippedFileData['a-serverless-plugin.js'].name)
|
|
.to.equal('a-serverless-plugin.js');
|
|
});
|
|
});
|
|
|
|
it('should exclude predefined files and folders (e.g. like .git)', () => packageService
|
|
.zipService().then(() => {
|
|
const artifact = packageService.serverless.service.package.artifact;
|
|
const data = fs.readFileSync(artifact);
|
|
|
|
return zip.loadAsync(data);
|
|
}).then(unzippedData => {
|
|
const unzippedFileData = unzippedData.files;
|
|
|
|
expect(Object.keys(unzippedFileData)
|
|
.filter(file => !unzippedFileData[file].dir).length).to.equal(9);
|
|
|
|
expect(unzippedFileData['.gitignore'])
|
|
.to.be.equal(undefined);
|
|
|
|
expect(unzippedFileData['.DS_Store'])
|
|
.to.be.equal(undefined);
|
|
|
|
expect(unzippedFileData['serverless.yml'])
|
|
.to.be.equal(undefined);
|
|
|
|
expect(unzippedFileData['serverless.env.yml'])
|
|
.to.be.equal(undefined);
|
|
|
|
expect(unzippedFileData['.git/some-git-file'])
|
|
.to.equal(undefined);
|
|
})
|
|
);
|
|
|
|
it('should include a previously excluded file', () => {
|
|
packageService.serverless.service.package.exclude = ['exclude-me.js', 'exclude-me'];
|
|
packageService.serverless.service.package.include = ['exclude-me.js', 'exclude-me'];
|
|
|
|
return packageService.zipService().then(() => {
|
|
const artifact = packageService.serverless.service.package.artifact;
|
|
const data = fs.readFileSync(artifact);
|
|
|
|
return zip.loadAsync(data);
|
|
}).then(unzippedData => {
|
|
const unzippedFileData = unzippedData.files;
|
|
|
|
expect(Object.keys(unzippedFileData)
|
|
.filter(file => !unzippedFileData[file].dir).length).to.equal(9);
|
|
|
|
expect(unzippedFileData['handler.js'].name)
|
|
.to.equal('handler.js');
|
|
|
|
expect(unzippedFileData['lib/function.js'].name)
|
|
.to.equal('lib/function.js');
|
|
|
|
expect(unzippedFileData['include-me.js'].name)
|
|
.to.equal('include-me.js');
|
|
|
|
expect(unzippedFileData['include-me/some-file'].name)
|
|
.to.equal('include-me/some-file');
|
|
|
|
expect(unzippedFileData['exclude-me.js'].name)
|
|
.to.equal('exclude-me.js');
|
|
|
|
expect(unzippedFileData['exclude-me/some-file'].name)
|
|
.to.equal('exclude-me/some-file');
|
|
|
|
expect(unzippedFileData['a-serverless-plugin.js'].name)
|
|
.to.equal('a-serverless-plugin.js');
|
|
});
|
|
});
|
|
});
|