181 lines
3.4 KiB
JavaScript
181 lines
3.4 KiB
JavaScript
'use strict'
|
|
|
|
const { test } = require('tape')
|
|
const mq = require('../')
|
|
|
|
require('../abstractTest')({
|
|
builder: mq,
|
|
test
|
|
})
|
|
|
|
test('queue concurrency', function (t) {
|
|
t.plan(3)
|
|
|
|
const e = mq({ concurrency: 1 })
|
|
let completed1 = false
|
|
|
|
t.equal(e.concurrency, 1)
|
|
|
|
e.on('hello 1', function (message, cb) {
|
|
setTimeout(cb, 10)
|
|
})
|
|
|
|
e.on('hello 2', function (message, cb) {
|
|
cb()
|
|
})
|
|
|
|
e.emit({ topic: 'hello 1' }, function () {
|
|
completed1 = true
|
|
})
|
|
|
|
e.emit({ topic: 'hello 2' }, function () {
|
|
t.ok(completed1, 'the first message must be completed')
|
|
})
|
|
|
|
t.equal(e.length, 1)
|
|
})
|
|
|
|
test('queue released when full', function (t) {
|
|
t.plan(21)
|
|
|
|
const e = mq({ concurrency: 1 })
|
|
|
|
e.on('hello 1', function (message, cb) {
|
|
t.ok(true, 'message received')
|
|
setTimeout(cb, 10)
|
|
})
|
|
|
|
function onSent () {
|
|
t.ok(true, 'message sent')
|
|
}
|
|
|
|
for (let i = 0; i < 9; i++) {
|
|
e._messageQueue.push({ topic: 'hello 1' })
|
|
e._messageCallbacks.push(onSent)
|
|
e.current++
|
|
}
|
|
|
|
e.emit({ topic: 'hello 1' }, onSent)
|
|
|
|
process.once('warning', function (warning) {
|
|
t.equal(warning.message, 'MqEmitter leak detected', 'warning message')
|
|
})
|
|
})
|
|
|
|
test('without any listeners and a callback', function (t) {
|
|
const e = mq()
|
|
const expected = {
|
|
topic: 'hello world',
|
|
payload: { my: 'message' }
|
|
}
|
|
|
|
e.emit(expected, function () {
|
|
t.equal(e.current, 1, 'there 1 message that is being processed')
|
|
e.close(function () {
|
|
t.end()
|
|
})
|
|
})
|
|
})
|
|
|
|
test('queue concurrency with overlapping subscriptions', function (t) {
|
|
t.plan(3)
|
|
|
|
const e = mq({ concurrency: 1 })
|
|
let completed1 = false
|
|
|
|
t.equal(e.concurrency, 1)
|
|
|
|
e.on('000001/021/#', function (message, cb) {
|
|
setTimeout(cb, 10)
|
|
})
|
|
|
|
e.on('000001/021/000B/0001/01', function (message, cb) {
|
|
setTimeout(cb, 20)
|
|
})
|
|
|
|
e.emit({ topic: '000001/021/000B/0001/01' }, function () {
|
|
completed1 = true
|
|
})
|
|
|
|
e.emit({ topic: '000001/021/000B/0001/01' }, function () {
|
|
t.ok(completed1, 'the first message must be completed')
|
|
process.nextTick(function () {
|
|
t.equal(e.current, 0, 'no message is in flight')
|
|
})
|
|
})
|
|
})
|
|
|
|
test('removeListener without a callback does not throw', function (t) {
|
|
const e = mq()
|
|
function fn () {}
|
|
|
|
e.on('hello', fn)
|
|
e.removeListener('hello', fn)
|
|
|
|
t.end()
|
|
})
|
|
|
|
test('removeAllListeners removes listeners', function (t) {
|
|
const e = mq()
|
|
|
|
e.on('hello', function () {
|
|
t.fail('listener called')
|
|
})
|
|
|
|
e.removeAllListeners('hello', function () {
|
|
e.emit({ topic: 'hello' }, function () {
|
|
t.end()
|
|
})
|
|
})
|
|
})
|
|
|
|
test('removeAllListeners without a callback does not throw', function (t) {
|
|
const e = mq()
|
|
function fn () {}
|
|
|
|
e.on('hello', fn)
|
|
e.removeAllListeners('hello')
|
|
|
|
t.end()
|
|
})
|
|
|
|
test('set defaults to opts', function (t) {
|
|
const opts = {}
|
|
mq(opts)
|
|
|
|
t.deepEqual(opts, {
|
|
matchEmptyLevels: true,
|
|
separator: '/',
|
|
wildcardOne: '+',
|
|
wildcardSome: '#'
|
|
})
|
|
|
|
t.end()
|
|
})
|
|
|
|
test('removeListener inside messageHandler', function (t) {
|
|
t.plan(3)
|
|
|
|
const e = mq()
|
|
|
|
function messageHandler1 (message, cb) {
|
|
t.ok(true, 'messageHandler1 called')
|
|
// removes itself
|
|
e.removeListener('hello', messageHandler1)
|
|
cb()
|
|
}
|
|
|
|
e.on('hello', messageHandler1)
|
|
|
|
function messageHandler2 (message, cb) {
|
|
t.ok(true, 'messageHandler2 called')
|
|
cb()
|
|
}
|
|
|
|
e.on('hello', messageHandler2)
|
|
|
|
e.emit({ topic: 'hello' }, function () {
|
|
t.ok(true, 'emit callback received')
|
|
})
|
|
})
|