UNPKG

message-subscriber

Version:

Subscribe to messages at any Cloud Service. Receive messages only by registering a EventEmitter Listener. (AWS SQS, Azure ESQ, Google Tasks)

227 lines (181 loc) 7.01 kB
import { SQSAdapter } from '../../../src/messageAdapters/SQSAdapter'; import { ChangeMessageVisibilityCommand, DeleteMessageCommand, ReceiveMessageCommand, SQSClient } from '@aws-sdk/client-sqs'; import { AwsClientStub, mockClient } from 'aws-sdk-client-mock'; import { expect } from 'chai'; let sqsMock: AwsClientStub<SQSClient>; describe('SQSAdapter', () => { beforeEach(() => { sqsMock = mockClient(SQSClient); }); afterEach(() => { sqsMock.restore(); }); it('should instanciate with sqs param', () => { new SQSAdapter({ maxNumberOfMessages: 10, queueURL: 'url', sqs: { region: 'us-east-1', }, }); }); describe('delete', () => { it('should call delete', async () => { const sqsAdapter = new SQSAdapter({ maxNumberOfMessages: 10, queueURL: 'url', }); await sqsAdapter.delete('1'); const deleteMessageCommand = new DeleteMessageCommand({ QueueUrl: 'url', ReceiptHandle: '1', }); expect(sqsMock.send.callCount).to.be.eqls(1); expect(sqsMock.call(0).args[0].input).to.eqls(deleteMessageCommand.input); }); it('should call delete on message', async () => { const sqsAdapter = new SQSAdapter({ maxNumberOfMessages: 10, queueURL: 'url', }); sqsMock.on(ReceiveMessageCommand).resolves({ Messages: [{ MessageId: '1', ReceiptHandle: '2', Body: '1', }], }); const deleteCommand = new DeleteMessageCommand({ QueueUrl: 'url', ReceiptHandle: '2', }); const messages = await sqsAdapter.receive(2); await messages[0].delete(); expect(sqsMock.send.callCount).to.be.eqls(2); expect(sqsMock.call(1).args[0].input).to.eqls(deleteCommand.input); }); }); describe('delay', () => { it('should call delay', async () => { const sqsAdapter = new SQSAdapter({ maxNumberOfMessages: 10, queueURL: 'url', }); await sqsAdapter.delay('1', 2); const changeMessageVisibilityCommand = new ChangeMessageVisibilityCommand({ QueueUrl: 'url', ReceiptHandle: '1', VisibilityTimeout: 2, }); expect(sqsMock.send.callCount).to.be.eqls(1); expect(sqsMock.call(0).args[0].input).to.eqls(changeMessageVisibilityCommand.input); }); it('should call delay on message', async () => { const sqsAdapter = new SQSAdapter({ maxNumberOfMessages: 10, queueURL: 'url', }); sqsMock.on(ReceiveMessageCommand).resolves({ Messages: [{ MessageId: '1', ReceiptHandle: '2', Body: '1', }], }); const changeMessageVisibilityCommand = new ChangeMessageVisibilityCommand({ QueueUrl: 'url', ReceiptHandle: '2', VisibilityTimeout: 2, }); const messages = await sqsAdapter.receive(2); await messages[0].delay(2); expect(sqsMock.send.callCount).to.be.eqls(2); expect(sqsMock.call(1).args[0].input).to.eqls(changeMessageVisibilityCommand.input); }); }); describe('receive', () => { it('should not receive Messages', async () => { const sqsAdapter = new SQSAdapter({ maxNumberOfMessages: 10, queueURL: 'url', }); sqsMock.on(ReceiveMessageCommand).resolves({ Messages: undefined, }); const messages = await sqsAdapter.receive(2); expect(messages).to.be.eql([]); }); it('should receive empty Messages', async () => { const sqsAdapter = new SQSAdapter({ maxNumberOfMessages: 10, queueURL: 'url', }); sqsMock.on(ReceiveMessageCommand).resolves({ Messages: [], }); const messages = await sqsAdapter.receive(2); expect(messages).to.be.eql([]); }); it('should receive Messages', async () => { const sqsAdapter = new SQSAdapter({ maxNumberOfMessages: 10, queueURL: 'url', }); sqsMock.on(ReceiveMessageCommand).resolves({ Messages: [{ MessageId: '1', ReceiptHandle: '2', Body: '1', }], }); const messages = await sqsAdapter.receive(2); expect(messages[0].id).to.be.eql('1'); expect(messages[0].receipt).to.be.eql('2'); expect(messages[0].payload).to.be.eql('1'); expect(typeof (messages[0].delete)).to.be.eql('function'); expect(typeof (messages[0].delay)).to.be.eql('function'); }); it('should receive Messages with default max', async () => { const sqsAdapter = new SQSAdapter({ maxNumberOfMessages: 10, queueURL: 'url', }); sqsMock.on(ReceiveMessageCommand).resolves({ Messages: [{ MessageId: '1', ReceiptHandle: '2', Body: '1', }], }); const receiveMessageCommand = new ReceiveMessageCommand({ MaxNumberOfMessages: 10, QueueUrl: 'url', VisibilityTimeout: 30, WaitTimeSeconds: 20, }); await sqsAdapter.receive(); expect(sqsMock.call(0).args[0].input).to.eqls(receiveMessageCommand.input); }); it('should receive Messages with max in parameter', async () => { const sqsAdapter = new SQSAdapter({ maxNumberOfMessages: 10, queueURL: 'url', }); sqsMock.on(ReceiveMessageCommand).resolves({ Messages: [{ MessageId: '1', ReceiptHandle: '2', Body: '1', }], }); const receiveMessageCommand = new ReceiveMessageCommand({ MaxNumberOfMessages: 2, QueueUrl: 'url', VisibilityTimeout: 30, WaitTimeSeconds: 20, }); await sqsAdapter.receive(2); expect(sqsMock.call(0).args[0].input).to.eqls(receiveMessageCommand.input); }); }); });