mirror of
https://github.com/serverless/serverless.git
synced 2025-12-08 19:46:03 +00:00
* 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
458 lines
12 KiB
JavaScript
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();
|
|
});
|
|
});
|