浏览代码

RAI: Add tests

JC Brand 4 年之前
父节点
当前提交
eed9ee8033
共有 4 个文件被更改,包括 101 次插入3 次删除
  1. 1 0
      karma.conf.js
  2. 96 0
      spec/rai.js
  3. 3 2
      src/headless/plugins/chat/model.js
  4. 1 1
      src/headless/plugins/muc/muc.js

+ 1 - 0
karma.conf.js

@@ -50,6 +50,7 @@ module.exports = function(config) {
       { pattern: "spec/styling.js", type: 'module' },
       { pattern: "spec/receipts.js", type: 'module' },
       { pattern: "spec/markers.js", type: 'module' },
+      { pattern: "spec/rai.js", type: 'module' },
       { pattern: "spec/muc_messages.js", type: 'module' },
       { pattern: "spec/me-messages.js", type: 'module' },
       { pattern: "spec/mentions.js", type: 'module' },

+ 96 - 0
spec/rai.js

@@ -0,0 +1,96 @@
+
+/*global mock, converse */
+
+const { Strophe } = converse.env;
+const u = converse.env.utils;
+// See: https://xmpp.org/rfcs/rfc3921.html
+
+
+fdescribe("XEP-0437 Room Activity Indicators", function () {
+
+    it("will be activated for a MUC that becomes hidden",
+        mock.initConverse(
+            ['rosterGroupsFetched'], {'muc_subscribe_to_rai': true},
+            async function (done, _converse) {
+
+        expect(_converse.session.get('rai_enabled_domains')).toBe(undefined);
+
+        const muc_jid = 'lounge@montague.lit';
+        await mock.openAndEnterChatRoom(_converse, muc_jid, 'romeo');
+        const view = _converse.api.chatviews.get(muc_jid);
+        expect(view.model.get('hidden')).toBe(false);
+
+        const sent_IQs = _converse.connection.IQ_stanzas;
+        const iq_get = await u.waitUntil(() => sent_IQs.filter(iq => iq.querySelector(`iq query[xmlns="${Strophe.NS.MAM}"]`)).pop());
+        const first_msg_id = _converse.connection.getUniqueId();
+        const last_msg_id = _converse.connection.getUniqueId();
+        let message = u.toStanza(
+            `<message xmlns="jabber:client"
+                    to="romeo@montague.lit/orchard"
+                    from="${muc_jid}">
+                <result xmlns="urn:xmpp:mam:2" queryid="${iq_get.querySelector('query').getAttribute('queryid')}" id="${first_msg_id}">
+                    <forwarded xmlns="urn:xmpp:forward:0">
+                        <delay xmlns="urn:xmpp:delay" stamp="2018-01-09T06:15:23Z"/>
+                        <message from="${muc_jid}/some1" type="groupchat">
+                            <body>1st MAM Message</body>
+                        </message>
+                    </forwarded>
+                </result>
+            </message>`);
+        _converse.connection._dataRecv(mock.createRequest(message));
+
+        message = u.toStanza(
+            `<message xmlns="jabber:client"
+                    to="romeo@montague.lit/orchard"
+                    from="${muc_jid}">
+                <result xmlns="urn:xmpp:mam:2" queryid="${iq_get.querySelector('query').getAttribute('queryid')}" id="${last_msg_id}">
+                    <forwarded xmlns="urn:xmpp:forward:0">
+                        <delay xmlns="urn:xmpp:delay" stamp="2018-01-09T06:16:23Z"/>
+                        <message from="${muc_jid}/some1" type="groupchat">
+                            <body>2nd MAM Message</body>
+                        </message>
+                    </forwarded>
+                </result>
+            </message>`);
+        _converse.connection._dataRecv(mock.createRequest(message));
+
+        const result = u.toStanza(
+            `<iq type='result' id='${iq_get.getAttribute('id')}'>
+                <fin xmlns='urn:xmpp:mam:2'>
+                    <set xmlns='http://jabber.org/protocol/rsm'>
+                        <first index='0'>${first_msg_id}</first>
+                        <last>${last_msg_id}</last>
+                        <count>2</count>
+                    </set>
+                </fin>
+            </iq>`);
+        _converse.connection._dataRecv(mock.createRequest(result));
+        await u.waitUntil(() => view.model.messages.length === 2);
+
+        const sent_stanzas = [];
+        spyOn(_converse.connection, 'send').and.callFake(s => sent_stanzas.push(s?.nodeTree ?? s));
+        view.model.save({'hidden': true});
+        await u.waitUntil(() => sent_stanzas.length === 3);
+
+        expect(Strophe.serialize(sent_stanzas[0])).toBe(
+            `<message from="${_converse.jid}" id="${sent_stanzas[0].getAttribute('id')}" to="lounge@montague.lit" type="groupchat" xmlns="jabber:client">`+
+                `<received id="${last_msg_id}" xmlns="urn:xmpp:chat-markers:0"/>`+
+            `</message>`
+        );
+        expect(Strophe.serialize(sent_stanzas[1])).toBe(
+            `<presence to="${muc_jid}/romeo" type="unavailable" xmlns="jabber:client">`+
+                `<priority>0</priority>`+
+                `<c hash="sha-1" node="https://conversejs.org" ver="PxXfr6uz8ClMWIga0OB/MhKNH/M=" xmlns="http://jabber.org/protocol/caps"/>`+
+            `</presence>`
+        );
+        expect(Strophe.serialize(sent_stanzas[2])).toBe(
+            `<presence to="montague.lit" xmlns="jabber:client">`+
+                `<priority>0</priority>`+
+                `<c hash="sha-1" node="https://conversejs.org" ver="PxXfr6uz8ClMWIga0OB/MhKNH/M=" xmlns="http://jabber.org/protocol/caps"/>`+
+                `<rai xmlns="urn:xmpp:rai:0"/>`+
+            `</presence>`
+        );
+        done();
+    }));
+
+});

+ 3 - 2
src/headless/plugins/chat/model.js

@@ -584,14 +584,15 @@ const ChatBox = ModelWithContact.extend({
 
     /**
      * Finds the last eligible message and then sends a XEP-0333 chat marker for it.
+     * @param { ('received'|'displayed'|'acknowledged') } [type='displayed']
      * @param { Boolean } force - Whether a marker should be sent for the
      *  message, even if it didn't include a `markable` element.
      */
-    sendMarkerForLastMessage (force=false) {
+    sendMarkerForLastMessage (type='displayed', force=false) {
         const msgs = Array.from(this.messages.models);
         msgs.reverse();
         const msg = msgs.find(m => m.get('sender') === 'them' && (force || m.get('is_markable')));
-        msg && this.sendMarkerForMessage(msg);
+        msg && this.sendMarkerForMessage(msg, type, force);
     },
 
     /**

+ 1 - 1
src/headless/plugins/muc/muc.js

@@ -207,7 +207,7 @@ const ChatRoomMixin = {
      */
     async onHiddenChange () {
         if (this.get('hidden') && api.settings.get('muc_subscribe_to_rai')) {
-            this.sendMarkerForLastMessage(true);
+            this.sendMarkerForLastMessage('received', true);
             if (this.session.get('connection_status') !== converse.ROOMSTATUS.DISCONNECTED) {
                 await this.leave();
             }