update predefined resources test

This commit is contained in:
Toan Nguyen 2017-09-09 12:56:42 +07:00
parent e8f09bd6be
commit 85acf54d01
7 changed files with 164 additions and 35 deletions

View File

@ -34,19 +34,28 @@ describe('#compileCors()', () => {
}; };
awsCompileApigEvents = new AwsCompileApigEvents(serverless, options); awsCompileApigEvents = new AwsCompileApigEvents(serverless, options);
awsCompileApigEvents.apiGatewayRestApiLogicalId = 'ApiGatewayRestApi'; awsCompileApigEvents.apiGatewayRestApiLogicalId = 'ApiGatewayRestApi';
awsCompileApigEvents.apiGatewayResourceLogicalIds = { awsCompileApigEvents.apiGatewayResources = {
'users/create': 'ApiGatewayResourceUsersCreate', 'users/create': {
'users/list': 'ApiGatewayResourceUsersList', name: 'UsersCreate',
'users/update': 'ApiGatewayResourceUsersUpdate', resourceLogicalId: 'ApiGatewayResourceUsersCreate',
'users/delete': 'ApiGatewayResourceUsersDelete', },
'users/any': 'ApiGatewayResourceUsersAny',
}; 'users/list': {
awsCompileApigEvents.apiGatewayResourceNames = { name: 'UsersList',
'users/create': 'UsersCreate', resourceLogicalId: 'ApiGatewayResourceUsersList',
'users/list': 'UsersList', },
'users/update': 'UsersUpdate', 'users/update': {
'users/delete': 'UsersDelete', name: 'UsersUpdate',
'users/any': 'UsersAny', resourceLogicalId: 'ApiGatewayResourceUsersUpdate',
},
'users/delete': {
name: 'UsersDelete',
resourceLogicalId: 'ApiGatewayResourceUsersDelete',
},
'users/any': {
name: 'UsersAny',
resourceLogicalId: 'ApiGatewayResourceUsersAny',
},
}; };
awsCompileApigEvents.validated = {}; awsCompileApigEvents.validated = {};
}); });

View File

