serverless/lib/plugins/aws/dev/local-lambda/test/local-lambda.test.js
Eslam λ Hefnawy 8c02a333d7
feat(dev-mode): Adds dev mode command (#12404)
* feat(dev-mode): adds dev mode command/plugin

* chore(dev-mode): more comments

* chore(dev-mode): fix local lambda tests

* fix(dev-mode): minor fixes for dev mode
2024-03-29 11:18:47 -07:00

458 lines
12 KiB
JavaScript

const path = require('path');
const LocalLambda = require('..');
const context = {
functionName: 'test-lambda',
functionVersion: '$LATEST',
memoryLimitInMB: '1024',
logGroupName: '/aws/lambda/test-lambda',
logStreamName: '2024/03/27/[$LATEST]c1c2c943f42c4038a764938980b95d99',
invokedFunctionArn: 'arn:aws:lambda:us-east-1:552750238299:function:test-lambda',
awsRequestId: 'e70aeb5a-f349-4af5-b22e-defc21581de3',
callbackWaitsForEmptyEventLoop: true,
};
describe('.js functions', () => {
it('should invoke and return the response', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'js'),
handler: 'handlers.hello',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke();
expect(result).toEqual({
response: {
statusCode: 200,
body: 'Hello',
},
error: null,
});
});
it('should pass the event to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'js'),
handler: 'handlers.event',
runtime: 'nodejs20.x',
});
const event = {
foo: 'bar',
};
const result = await localLambda.invoke(event);
expect(result).toEqual({
response: {
statusCode: 200,
body: event,
},
error: null,
});
});
it('should pass the environment to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'js'),
handler: 'handlers.environment',
runtime: 'nodejs20.x',
environment: {
FOO: 'BAR',
},
});
const result = await localLambda.invoke();
expect(result).toEqual({
response: {
statusCode: 200,
body: 'BAR',
},
error: null,
});
});
it('should pass the context to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'js'),
handler: 'handlers.context',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke({}, context);
expect(result.response).toMatchObject(context);
});
it('should pass the callback to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'js'),
handler: 'handlers.callback',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke();
expect(result.response).toEqual('Hello');
});
it('should not reject in case of errors', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'js'),
handler: 'handlers.error',
runtime: 'nodejs20.x',
});
await expect(localLambda.invoke()).resolves.not.toThrow();
});
it('should return error information', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'js'),
handler: 'handlers.error',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke();
expect(result.error.name).toEqual('Error');
expect(result.error.message).toEqual('This error should not fail the test');
expect(result.error.stack).toBeDefined();
});
});
describe('.cjs functions', () => {
it('should invoke and return the response', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'cjs'),
handler: 'handlers.hello',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke();
expect(result).toEqual({
response: {
statusCode: 200,
body: 'Hello',
},
error: null,
});
});
it('should pass the event to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'cjs'),
handler: 'handlers.event',
runtime: 'nodejs20.x',
});
const event = {
foo: 'bar',
};
const result = await localLambda.invoke(event);
expect(result).toEqual({
response: {
statusCode: 200,
body: event,
},
error: null,
});
});
it('should pass the environment to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'cjs'),
handler: 'handlers.environment',
runtime: 'nodejs20.x',
environment: {
FOO: 'BAR',
},
});
const result = await localLambda.invoke();
expect(result).toEqual({
response: {
statusCode: 200,
body: 'BAR',
},
error: null,
});
});
it('should pass the context to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'cjs'),
handler: 'handlers.context',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke({}, context);
expect(result.response).toMatchObject(context);
});
it('should pass the callback to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'cjs'),
handler: 'handlers.callback',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke();
expect(result.response).toEqual('Hello');
});
it('should not reject in case of errors', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'cjs'),
handler: 'handlers.error',
runtime: 'nodejs20.x',
});
await expect(localLambda.invoke()).resolves.not.toThrow();
});
it('should return error information', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'cjs'),
handler: 'handlers.error',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke();
expect(result.error.name).toEqual('Error');
expect(result.error.message).toEqual('This error should not fail the test');
expect(result.error.stack).toBeDefined();
});
});
describe('.mjs functions', () => {
it('should invoke and return response', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'mjs'),
handler: 'handlers.hello',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke({});
expect(result).toEqual({
response: {
statusCode: 200,
body: 'Hello',
},
error: null,
});
});
it('should pass the event to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'mjs'),
handler: 'handlers.event',
runtime: 'nodejs20.x',
});
const event = {
foo: 'bar',
};
const result = await localLambda.invoke(event);
expect(result).toEqual({
response: {
statusCode: 200,
body: event,
},
error: null,
});
});
it('should pass the environment to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'mjs'),
handler: 'handlers.environment',
runtime: 'nodejs20.x',
environment: {
FOO: 'BAR',
},
});
const result = await localLambda.invoke();
expect(result).toEqual({
response: {
statusCode: 200,
body: 'BAR',
},
error: null,
});
});
it('should pass the context to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'mjs'),
handler: 'handlers.context',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke({}, context);
expect(result.response).toMatchObject(context);
});
it('should should not reject in case of errors', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'mjs'),
handler: 'handlers.error',
runtime: 'nodejs20.x',
});
await expect(localLambda.invoke()).resolves.not.toThrow();
});
it('should pass the callback to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'mjs'),
handler: 'handlers.callback',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke();
expect(result.response).toEqual('Hello');
});
it('should return error information', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'mjs'),
handler: 'handlers.error',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke();
expect(result.error.name).toEqual('Error');
expect(result.error.message).toEqual('This error should not fail the test');
expect(result.error.stack).toBeDefined();
});
});
describe('.ts functions', () => {
it('should invoke and return the response', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'ts'),
handler: 'handlers.hello',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke({});
expect(result).toEqual({
response: {
statusCode: 200,
body: 'Hello',
},
error: null,
});
});
it('should pass the event to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'ts'),
handler: 'handlers.event',
runtime: 'nodejs20.x',
});
const event = {
foo: 'bar',
};
const result = await localLambda.invoke(event);
expect(result).toEqual({
response: {
statusCode: 200,
body: event,
},
error: null,
});
});
it('should pass the environment to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'ts'),
handler: 'handlers.environment',
runtime: 'nodejs20.x',
environment: {
FOO: 'BAR',
},
});
const result = await localLambda.invoke();
expect(result).toEqual({
response: {
statusCode: 200,
body: 'BAR',
},
error: null,
});
});
it('should pass the context to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'ts'),
handler: 'handlers.context',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke({}, context);
expect(result.response).toMatchObject(context);
});
it('should pass the callback to the handler', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'ts'),
handler: 'handlers.callback',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke();
expect(result.response).toEqual('Hello');
});
it('should should not reject in case of errors', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'ts'),
handler: 'handlers.error',
runtime: 'nodejs20.x',
});
await expect(localLambda.invoke()).resolves.not.toThrow();
});
it('should return error information', async () => {
const localLambda = new LocalLambda({
serviceAbsolutePath: path.resolve(__dirname, 'handlers', 'ts'),
handler: 'handlers.error',
runtime: 'nodejs20.x',
});
const result = await localLambda.invoke();
expect(result.error.name).toEqual('Error');
expect(result.error.message).toEqual('This error should not fail the test');
expect(result.error.stack).toBeDefined();
});
});