Bläddra i källkod

bugfix: unaved contacts' `subscription` value is `undefined`, not `'none'`.

JC Brand 1 vecka sedan
förälder
incheckning
e90649d882

+ 1 - 0
karma.conf.js

@@ -135,6 +135,7 @@ module.exports = function(config) {
       { pattern: "src/plugins/rosterview/tests/presence.js", type: 'module' },
       { pattern: "src/plugins/rosterview/tests/protocol.js", type: 'module' },
       { pattern: "src/plugins/rosterview/tests/roster.js", type: 'module' },
+      { pattern: "src/plugins/rosterview/tests/unsaved-contacts.js", type: 'module' },
       { pattern: "src/utils/tests/url.js", type: 'module' },
 
       // For some reason this test causes issues when its run earlier

+ 3 - 4
src/headless/plugins/roster/contacts.js

@@ -22,18 +22,17 @@ class RosterContacts extends Collection {
         this.state = new Model({ id, 'collapsed_groups': [] });
         initStorage(this.state, id);
         this.state.fetch();
-
         api.listen.on('chatBoxClosed',
             /** @param {import('../../shared/chatbox').default} model */
-            (model) => this.onChatBoxClosed(model));
+            (model) => this.removeUnsavedContact(model));
     }
 
     /**
      * @param {import('../../shared/chatbox').default} model
      */
-    onChatBoxClosed(model) {
+    removeUnsavedContact(model) {
         const contact = this.get(model.get('jid'));
-        if (contact?.get('subscription') === 'none') {
+        if (contact && contact.get('subscription') === undefined) {
             contact.destroy();
         }
     }

+ 1 - 1
src/headless/types/plugins/roster/contacts.d.ts

@@ -7,7 +7,7 @@ declare class RosterContacts extends Collection {
     /**
      * @param {import('../../shared/chatbox').default} model
      */
-    onChatBoxClosed(model: import("../../shared/chatbox").default): void;
+    removeUnsavedContact(model: import("../../shared/chatbox").default): void;
     onConnected(): void;
     /**
      * Register a handler for roster IQ "set" stanzas, which update

+ 0 - 75
src/plugins/rosterview/tests/roster.js

@@ -1,5 +1,4 @@
 /*global mock, converse, _ */
-
 const $pres = converse.env.$pres;
 const Strophe = converse.env.Strophe;
 const sizzle = converse.env.sizzle;
@@ -1326,80 +1325,6 @@ describe("The Contacts Roster", function () {
         }));
     });
 
