Skip to content

Commit 377d67e

Browse files
authored
chore: merge pull request #174 from awslabs/develop
2 parents 086714c + 85cbae6 commit 377d67e

File tree

7 files changed

+3379
-1984
lines changed

7 files changed

+3379
-1984
lines changed

.travis.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,16 @@ before_install:
1111
- npm run install-example-dependencies
1212
- echo 'Example dependencies installed!'
1313

14+
# NOTE: forcing Travis to use `npm install` instead of `npm ci`
15+
# which was removing our examples' node_modules
16+
install:
17+
- npm install
18+
1419
jobs:
1520
include:
1621
- stage: test
1722
script:
23+
- pwd
1824
- npm test
1925
- stage: lint
2026
script:
@@ -30,13 +36,12 @@ jobs:
3036
branch: master
3137
skip_cleanup: true
3238
script:
33-
# - npm run security-scan
3439
- npm run release
3540

3641
cache:
3742
directories:
3843
- node_modules
39-
- example/node_modules
44+
- example/basic-starter/node_modules
4045

4146
notifications:
4247
email:

__tests__/integration.js

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const app = require('../examples/basic-starter/app')
66

77
const server = awsServerlessExpress.createServer(app)
88
const lambdaFunction = {
9-
handler: (event, context) => awsServerlessExpress.proxy(server, event, context)
9+
handler: (event, context, resolutionMode, callback) => awsServerlessExpress.proxy(server, event, context, resolutionMode, callback)
1010
}
1111

