iamqp
Version:
RabbitMQ wrapper for NodeJS with several produce(reply)/consume scenarios
281 lines (231 loc) • 9.23 kB
JavaScript
const iamqp = require('../../../index')
const assert = require('chai').assert
const lodash = require('lodash')
/**
* Plain queue publish/subscribe pattern testing.
*/
function plainTest () {
const amqpURL = 'amqp://localhost'
describe('plain 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 producer = new iamqp.PlainProducer(amqpURL, 'basic_test_channel_A')
const consumer = new iamqp.PlainConsumer(amqpURL, 'basic_test_channel_A')
producer.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `producer ${err.message}`)
})
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.publish(Math.random()), true)
}, 200)
setTimeout(() => {
lodashTest = lodash.isBoolean
assert.strictEqual(producer.publish(true), true)
}, 400)
setTimeout(() => {
lodashTest = lodash.isString
assert.strictEqual(producer.publish('test-string'), true)
}, 600)
setTimeout(() => {
lodashTest = lodash.isArray
assert.strictEqual(producer.publish([
Math.random(),
Math.random().toString(),
{
a: Math.random()
}
]), true)
}, 800)
setTimeout(() => {
assert.strictEqual(messagesCount, 4)
assert.strictEqual(producer.closeConnection(), true)
assert.strictEqual(consumer.closeConnection(), true)
pDone()
}, 1000)
}).timeout(1100)
/**
* Three publishers and one consumer.
* The publishers publish an object with a number in intervals and the consumer sums the number.
*/
it('three publishers and one consumer', (pDone) => {
const producerA = new iamqp.PlainProducer(amqpURL, 'basic_test_channel_B')
const producerB = new iamqp.PlainProducer(amqpURL, 'basic_test_channel_B')
const producerC = new iamqp.PlainProducer(amqpURL, 'basic_test_channel_B')
const consumer = new iamqp.PlainConsumer(amqpURL, 'basic_test_channel_B')
producerA.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `publisherA ${err.message}`)
})
producerB.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `publisherB ${err.message}`)
})
producerC.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `publisherC ${err.message}`)
})
consumer.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `consumer ${err.message}`)
})
let messageSum = 0
consumer.getEventer().on('message', (pMessage) => {
assert.strictEqual(lodash.has(pMessage, 'a'), true, 'consumer missing key "a"')
assert.strictEqual(lodash.isSafeInteger(lodash.get(pMessage, 'a')), true)
assert.strictEqual(lodash.has(pMessage, 'b'), true, 'consumer missing key "b"')
assert.strictEqual(lodash.isString(lodash.get(pMessage, 'b')), true)
messageSum += pMessage.a
})
consumer.openConnection()
producerA.openConnection()
producerB.openConnection()
producerC.openConnection()
setTimeout(() => {
assert.strictEqual(producerA.publish({ a: 1, b: 'b' }), true)
assert.strictEqual(producerB.publish({ a: 2, b: 'b' }), true)
assert.strictEqual(producerC.publish({ a: 3, b: 'b' }), true)
}, 200)
setTimeout(() => {
assert.strictEqual(producerA.publish({ a: 1, b: 'b' }), true)
assert.strictEqual(producerB.publish({ a: 2, b: 'b' }), true)
assert.strictEqual(producerC.publish({ a: 3, b: 'b' }), true)
}, 300)
setTimeout(() => {
assert.strictEqual(messageSum, 12)
assert.strictEqual(producerA.closeConnection(), true)
assert.strictEqual(producerB.closeConnection(), true)
assert.strictEqual(producerC.closeConnection(), true)
assert.strictEqual(consumer.closeConnection(), true)
pDone()
}, 400)
}).timeout(500)
/**
* One publisher and one consumer.
* The publisher publishes in intervals an object with a number and the consumer sums that number.
*/
it('one publisher one consumer', (pDone) => {
const producer = new iamqp.PlainProducer(amqpURL, 'basic_test_channel_C')
const consumer = new iamqp.PlainConsumer(amqpURL, 'basic_test_channel_C')
producer.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `publisher ${err.message}`)
})
consumer.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `consumer ${err.message}`)
})
let messageSum = 0
consumer.getEventer().on('message', (pMessage) => {
assert.strictEqual(lodash.has(pMessage, 'a'), true, 'consumer missing key "a"')
assert.strictEqual(lodash.isSafeInteger(lodash.get(pMessage, 'a')), true)
messageSum += pMessage.a
})
consumer.openConnection()
producer.openConnection()
setTimeout(() => {
assert.strictEqual(producer.publish({ a: 1 }), true)
}, 200)
setTimeout(() => {
assert.strictEqual(producer.publish({ a: 2 }), true)
}, 300)
setTimeout(() => {
assert.strictEqual(producer.publish({ a: 3 }), true)
assert.strictEqual(producer.publish({ a: 4 }), true)
}, 350)
setTimeout(() => {
assert.strictEqual(messageSum, 10)
assert.strictEqual(consumer.closeConnection(), true)
assert.strictEqual(producer.closeConnection(), true)
pDone()
}, 450)
}).timeout(500)
/**
* Given an explicit message TTL, expect the message never to arrive
*/
it('one publisher one consumer test message TTL', (pDone) => {
const producer = new iamqp.PlainProducer(amqpURL, 'basic_test_channel_D', {
queueArguments: {
messageTtl: 1000
}
})
producer.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `publisher ${err.message}`)
})
producer.openConnection()
setTimeout(() => {
assert.strictEqual(producer.publish({ a: 1 }), true)
}, 200)
let messageCount = 0
setTimeout(() => {
const consumer = new iamqp.PlainConsumer(amqpURL, 'basic_test_channel_D', {
queueArguments: {
messageTtl: 1000
}
})
consumer.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `consumer ${err.message}`)
})
consumer.getEventer().on('message', (pMessage) => {
messageCount += 1
})
consumer.openConnection()
}, 1500)
setTimeout(() => {
assert.strictEqual(messageCount, 0, 'no messages should be received')
pDone()
}, 1800)
}).timeout(2000)
it('one publisher one consumer test max message length', (pDone) => {
const producer = new iamqp.PlainProducer(amqpURL, 'basic_test_channel_E', {
queueArguments: {
maxLength: 3
}
})
const consumer = new iamqp.PlainConsumer(amqpURL, 'basic_test_channel_E', {
queueArguments: {
maxLength: 3
}
})
producer.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `publisher ${err.message}`)
})
consumer.getEventer().on('error', (err) => {
assert.strictEqual(err, null, `consumer ${err.message}`)
})
let messageCount = 0
consumer.getEventer().on('message', (pMessage) => {
messageCount += 1
})
producer.openConnection()
setTimeout(() => {
assert.strictEqual(producer.publish({ a: 1 }), true)
assert.strictEqual(producer.publish({ a: 1 }), true)
assert.strictEqual(producer.publish({ a: 1 }), true)
assert.strictEqual(producer.publish({ a: 1 }), true)
assert.strictEqual(producer.publish({ a: 1 }), true)
consumer.openConnection()
}, 200)
setTimeout(() => {
assert.strictEqual(messageCount, 3)
assert.strictEqual(consumer.closeConnection(), true)
assert.strictEqual(producer.closeConnection(), true)
pDone()
}, 450)
}).timeout(500)
})
}
module.exports.run = plainTest