UNPKG

iamqp

Version:

RabbitMQ wrapper for NodeJS with several produce(reply)/consume scenarios

298 lines (248 loc) 10.8 kB
const iamqp = require('../../../index') const assert = require('chai').assert const lodash = require('lodash') /** * Fanout publish/subscribe pattern testing. */ function fanoutTest () { const amqpURL = 'amqp://localhost' describe('fanout tests', () => { /** * Test that: * <ul> * <li>numbers</li> * <li>strings</li> * <li>booleans</li> * <li>arrays</li> * </ul> * ... get transmitted. */ it('testing types - number, string, boolean, array', (pDone) => { const consumer = new iamqp.FanoutConsumer(amqpURL, 'test_fanout_channel_A') const producer = new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_A') consumer.getEventer().on('error', (err) => { assert.strictEqual(err, null, `consumer ${err.message}`) }) let messagesCount = 0 let lodashTest = null consumer.getEventer().on('message', (pMessage) => { messagesCount += 1 assert.strictEqual(lodashTest(pMessage), true, `check ${lodashTest} on ${pMessage} failed`) }) consumer.openConnection() producer.openConnection() setTimeout(() => { lodashTest = lodash.isNumber assert.strictEqual(producer.fanout(Math.random()), true) }, 200) setTimeout(() => { lodashTest = lodash.isBoolean assert.strictEqual(producer.fanout(true), true) }, 400) setTimeout(() => { lodashTest = lodash.isString assert.strictEqual(producer.fanout('test-string'), true) }, 600) setTimeout(() => { lodashTest = lodash.isArray assert.strictEqual(producer.fanout([ Math.random(), Math.random().toString(), { a: Math.random() } ]), true) }, 800) setTimeout(() => { assert.strictEqual(messagesCount, 4) assert.strictEqual(consumer.closeConnection(), true) assert.strictEqual(producer.closeConnection(), true) pDone() }, 1000) }).timeout(1100) /** * Three consumers and one producer are initiated. * In intervals, the producer publishes objects with a number that the consumers sum. */ it('three consumers and one producer', (pDone) => { const consumerA = new iamqp.FanoutConsumer(amqpURL, 'test_fanout_channel_B') const consumerB = new iamqp.FanoutConsumer(amqpURL, 'test_fanout_channel_B') const consumerC = new iamqp.FanoutConsumer(amqpURL, 'test_fanout_channel_B') const producer = new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_B') consumerA.getEventer().on('error', (err) => { assert.strictEqual(err, null, `consumerA ${err.message}`) }) consumerB.getEventer().on('error', (err) => { assert.strictEqual(err, null, `consumerB ${err.message}`) }) consumerC.getEventer().on('error', (err) => { assert.strictEqual(err, null, `consumerC ${err.message}`) }) producer.getEventer().on('error', (err) => { assert.strictEqual(err, null, `producerA ${err.message}`) }) const messagesSum = { consumerA: 0, consumerB: 0, consumerC: 0 } consumerA.getEventer().on('message', (pMessage) => { assert.strictEqual(lodash.has(pMessage, 'a'), true) assert.strictEqual(lodash.isSafeInteger(lodash.get(pMessage, 'a')), true) messagesSum.consumerA += pMessage.a }) consumerB.getEventer().on('message', (pMessage) => { assert.strictEqual(lodash.has(pMessage, 'a'), true) assert.strictEqual(lodash.isSafeInteger(lodash.get(pMessage, 'a')), true) messagesSum.consumerB += pMessage.a }) consumerC.getEventer().on('message', (pMessage) => { assert.strictEqual(lodash.has(pMessage, 'a'), true) assert.strictEqual(lodash.isSafeInteger(lodash.get(pMessage, 'a')), true) messagesSum.consumerC += pMessage.a }) consumerA.openConnection() consumerB.openConnection() consumerC.openConnection() producer.openConnection() setTimeout(() => { assert.strictEqual(producer.fanout({ a: 1 }), true) }, 200) setTimeout(() => { assert.strictEqual(producer.fanout({ a: 2 }), true) assert.strictEqual(producer.fanout({ a: 3 }), true) }, 400) setTimeout(() => { assert.strictEqual(messagesSum.consumerA, 6) assert.strictEqual(messagesSum.consumerB, 6) assert.strictEqual(messagesSum.consumerC, 6) assert.strictEqual(consumerA.closeConnection(), true) assert.strictEqual(consumerB.closeConnection(), true) assert.strictEqual(consumerC.closeConnection(), true) assert.strictEqual(producer.closeConnection(), true) pDone() }, 600) }).timeout(800) /** * Two producers and three consumers are initiated. * In intervals, the producers publish objects with a number that the consumers sum. */ it('two producers and three consumer', (pDone) => { const consumerA = new iamqp.FanoutConsumer(amqpURL, 'test_fanout_channel_C') const consumerB = new iamqp.FanoutConsumer(amqpURL, 'test_fanout_channel_C') const consumerC = new iamqp.FanoutConsumer(amqpURL, 'test_fanout_channel_C') const producerA = new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_C') const producerB = new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_C') consumerA.getEventer().on('error', (err) => { assert.strictEqual(err, null, `consumer1 ${err.message}`) }) consumerB.getEventer().on('error', (err) => { assert.strictEqual(err, null, `consumer2 ${err.message}`) }) consumerC.getEventer().on('error', (err) => { assert.strictEqual(err, null, `consumer3 ${err.message}`) }) producerA.getEventer().on('error', (err) => { assert.strictEqual(err, null, `producer1 ${err.message}`) }) producerB.getEventer().on('error', (err) => { assert.strictEqual(err, null, `producer2 ${err.message}`) }) const messagesSum = { consumerA: 0, consumerB: 0, consumerC: 0 } consumerA.getEventer().on('message', (pMessage) => { assert.strictEqual(lodash.has(pMessage, 'a'), true, 'consumerA missing key "b"') assert.strictEqual(lodash.isSafeInteger(lodash.get(pMessage, 'a')), true) messagesSum.consumerA += pMessage.a }) consumerB.getEventer().on('message', (pMessage) => { assert.strictEqual(lodash.has(pMessage, 'b'), true, 'consumerB missing key "b"') assert.strictEqual(lodash.isSafeInteger(lodash.get(pMessage, 'b')), true) messagesSum.consumerB += pMessage.b }) consumerC.getEventer().on('message', (pMessage) => { assert.strictEqual(lodash.has(pMessage, 'c'), true, 'consumerC missing key "b"') assert.strictEqual(lodash.isSafeInteger(lodash.get(pMessage, 'c')), true) messagesSum.consumerC += pMessage.c }) consumerA.openConnection() consumerB.openConnection() consumerC.openConnection() producerA.openConnection() producerB.openConnection() setTimeout(() => { assert.strictEqual(producerA.fanout({ a: 1, b: 2, c: 3 }), true) }, 200) setTimeout(() => { assert.strictEqual(producerA.fanout({ a: 1, b: 2, c: 3 }), true) assert.strictEqual(producerB.fanout({ a: 1, b: 2, c: 3 }), true) assert.strictEqual(producerB.fanout({ a: 1, b: 2, c: 3 }), true) }, 400) setTimeout(() => { assert.strictEqual(messagesSum.consumerA, 4) assert.strictEqual(messagesSum.consumerB, 8) assert.strictEqual(messagesSum.consumerC, 12) assert.strictEqual(consumerA.closeConnection(), true) assert.strictEqual(consumerB.closeConnection(), true) assert.strictEqual(consumerC.closeConnection(), true) assert.strictEqual(producerA.closeConnection(), true) assert.strictEqual(producerB.closeConnection(), true) pDone() }, 600) }).timeout(800) /** * Ten producers and one consumer are initiated. * Each of the producers publishes 100 numbers that the consumer sums. */ it('ten producers and one consumer', (pDone) => { const consumer = new iamqp.FanoutConsumer(amqpURL, 'test_fanout_channel_D') let count = 0 consumer.getEventer().on('error', (err) => { assert.strictEqual(err, null) }) consumer.getEventer().on('message', (pMessage) => { assert.strictEqual(lodash.isNumber(pMessage), true, 'the message received is not a number') count += pMessage }) const producers = [] producers.push(new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_D')) producers.push(new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_D')) producers.push(new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_D')) producers.push(new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_D')) producers.push(new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_D')) producers.push(new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_D')) producers.push(new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_D')) producers.push(new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_D')) producers.push(new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_D')) producers.push(new iamqp.FanoutProducer(amqpURL, 'test_fanout_channel_D')) for (let i = 0; i < producers.length; i++) { producers[i].getEventer().on('error', (err) => { assert.strictEqual(err, null) }) } consumer.openConnection() for (let i = 0; i < producers.length; i++) { producers[i].openConnection() } setTimeout(() => { for (let j = 0; j < 100; j++) { for (let k = 0; k < producers.length; k++) { assert.strictEqual(producers[k].fanout(1), true) } } }, 200) setTimeout(() => { assert.strictEqual(count, 1000, 'the number of messaged not valid') assert.strictEqual(consumer.closeConnection(), true) for (let k = 0; k < producers.length; k++) { assert.strictEqual(producers[k].closeConnection(), true) } pDone() }, 600) }).timeout(800) }) } module.exports.run = fanoutTest