summaryrefslogtreecommitdiffstats
path: root/comm/chat/protocols/matrix/test/test_matrixMessage.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/chat/protocols/matrix/test/test_matrixMessage.js')
-rw-r--r--comm/chat/protocols/matrix/test/test_matrixMessage.js441
1 files changed, 441 insertions, 0 deletions
diff --git a/comm/chat/protocols/matrix/test/test_matrixMessage.js b/comm/chat/protocols/matrix/test/test_matrixMessage.js
new file mode 100644
index 0000000000..4d0d2120ba
--- /dev/null
+++ b/comm/chat/protocols/matrix/test/test_matrixMessage.js
@@ -0,0 +1,441 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const { ReceiptType } = ChromeUtils.importESModule(
+ "resource:///modules/matrix-sdk.sys.mjs"
+);
+
+const kSendReadPref = "purple.conversations.im.send_read";
+
+loadMatrix();
+
+add_task(function test_whenDisplayed() {
+ const mockConv = {
+ _account: {
+ _client: {
+ sendReadReceipt(event, receiptType) {
+ mockConv.readEvent = event;
+ mockConv.receiptType = receiptType;
+ return Promise.resolve();
+ },
+ },
+ },
+ };
+ const message = new MatrixMessage(
+ "foo",
+ "bar",
+ {
+ event: "baz",
+ },
+ mockConv
+ );
+
+ message.whenDisplayed();
+
+ equal(mockConv.readEvent, "baz");
+ equal(
+ mockConv.receiptType,
+ message.hideReadReceipts ? ReceiptType.ReadPrivate : ReceiptType.Read
+ );
+
+ mockConv.readEvent = false;
+
+ message.whenDisplayed();
+ ok(!mockConv.readEvent);
+});
+
+add_task(async function test_whenDisplayedError() {
+ let resolveError;
+ const errorPromise = new Promise(resolve => {
+ resolveError = resolve;
+ });
+ const readReceiptRejection = "foo bar";
+ const mockConv = {
+ ERROR(error) {
+ resolveError(error);
+ },
+ _account: {
+ _client: {
+ sendReadReceipt() {
+ return Promise.reject(readReceiptRejection);
+ },
+ },
+ },
+ };
+ const message = new MatrixMessage(
+ "foo",
+ "bar",
+ {
+ event: "baz",
+ },
+ mockConv
+ );
+
+ message.whenDisplayed();
+ const error = await errorPromise;
+ equal(error, readReceiptRejection);
+});
+
+add_task(function test_whenRead() {
+ const mockConv = {
+ _roomId: "lorem",
+ _account: {
+ _client: {
+ setRoomReadMarkers(roomId, eventId) {
+ mockConv.readRoomId = roomId;
+ mockConv.readEventId = eventId;
+ return Promise.resolve();
+ },
+ },
+ },
+ };
+ const message = new MatrixMessage(
+ "foo",
+ "bar",
+ {
+ event: {
+ getId() {
+ return "baz";
+ },
+ },
+ },
+ mockConv
+ );
+
+ message.whenRead();
+
+ equal(mockConv.readEventId, "baz");
+ equal(mockConv.readRoomId, "lorem");
+
+ mockConv.readEventId = false;
+
+ message.whenRead();
+ ok(!mockConv.readEventId);
+});
+
+add_task(async function test_whenReadError() {
+ let resolveError;
+ const errorPromise = new Promise(resolve => {
+ resolveError = resolve;
+ });
+ const readReceiptRejection = "foo bar";
+ const mockConv = {
+ ERROR(error) {
+ resolveError(error);
+ },
+ _account: {
+ _client: {
+ setRoomReadMarkers() {
+ return Promise.reject(readReceiptRejection);
+ },
+ },
+ },
+ };
+ const message = new MatrixMessage(
+ "foo",
+ "bar",
+ {
+ event: {
+ getId() {
+ return "baz";
+ },
+ },
+ },
+ mockConv
+ );
+
+ message.whenRead();
+ const error = await errorPromise;
+ equal(error, readReceiptRejection);
+});
+
+add_task(async function test_whenDisplayedNoEvent() {
+ const message = new MatrixMessage("foo", "bar", {
+ system: true,
+ });
+
+ message.whenDisplayed();
+
+ ok(!message._displayed);
+});
+
+add_task(async function test_whenReadNoEvent() {
+ const message = new MatrixMessage("foo", "bar", {
+ system: true,
+ });
+
+ message.whenRead();
+
+ ok(!message._read);
+});
+
+add_task(async function test_hideReadReceipts() {
+ const message = new MatrixMessage("foo", "bar", {});
+ const initialSendRead = Services.prefs.getBoolPref(kSendReadPref);
+ strictEqual(message.hideReadReceipts, !initialSendRead);
+ Services.prefs.setBoolPref(kSendReadPref, !initialSendRead);
+ const message2 = new MatrixMessage("lorem", "ipsum", {});
+ strictEqual(message2.hideReadReceipts, initialSendRead);
+ strictEqual(message.hideReadReceipts, !initialSendRead);
+ Services.prefs.setBoolPref(kSendReadPref, initialSendRead);
+});
+
+add_task(async function test_getActions() {
+ const event = makeEvent({
+ type: MatrixSDK.EventType.RoomMessage,
+ });
+ const message = new MatrixMessage(
+ "foo",
+ "bar",
+ { event },
+ {
+ roomState: {
+ maySendRedactionForEvent() {
+ return false;
+ },
+ },
+ }
+ );
+ const actions = message.getActions();
+ ok(Array.isArray(actions));
+ equal(actions.length, 0);
+});
+
+add_task(async function test_getActions_decryptionFailure() {
+ const event = makeEvent({
+ type: MatrixSDK.EventType.RoomMessage,
+ content: {
+ msgtype: "m.bad.encrypted",
+ },
+ });
+ let eventKeysWereRequestedFor;
+ const message = new MatrixMessage(
+ "foo",
+ "bar",
+ { event },
+ {
+ _account: {
+ _client: {
+ cancelAndResendEventRoomKeyRequest(matrixEvent) {
+ eventKeysWereRequestedFor = matrixEvent;
+ return Promise.resolve();
+ },
+ },
+ },
+ roomState: {
+ maySendRedactionForEvent() {
+ return false;
+ },
+ },
+ }
+ );
+ const actions = message.getActions();
+ ok(Array.isArray(actions));
+ equal(actions.length, 1);
+ const [action] = actions;
+ ok(action.label);
+ action.run();
+ strictEqual(eventKeysWereRequestedFor, event);
+});
+
+add_task(async function test_getActions_redact() {
+ const event = makeEvent({
+ type: MatrixSDK.EventType.RoomMessage,
+ content: {
+ msgtype: MatrixSDK.MsgType.Text,
+ body: "foo bar",
+ },
+ roomId: "!actions:example.com",
+ threadRootId: "$thread:example.com",
+ id: "$ev:example.com",
+ });
+ let eventRedacted = false;
+ const message = new MatrixMessage(
+ "foo",
+ "bar",
+ { event },
+ {
+ _account: {
+ userId: 0,
+ _client: {
+ redactEvent(roomId, threadRootId, eventId) {
+ equal(roomId, "!actions:example.com");
+ equal(threadRootId, "$thread:example.com");
+ equal(eventId, "$ev:example.com");
+ eventRedacted = true;
+ return Promise.resolve();
+ },
+ },
+ },
+ roomState: {
+ maySendRedactionForEvent(ev, userId) {
+ equal(ev, event);
+ equal(userId, 0);
+ return true;
+ },
+ },
+ }
+ );
+ const actions = message.getActions();
+ ok(Array.isArray(actions));
+ equal(actions.length, 1);
+ const [action] = actions;
+ ok(action.label);
+ action.run();
+ ok(eventRedacted);
+});
+
+add_task(async function test_getActions_noEvent() {
+ const message = new MatrixMessage("system", "test", {
+ system: true,
+ });
+ const actions = message.getActions();
+ ok(Array.isArray(actions));
+ deepEqual(actions, []);
+});
+
+add_task(async function test_getActions_report() {
+ const event = makeEvent({
+ type: MatrixSDK.EventType.RoomMessage,
+ content: {
+ msgtype: MatrixSDK.MsgType.Text,
+ body: "lorem ipsum",
+ },
+ roomId: "!actions:example.com",
+ id: "$ev:example.com",
+ });
+ let eventReported = false;
+ const message = new MatrixMessage(
+ "user",
+ "lorem ipsum",
+ { event, incoming: true },
+ {
+ _account: {
+ _client: {
+ reportEvent(roomId, eventId, score, reason) {
+ equal(roomId, "!actions:example.com");
+ equal(eventId, "$ev:example.com");
+ equal(score, -100);
+ equal(reason, "");
+ eventReported = true;
+ return Promise.resolve();
+ },
+ },
+ },
+ roomState: {
+ maySendRedactionForEvent(ev, userId) {
+ return false;
+ },
+ },
+ }
+ );
+ const actions = message.getActions();
+ ok(Array.isArray(actions));
+ const [action] = actions;
+ ok(action.label);
+ action.run();
+ ok(eventReported);
+});
+
+add_task(async function test_getActions_notSent() {
+ let resendCalled = false;
+ let cancelCalled = false;
+ const event = makeEvent({
+ status: MatrixSDK.EventStatus.NOT_SENT,
+ type: MatrixSDK.EventType.RoomMessage,
+ content: {
+ msgtype: MatrixSDK.MsgType.Text,
+ body: "foo bar",
+ },
+ });
+ const message = new MatrixMessage(
+ "!test:example.com",
+ "Error sending message",
+ {
+ event,
+ error: true,
+ },
+ {
+ _account: {
+ _client: {
+ resendEvent(ev, room) {
+ equal(ev, event);
+ ok(room);
+ resendCalled = true;
+ },
+ cancelPendingEvent(ev) {
+ equal(ev, event);
+ cancelCalled = true;
+ },
+ },
+ },
+ roomState: {
+ maySendRedactionForEvent(ev, userId) {
+ return false;
+ },
+ },
+ room: {},
+ }
+ );
+ const actions = message.getActions();
+ ok(Array.isArray(actions));
+ equal(actions.length, 2);
+ const [retryAction, cancelAction] = actions;
+ ok(retryAction.label);
+ ok(cancelAction.label);
+ retryAction.run();
+ ok(resendCalled);
+ ok(!cancelCalled);
+ cancelAction.run();
+ ok(cancelCalled);
+});
+
+add_task(function test_whenDisplayedUnsent() {
+ const mockConv = {
+ _account: {
+ _client: {
+ sendReadReceipt(event, options) {
+ ok(false, "Should not send read receipt for unsent event");
+ },
+ },
+ },
+ };
+ const message = new MatrixMessage(
+ "foo",
+ "bar",
+ {
+ event: makeEvent({
+ status: MatrixSDK.EventStatus.NOT_SENT,
+ }),
+ },
+ mockConv
+ );
+
+ message.whenDisplayed();
+ ok(!message._displayed);
+});
+
+add_task(function test_whenReadUnsent() {
+ const mockConv = {
+ _account: {
+ _client: {
+ setRoomReadMarkers(event, options) {
+ ok(false, "Should not send read marker for unsent event");
+ },
+ },
+ },
+ };
+ const message = new MatrixMessage(
+ "foo",
+ "bar",
+ {
+ event: makeEvent({
+ status: MatrixSDK.EventStatus.NOT_SENT,
+ }),
+ },
+ mockConv
+ );
+
+ message.whenRead();
+ ok(!message._read);
+});