Skip to content

Commit 973a693

Browse files
committed
refactor(sqs-validation): switch to Joi for sqs validation
1 parent 02d1841 commit 973a693

10 files changed

+130
-189
lines changed

lib/apiGateway/schema.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ const key = Joi.alternatives().try([
102102
)
103103
])
104104

105-
const stringOrGetAtt = (attributeName) => {
105+
const stringOrGetAtt = (propertyName, attributeName) => {
106106
return Joi.alternatives().try([
107107
Joi.string(),
108108
Joi.object({
@@ -118,7 +118,7 @@ const stringOrGetAtt = (attributeName) => {
118118
}).error(
119119
customErrorBuilder(
120120
'object.child',
121-
`"topicName" must be in the format "{ 'Fn::GetAtt': ['<ResourceId>', '${attributeName}'] }"`
121+
`"${propertyName}" must be in the format "{ 'Fn::GetAtt': ['<ResourceId>', '${attributeName}'] }"`
122122
)
123123
)
124124
])
@@ -139,8 +139,15 @@ const proxiesSchemas = {
139139
key: key.required()
140140
})
141141
}),
142-
sns: Joi.object({ sns: proxy.append({ topicName: stringOrGetAtt('TopicName').required() }) }),
143-
sqs: Joi.object({ sqs: proxy.append({ requestParameters }) })
142+
sns: Joi.object({
143+
sns: proxy.append({ topicName: stringOrGetAtt('topicName', 'TopicName').required() })
144+
}),
145+
sqs: Joi.object({
146+
sqs: proxy.append({
147+
queueName: stringOrGetAtt('queueName', 'QueueName').required(),
148+
requestParameters
149+
})
150+
})
144151
}
145152

146153
const schema = Joi.array()

