iamqp
Version:
RabbitMQ wrapper for NodeJS with several produce(reply)/consume scenarios
298 lines (248 loc) • 10.8 kB
JavaScript
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