UNPKG

7.34 kBJavaScriptView Raw
1'use strict'
2
3const assert = require('chai').assert
4const path = require('path')
5const aws = require('aws-sdk-mock')
6aws.setSDK(path.resolve('node_modules/aws-sdk'))
7const S3Events = require('../lib/s3_events')
8
9const params = {
10 FunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function',
11 Bucket: 'node-lambda-test-bucket',
12 Events: ['s3:ObjectCreated:*'],
13 Filter: null
14}
15
16const mockResponse = {
17 addPermission: {
18 Statement: JSON.stringify({
19 Sid: 'node-lambda-test-bucket',
20 Resource: 'arn:aws:lambda:node-lambda-test-function',
21 Effect: 'Allow',
22 Principal: { Service: 's3.amazonaws.com' },
23 Action: [ 'lambda:InvokeFunction' ],
24 Condition: { ArnLike: { 'AWS:SourceArn': 'arn:aws:s3:::node-lambda-test-bucket' } }
25 })
26 },
27
28 putBucketNotificationConfiguration: {}
29}
30
31var s3Events = null
32
33/* global before, after, describe, it */
34describe('lib/s3_events', () => {
35 before(() => {
36 aws.mock('Lambda', 'addPermission', (params, callback) => {
37 callback(null, mockResponse.addPermission)
38 })
39 aws.mock('S3', 'putBucketNotificationConfiguration', (params, callback) => {
40 callback(null, mockResponse.putBucketNotificationConfiguration)
41 })
42
43 s3Events = new S3Events(require('aws-sdk'))
44 })
45
46 after(() => {
47 aws.restore('Lambda')
48 aws.restore('S3')
49 })
50
51 describe('_functionName', () => {
52 it('Extract name from FunctionArn', () => {
53 assert.equal(
54 s3Events._functionName(params),
55 'node-lambda-test-function'
56 )
57 })
58 })
59
60 describe('_statementId', () => {
61 it('StatementId that matches /[a-zA-Z0-9-_]+/.', () => {
62 [{
63 params: params,
64 expected: 'node-lambda-test-bucket'
65 }, {
66 params: {Bucket: 'example.com'},
67 expected: 'example_com'
68 }].forEach((test) => {
69 const actual = s3Events._statementId(test.params)
70 assert.equal(actual, test.expected, test)
71 assert.match(actual, /[a-zA-Z0-9-_]+/, test)
72 })
73 })
74 })
75
76 describe('_addPermissionParams', () => {
77 it('Return parameters for lambda.addPermission()', () => {
78 const expected = {
79 Action: 'lambda:InvokeFunction',
80 FunctionName: 'node-lambda-test-function',
81 Principal: 's3.amazonaws.com',
82 SourceArn: 'arn:aws:s3:::node-lambda-test-bucket',
83 StatementId: 'node-lambda-test-bucket'
84 }
85 assert.deepEqual(s3Events._addPermissionParams(params), expected)
86 })
87 })
88
89 describe('_lambdaFunctionConfiguration', () => {
90 it('Return parameters for s3._lambdaFunctionConfiguration(). No Filter', () => {
91 const expected = {
92 Events: ['s3:ObjectCreated:*'],
93 LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
94 }
95 assert.deepEqual(
96 s3Events._lambdaFunctionConfiguration(params),
97 expected
98 )
99 })
100
101 it('Return parameters for s3.putBucketNotificationConfiguration(). Use Filter', () => {
102 const expected = {
103 Events: ['s3:ObjectCreated:*'],
104 LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function',
105 Filter: {
106 Key: {
107 FilterRules: [{
108 Name: 'prefix',
109 Value: 'test-prefix'
110 }]
111 }
112 }
113 }
114 const _params = Object.assign({}, params)
115 _params.Filter = {
116 Key: {
117 FilterRules: [{
118 Name: 'prefix',
119 Value: 'test-prefix'
120 }]
121 }
122 }
123 assert.deepEqual(
124 s3Events._lambdaFunctionConfiguration(_params),
125 expected
126 )
127 })
128 })
129
130 describe('_paramsListToBucketNotificationConfigurations', () => {
131 describe('The number of elements of paramsList is 1', () => {
132 it('Return parameter list of putBucketNotificationConfiguration', () => {
133 const expected = [{
134 Bucket: 'node-lambda-test-bucket',
135 NotificationConfiguration: {
136 LambdaFunctionConfigurations: [{
137 Events: ['s3:ObjectCreated:*'],
138 LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
139 }]
140 }
141 }]
142 assert.deepEqual(
143 s3Events._paramsListToBucketNotificationConfigurations([params]),
144 expected
145 )
146 })
147 })
148 describe('The number of elements of paramsList is 2. Same bucket', () => {
149 it('Return parameter list of putBucketNotificationConfiguration', () => {
150 const expected = [{
151 Bucket: 'node-lambda-test-bucket',
152 NotificationConfiguration: {
153 LambdaFunctionConfigurations: [{
154 Events: ['s3:ObjectCreated:*'],
155 LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
156 }, {
157 Events: ['s3:ObjectDelete:*'],
158 LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
159 }]
160 }
161 }]
162
163 const paramsDeleteEvent = Object.assign({}, params)
164 paramsDeleteEvent.Events = ['s3:ObjectDelete:*']
165 assert.deepEqual(
166 s3Events._paramsListToBucketNotificationConfigurations([
167 params,
168 paramsDeleteEvent
169 ]),
170 expected
171 )
172 })
173 })
174 describe('The number of elements of paramsList is 2. Different bucket', () => {
175 it('Return parameter list of putBucketNotificationConfiguration', () => {
176 const expected = [{
177 Bucket: 'node-lambda-test-bucket',
178 NotificationConfiguration: {
179 LambdaFunctionConfigurations: [{
180 Events: ['s3:ObjectCreated:*'],
181 LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
182 }]
183 }
184 }, {
185 Bucket: 'node-lambda-test-bucket2',
186 NotificationConfiguration: {
187 LambdaFunctionConfigurations: [{
188 Events: ['s3:ObjectCreated:*'],
189 LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
190 }]
191 }
192 }]
193
194 const paramsDifferentBucket = Object.assign({}, params)
195 paramsDifferentBucket.Bucket = 'node-lambda-test-bucket2'
196 assert.deepEqual(
197 s3Events._paramsListToBucketNotificationConfigurations([
198 params,
199 paramsDifferentBucket
200 ]),
201 expected
202 )
203 })
204 })
205 })
206
207 describe('_addPermission', () => {
208 it('using mock', () => {
209 return s3Events._addPermission(params).then(data => {
210 assert.deepEqual(data, mockResponse.addPermission)
211 })
212 })
213 })
214
215 describe('_putBucketNotificationConfiguration', () => {
216 it('using mock', () => {
217 const putBucketNotificationConfigurationParams =
218 s3Events._paramsListToBucketNotificationConfigurations([params])[0]
219 return s3Events._putBucketNotificationConfiguration(putBucketNotificationConfigurationParams).then(data => {
220 assert.deepEqual(data, mockResponse.putBucketNotificationConfiguration)
221 })
222 })
223 })
224
225 describe('add', () => {
226 it('using mock', () => {
227 return s3Events.add([params]).then(data => {
228 assert.deepEqual(data, mockResponse.putBucketNotificationConfiguration)
229 })
230 })
231 })
232})