Browse Source

Move MUC tests into their own files

JC Brand 3 years ago
parent
commit
523566c218

+ 2 - 0
karma.conf.js

@@ -80,6 +80,8 @@ module.exports = function(config) {
       { pattern: "src/plugins/muc-views/tests/mentions.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/mentions.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/mep.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/mep.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/modtools.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/modtools.js", type: 'module' },
+      { pattern: "src/plugins/muc-views/tests/muc-add-modal.js", type: 'module' },
+      { pattern: "src/plugins/muc-views/tests/muc-list-modal.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/muc-api.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/muc-api.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/muc-mentions.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/muc-mentions.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/muc-messages.js", type: 'module' },
       { pattern: "src/plugins/muc-views/tests/muc-messages.js", type: 'module' },

+ 125 - 0
src/plugins/muc-views/tests/muc-add-modal.js

@@ -0,0 +1,125 @@
+/*global mock, converse */
+
+const {  Promise, sizzle, u } = converse.env;
+
+describe('The "Groupchats" Add modal', function () {
+
+    it('can be opened from a link in the "Groupchats" section of the controlbox',
+        mock.initConverse(['chatBoxesFetched'], {}, async function (_converse) {
+            await mock.openControlBox(_converse);
+            await mock.waitForRoster(_converse, 'current', 0);
+
+            const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
+            roomspanel.querySelector('.show-add-muc-modal').click();
+            mock.closeControlBox(_converse);
+            const modal = _converse.api.modal.get('add-chatroom-modal');
+            await u.waitUntil(() => u.isVisible(modal.el), 1000);
+
+            let label_name = modal.el.querySelector('label[for="chatroom"]');
+            expect(label_name.textContent.trim()).toBe('Groupchat address:');
+            let name_input = modal.el.querySelector('input[name="chatroom"]');
+            expect(name_input.placeholder).toBe('name@conference.example.org');
+
+            const label_nick = modal.el.querySelector('label[for="nickname"]');
+            expect(label_nick.textContent.trim()).toBe('Nickname:');
+            const nick_input = modal.el.querySelector('input[name="nickname"]');
+            expect(nick_input.value).toBe('');
+            nick_input.value = 'romeo';
+
+            expect(modal.el.querySelector('.modal-title').textContent.trim()).toBe('Enter a new Groupchat');
+            spyOn(_converse.ChatRoom.prototype, 'getDiscoInfo').and.callFake(() => Promise.resolve());
+            modal.el.querySelector('input[name="chatroom"]').value = 'lounce@muc.montague.lit';
+            modal.el.querySelector('form input[type="submit"]').click();
+            await u.waitUntil(() => _converse.chatboxes.length);
+            await u.waitUntil(() => sizzle('.chatroom', _converse.el).filter(u.isVisible).length === 1);
+
+            roomspanel.model.set('muc_domain', 'muc.example.org');
+            roomspanel.querySelector('.show-add-muc-modal').click();
+            label_name = modal.el.querySelector('label[for="chatroom"]');
+            expect(label_name.textContent.trim()).toBe('Groupchat address:');
+            name_input = modal.el.querySelector('input[name="chatroom"]');
+            expect(name_input.placeholder).toBe('name@muc.example.org');
+        })
+    );
+
+    it("doesn't require the domain when muc_domain is set",
+        mock.initConverse(['chatBoxesFetched'], { 'muc_domain': 'muc.example.org' }, async function (_converse) {
+            await mock.openControlBox(_converse);
+            const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
+            roomspanel.querySelector('.show-add-muc-modal').click();
+            const modal = _converse.api.modal.get('add-chatroom-modal');
+            await u.waitUntil(() => u.isVisible(modal.el), 1000);
+            expect(modal.el.querySelector('.modal-title').textContent.trim()).toBe('Enter a new Groupchat');
+            spyOn(_converse.ChatRoom.prototype, 'getDiscoInfo').and.callFake(() => Promise.resolve());
+            const label_name = modal.el.querySelector('label[for="chatroom"]');
+            expect(label_name.textContent.trim()).toBe('Groupchat name:');
+            let name_input = modal.el.querySelector('input[name="chatroom"]');
+            expect(name_input.placeholder).toBe('name@muc.example.org');
+            name_input.value = 'lounge';
+            let nick_input = modal.el.querySelector('input[name="nickname"]');
+            nick_input.value = 'max';
+
+            modal.el.querySelector('form input[type="submit"]').click();
+            await u.waitUntil(() => _converse.chatboxes.length);
+            await u.waitUntil(() => sizzle('.chatroom', _converse.el).filter(u.isVisible).length === 1);
+            expect(_converse.chatboxes.models.map(m => m.get('id')).includes('lounge@muc.example.org')).toBe(true);
+
+            // However, you can still open MUCs with different domains
+            roomspanel.querySelector('.show-add-muc-modal').click();
+            await u.waitUntil(() => u.isVisible(modal.el), 1000);
+            name_input = modal.el.querySelector('input[name="chatroom"]');
+            name_input.value = 'lounge@conference.example.org';
+            nick_input = modal.el.querySelector('input[name="nickname"]');
+            nick_input.value = 'max';
+            modal.el.querySelector('form input[type="submit"]').click();
+            await u.waitUntil(() => _converse.chatboxes.models.filter(c => c.get('type') === 'chatroom').length === 2);
+            await u.waitUntil(() => sizzle('.chatroom', _converse.el).filter(u.isVisible).length === 2);
+            expect(_converse.chatboxes.models.map(m => m.get('id')).includes('lounge@conference.example.org')).toBe(
+                true
+            );
+        })
+    );
+
+    it('only uses the muc_domain is locked_muc_domain is true',
+        mock.initConverse(
+            ['chatBoxesFetched'],
+            { 'muc_domain': 'muc.example.org', 'locked_muc_domain': true },
+            async function (_converse) {
+                await mock.openControlBox(_converse);
+                const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
+                roomspanel.querySelector('.show-add-muc-modal').click();
+                const modal = _converse.api.modal.get('add-chatroom-modal');
+                await u.waitUntil(() => u.isVisible(modal.el), 1000);
+                expect(modal.el.querySelector('.modal-title').textContent.trim()).toBe('Enter a new Groupchat');
+                spyOn(_converse.ChatRoom.prototype, 'getDiscoInfo').and.callFake(() => Promise.resolve());
+                const label_name = modal.el.querySelector('label[for="chatroom"]');
+                expect(label_name.textContent.trim()).toBe('Groupchat name:');
+                let name_input = modal.el.querySelector('input[name="chatroom"]');
+                expect(name_input.placeholder).toBe('');
+                name_input.value = 'lounge';
+                let nick_input = modal.el.querySelector('input[name="nickname"]');
+                nick_input.value = 'max';
+                modal.el.querySelector('form input[type="submit"]').click();
+                await u.waitUntil(() => _converse.chatboxes.length);
+                await u.waitUntil(() => sizzle('.chatroom', _converse.el).filter(u.isVisible).length === 1);
+                expect(_converse.chatboxes.models.map(m => m.get('id')).includes('lounge@muc.example.org')).toBe(true);
+
+                // However, you can still open MUCs with different domains
+                roomspanel.querySelector('.show-add-muc-modal').click();
+                await u.waitUntil(() => u.isVisible(modal.el), 1000);
+                name_input = modal.el.querySelector('input[name="chatroom"]');
+                name_input.value = 'lounge@conference';
+                nick_input = modal.el.querySelector('input[name="nickname"]');
+                nick_input.value = 'max';
+                modal.el.querySelector('form input[type="submit"]').click();
+                await u.waitUntil(
+                    () => _converse.chatboxes.models.filter(c => c.get('type') === 'chatroom').length === 2
+                );
+                await u.waitUntil(() => sizzle('.chatroom', _converse.el).filter(u.isVisible).length === 2);
+                expect(
+                    _converse.chatboxes.models.map(m => m.get('id')).includes('lounge\\40conference@muc.example.org')
+                ).toBe(true);
+            }
+        )
+    );
+});

+ 141 - 0
src/plugins/muc-views/tests/muc-list-modal.js

@@ -0,0 +1,141 @@
+/*global mock, converse */
+
+const { $iq, Strophe, Promise, sizzle, u } = converse.env;
+
+describe('The "Groupchats" List modal', function () {
+
+    it('can be opened from a link in the "Groupchats" section of the controlbox',
+        mock.initConverse(['chatBoxesFetched'], {}, async function (_converse) {
+            await mock.openControlBox(_converse);
+            const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
+            roomspanel.querySelector('.show-list-muc-modal').click();
+            mock.closeControlBox(_converse);
+            const modal = _converse.api.modal.get('muc-list-modal');
+            await u.waitUntil(() => u.isVisible(modal.el), 1000);
+            spyOn(_converse.ChatRoom.prototype, 'getDiscoInfo').and.callFake(() => Promise.resolve());
+
+            // See: https://xmpp.org/extensions/xep-0045.html#disco-rooms
+            expect(modal.el.querySelectorAll('.available-chatrooms li').length).toBe(0);
+
+            const server_input = modal.el.querySelector('input[name="server"]');
+            expect(server_input.placeholder).toBe('conference.example.org');
+            server_input.value = 'chat.shakespeare.lit';
+            modal.el.querySelector('input[type="submit"]').click();
+            await u.waitUntil(() => _converse.chatboxes.length);
+
+            const IQ_stanzas = _converse.connection.IQ_stanzas;
+            const sent_stanza = await u.waitUntil(() =>
+                IQ_stanzas.filter(s => sizzle(`query[xmlns="${Strophe.NS.DISCO_ITEMS}"]`, s).length).pop()
+            );
+            const id = sent_stanza.getAttribute('id');
+            expect(Strophe.serialize(sent_stanza)).toBe(
+                `<iq from="romeo@montague.lit/orchard" id="${id}" ` +
+                    `to="chat.shakespeare.lit" ` +
+                    `type="get" ` +
+                    `xmlns="jabber:client">` +
+                        `<query xmlns="http://jabber.org/protocol/disco#items"/>` +
+                    `</iq>`
+            );
+            const iq = $iq({
+                'from': 'muc.montague.lit',
+                'to': 'romeo@montague.lit/pda',
+                'id': id,
+                'type': 'result',
+            })
+                .c('query')
+                .c('item', { jid: 'heath@chat.shakespeare.lit', name: 'A Lonely Heath' }).up()
+                .c('item', { jid: 'coven@chat.shakespeare.lit', name: 'A Dark Cave' }).up()
+                .c('item', { jid: 'forres@chat.shakespeare.lit', name: 'The Palace' }).up()
+                .c('item', { jid: 'inverness@chat.shakespeare.lit', name: 'Macbeth&apos;s Castle' }).up()
+                .c('item', { jid: 'orchard@chat.shakespeare.lit', name: "Capulet's Orchard" }).up()
+                .c('item', { jid: 'friar@chat.shakespeare.lit', name: "Friar Laurence's cell" }).up()
+                .c('item', { jid: 'hall@chat.shakespeare.lit', name: "Hall in Capulet's house" }).up()
+                .c('item', { jid: 'chamber@chat.shakespeare.lit', name: "Juliet's chamber" }).up()
+                .c('item', { jid: 'public@chat.shakespeare.lit', name: 'A public place' }).up()
+                .c('item', { jid: 'street@chat.shakespeare.lit', name: 'A street' }).nodeTree;
+            _converse.connection._dataRecv(mock.createRequest(iq));
+
+            await u.waitUntil(() => modal.el.querySelectorAll('.available-chatrooms li').length === 11);
+            const rooms = modal.el.querySelectorAll('.available-chatrooms li');
+            expect(rooms[0].textContent.trim()).toBe('Groupchats found');
+            expect(rooms[1].textContent.trim()).toBe('A Lonely Heath');
+            expect(rooms[2].textContent.trim()).toBe('A Dark Cave');
+            expect(rooms[3].textContent.trim()).toBe('The Palace');
+            expect(rooms[4].textContent.trim()).toBe("Macbeth's Castle");
+            expect(rooms[5].textContent.trim()).toBe("Capulet's Orchard");
+            expect(rooms[6].textContent.trim()).toBe("Friar Laurence's cell");
+            expect(rooms[7].textContent.trim()).toBe("Hall in Capulet's house");
+            expect(rooms[8].textContent.trim()).toBe("Juliet's chamber");
+            expect(rooms[9].textContent.trim()).toBe('A public place');
+            expect(rooms[10].textContent.trim()).toBe('A street');
+
+            rooms[4].querySelector('.open-room').click();
+            await u.waitUntil(() => _converse.chatboxes.length > 1);
+            expect(sizzle('.chatroom', _converse.el).filter(u.isVisible).length).toBe(1); // There should now be an open chatroom
+            const view = _converse.chatboxviews.get('inverness@chat.shakespeare.lit');
+            expect(view.querySelector('.chatbox-title__text').textContent.trim()).toBe("Macbeth's Castle");
+        })
+    );
+
+    it('is pre-filled with the muc_domain',
+        mock.initConverse(['chatBoxesFetched'], { 'muc_domain': 'muc.example.org' }, async function (_converse) {
+            await mock.openControlBox(_converse);
+            const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
+            roomspanel.querySelector('.show-list-muc-modal').click();
+            mock.closeControlBox(_converse);
+            const modal = _converse.api.modal.get('muc-list-modal');
+            await u.waitUntil(() => u.isVisible(modal.el), 1000);
+            const server_input = modal.el.querySelector('input[name="server"]');
+            expect(server_input.value).toBe('muc.example.org');
+        })
+    );
+
+    it("doesn't let you set the MUC domain if it's locked",
+        mock.initConverse(
+            ['chatBoxesFetched'],
+            { 'muc_domain': 'chat.shakespeare.lit', 'locked_muc_domain': true },
+            async function (_converse) {
+                await mock.openControlBox(_converse);
+                const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
+                roomspanel.querySelector('.show-list-muc-modal').click();
+                mock.closeControlBox(_converse);
+                const modal = _converse.api.modal.get('muc-list-modal');
+                await u.waitUntil(() => u.isVisible(modal.el), 1000);
+                spyOn(_converse.ChatRoom.prototype, 'getDiscoInfo').and.callFake(() => Promise.resolve());
+
+                expect(modal.el.querySelector('input[name="server"]')).toBe(null);
+                expect(modal.el.querySelector('input[type="submit"]')).toBe(null);
+                await u.waitUntil(() => _converse.chatboxes.length);
+                const sent_stanza = await u.waitUntil(() =>
+                    _converse.connection.sent_stanzas
+                        .filter(s => sizzle(`query[xmlns="http://jabber.org/protocol/disco#items"]`, s).length)
+                        .pop()
+                );
+                expect(Strophe.serialize(sent_stanza)).toBe(
+                    `<iq from="romeo@montague.lit/orchard" id="${sent_stanza.getAttribute('id')}" ` +
+                        `to="chat.shakespeare.lit" type="get" xmlns="jabber:client">` +
+                            `<query xmlns="http://jabber.org/protocol/disco#items"/>` +
+                        `</iq>`
+                );
+                const iq = $iq({
+                    from: 'muc.montague.lit',
+                    to: 'romeo@montague.lit/pda',
+                    id: sent_stanza.getAttribute('id'),
+                    type: 'result',
+                })
+                    .c('query')
+                    .c('item', { jid: 'heath@chat.shakespeare.lit', name: 'A Lonely Heath' }).up()
+                    .c('item', { jid: 'coven@chat.shakespeare.lit', name: 'A Dark Cave' }).up()
+                    .c('item', { jid: 'forres@chat.shakespeare.lit', name: 'The Palace' }).up();
+                _converse.connection._dataRecv(mock.createRequest(iq));
+
+                await u.waitUntil(() => modal.el.querySelectorAll('.available-chatrooms li').length === 4);
+                const rooms = modal.el.querySelectorAll('.available-chatrooms li');
+                expect(rooms[0].textContent.trim()).toBe('Groupchats found');
+                expect(rooms[1].textContent.trim()).toBe('A Lonely Heath');
+                expect(rooms[2].textContent.trim()).toBe('A Dark Cave');
+                expect(rooms[3].textContent.trim()).toBe('The Palace');
+            }
+        )
+    );
+});

+ 0 - 254
src/plugins/muc-views/tests/muc.js

@@ -3407,260 +3407,6 @@ describe("Groupchats", function () {
         }));
         }));
     });
     });
 
 
