summaryrefslogtreecommitdiffstats
path: root/comm/chat/protocols/irc/test/test_ircChannel.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/chat/protocols/irc/test/test_ircChannel.js')
-rw-r--r--comm/chat/protocols/irc/test/test_ircChannel.js187
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");
+});