1212
function clone (json) {
@@ -50,6 +50,20 @@ function makeResponse (response) {
5050
}
5151

5252
describe('integration tests', () => {
53+
test('proxy returns server', (done) => {
54+
const succeed = () => {
55+
done()
56+
}
57+
58+
const server = lambdaFunction.handler(makeEvent({
59+
path: '/',
60+
httpMethod: 'GET'
61+
}), {
62+
succeed
63+
})
64+
expect(server._socketPathSuffix).toBeTruthy()
65+
})
66+
5367
test('GET HTML (initial request)', (done) => {
5468
const succeed = response => {
5569
delete response.headers.date
@@ -82,7 +96,6 @@ describe('integration tests', () => {
8296
succeed
8397
})
8498
})
85-
8699
test('GET JSON collection', (done) => {
87100
const succeed = response => {
88101
delete response.headers.date
@@ -149,6 +162,43 @@ describe('integration tests', () => {
149162
})
150163
})
151164

165+
test('GET JSON single (resolutionMode = CALLBACK)', (done) => {
166+
const callback = (e, response) => {
167+
delete response.headers.date
168+
expect(response).toEqual(makeResponse({
169+
'body': '{"id":1,"name":"Joe"}',
170+
'headers': {
171+
'content-length': '21',
172+
'etag': 'W/"15-rRboW+j/yFKqYqV6yklp53+fANQ"'
173+
}
174+
}))
175+
done()
176+
}
177+
lambdaFunction.handler(makeEvent({
178+
path: '/users/1',
179+
httpMethod: 'GET'
180+
}), {}, 'CALLBACK', callback)
181+
})
182+
183+
test('GET JSON single (resolutionMode = PROMISE)', (done) => {
184+
const succeed = response => {
185+
delete response.headers.date
186+
expect(response).toEqual(makeResponse({
187+
'body': '{"id":1,"name":"Joe"}',
188+
'headers': {
189+
'content-length': '21',
190+
'etag': 'W/"15-rRboW+j/yFKqYqV6yklp53+fANQ"'
191+
}
192+
}))
193+
done()
194+
}
195+
lambdaFunction.handler(makeEvent({
196+
path: '/users/1',
197+
httpMethod: 'GET'
198+
}), {}, 'PROMISE')
199+
.promise.then(succeed)
200+
})
201+
152202
test('GET JSON single 404', (done) => {
153203
const succeed = response => {
154204
delete response.headers.date

__tests__/unit.js

Lines changed: 111 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
'use strict'
2+
3+
const path = require('path')
4+
25
const awsServerlessExpress = require('../src/index')
36

47
test('getPathWithQueryStringParams: no params', () => {
@@ -92,7 +95,9 @@ test('mapApiGatewayEventToHttpRequest: without headers', () => {
9295

9396
test('getSocketPath', () => {
9497
const socketPath = awsServerlessExpress.getSocketPath('12345abcdef')
95-
expect(socketPath).toEqual('/tmp/server-12345abcdef.sock')
98+
const isWin = process.platform === 'win32'
99+
const expectedSocketPath = isWin ? path.join('\\\\?\\\\pipe\\\\', process.cwd(), 'server-12345abcdef') : '/tmp/server-12345abcdef.sock'
100+
expect(socketPath).toBe(expectedSocketPath)
96101
})
97102

98103
const PassThrough = require('stream').PassThrough
@@ -122,6 +127,50 @@ class MockContext {
122127
}
123128
}
124129

130+
describe('forwardConnectionErrorResponseToApiGateway', () => {
131+
test('responds with 502 status', () => {
132+
return new Promise(
133+
(resolve, reject) => {
134+
const context = new MockContext(resolve)
135+
const contextResolver = {
136+
succeed: (p) => context.succeed(p.response)
137+
}
138+
awsServerlessExpress.forwardConnectionErrorResponseToApiGateway('ERROR', contextResolver)
139+
}
140+
).then(successResponse => expect(successResponse).toEqual({
141+
statusCode: 502,
142+
body: '',
143+
headers: {}
144+
}))
145+
})
146+
})
147+
148+
describe('forwardLibraryErrorResponseToApiGateway', () => {
149+
test('responds with 500 status', () => {
150+
return new Promise(
151+
(resolve, reject) => {
152+
const context = new MockContext(resolve)
153+
const contextResolver = {
154+
succeed: (p) => context.succeed(p.response)
155+
}
156+
awsServerlessExpress.forwardLibraryErrorResponseToApiGateway('ERROR', contextResolver)
157+
}
158+
).then(successResponse => expect(successResponse).toEqual({
159+
statusCode: 500,
160+
body: '',
161+
headers: {}
162+
}))
163+
})
164+
})
165+
166+
function getContextResolver (resolve) {
167+
const context = new MockContext(resolve)
168+
const contextResolver = {
169+
succeed: (p) => context.succeed(p.response)
170+
}
171+
172+
return contextResolver
173+
}
125174
describe('forwardResponseToApiGateway: header handling', () => {
126175
test('multiple headers with the same name get transformed', () => {
127176
const server = new MockServer()
@@ -130,9 +179,8 @@ describe('forwardResponseToApiGateway: header handling', () => {
130179
const response = new MockResponse(200, headers, body)
131180
return new Promise(
132181
(resolve, reject) => {
133-
const context = new MockContext(resolve)
134-
awsServerlessExpress.forwardResponseToApiGateway(
135-
server, response, context)
182+
const contextResolver = getContextResolver(resolve)
183+
awsServerlessExpress.forwardResponseToApiGateway(server, response, contextResolver)
136184
}
137185
).then(successResponse => expect(successResponse).toEqual({
138186
statusCode: 200,
@@ -151,9 +199,8 @@ describe('forwardResponseToApiGateway: content-type encoding', () => {
151199
const response = new MockResponse(200, headers, body)
152200
return new Promise(
153201
(resolve, reject) => {
154-
const context = new MockContext(resolve)
155-
awsServerlessExpress.forwardResponseToApiGateway(
156-
server, response, context)
202+
const contextResolver = getContextResolver(resolve)
203+
awsServerlessExpress.forwardResponseToApiGateway(server, response, contextResolver)
157204
}
158205
).then(successResponse => expect(successResponse).toEqual({
159206
statusCode: 200,
@@ -170,9 +217,8 @@ describe('forwardResponseToApiGateway: content-type encoding', () => {
170217
const response = new MockResponse(200, headers, body)
171218
return new Promise(
172219
(resolve, reject) => {
173-
const context = new MockContext(resolve)
174-
awsServerlessExpress.forwardResponseToApiGateway(
175-
server, response, context)
220+
const contextResolver = getContextResolver(resolve)
221+
awsServerlessExpress.forwardResponseToApiGateway(server, response, contextResolver)
176222
}
177223
).then(successResponse => expect(successResponse).toEqual({
178224
statusCode: 200,
@@ -189,9 +235,8 @@ describe('forwardResponseToApiGateway: content-type encoding', () => {
189235
const response = new MockResponse(200, headers, body)
190236
return new Promise(
191237
(resolve, reject) => {
192-
const context = new MockContext(resolve)
193-
awsServerlessExpress.forwardResponseToApiGateway(
194-
server, response, context)
238+
const contextResolver = getContextResolver(resolve)
239+
awsServerlessExpress.forwardResponseToApiGateway(server, response, contextResolver)
195240
}
196241
).then(successResponse => expect(successResponse).toEqual({
197242
statusCode: 200,
@@ -208,9 +253,8 @@ describe('forwardResponseToApiGateway: content-type encoding', () => {
208253
const response = new MockResponse(200, headers, body)
209254
return new Promise(
210255
(resolve, reject) => {
211-
const context = new MockContext(resolve)
212-
awsServerlessExpress.forwardResponseToApiGateway(
213-
server, response, context)
256+
const contextResolver = getContextResolver(resolve)
257+
awsServerlessExpress.forwardResponseToApiGateway(server, response, contextResolver)
214258
}
215259
).then(successResponse => expect(successResponse).toEqual({
216260
statusCode: 200,
@@ -227,9 +271,8 @@ describe('forwardResponseToApiGateway: content-type encoding', () => {
227271
const response = new MockResponse(200, headers, body)
228272
return new Promise(
229273
(resolve, reject) => {
230-
const context = new MockContext(resolve)
231-
awsServerlessExpress.forwardResponseToApiGateway(
232-
server, response, context)
274+
const contextResolver = getContextResolver(resolve)
275+
awsServerlessExpress.forwardResponseToApiGateway(server, response, contextResolver)
233276
}
234277
).then(successResponse => expect(successResponse).toEqual({
235278
statusCode: 200,
@@ -239,3 +282,52 @@ describe('forwardResponseToApiGateway: content-type encoding', () => {
239282
}))
240283
})
241284
})
285+
286+
describe('makeResolver', () => {
287+
test('CONTEXT_SUCCEED (specified)', () => {
288+
return new Promise(
289+
(resolve, reject) => {
290+
const context = new MockContext(resolve)
291+
const contextResolver = awsServerlessExpress.makeResolver({
292+
context,
293+
resolutionMode: 'CONTEXT_SUCCEED'
294+
})
295+
296+
return contextResolver.succeed({
297+
response: 'success'
298+
})
299+
}).then(successResponse => expect(successResponse).toEqual('success'))
300+
})
301+
302+
test('CALLBACK', () => {
303+
const callback = (e, response) => response
304+
const callbackResolver = awsServerlessExpress.makeResolver({
305+
callback,
306+
resolutionMode: 'CALLBACK'
307+
})
308+
const successResponse = callbackResolver.succeed({
309+
response: 'success'
310+
})
311+
312+
expect(successResponse).toEqual('success')
313+
})
314+
315+
test('PROMISE', () => {
316+
return new Promise((resolve, reject) => {
317+
const promise = {
318+
resolve,
319+
reject
320+
}
321+
const promiseResolver = awsServerlessExpress.makeResolver({
322+
promise,
323+
resolutionMode: 'PROMISE'
324+
})
325+
326+
return promiseResolver.succeed({
327+
response: 'success'
328+
})
329+
}).then(successResponse => {
330+
expect(successResponse).toEqual('success')
331+
})
332+
})
333+
})

0 commit comments

Comments
 (0)