Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/run-e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ jobs:
packages/logger,
packages/metrics,
packages/parameters,
packages/event-handler,
packages/tracer,
layers,
]
Expand Down
50 changes: 35 additions & 15 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 7 additions & 4 deletions packages/event-handler/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
"test:unit": "vitest --run",
"test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'",
"test:unit:types": "echo 'Not Implemented'",
"test:e2e:nodejs20x": "echo \"Not implemented\"",
"test:e2e:nodejs22x": "echo \"Not implemented\"",
"test:e2e": "echo \"Not implemented\"",
"test:e2e:nodejs20x": "RUNTIME=nodejs20x vitest run tests/e2e",
"test:e2e:nodejs22x": "RUNTIME=nodejs22x vitest run tests/e2e",
"test:e2e": "npm run test:e2e:nodejs20x",
"build:cjs": "tsc --build tsconfig.cjs.json && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json",
"build:esm": "tsc --build tsconfig.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json",
"build": "npm run build:esm & npm run build:cjs",
Expand Down Expand Up @@ -139,5 +139,8 @@
"nodejs",
"serverless",
"appsync-events"
]
],
"devDependencies": {
"@aws-lambda-powertools/testing-utils": "file:../testing"
}
}
14 changes: 14 additions & 0 deletions packages/event-handler/tests/e2e/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/**
* Resource name prefix for event handler e2e test stacks
*/
export const RESOURCE_NAME_PREFIX = 'EventHandler';

/**
* Stack output key for the API Gateway URL
*/
export const STACK_OUTPUT_API_URL = 'ApiUrl';

/**
* Stack output key for the Lambda function name
*/
export const STACK_OUTPUT_FUNCTION_NAME = 'HttpEventHandler';
75 changes: 75 additions & 0 deletions packages/event-handler/tests/e2e/httpRouter.test.FunctionCode.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest';
import type { Context } from 'aws-lambda';
import { binaryRouter } from './routers/binaryRouter.js';
import { compressRouter } from './routers/compressRouter.js';
import { corsRouter } from './routers/corsRouter.js';
import { errorsRouter } from './routers/errorsRouter.js';
import { methodsRouter } from './routers/methodsRouter.js';
import { middlewareRouter } from './routers/middlewareRouter.js';
import { multiValueHeadersRouter } from './routers/multiValueHeadersRouter.js';
import { nestedRouter } from './routers/nestedRouter.js';
import { paramsRouter } from './routers/paramsRouter.js';

const app = new Router();

// Include all routers with prefixes
app.includeRouter(methodsRouter, { prefix: '/methods' });
app.includeRouter(paramsRouter, { prefix: '/params' });
app.includeRouter(errorsRouter, { prefix: '/errors' });
app.includeRouter(middlewareRouter, { prefix: '/middleware' });
app.includeRouter(nestedRouter, { prefix: '/nested' });
app.includeRouter(corsRouter, { prefix: '/cors' });
app.includeRouter(compressRouter, { prefix: '/compress' });
app.includeRouter(multiValueHeadersRouter, { prefix: '/multi-headers' });
app.includeRouter(binaryRouter, { prefix: '/binary' });

// Request body parsing and headers
app.post('/echo', async ({ req }) => {
const body = await req.json();
const contentType = req.headers.get('content-type');
const customHeader = req.headers.get('x-custom-header');
const multiHeader = req.headers.get('x-multi-header');

return {
body,
headers: {
'content-type': contentType,
'x-custom-header': customHeader,
'x-multi-header': multiHeader,
},
};
});

app.post('/form', async ({ req }) => {
const contentType = req.headers.get('content-type');
const bodyText = await req.text();

return {
contentType,
bodyLength: bodyText.length,
received: true,
};
});

// Custom response with status code and headers
app.get(
'/custom-response',
() =>
new Response(JSON.stringify({ message: 'Custom response' }), {
status: 201,
headers: {
'Content-Type': 'application/json',
'X-Custom-Header': 'custom-value',
'Cache-Control': 'max-age=3600',
},
})
);

// Root path
app.get('/', () => ({
message: 'Root path',
version: '1.0.0',
}));

export const handler = async (event: unknown, context: Context) =>
app.resolve(event, context);
Loading
Loading