diff options
Diffstat (limited to 'comm/chat/protocols/irc/test/test_ircChannel.js')
-rw-r--r-- | comm/chat/protocols/irc/test/test_ircChannel.js | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/comm/chat/protocols/irc/test/test_ircChannel.js b/comm/chat/protocols/irc/test/test_ircChannel.js new file mode 100644 index 0000000000..eb8b04dcc7 --- /dev/null +++ b/comm/chat/protocols/irc/test/test_ircChannel.js @@ -0,0 +1,187 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +var { ircChannel } = ChromeUtils.importESModule( + "resource:///modules/ircAccount.sys.mjs" +); + +function waitForTopic(target, targetTopic) { + return new Promise(resolve => { + let observer = { + observe(subject, topic, data) { + if (topic === targetTopic) { + resolve({ subject, data }); + target.removeObserver(observer); + } + }, + }; + target.addObserver(observer); + }); +} + +function getChannel(account) { + const channelStub = { + _observers: [], + _name: "#test", + _account: { + _currentServerName: "test", + imAccount: { + statusInfo: {}, + }, + _nickname: "user", + _activeCAPs: new Set(), + ...account, + }, + }; + Object.setPrototypeOf(channelStub, ircChannel.prototype); + return channelStub; +} + +add_task(async function test_dispatchMessage_normal() { + let didSend = false; + const channelStub = getChannel({ + sendMessage(type, data) { + equal(type, "PRIVMSG"); + deepEqual(data, ["#test", "foo"]); + didSend = true; + return true; + }, + }); + const newText = waitForTopic(channelStub, "new-text"); + channelStub.dispatchMessage("foo"); + ok(didSend); + const { subject: sentMessage } = await newText; + equal(sentMessage.message, "foo"); + ok(sentMessage.outgoing); + ok(!sentMessage.notification); + equal(sentMessage.who, "user"); +}); + +add_task(async function test_dispatchMessage_empty() { + let didSend = false; + const channelStub = getChannel({ + sendMessage(type, data) { + ok(false, "Should not send empty message"); + didSend = true; + return true; + }, + }); + channelStub.writeMessage = () => { + ok(false, "Should not display empty unsent message"); + didSend = true; + }; + ircChannel.prototype.dispatchMessage.call(channelStub, ""); + ok(!didSend); +}); + +add_task(async function test_dispatchMessage_echoed() { + let didSend = false; + let didWrite = false; + const channelStub = getChannel({ + sendMessage(type, data) { + equal(type, "PRIVMSG"); + deepEqual(data, ["#test", "foo"]); + didSend = true; + return true; + }, + }); + channelStub._account._activeCAPs.add("echo-message"); + channelStub.writeMessage = () => { + ok(false, "Should not write message when echo is on"); + didWrite = true; + }; + ircChannel.prototype.dispatchMessage.call(channelStub, "foo"); + ok(didSend); + ok(!didWrite); +}); + +add_task(async function test_dispatchMessage_error() { + let didSend = false; + const channelStub = getChannel({ + sendMessage(type, data) { + equal(type, "PRIVMSG"); + deepEqual(data, ["#test", "foo"]); + didSend = true; + return false; + }, + }); + const newText = waitForTopic(channelStub, "new-text"); + ircChannel.prototype.dispatchMessage.call(channelStub, "foo"); + ok(didSend); + const { subject: writtenMessage } = await newText; + ok(writtenMessage.error); + ok(writtenMessage.system); + equal(writtenMessage.who, "test"); +}); + +add_task(async function test_dispatchMessage_action() { + let didSend = false; + const channelStub = getChannel({ + sendMessage(type, data) { + ok(false, "Action should not be sent as normal message"); + return false; + }, + sendCTCPMessage(target, isNotice, command, params) { + equal(target, "#test"); + ok(!isNotice); + equal(command, "ACTION"); + equal(params, "foo"); + didSend = true; + return true; + }, + }); + const newText = waitForTopic(channelStub, "new-text"); + ircChannel.prototype.dispatchMessage.call(channelStub, "foo", true); + ok(didSend); + const { subject: sentMessage } = await newText; + equal(sentMessage.message, "foo"); + ok(sentMessage.outgoing); + ok(!sentMessage.notification); + ok(sentMessage.action); + equal(sentMessage.who, "user"); +}); + +add_task(async function test_dispatchMessage_actionError() { + let didSend = false; + const channelStub = getChannel({ + sendMessage(type, data) { + ok(false, "Action should not be sent as normal message"); + return false; + }, + sendCTCPMessage(target, isNotice, command, params) { + equal(target, "#test"); + ok(!isNotice); + equal(command, "ACTION"); + equal(params, "foo"); + didSend = true; + return false; + }, + }); + const newText = waitForTopic(channelStub, "new-text"); + ircChannel.prototype.dispatchMessage.call(channelStub, "foo", true); + ok(didSend, "Message was sent"); + const { subject: sentMessage } = await newText; + ok(sentMessage.error, "Shown message is error"); + ok(sentMessage.system, "Shown message is from system"); + equal(sentMessage.who, "test"); +}); + +add_task(async function test_dispatchMessage_notice() { + let didSend = false; + const channelStub = getChannel({ + sendMessage(type, data) { + equal(type, "NOTICE"); + deepEqual(data, ["#test", "foo"]); + didSend = true; + return true; + }, + }); + const newText = waitForTopic(channelStub, "new-text"); + ircChannel.prototype.dispatchMessage.call(channelStub, "foo", false, true); + ok(didSend); + const { subject: sentMessage } = await newText; + equal(sentMessage.message, "foo"); + ok(sentMessage.outgoing); + ok(sentMessage.notification); + equal(sentMessage.who, "user"); +}); |