@ -35,18 +35,26 @@ describe('#compileMethods()', () => {
awsCompileApigEvents = new AwsCompileApigEvents(serverless, options); awsCompileApigEvents = new AwsCompileApigEvents(serverless, options);
awsCompileApigEvents.validated = {}; awsCompileApigEvents.validated = {};
awsCompileApigEvents.apiGatewayRestApiLogicalId = 'ApiGatewayRestApi'; awsCompileApigEvents.apiGatewayRestApiLogicalId = 'ApiGatewayRestApi';
awsCompileApigEvents.apiGatewayResourceLogicalIds = { awsCompileApigEvents.apiGatewayResources = {
'users/create': 'ApiGatewayResourceUsersCreate', 'users/create': {
'users/list': 'ApiGatewayResourceUsersList', name: 'UsersCreate',
'users/update': 'ApiGatewayResourceUsersUpdate', resourceLogicalId: 'ApiGatewayResourceUsersCreate',
'users/delete': 'ApiGatewayResourceUsersDelete', },
};
awsCompileApigEvents.apiGatewayResourceNames = { 'users/list': {
'users/create': 'UsersCreate', name: 'UsersList',
'users/list': 'UsersList', resourceLogicalId: 'ApiGatewayResourceUsersList',
'users/update': 'UsersUpdate', },
'users/delete': 'UsersDelete', 'users/update': {
name: 'UsersUpdate',
resourceLogicalId: 'ApiGatewayResourceUsersUpdate',
},
'users/delete': {
name: 'UsersDelete',
resourceLogicalId: 'ApiGatewayResourceUsersDelete',
},
}; };
}); });
it('should have request parameters defined when they are set', () => { it('should have request parameters defined when they are set', () => {

View File

@ -148,7 +148,11 @@ module.exports = {
} }
predefinedResources.forEach(applyResource); 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 predefinedResources array is empty, return all paths
if (predefinedResourceNodes.length === 0) { if (predefinedResourceNodes.length === 0) {
@ -228,6 +232,11 @@ module.exports = {
throw new Error(`Can not find API Gateway resource from path ${path}`); 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; return this.apiGatewayResources[path].resourceId;
}, },

View File

@ -70,15 +70,15 @@ describe('#compileResources()', () => {
}, },
}, },
]; ];
expect(awsCompileApigEvents.getResourcePaths()).to.deep.equal([ expect(Object.keys(awsCompileApigEvents.getResourcePaths())).to.deep.equal([
'foo', 'foo',
'bar',
'foo/bar', 'foo/bar',
'bar',
'bar/-', 'bar/-',
'bar/foo', 'bar/foo',
'bar/{id}', 'bar/{id}',
'bar/{foo_id}',
'bar/{id}/foobar', 'bar/{id}/foobar',
'bar/{foo_id}',
'bar/{foo_id}/foobar', 'bar/{foo_id}/foobar',
]); ]);
}); });
@ -160,12 +160,16 @@ describe('#compileResources()', () => {
}, },
]; ];
return awsCompileApigEvents.compileResources().then(() => { return awsCompileApigEvents.compileResources().then(() => {
expect(awsCompileApigEvents.apiGatewayResourceLogicalIds).to.deep.equal({ const expectedResourceLogicalIds = {
baz: 'ApiGatewayResourceBaz', baz: 'ApiGatewayResourceBaz',
'baz/foo': 'ApiGatewayResourceBazFoo', 'baz/foo': 'ApiGatewayResourceBazFoo',
foo: 'ApiGatewayResourceFoo', foo: 'ApiGatewayResourceFoo',
'foo/{foo_id}': 'ApiGatewayResourceFooFooidVar', 'foo/{foo_id}': 'ApiGatewayResourceFooFooidVar',
'foo/{foo_id}/bar': 'ApiGatewayResourceFooFooidVarBar', '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(() => { return awsCompileApigEvents.compileResources().then(() => {
expect(awsCompileApigEvents.apiGatewayResourceLogicalIds).to.deep.equal({ const expectedResourceLogicalIds = {
foo: 'ApiGatewayResourceFoo', foo: 'ApiGatewayResourceFoo',
'foo/bar': 'ApiGatewayResourceFooBar', 'foo/bar': 'ApiGatewayResourceFooBar',
'foo/{bar}': 'ApiGatewayResourceFooBarVar', '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({}); .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');
});
});
}); });

View File

@ -5,7 +5,8 @@ const BbPromise = require('bluebird');
module.exports = { module.exports = {
compileRestApi() { compileRestApi() {
if (this.serverless.service.provider.apiGateway.restApiId) { if (this.serverless.service.provider.apiGateway &&
this.serverless.service.provider.apiGateway.restApiId) {
return BbPromise.resolve(); return BbPromise.resolve();
} }

View File

@ -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({});
});
}
);
}); });

View File

@ -259,7 +259,8 @@ class AwsProvider {
* Get API Gateway Rest API ID from serverless config * Get API Gateway Rest API ID from serverless config
*/ */
getApiGatewayRestApiId() { 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; return this.serverless.service.provider.apiGateway.restApiId;
} }
@ -270,7 +271,8 @@ class AwsProvider {
* Get Rest API Root Resource ID from serverless config * Get Rest API Root Resource ID from serverless config
*/ */
getApiGatewayRestApiRootResourceId() { 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 this.serverless.service.provider.apiGateway.restApiRootResourceId;
} }
return { 'Fn::GetAtt': [this.naming.getRestApiLogicalId(), 'RootResourceId'] }; return { 'Fn::GetAtt': [this.naming.getRestApiLogicalId(), 'RootResourceId'] };
@ -280,8 +282,24 @@ class AwsProvider {
* Get Rest API Predefined Resources from serverless config * Get Rest API Predefined Resources from serverless config
*/ */
getApiGatewayPredefinedResources() { getApiGatewayPredefinedResources() {
return this.serverless.service.provider.apiGateway.restApiResources if (!this.serverless.service.provider.apiGateway
? this.serverless.service.provider.apiGateway.restApiResources : []; || !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],
}));
} }
} }