-    describe("The \"Groupchats\" Add modal", function () {
-
-        it("can be opened from a link in the \"Groupchats\" section of the controlbox",
-                mock.initConverse(['chatBoxesFetched'], {}, async function (_converse) {
-
-            await mock.openControlBox(_converse);
-            await mock.waitForRoster(_converse, 'current', 0);
-
-            const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
-            roomspanel.querySelector('.show-add-muc-modal').click();
-            mock.closeControlBox(_converse);
-            const modal = _converse.api.modal.get('add-chatroom-modal');
-            await u.waitUntil(() => u.isVisible(modal.el), 1000)
-
-            let label_name = modal.el.querySelector('label[for="chatroom"]');
-            expect(label_name.textContent.trim()).toBe('Groupchat address:');
-            let name_input = modal.el.querySelector('input[name="chatroom"]');
-            expect(name_input.placeholder).toBe('name@conference.example.org');
-
-            const label_nick = modal.el.querySelector('label[for="nickname"]');
-            expect(label_nick.textContent.trim()).toBe('Nickname:');
-            const nick_input = modal.el.querySelector('input[name="nickname"]');
-            expect(nick_input.value).toBe('');
-            nick_input.value = 'romeo';
-
-            expect(modal.el.querySelector('.modal-title').textContent.trim()).toBe('Enter a new Groupchat');
-            spyOn(_converse.ChatRoom.prototype, 'getDiscoInfo').and.callFake(() => Promise.resolve());
-            roomspanel.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
-            modal.el.querySelector('input[name="chatroom"]').value = 'lounce@muc.montague.lit';
-            modal.el.querySelector('form input[type="submit"]').click();
-            await u.waitUntil(() => _converse.chatboxes.length);
-            await u.waitUntil(() => sizzle('.chatroom', _converse.el).filter(u.isVisible).length === 1);
-
-            roomspanel.model.set('muc_domain', 'muc.example.org');
-            roomspanel.querySelector('.show-add-muc-modal').click();
-            label_name = modal.el.querySelector('label[for="chatroom"]');
-            expect(label_name.textContent.trim()).toBe('Groupchat address:');
-            name_input = modal.el.querySelector('input[name="chatroom"]');
-            expect(name_input.placeholder).toBe('name@muc.example.org');
-        }));
-
-        it("doesn't require the domain when muc_domain is set",
-                mock.initConverse(['chatBoxesFetched'], {'muc_domain': 'muc.example.org'}, async function (_converse) {
-
-            await mock.openControlBox(_converse);
-            const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
-            roomspanel.querySelector('.show-add-muc-modal').click();
-            const modal = _converse.api.modal.get('add-chatroom-modal');
-            await u.waitUntil(() => u.isVisible(modal.el), 1000)
-            expect(modal.el.querySelector('.modal-title').textContent.trim()).toBe('Enter a new Groupchat');
-            spyOn(_converse.ChatRoom.prototype, 'getDiscoInfo').and.callFake(() => Promise.resolve());
-            roomspanel.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
-            const label_name = modal.el.querySelector('label[for="chatroom"]');
-            expect(label_name.textContent.trim()).toBe('Groupchat name:');
-            let name_input = modal.el.querySelector('input[name="chatroom"]');
-            expect(name_input.placeholder).toBe('name@muc.example.org');
-            name_input.value = 'lounge';
-            let nick_input = modal.el.querySelector('input[name="nickname"]');
-            nick_input.value = 'max';
-
-            modal.el.querySelector('form input[type="submit"]').click();
-            await u.waitUntil(() => _converse.chatboxes.length);
-            await u.waitUntil(() => sizzle('.chatroom', _converse.el).filter(u.isVisible).length === 1);
-            expect(_converse.chatboxes.models.map(m => m.get('id')).includes('lounge@muc.example.org')).toBe(true);
-
-            // However, you can still open MUCs with different domains
-            roomspanel.querySelector('.show-add-muc-modal').click();
-            await u.waitUntil(() => u.isVisible(modal.el), 1000);
-            name_input = modal.el.querySelector('input[name="chatroom"]');
-            name_input.value = 'lounge@conference.example.org';
-            nick_input = modal.el.querySelector('input[name="nickname"]');
-            nick_input.value = 'max';
-            modal.el.querySelector('form input[type="submit"]').click();
-            await u.waitUntil(() => _converse.chatboxes.models.filter(c => c.get('type') === 'chatroom').length === 2);
-            await u.waitUntil(() => sizzle('.chatroom', _converse.el).filter(u.isVisible).length === 2);
-            expect(_converse.chatboxes.models.map(m => m.get('id')).includes('lounge@conference.example.org')).toBe(true);
-        }));
-
-        it("only uses the muc_domain is locked_muc_domain is true",
-                mock.initConverse(['chatBoxesFetched'], {'muc_domain': 'muc.example.org', 'locked_muc_domain': true},
-                async function (_converse) {
-
-            await mock.openControlBox(_converse);
-            const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
-            roomspanel.querySelector('.show-add-muc-modal').click();
-            const modal = _converse.api.modal.get('add-chatroom-modal');
-            await u.waitUntil(() => u.isVisible(modal.el), 1000)
-            expect(modal.el.querySelector('.modal-title').textContent.trim()).toBe('Enter a new Groupchat');
-            spyOn(_converse.ChatRoom.prototype, 'getDiscoInfo').and.callFake(() => Promise.resolve());
-            roomspanel.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
-            const label_name = modal.el.querySelector('label[for="chatroom"]');
-            expect(label_name.textContent.trim()).toBe('Groupchat name:');
-            let name_input = modal.el.querySelector('input[name="chatroom"]');
-            expect(name_input.placeholder).toBe('');
-            name_input.value = 'lounge';
-            let nick_input = modal.el.querySelector('input[name="nickname"]');
-            nick_input.value = 'max';
-            modal.el.querySelector('form input[type="submit"]').click();
-            await u.waitUntil(() => _converse.chatboxes.length);
-            await u.waitUntil(() => sizzle('.chatroom', _converse.el).filter(u.isVisible).length === 1);
-            expect(_converse.chatboxes.models.map(m => m.get('id')).includes('lounge@muc.example.org')).toBe(true);
-
-            // However, you can still open MUCs with different domains
-            roomspanel.querySelector('.show-add-muc-modal').click();
-            await u.waitUntil(() => u.isVisible(modal.el), 1000);
-            name_input = modal.el.querySelector('input[name="chatroom"]');
-            name_input.value = 'lounge@conference';
-            nick_input = modal.el.querySelector('input[name="nickname"]');
-            nick_input.value = 'max';
-            modal.el.querySelector('form input[type="submit"]').click();
-            await u.waitUntil(() => _converse.chatboxes.models.filter(c => c.get('type') === 'chatroom').length === 2);
-            await u.waitUntil(() => sizzle('.chatroom', _converse.el).filter(u.isVisible).length === 2);
-            expect(_converse.chatboxes.models.map(m => m.get('id')).includes('lounge\\40conference@muc.example.org')).toBe(true);
-        }));
-    });
-
-    describe("The \"Groupchats\" List modal", function () {
-
-        it("can be opened from a link in the \"Groupchats\" section of the controlbox",
-                mock.initConverse(['chatBoxesFetched'], {}, async function (_converse) {
-
-            await mock.openControlBox(_converse);
-            const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
-            roomspanel.querySelector('.show-list-muc-modal').click();
-            mock.closeControlBox(_converse);
-            const modal = _converse.api.modal.get('muc-list-modal');
-            await u.waitUntil(() => u.isVisible(modal.el), 1000);
-            spyOn(_converse.ChatRoom.prototype, 'getDiscoInfo').and.callFake(() => Promise.resolve());
-            roomspanel.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
-
-            // See: https://xmpp.org/extensions/xep-0045.html#disco-rooms
-            expect(modal.el.querySelectorAll('.available-chatrooms li').length).toBe(0);
-
-            const server_input = modal.el.querySelector('input[name="server"]');
-            expect(server_input.placeholder).toBe('conference.example.org');
-            server_input.value = 'chat.shakespeare.lit';
-            modal.el.querySelector('input[type="submit"]').click();
-            await u.waitUntil(() => _converse.chatboxes.length);
-
-            const IQ_stanzas = _converse.connection.IQ_stanzas;
-            const sent_stanza = await u.waitUntil(
-                () => IQ_stanzas.filter(s => sizzle(`query[xmlns="${Strophe.NS.DISCO_ITEMS}"]`, s).length).pop()
-            );
-            const id = sent_stanza.getAttribute('id');
-            expect(Strophe.serialize(sent_stanza)).toBe(
-                `<iq from="romeo@montague.lit/orchard" id="${id}" `+
-                    `to="chat.shakespeare.lit" `+
-                    `type="get" `+
-                    `xmlns="jabber:client">`+
-                        `<query xmlns="http://jabber.org/protocol/disco#items"/>`+
-                `</iq>`
-            );
-            const iq = $iq({
-                'from':'muc.montague.lit',
-                'to':'romeo@montague.lit/pda',
-                'id': id,
-                'type':'result'
-            }).c('query')
-            .c('item', { jid:'heath@chat.shakespeare.lit', name:'A Lonely Heath'}).up()
-            .c('item', { jid:'coven@chat.shakespeare.lit', name:'A Dark Cave'}).up()
-            .c('item', { jid:'forres@chat.shakespeare.lit', name:'The Palace'}).up()
-            .c('item', { jid:'inverness@chat.shakespeare.lit', name:'Macbeth&apos;s Castle'}).up()
-            .c('item', { jid:'orchard@chat.shakespeare.lit', name:'Capulet\'s Orchard'}).up()
-            .c('item', { jid:'friar@chat.shakespeare.lit', name:'Friar Laurence\'s cell'}).up()
-            .c('item', { jid:'hall@chat.shakespeare.lit', name:'Hall in Capulet\'s house'}).up()
-            .c('item', { jid:'chamber@chat.shakespeare.lit', name:'Juliet\'s chamber'}).up()
-            .c('item', { jid:'public@chat.shakespeare.lit', name:'A public place'}).up()
-            .c('item', { jid:'street@chat.shakespeare.lit', name:'A street'}).nodeTree;
-            _converse.connection._dataRecv(mock.createRequest(iq));
-
-            await u.waitUntil(() => modal.el.querySelectorAll('.available-chatrooms li').length === 11);
-            const rooms = modal.el.querySelectorAll('.available-chatrooms li');
-            expect(rooms[0].textContent.trim()).toBe("Groupchats found");
-            expect(rooms[1].textContent.trim()).toBe("A Lonely Heath");
-            expect(rooms[2].textContent.trim()).toBe("A Dark Cave");
-            expect(rooms[3].textContent.trim()).toBe("The Palace");
-            expect(rooms[4].textContent.trim()).toBe("Macbeth's Castle");
-            expect(rooms[5].textContent.trim()).toBe('Capulet\'s Orchard');
-            expect(rooms[6].textContent.trim()).toBe('Friar Laurence\'s cell');
-            expect(rooms[7].textContent.trim()).toBe('Hall in Capulet\'s house');
-            expect(rooms[8].textContent.trim()).toBe('Juliet\'s chamber');
-            expect(rooms[9].textContent.trim()).toBe('A public place');
-            expect(rooms[10].textContent.trim()).toBe('A street');
-
-            rooms[4].querySelector('.open-room').click();
-            await u.waitUntil(() => _converse.chatboxes.length > 1);
-            expect(sizzle('.chatroom', _converse.el).filter(u.isVisible).length).toBe(1); // There should now be an open chatroom
-            const view = _converse.chatboxviews.get('inverness@chat.shakespeare.lit');
-            expect(view.querySelector('.chatbox-title__text').textContent.trim()).toBe("Macbeth's Castle");
-        }));
-
-        it("is pre-filled with the muc_domain",
-            mock.initConverse(
-                ['chatBoxesFetched'],
-                {'muc_domain': 'muc.example.org'},
-                async function (_converse) {
-
-            await mock.openControlBox(_converse);
-            const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
-            roomspanel.querySelector('.show-list-muc-modal').click();
-            mock.closeControlBox(_converse);
-            const modal = _converse.api.modal.get('muc-list-modal');
-            await u.waitUntil(() => u.isVisible(modal.el), 1000);
-            const server_input = modal.el.querySelector('input[name="server"]');
-            expect(server_input.value).toBe('muc.example.org');
-        }));
-
-        it("doesn't let you set the MUC domain if it's locked",
-            mock.initConverse(
-                ['chatBoxesFetched'],
-                {'muc_domain': 'chat.shakespeare.lit', 'locked_muc_domain': true},
-                async function (_converse) {
-
-            await mock.openControlBox(_converse);
-            const roomspanel = _converse.chatboxviews.get('controlbox').querySelector('converse-rooms-list');
-            roomspanel.querySelector('.show-list-muc-modal').click();
-            mock.closeControlBox(_converse);
-            const modal = _converse.api.modal.get('muc-list-modal');
-            await u.waitUntil(() => u.isVisible(modal.el), 1000);
-            spyOn(_converse.ChatRoom.prototype, 'getDiscoInfo').and.callFake(() => Promise.resolve());
-            roomspanel.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
-
-            expect(modal.el.querySelector('input[name="server"]')).toBe(null);
-            expect(modal.el.querySelector('input[type="submit"]')).toBe(null);
-            await u.waitUntil(() => _converse.chatboxes.length);
-            const sent_stanza = await u.waitUntil(() =>
-                _converse.connection.sent_stanzas.filter(
-                    s => sizzle(`query[xmlns="http://jabber.org/protocol/disco#items"]`, s).length).pop()
-            );
-            expect(Strophe.serialize(sent_stanza)).toBe(
-                `<iq from="romeo@montague.lit/orchard" id="${sent_stanza.getAttribute('id')}" `+
-                        `to="chat.shakespeare.lit" type="get" xmlns="jabber:client">`+
-                    `<query xmlns="http://jabber.org/protocol/disco#items"/>`+
-                `</iq>`
-            );
-            const iq = $iq({
-                from:'muc.montague.lit',
-                to:'romeo@montague.lit/pda',
-                id: sent_stanza.getAttribute('id'),
-                type:'result'
-            }).c('query')
-            .c('item', { jid:'heath@chat.shakespeare.lit', name:'A Lonely Heath'}).up()
-            .c('item', { jid:'coven@chat.shakespeare.lit', name:'A Dark Cave'}).up()
-            .c('item', { jid:'forres@chat.shakespeare.lit', name:'The Palace'}).up()
-            _converse.connection._dataRecv(mock.createRequest(iq));
-
-            await u.waitUntil(() => modal.el.querySelectorAll('.available-chatrooms li').length === 4);
-            const rooms = modal.el.querySelectorAll('.available-chatrooms li');
-            expect(rooms[0].textContent.trim()).toBe("Groupchats found");
-            expect(rooms[1].textContent.trim()).toBe("A Lonely Heath");
-            expect(rooms[2].textContent.trim()).toBe("A Dark Cave");
-            expect(rooms[3].textContent.trim()).toBe("The Palace");
-        }));
-    });
 
 
     describe("A XEP-0085 Chat Status Notification", function () {
     describe("A XEP-0085 Chat Status Notification", function () {