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.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 = {};
});

View File

@ -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', () => {

View File

@ -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;
},

View File

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

View File

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

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
*/
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],
}));
}
}