lib/apiGateway/validate.test.js

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ describe('#validateServiceProxies()', () => {
127127
{
128128
sqs: {
129129
path: '/sqs',
130-
method: 'POST'
130+
method: 'POST',
131+
queueName: 'queueName'
131132
}
132133
}
133134
]
@@ -961,13 +962,103 @@ describe('#validateServiceProxies()', () => {
961962
})
962963

963964
describe('sqs', () => {
965+
it('should throw if sqs service is missing the "queueName" property', () => {
966+
serverlessApigatewayServiceProxy.serverless.service.custom = {
967+
apiGatewayServiceProxies: [
968+
{
969+
sqs: {
970+
path: 'sqs',
971+
method: 'post'
972+
}
973+
}
974+
]
975+
}
976+
977+
expect(() => serverlessApigatewayServiceProxy.validateServiceProxies()).to.throw(
978+
serverless.classes.Error,
979+
'child "sqs" fails because [child "queueName" fails because ["queueName" is required]]'
980+
)
981+
})
982+
983+
it('should throw if "queueName" is not a string or an AWS intrinsic "Fn::GetAtt" function', () => {
984+
serverlessApigatewayServiceProxy.serverless.service.custom = {
985+
apiGatewayServiceProxies: [
986+
{
987+
sqs: {
988+
queueName: ['xx', 'yy'],
989+
path: 'sqs',
990+
method: 'post'
991+
}
992+
}
993+
]
994+
}
995+
996+
expect(() => serverlessApigatewayServiceProxy.validateServiceProxies()).to.throw(
997+
serverless.classes.Error,
998+
'child "sqs" fails because [child "queueName" fails because ["queueName" must be a string, "queueName" must be an object]]'
999+
)
1000+
})
1001+
1002+
it('should throw error if the "queueName" property is missing the AWS intrinsic function "Fn::GetAtt"', () => {
1003+
serverlessApigatewayServiceProxy.serverless.service.custom = {
1004+
apiGatewayServiceProxies: [
1005+
{
1006+
sqs: {
1007+
queueName: { xxx: 'sqsStreamResourceId' },
1008+
path: 'sqs',
1009+
method: 'post'
1010+
}
1011+
}
1012+
]
1013+
}
1014+
1015+
expect(() => serverlessApigatewayServiceProxy.validateServiceProxies()).to.throw(
1016+
serverless.classes.Error,
1017+
`child "sqs" fails because [child "queueName" fails because ["queueName" must be a string, "queueName" must be in the format "{ 'Fn::GetAtt': ['<ResourceId>', 'QueueName'] }"]]`
1018+
)
1019+
})
1020+
1021+
it('should not show error if queueName is a string', () => {
1022+
serverlessApigatewayServiceProxy.validated = {
1023+
events: [
1024+
{
1025+
serviceName: 'sqs',
1026+
http: {
1027+
queueName: 'yourQueue',
1028+
path: 'sqs',
1029+
method: 'post'
1030+
}
1031+
}
1032+
]
1033+
}
1034+
1035+
expect(() => serverlessApigatewayServiceProxy.validateServiceProxies()).to.not.throw()
1036+
})
1037+
1038+
it('should not show error if queueName is valid intrinsic function', () => {
1039+
serverlessApigatewayServiceProxy.serverless.service.custom = {
1040+
apiGatewayServiceProxies: [
1041+
{
1042+
sqs: {
1043+
queueName: { 'Fn::GetAtt': ['SQSQueueResourceId', 'QueueName'] },
1044+
path: 'sqs',
1045+
method: 'post'
1046+
}
1047+
}
1048+
]
1049+
}
1050+
1051+
expect(() => serverlessApigatewayServiceProxy.validateServiceProxies()).to.not.throw()
1052+
})
1053+
9641054
it('should throw if requestParameters is not a string to string', () => {
9651055
serverlessApigatewayServiceProxy.serverless.service.custom = {
9661056
apiGatewayServiceProxies: [
9671057
{
9681058
sqs: {
9691059
path: '/sqs',
9701060
method: 'post',
1061+
queueName: 'queueName',
9711062
requestParameters: { key1: 'value', key2: [] }
9721063
}
9731064
}
@@ -980,13 +1071,14 @@ describe('#validateServiceProxies()', () => {
9801071
)
9811072
})
9821073

983-
it('should allow requestParameters to be a string to string mapping', () => {
1074+
it('should not throw if requestParameters is a string to string mapping', () => {
9841075
serverlessApigatewayServiceProxy.serverless.service.custom = {
9851076
apiGatewayServiceProxies: [
9861077
{
9871078
sqs: {
9881079
path: '/sqs',
9891080
method: 'post',
1081+
queueName: 'queueName',
9901082
requestParameters: { key1: 'value', key2: 'value2' }
9911083
}
9921084
}

lib/index.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ const compileKinesisServiceProxy = require('./package/kinesis/compileKinesisServ
1818
// SQS
1919
const compileMethodsToSqs = require('./package/sqs/compileMethodsToSqs')
2020
const compileIamRoleToSqs = require('./package/sqs/compileIamRoleToSqs')
21-
const validateSqsServiceProxy = require('./package/sqs/validateSqsServiceProxy')
2221
const compileSqsServiceProxy = require('./package/sqs/compileSqsServiceProxy')
2322
// S3
2423
const compileMethodsToS3 = require('./package/s3/compileMethodsToS3')
@@ -50,7 +49,6 @@ class ServerlessApigatewayServiceProxy {
5049
compileMethodsToSqs,
5150
compileIamRoleToSqs,
5251
compileSqsServiceProxy,
53-
validateSqsServiceProxy,
5452
compileMethodsToS3,
5553
compileIamRoleToS3,
5654
compileS3ServiceProxy,

lib/package/sqs/compileIamRoleToSqs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
const _ = require('lodash')
33

44
module.exports = {
5-
async compileIamRoleToSqs() {
5+
compileIamRoleToSqs() {
66
const sqsQueueNames = this.getAllServiceProxies()
77
.filter((serviceProxy) => this.getServiceName(serviceProxy) === 'sqs')
88
.map((serviceProxy) => {

lib/package/sqs/compileIamRoleToSqs.test.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ describe('#compileIamRoleToSqs()', () => {
2525
serverlessApigatewayServiceProxy = new ServerlessApigatewayServiceProxy(serverless, options)
2626
})
2727

28-
it('should create corresponding resources when kinesis proxies are given', async () => {
28+
it('should create corresponding resources when kinesis proxies are given', () => {
2929
serverlessApigatewayServiceProxy.serverless.service.custom = {
3030
apiGatewayServiceProxies: [
3131
{
@@ -52,7 +52,8 @@ describe('#compileIamRoleToSqs()', () => {
5252
]
5353
}
5454

55-
await expect(serverlessApigatewayServiceProxy.compileIamRoleToSqs()).to.be.fulfilled
55+
serverlessApigatewayServiceProxy.compileIamRoleToSqs()
56+
5657
expect(serverless.service.provider.compiledCloudFormationTemplate.Resources).to.deep.equal({
5758
ApigatewayToSqsRole: {
5859
Type: 'AWS::IAM::Role',
@@ -107,7 +108,7 @@ describe('#compileIamRoleToSqs()', () => {
107108
})
108109
})
109110

110-
it('should not create corresponding resources when other proxies are given', async () => {
111+
it('should not create corresponding resources when other proxies are given', () => {
111112
serverlessApigatewayServiceProxy.serverless.service.custom = {
112113
apiGatewayServiceProxies: [
113114
{
@@ -119,7 +120,8 @@ describe('#compileIamRoleToSqs()', () => {
119120
]
120121
}
121122

122-
await expect(serverlessApigatewayServiceProxy.compileIamRoleToSqs()).to.be.fulfilled
123+
serverlessApigatewayServiceProxy.compileIamRoleToSqs()
124+
123125
expect(serverless.service.provider.compiledCloudFormationTemplate.Resources).to.be.empty
124126
})
125127
})

lib/package/sqs/compileMethodsToSqs.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
'use strict'
22

3-
const BbPromise = require('bluebird')
43
const _ = require('lodash')
54

65
module.exports = {
7-
async compileMethodsToSqs() {
6+
compileMethodsToSqs() {
87
this.validated.events.forEach((event) => {
98
if (event.serviceName == 'sqs') {
109
const resourceId = this.getResourceId(event.http.path)
@@ -42,8 +41,6 @@ module.exports = {
4241
})
4342
}
4443
})
45-
46-
return BbPromise.resolve()
4744
},
4845

4946
getSqsMethodIntegration(http) {

lib/package/sqs/compileMethodsToSqs.test.js

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ describe('#compileMethodsToSqs()', () => {
2525
serverlessApigatewayServiceProxy = new ServerlessApigatewayServiceProxy(serverless, options)
2626
})
2727

28-
it('should create corresponding resources when sqs proxies are given', async () => {
28+
it('should create corresponding resources when sqs proxies are given', () => {
2929
serverlessApigatewayServiceProxy.validated = {
3030
events: [
3131
{
@@ -49,7 +49,8 @@ describe('#compileMethodsToSqs()', () => {
4949
}
5050
}
5151

52-
await expect(serverlessApigatewayServiceProxy.compileMethodsToSqs()).to.be.fulfilled
52+
serverlessApigatewayServiceProxy.compileMethodsToSqs()
53+
5354
expect(serverless.service.provider.compiledCloudFormationTemplate.Resources).to.deep.equal({
5455
ApiGatewayMethodsqsPost: {
5556
Type: 'AWS::ApiGateway::Method',
@@ -110,7 +111,7 @@ describe('#compileMethodsToSqs()', () => {
110111
})
111112
})
112113

113-
it('should create corresponding resources when sqs proxies are given with cors', async () => {
114+
it('should create corresponding resources when sqs proxies are given with cors', () => {
114115
serverlessApigatewayServiceProxy.validated = {
115116
events: [
116117
{
@@ -148,7 +149,8 @@ describe('#compileMethodsToSqs()', () => {
148149
}
149150
}
150151

151-
await expect(serverlessApigatewayServiceProxy.compileMethodsToSqs()).to.be.fulfilled
152+
serverlessApigatewayServiceProxy.compileMethodsToSqs()
153+
152154
expect(serverless.service.provider.compiledCloudFormationTemplate.Resources).to.deep.equal({
153155
ApiGatewayMethodsqsPost: {
154156
Type: 'AWS::ApiGateway::Method',
@@ -221,7 +223,7 @@ describe('#compileMethodsToSqs()', () => {
221223
})
222224
})
223225

224-
it('should create corresponding resources with "CUSTOM" authorization type', async () => {
226+
it('should create corresponding resources with "CUSTOM" authorization type', () => {
225227
serverlessApigatewayServiceProxy.validated = {
226228
events: [
227229
{
@@ -246,7 +248,8 @@ describe('#compileMethodsToSqs()', () => {
246248
}
247249
}
248250

249-
await expect(serverlessApigatewayServiceProxy.compileMethodsToSqs()).to.be.fulfilled
251+
serverlessApigatewayServiceProxy.compileMethodsToSqs()
252+
250253
expect(serverless.service.provider.compiledCloudFormationTemplate.Resources).to.deep.equal({
251254
ApiGatewayMethodsqsPost: {
252255
Type: 'AWS::ApiGateway::Method',
@@ -307,7 +310,7 @@ describe('#compileMethodsToSqs()', () => {
307310
})
308311
})
309312

310-
it('should create corresponding resources with "COGNITO_USER_POOLS" authorization type', async () => {
313+
it('should create corresponding resources with "COGNITO_USER_POOLS" authorization type', () => {
311314
serverlessApigatewayServiceProxy.validated = {
312315
events: [
313316
{
@@ -332,7 +335,8 @@ describe('#compileMethodsToSqs()', () => {
332335
}
333336
}
334337

335-
await expect(serverlessApigatewayServiceProxy.compileMethodsToSqs()).to.be.fulfilled
338+
serverlessApigatewayServiceProxy.compileMethodsToSqs()
339+
336340
expect(serverless.service.provider.compiledCloudFormationTemplate.Resources).to.deep.equal({
337341
ApiGatewayMethodsqsPost: {
338342
Type: 'AWS::ApiGateway::Method',
@@ -393,7 +397,7 @@ describe('#compileMethodsToSqs()', () => {
393397
})
394398
})
395399

396-
it('should add additional requestParameters', async () => {
400+
it('should add additional requestParameters', () => {
397401
serverlessApigatewayServiceProxy.validated = {
398402
events: [
399403
{
@@ -418,7 +422,8 @@ describe('#compileMethodsToSqs()', () => {
418422
}
419423
}
420424

421-
await expect(serverlessApigatewayServiceProxy.compileMethodsToSqs()).to.be.fulfilled
425+
serverlessApigatewayServiceProxy.compileMethodsToSqs()
426+
422427
expect(serverless.service.provider.compiledCloudFormationTemplate.Resources).to.deep.equal({
423428
ApiGatewayMethodsqsPost: {
424429
Type: 'AWS::ApiGateway::Method',
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
'use strict'
22
module.exports = {
33
async compileSqsServiceProxy() {
4-
await this.validateSqsServiceProxy()
5-
await this.compileIamRoleToSqs()
6-
await this.compileMethodsToSqs()
4+
this.compileIamRoleToSqs()
5+
this.compileMethodsToSqs()
76
}
87
}

0 commit comments

Comments
 (0)