-    describe("An unsaved Contact", function () {
-
-        it("is shown upon receiving a message",
-            mock.initConverse(
-                [], {},
-                async function (_converse) {
-
-            const { api } = _converse;
-            await mock.waitUntilBlocklistInitialized(_converse);
-            await mock.waitForRoster(_converse, "current", 0);
-            await mock.openControlBox(_converse);
-
-            const sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@montague.lit';
-            const msg = stx`
-                <message xmlns='jabber:client'
-                        id='${api.connection.get().getUniqueId()}'
-                        to='${_converse.bare_jid}'
-                        from='${sender_jid}'
-                        type='chat'>
-                    <body>Hello</body>
-                </message>`;
-            await _converse.handleMessageStanza(msg);
-
-            const rosterview = document.querySelector('converse-roster');
-            await u.waitUntil(() => rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length);
-            expect(rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length).toBe(1);
-            const el = rosterview.querySelector(`ul[data-group="Unsaved contacts"] li .contact-name`);
-            expect(el.textContent).toBe('Mercutio');
-        }));
-
-        it("is shown upon receiving a message to a previously removed contact",
-            mock.initConverse(
-                [], { lazy_load_vcards: false },
-                async function (_converse) {
-
-            const { api } = _converse;
-            await mock.waitUntilBlocklistInitialized(_converse);
-            await mock.waitForRoster(_converse, "current", 1);
-            await mock.openControlBox(_converse);
-
-            const sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@montague.lit';
-            let msg = stx`
-                <message xmlns='jabber:client'
-                        id='${api.connection.get().getUniqueId()}'
-                        to='${_converse.bare_jid}'
-                        from='${sender_jid}'
-                        type='chat'>
-                    <body>Hello</body>
-                </message>`;
-            await _converse.handleMessageStanza(msg);
-
-            spyOn(_converse.api, 'confirm').and.returnValue(Promise.resolve(true));
-
-            const rosterview = document.querySelector('converse-roster');
-            rosterview.querySelector(`.remove-xmpp-contact`).click();
-            expect(_converse.api.confirm).toHaveBeenCalled();
-
-            msg = stx`
-                <message xmlns='jabber:client'
-                        id='${api.connection.get().getUniqueId()}'
-                        to='${_converse.bare_jid}'
-                        from='${sender_jid}'
-                        type='chat'>
-                    <body>Why did you remove me?</body>
-                </message>`;
-            await _converse.handleMessageStanza(msg);
-
-            await u.waitUntil(() => rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length);
-            expect(rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length).toBe(1);
-            const el = rosterview.querySelector(`ul[data-group="Unsaved contacts"] li .contact-name`);
-            expect(el.textContent).toBe('Mercutio');
-        }));
-    });
-
     describe("All Contacts", function () {
 
         it("are saved to, and can be retrieved from browserStorage",

+ 103 - 0
src/plugins/rosterview/tests/unsaved-contacts.js

@@ -0,0 +1,103 @@
+const { stx, u } = converse.env;
+
+fdescribe('An unsaved Contact', function () {
+    it(
+        'is shown upon receiving a message',
+        mock.initConverse([], {}, async function (_converse) {
+            const { api } = _converse;
+            await mock.waitUntilBlocklistInitialized(_converse);
+            await mock.waitForRoster(_converse, 'current', 0);
+            await mock.openControlBox(_converse);
+
+            const sender_jid = mock.cur_names[0].replace(/ /g, '.').toLowerCase() + '@montague.lit';
+            const msg = stx`
+                <message xmlns='jabber:client'
+                        id='${api.connection.get().getUniqueId()}'
+                        to='${_converse.bare_jid}'
+                        from='${sender_jid}'
+                        type='chat'>
+                    <body>Hello</body>
+                </message>`;
+            await _converse.handleMessageStanza(msg);
+
+            const rosterview = document.querySelector('converse-roster');
+            await u.waitUntil(() => rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length);
+            expect(rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length).toBe(1);
+            const el = rosterview.querySelector(`ul[data-group="Unsaved contacts"] li .contact-name`);
+            expect(el.textContent).toBe('Mercutio');
+        })
+    );
+
+    it(
+        'is shown upon receiving a message to a previously removed contact',
+        mock.initConverse([], { lazy_load_vcards: false }, async function (_converse) {
+            const { api } = _converse;
+            await mock.waitUntilBlocklistInitialized(_converse);
+            await mock.waitForRoster(_converse, 'current', 1);
+            await mock.openControlBox(_converse);
+
+            const sender_jid = mock.cur_names[0].replace(/ /g, '.').toLowerCase() + '@montague.lit';
+            let msg = stx`
+                <message xmlns='jabber:client'
+                        id='${api.connection.get().getUniqueId()}'
+                        to='${_converse.bare_jid}'
+                        from='${sender_jid}'
+                        type='chat'>
+                    <body>Hello</body>
+                </message>`;
+            await _converse.handleMessageStanza(msg);
+
+            spyOn(_converse.api, 'confirm').and.returnValue(Promise.resolve(true));
+
+            const rosterview = document.querySelector('converse-roster');
+            rosterview.querySelector(`.remove-xmpp-contact`).click();
+            expect(_converse.api.confirm).toHaveBeenCalled();
+
+            msg = stx`
+                <message xmlns='jabber:client'
+                        id='${api.connection.get().getUniqueId()}'
+                        to='${_converse.bare_jid}'
+                        from='${sender_jid}'
+                        type='chat'>
+                    <body>Why did you remove me?</body>
+                </message>`;
+            await _converse.handleMessageStanza(msg);
+
+            await u.waitUntil(() => rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length);
+            expect(rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length).toBe(1);
+            const el = rosterview.querySelector(`ul[data-group="Unsaved contacts"] li .contact-name`);
+            expect(el.textContent).toBe('Mercutio');
+        })
+    );
+
+    it(
+        'is removed again when the chat is closed',
+        mock.initConverse([], {}, async function (_converse) {
+            const { api } = _converse;
+            await mock.waitUntilBlocklistInitialized(_converse);
+            await mock.waitForRoster(_converse, 'current', 0);
+            await mock.openControlBox(_converse);
+
+            const sender_jid = mock.cur_names[0].replace(/ /g, '.').toLowerCase() + '@montague.lit';
+            const msg = stx`
+                <message xmlns='jabber:client'
+                        id='${api.connection.get().getUniqueId()}'
+                        to='${_converse.bare_jid}'
+                        from='${sender_jid}'
+                        type='chat'>
+                    <body>Hello</body>
+                </message>`;
+            await _converse.handleMessageStanza(msg);
+
+            const rosterview = document.querySelector('converse-roster');
+            await u.waitUntil(() => rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length);
+            expect(rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length).toBe(1);
+            const el = rosterview.querySelector(`ul[data-group="Unsaved contacts"] li .contact-name`);
+            expect(el.textContent).toBe('Mercutio');
+
+            const chat = await api.chats.get(sender_jid);
+            chat.close();
+            await u.waitUntil(() => rosterview.querySelectorAll(`ul[data-group="Unsaved contacts"] li`).length === 0);
+        })
+    );
+});