UNPKG

cq-websocket

Version:

A Node SDK for developing QQ chatbots based on WebSocket, which is depending on CoolQ and CQHTTP API plugin.

199 lines (142 loc) 5.39 kB
const CQWebsocket = require('../..') const traverse = require('../../src/util/traverse') const { test } = require('ava') const NOOP1 = function () {} const NOOP2 = function () {} function countListeners (bot) { let listenerCount = 0 traverse(bot._eventBus._EventMap, (v) => { if (Array.isArray(v)) { listenerCount += v.length } }) return listenerCount } test('#off(): remove all listeners', function (t) { t.plan(4) const bot = new CQWebsocket() bot .on('socket.connect', NOOP1) .on('socket.connect', NOOP2) .on('message.group.@me', NOOP1) .on('request.group.invite', NOOP1) const total1 = bot._eventBus.count('socket.connect') + bot._eventBus.count('message.group.@.me') + bot._eventBus.count('request.group.invite') t.is(total1, 4) t.is(bot._eventBus.count('socket.error'), 1) bot.off() const total2 = bot._eventBus.count('socket.connect') + bot._eventBus.count('message.group.@.me') + bot._eventBus.count('request.group.invite') t.is(total2, 0) t.is(bot._eventBus.count('socket.error'), 1) }) test('#off(event): remove all listeners of the specified event', function (t) { t.plan(2) const bot = new CQWebsocket() bot .on('socket.connect', NOOP1) .on('socket.connect', NOOP2) .on('message.group.@me', NOOP1) .on('request.group.invite', NOOP1) const total1 = bot._eventBus.count('socket.connect') + bot._eventBus.count('message.group.@.me') + bot._eventBus.count('request.group.invite') t.is(total1, 4) bot.off('socket.connect') const total2 = bot._eventBus.count('socket.connect') + bot._eventBus.count('message.group.@.me') + bot._eventBus.count('request.group.invite') t.is(total2, 2) }) test('#off(event, listener): remove a specific listener', function (t) { t.plan(3) const bot = new CQWebsocket() bot .on('socket.connect', NOOP1) .on('socket.connect', NOOP2) .on('message.group.@me', NOOP1) .on('request.group.invite', NOOP1) const total1 = bot._eventBus.count('socket.connect') + bot._eventBus.count('message.group.@.me') + bot._eventBus.count('request.group.invite') t.is(total1, 4) bot.off('socket.connect', NOOP1) const total2 = bot._eventBus.count('socket.connect') + bot._eventBus.count('message.group.@.me') + bot._eventBus.count('request.group.invite') t.is(total2, 3) t.is(bot._eventBus._getHandlerQueue('socket.connect')[0], NOOP2) }) test('#off(event, listener): if a listener is registered via multiple #on()\'s, it should also be removed via multiple #off()\'s.', function (t) { t.plan(5) const bot = new CQWebsocket() bot .on('socket.connect', NOOP1) .on('socket.connect', NOOP1) .on('socket.connect', NOOP1) .on('socket.connect', NOOP1) t.is(bot._eventBus.count('socket.connect'), 4) bot.off('socket.connect', NOOP1) t.is(bot._eventBus.count('socket.connect'), 3) bot.off('socket.connect', NOOP1) t.is(bot._eventBus.count('socket.connect'), 2) bot.off('socket.connect', NOOP1) t.is(bot._eventBus.count('socket.connect'), 1) bot.off('socket.connect', NOOP1) t.is(bot._eventBus.count('socket.connect'), 0) }) test('#off(event, onceListener): should be able to remove once listeners', function (t) { t.plan(2) const bot = new CQWebsocket() .once('message', console.log) t.is(bot._eventBus.count('message'), 1) bot.off('message', console.log) t.is(bot._eventBus.count('message'), 0) }) test('#off(socket.error): remove all socket.error listeners', function (t) { t.plan(2) const func1 = function () {} const bot = new CQWebsocket() .once('socket.error', console.error) .on('socket.error', func1) .on('socket.error', console.error) t.is(bot._eventBus.count('socket.error'), 3) bot.off('socket.error') t.is(bot._eventBus.count('socket.error'), 1) }) test('#off(socket.error, listener): remove specified socket.error listener', function (t) { t.plan(7) const func1 = function () {} const bot = new CQWebsocket() .once('socket.error', console.error) .on('socket.error', func1) .on('socket.error', console.error) t.is(bot._eventBus.count('socket.error'), 3) bot.off('socket.error', func1) t.is(bot._eventBus.count('socket.error'), 2) const queue = bot._eventBus._getHandlerQueue('socket.error') t.not(queue[0], queue[1]) // not the same since queue[0] is a once listener which wraps console.error t.is(queue[0], bot._eventBus._onceListeners.get(console.error)) bot.off('socket.error', console.error) // the once listener is removed since it is registered earlier t.is(bot._eventBus.count('socket.error'), 1) t.is(bot._eventBus._getHandlerQueue('socket.error')[0], console.error) bot.off('socket.error', console.error) t.is(bot._eventBus.count('socket.error'), 1) // default error handler }) test('#off(invalidEvent)', function (t) { t.plan(3) const bot = new CQWebsocket() t.is(countListeners(bot), 1) // default socket.error t.is(bot.off('invalid.event'), bot) t.is(countListeners(bot), 1) // default socket.error }) test('#off(event, not_a_listener)', function (t) { t.plan(3) const bot = new CQWebsocket() .on('message', NOOP1) t.is(countListeners(bot), 2) // default socket.error + NOOP1 t.is(bot.off('message', NOOP2), bot) t.is(countListeners(bot), 2) // default socket.error + NOOP1 })