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(); }); });