Skip to content

Commit bd69383

Browse files
authored
test(event-handler): add e2e tests (#4754)
1 parent 972c76f commit bd69383

17 files changed

+1321
-19
lines changed

.github/workflows/run-e2e-tests.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ jobs:
3131
packages/logger,
3232
packages/metrics,
3333
packages/parameters,
34+
packages/event-handler,
3435
packages/tracer,
3536
layers,
3637
]

package-lock.json

Lines changed: 35 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/event-handler/package.json

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
"test:unit": "vitest --run",
1515
"test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'",
1616
"test:unit:types": "echo 'Not Implemented'",
17-
"test:e2e:nodejs20x": "echo \"Not implemented\"",
18-
"test:e2e:nodejs22x": "echo \"Not implemented\"",
19-
"test:e2e": "echo \"Not implemented\"",
17+
"test:e2e:nodejs20x": "RUNTIME=nodejs20x vitest run tests/e2e",
18+
"test:e2e:nodejs22x": "RUNTIME=nodejs22x vitest run tests/e2e",
19+
"test:e2e": "npm run test:e2e:nodejs20x",
2020
"build:cjs": "tsc --build tsconfig.cjs.json && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json",
2121
"build:esm": "tsc --build tsconfig.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json",
2222
"build": "npm run build:esm & npm run build:cjs",
@@ -139,5 +139,8 @@
139139
"nodejs",
140140
"serverless",
141141
"appsync-events"
142-
]
142+
],
143+
"devDependencies": {
144+
"@aws-lambda-powertools/testing-utils": "file:../testing"
145+
}
143146
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/**
2+
* Resource name prefix for event handler e2e test stacks
3+
*/
4+
export const RESOURCE_NAME_PREFIX = 'EventHandler';
5+
6+
/**
7+
* Stack output key for the API Gateway URL
8+
*/
9+
export const STACK_OUTPUT_API_URL = 'ApiUrl';
10+
11+
/**
12+
* Stack output key for the Lambda function name
13+
*/
14+
export const STACK_OUTPUT_FUNCTION_NAME = 'HttpEventHandler';
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest';
2+
import type { Context } from 'aws-lambda';
3+
import { binaryRouter } from './routers/binaryRouter.js';
4+
import { compressRouter } from './routers/compressRouter.js';
5+
import { corsRouter } from './routers/corsRouter.js';
6+
import { errorsRouter } from './routers/errorsRouter.js';
7+
import { methodsRouter } from './routers/methodsRouter.js';
8+
import { middlewareRouter } from './routers/middlewareRouter.js';
9+
import { multiValueHeadersRouter } from './routers/multiValueHeadersRouter.js';
10+
import { nestedRouter } from './routers/nestedRouter.js';
11+
import { paramsRouter } from './routers/paramsRouter.js';
12+
13+
const app = new Router();
14+
15+
// Include all routers with prefixes
16+
app.includeRouter(methodsRouter, { prefix: '/methods' });
17+
app.includeRouter(paramsRouter, { prefix: '/params' });
18+
app.includeRouter(errorsRouter, { prefix: '/errors' });
19+
app.includeRouter(middlewareRouter, { prefix: '/middleware' });
20+
app.includeRouter(nestedRouter, { prefix: '/nested' });
21+
app.includeRouter(corsRouter, { prefix: '/cors' });
22+
app.includeRouter(compressRouter, { prefix: '/compress' });
23+
app.includeRouter(multiValueHeadersRouter, { prefix: '/multi-headers' });
24+
app.includeRouter(binaryRouter, { prefix: '/binary' });
25+
26+
// Request body parsing and headers
27+
app.post('/echo', async ({ req }) => {
28+
const body = await req.json();
29+
const contentType = req.headers.get('content-type');
30+
const customHeader = req.headers.get('x-custom-header');
31+
const multiHeader = req.headers.get('x-multi-header');
32+
33+
return {
34+
body,
35+
headers: {
36+
'content-type': contentType,
37+
'x-custom-header': customHeader,
38+
'x-multi-header': multiHeader,
39+
},
40+
};
41+
});
42+
43+
app.post('/form', async ({ req }) => {
44+
const contentType = req.headers.get('content-type');
45+
const bodyText = await req.text();
46+
47+
return {
48+
contentType,
49+
bodyLength: bodyText.length,
50+
received: true,
51+
};
52+
});
53+
54+
// Custom response with status code and headers
55+
app.get(
56+
'/custom-response',
57+
() =>
58+
new Response(JSON.stringify({ message: 'Custom response' }), {
59+
status: 201,
60+
headers: {
61+
'Content-Type': 'application/json',
62+
'X-Custom-Header': 'custom-value',
63+
'Cache-Control': 'max-age=3600',
64+
},
65+
})
66+
);
67+
68+
// Root path
69+
app.get('/', () => ({
70+
message: 'Root path',
71+
version: '1.0.0',
72+
}));
73+
74+
export const handler = async (event: unknown, context: Context) =>
75+
app.resolve(event, context);

0 commit comments

Comments
 (0)