1 | 'use strict'
|
2 |
|
3 | const assert = require('chai').assert
|
4 | const path = require('path')
|
5 | const aws = require('aws-sdk-mock')
|
6 | aws.setSDK(path.resolve('node_modules/aws-sdk'))
|
7 | const S3Events = require('../lib/s3_events')
|
8 |
|
9 | const 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 |
|
16 | const 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 |
|
31 | let s3Events = null
|
32 |
|
33 |
|
34 | describe('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 | })
|