From 85acf54d019ca94de7280e28d41819aedcff4a58 Mon Sep 17 00:00:00 2001 From: Toan Nguyen Date: Sat, 9 Sep 2017 12:56:42 +0700 Subject: [PATCH] update predefined resources test --- .../events/apiGateway/lib/cors.test.js | 35 +++++---- .../apiGateway/lib/method/index.test.js | 30 ++++--- .../events/apiGateway/lib/resources.js | 11 ++- .../events/apiGateway/lib/resources.test.js | 78 +++++++++++++++++-- .../compile/events/apiGateway/lib/restApi.js | 3 +- .../events/apiGateway/lib/restApi.test.js | 16 ++++ lib/plugins/aws/provider/awsProvider.js | 26 ++++++- 7 files changed, 164 insertions(+), 35 deletions(-) diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/cors.test.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/cors.test.js index 1b77b46a9..cd9ef24d9 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/cors.test.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/cors.test.js @@ -34,19 +34,28 @@ describe('#compileCors()', () => { }; awsCompileApigEvents = new AwsCompileApigEvents(serverless, options); awsCompileApigEvents.apiGatewayRestApiLogicalId = 'ApiGatewayRestApi'; - awsCompileApigEvents.apiGatewayResourceLogicalIds = { - 'users/create': 'ApiGatewayResourceUsersCreate', - 'users/list': 'ApiGatewayResourceUsersList', - 'users/update': 'ApiGatewayResourceUsersUpdate', - 'users/delete': 'ApiGatewayResourceUsersDelete', - 'users/any': 'ApiGatewayResourceUsersAny', - }; - awsCompileApigEvents.apiGatewayResourceNames = { - 'users/create': 'UsersCreate', - 'users/list': 'UsersList', - 'users/update': 'UsersUpdate', - 'users/delete': 'UsersDelete', - 'users/any': 'UsersAny', + awsCompileApigEvents.apiGatewayResources = { + 'users/create': { + name: 'UsersCreate', + resourceLogicalId: 'ApiGatewayResourceUsersCreate', + }, + + 'users/list': { + name: 'UsersList', + resourceLogicalId: 'ApiGatewayResourceUsersList', + }, + 'users/update': { + name: 'UsersUpdate', + resourceLogicalId: 'ApiGatewayResourceUsersUpdate', + }, + 'users/delete': { + name: 'UsersDelete', + resourceLogicalId: 'ApiGatewayResourceUsersDelete', + }, + 'users/any': { + name: 'UsersAny', + resourceLogicalId: 'ApiGatewayResourceUsersAny', + }, }; awsCompileApigEvents.validated = {}; }); diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.test.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.test.js index c81ed7edb..c34c79116 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.test.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/method/index.test.js @@ -35,18 +35,26 @@ describe('#compileMethods()', () => { awsCompileApigEvents = new AwsCompileApigEvents(serverless, options); awsCompileApigEvents.validated = {}; awsCompileApigEvents.apiGatewayRestApiLogicalId = 'ApiGatewayRestApi'; - awsCompileApigEvents.apiGatewayResourceLogicalIds = { - 'users/create': 'ApiGatewayResourceUsersCreate', - 'users/list': 'ApiGatewayResourceUsersList', - 'users/update': 'ApiGatewayResourceUsersUpdate', - 'users/delete': 'ApiGatewayResourceUsersDelete', - }; - awsCompileApigEvents.apiGatewayResourceNames = { - 'users/create': 'UsersCreate', - 'users/list': 'UsersList', - 'users/update': 'UsersUpdate', - 'users/delete': 'UsersDelete', + awsCompileApigEvents.apiGatewayResources = { + 'users/create': { + name: 'UsersCreate', + resourceLogicalId: 'ApiGatewayResourceUsersCreate', + }, + + 'users/list': { + name: 'UsersList', + resourceLogicalId: 'ApiGatewayResourceUsersList', + }, + 'users/update': { + name: 'UsersUpdate', + resourceLogicalId: 'ApiGatewayResourceUsersUpdate', + }, + 'users/delete': { + name: 'UsersDelete', + resourceLogicalId: 'ApiGatewayResourceUsersDelete', + }, }; + }); it('should have request parameters defined when they are set', () => { diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/resources.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/resources.js index 023afe220..c16af05d7 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/resources.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/resources.js @@ -148,7 +148,11 @@ module.exports = { } predefinedResources.forEach(applyResource); - this.validated.events.forEach((event) => applyResource(event.http, true)); + this.validated.events.forEach((event) => { + if (event.http.path) { + applyResource(event.http, true); + } + }); // if predefinedResources array is empty, return all paths if (predefinedResourceNodes.length === 0) { @@ -228,6 +232,11 @@ module.exports = { throw new Error(`Can not find API Gateway resource from path ${path}`); } + if (!this.apiGatewayResources[path].resourceId + && this.apiGatewayResources[path].resourceLogicalId) { + this.apiGatewayResources[path].resourceId = + { Ref: this.apiGatewayResources[path].resourceLogicalId }; + } return this.apiGatewayResources[path].resourceId; }, diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/resources.test.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/resources.test.js index 61c4eb46a..0c5a0e0ca 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/resources.test.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/resources.test.js @@ -70,15 +70,15 @@ describe('#compileResources()', () => { }, }, ]; - expect(awsCompileApigEvents.getResourcePaths()).to.deep.equal([ + expect(Object.keys(awsCompileApigEvents.getResourcePaths())).to.deep.equal([ 'foo', - 'bar', 'foo/bar', + 'bar', 'bar/-', 'bar/foo', 'bar/{id}', - 'bar/{foo_id}', 'bar/{id}/foobar', + 'bar/{foo_id}', 'bar/{foo_id}/foobar', ]); }); @@ -160,12 +160,16 @@ describe('#compileResources()', () => { }, ]; return awsCompileApigEvents.compileResources().then(() => { - expect(awsCompileApigEvents.apiGatewayResourceLogicalIds).to.deep.equal({ + const expectedResourceLogicalIds = { baz: 'ApiGatewayResourceBaz', 'baz/foo': 'ApiGatewayResourceBazFoo', foo: 'ApiGatewayResourceFoo', 'foo/{foo_id}': 'ApiGatewayResourceFooFooidVar', 'foo/{foo_id}/bar': 'ApiGatewayResourceFooFooidVarBar', + }; + Object.keys(expectedResourceLogicalIds).forEach((path) => { + expect(awsCompileApigEvents.apiGatewayResources[path].resourceLogicalId) + .equal(expectedResourceLogicalIds[path]); }); }); }); @@ -186,10 +190,14 @@ describe('#compileResources()', () => { }, ]; return awsCompileApigEvents.compileResources().then(() => { - expect(awsCompileApigEvents.apiGatewayResourceLogicalIds).to.deep.equal({ + const expectedResourceLogicalIds = { foo: 'ApiGatewayResourceFoo', 'foo/bar': 'ApiGatewayResourceFooBar', 'foo/{bar}': 'ApiGatewayResourceFooBarVar', + }; + Object.keys(expectedResourceLogicalIds).forEach((path) => { + expect(awsCompileApigEvents.apiGatewayResources[path].resourceLogicalId) + .equal(expectedResourceLogicalIds[path]); }); }); }); @@ -242,4 +250,64 @@ describe('#compileResources()', () => { .Resources).to.deep.equal({}); }); }); + + it('should create child resources only if there are predefined parent resources', () => { + awsCompileApigEvents.serverless.service.provider.apiGateway = { + restApiId: '6fyzt1pfpk', + restApiRootResourceId: 'z5d4qh4oqi', + restApiResources: { + foo: 'axcybf2i39', + + }, + }; + + awsCompileApigEvents.validated.events = [ + { + http: { + path: 'foo/bar', + method: 'POST', + }, + }, + { + http: { + path: 'bar/-', + method: 'GET', + }, + }, + { + http: { + path: 'bar/foo', + method: 'GET', + }, + }, + { + http: { + path: 'bar/{id}/foobar', + method: 'GET', + }, + }, + { + http: { + path: 'bar/{id}', + method: 'GET', + }, + }, + ]; + return awsCompileApigEvents.compileResources().then(() => { + expect(awsCompileApigEvents.serverless.service.provider.compiledCloudFormationTemplate + .Resources.ApiGatewayResourceFoo).to.equal(undefined); + expect(awsCompileApigEvents.serverless.service.provider.compiledCloudFormationTemplate + .Resources.ApiGatewayResourceBar.Properties.RestApiId) + .to.equal('6fyzt1pfpk'); + expect(awsCompileApigEvents.serverless.service.provider.compiledCloudFormationTemplate + .Resources.ApiGatewayResourceBar.Properties.ParentId) + .to.equal('z5d4qh4oqi'); + expect(awsCompileApigEvents.serverless.service.provider.compiledCloudFormationTemplate + .Resources.ApiGatewayResourceFooBar.Properties.ParentId) + .to.equal('axcybf2i39'); + expect(awsCompileApigEvents.serverless.service.provider.compiledCloudFormationTemplate + .Resources.ApiGatewayResourceBarIdVar.Properties.ParentId.Ref) + .to.equal('ApiGatewayResourceBar'); + }); + }); }); diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/restApi.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/restApi.js index 5cb4749be..1b3113790 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/restApi.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/restApi.js @@ -5,7 +5,8 @@ const BbPromise = require('bluebird'); module.exports = { compileRestApi() { - if (this.serverless.service.provider.apiGateway.restApiId) { + if (this.serverless.service.provider.apiGateway && + this.serverless.service.provider.apiGateway.restApiId) { return BbPromise.resolve(); } diff --git a/lib/plugins/aws/package/compile/events/apiGateway/lib/restApi.test.js b/lib/plugins/aws/package/compile/events/apiGateway/lib/restApi.test.js index 2ebf517fc..3c48ac868 100644 --- a/lib/plugins/aws/package/compile/events/apiGateway/lib/restApi.test.js +++ b/lib/plugins/aws/package/compile/events/apiGateway/lib/restApi.test.js @@ -54,4 +54,20 @@ describe('#compileRestApi()', () => { ); }) ); + + it('should ignore REST API resource creation if there is predefined restApi config', + () => { + awsCompileApigEvents.serverless.service.provider.apiGateway = { + restApiId: '6fyzt1pfpk', + restApiRootResourceId: 'z5d4qh4oqi', + }; + return awsCompileApigEvents + .compileRestApi().then(() => { + expect( + awsCompileApigEvents.serverless.service.provider.compiledCloudFormationTemplate + .Resources + ).to.deep.equal({}); + }); + } + ); }); diff --git a/lib/plugins/aws/provider/awsProvider.js b/lib/plugins/aws/provider/awsProvider.js index 0b158cd79..71d241e91 100644 --- a/lib/plugins/aws/provider/awsProvider.js +++ b/lib/plugins/aws/provider/awsProvider.js @@ -259,7 +259,8 @@ class AwsProvider { * Get API Gateway Rest API ID from serverless config */ getApiGatewayRestApiId() { - if (this.serverless.service.provider.apiGateway.restApiId) { + if (this.serverless.service.provider.apiGateway + && this.serverless.service.provider.apiGateway.restApiId) { return this.serverless.service.provider.apiGateway.restApiId; } @@ -270,7 +271,8 @@ class AwsProvider { * Get Rest API Root Resource ID from serverless config */ getApiGatewayRestApiRootResourceId() { - if (this.serverless.service.provider.apiGateway.restApiRootResourceId) { + if (this.serverless.service.provider.apiGateway + && this.serverless.service.provider.apiGateway.restApiRootResourceId) { return this.serverless.service.provider.apiGateway.restApiRootResourceId; } return { 'Fn::GetAtt': [this.naming.getRestApiLogicalId(), 'RootResourceId'] }; @@ -280,8 +282,24 @@ class AwsProvider { * Get Rest API Predefined Resources from serverless config */ getApiGatewayPredefinedResources() { - return this.serverless.service.provider.apiGateway.restApiResources - ? this.serverless.service.provider.apiGateway.restApiResources : []; + if (!this.serverless.service.provider.apiGateway + || !this.serverless.service.provider.apiGateway.restApiResources) { + return []; + } + + if (Array.isArray(this.serverless.service.provider.apiGateway.restApiResources)) { + return this.serverless.service.provider.apiGateway.restApiResources; + } + + if (typeof this.serverless.service.provider.apiGateway.restApiResources !== 'object') { + throw new Error('REST API resource must be an array of object'); + } + + return Object.keys(this.serverless.service.provider.apiGateway.restApiResources) + .map((key) => ({ + path: key, + resourceId: this.serverless.service.provider.apiGateway.restApiResources[key], + })); } }