UNPKG

iamqp

Version:

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

281 lines (231 loc) 9.23 kB
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