UNPKG

serverless-offline-streams

Version:

This plugin provides support for event driven systems using Serverless Offline

119 lines (91 loc) 4.51 kB
import {SqsPluginConfiguration} from "../../PluginConfiguration"; import {StringKeyObject} from "../../utils"; import {ParsedFunctionDefinition} from "../../StreamFunctionDefinitions"; import bindHandlersToQueues from "./bindHandlersToQueues"; import {ActiveQueueDef} from "../QueueDef"; import {activeQueueDef} from "../testHelpers"; import {mockClient} from "aws-sdk-client-mock"; import {SQSClient} from "@aws-sdk/client-sqs"; describe('bindHandlersToQueues', () => { const sqsClientMock = mockClient(SQSClient) const sqsClient = sqsClientMock as unknown as SQSClient beforeEach(() => { sqsClientMock.reset() }) const createFunction = (functionName: string, handler: string, queueArns: string[]): StringKeyObject<ParsedFunctionDefinition> => ({ [functionName]: { functionName, handler, events: queueArns.map(arn => ({ type: "SQS", sourceEvent: {sqs: {arn}} })) } }) const arn = (queueName: string) => `arn:aws:sqs:eu-west-1:444455556666:${queueName}` it('binds and merges handlers', () => { const functions: StringKeyObject<ParsedFunctionDefinition> = { ...createFunction('func1', 'handler1', [arn('queue1'), arn('queue2')]), ...createFunction('func2', 'handler2', [arn('queue2'), arn('queue3')]), } const queues: ActiveQueueDef[] = [ activeQueueDef(sqsClient, {name: 'queue1'}), activeQueueDef(sqsClient, {name: 'queue2'}), activeQueueDef(sqsClient, {name: 'queue3'}), ] const config: SqsPluginConfiguration = {errorOnMissingQueueDefinition: true} const boundQueues = bindHandlersToQueues(config, {}, queues, functions) expect(boundQueues.length).toBe(3) expect(boundQueues[0]).toEqual({...queues[0], handlerFunctions: ['func1']}) expect(boundQueues[1]).toEqual({...queues[1], handlerFunctions: ['func1', 'func2']}) expect(boundQueues[2]).toEqual({...queues[2], handlerFunctions: ['func2']}) }) it('throws error if errorOnMissingQueueDefinition=true and queue missing', () => { const functions: StringKeyObject<ParsedFunctionDefinition> = { ...createFunction('func1', 'handler1', [arn('queue2')]), } const queues: ActiveQueueDef[] = [ activeQueueDef(sqsClient, {name: 'queue1'}), ] const config: SqsPluginConfiguration = {errorOnMissingQueueDefinition: true} expect(() => bindHandlersToQueues(config, {}, queues, functions)) .toThrow(`No queue definition with arn: '${arn('queue2')}' found, but it was referenced by an event mapping in function: 'func1'`) }) it('does not error if errorOnMissingQueueDefinition=false and queue missing', () => { const functions: StringKeyObject<ParsedFunctionDefinition> = { ...createFunction('func1', 'handler1', [arn('queue2')]), } const queues: ActiveQueueDef[] = [ activeQueueDef(sqsClient, {name: 'queue1'}), ] const config: SqsPluginConfiguration = {errorOnMissingQueueDefinition: false} const boundQueues = bindHandlersToQueues(config, {}, queues, functions) expect(boundQueues.length).toBe(0) }) it('scans resources for Ref arn', () => { const functions: StringKeyObject<ParsedFunctionDefinition> = { ...createFunction('func1', 'handler1', [arn('queue2')]), } const resources = { k3: {name: "RES3"}, k4: {name: "RES4"} } const queues: ActiveQueueDef[] = [ activeQueueDef(sqsClient, {name: 'queue1'}), ] const config: SqsPluginConfiguration = {errorOnMissingQueueDefinition: false} const boundQueues = bindHandlersToQueues(config, {}, queues, functions) expect(boundQueues.length).toBe(0) }) it('uses alias if name not matched', () => { const functions: StringKeyObject<ParsedFunctionDefinition> = { ...createFunction('func1', 'handler1', ['my-queue-alias']), } const queues: ActiveQueueDef[] = [ activeQueueDef(sqsClient, {name: 'MyQueue', aliases: ['my-queue-alias']}), ] const config: SqsPluginConfiguration = {errorOnMissingQueueDefinition: true} const boundQueues = bindHandlersToQueues(config, {}, queues, functions) expect(boundQueues.length).toBe(1) }) })