From 523566c21886d6118de7ec941bd04c89a418d304 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Wed, 30 Mar 2022 09:48:23 +0200 Subject: [PATCH] Move MUC tests into their own files --- karma.conf.js | 2 + src/plugins/muc-views/tests/muc-add-modal.js | 125 +++++++++ src/plugins/muc-views/tests/muc-list-modal.js | 141 ++++++++++ src/plugins/muc-views/tests/muc.js | 254 ------------------ 4 files changed, 268 insertions(+), 254 deletions(-) create mode 100644 src/plugins/muc-views/tests/muc-add-modal.js create mode 100644 src/plugins/muc-views/tests/muc-list-modal.js diff --git a/karma.conf.js b/karma.conf.js index c9051b6d7..e313e2f9f 100644 --- a/karma.conf.js +++ b/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/mep.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-mentions.js", type: 'module' }, { pattern: "src/plugins/muc-views/tests/muc-messages.js", type: 'module' }, diff --git a/src/plugins/muc-views/tests/muc-add-modal.js b/src/plugins/muc-views/tests/muc-add-modal.js new file mode 100644 index 000000000..e91b48033 --- /dev/null +++ b/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); + } + ) + ); +}); diff --git a/src/plugins/muc-views/tests/muc-list-modal.js b/src/plugins/muc-views/tests/muc-list-modal.js new file mode 100644 index 000000000..38b10d541 --- /dev/null +++ b/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( + `` + + `` + + `` + ); + 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'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( + `` + + `` + + `` + ); + 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'); + } + ) + ); +}); diff --git a/src/plugins/muc-views/tests/muc.js b/src/plugins/muc-views/tests/muc.js index 10f1ee11c..549f548fc 100644 --- a/src/plugins/muc-views/tests/muc.js +++ b/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( - ``+ - ``+ - `` - ); - 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'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( - ``+ - ``+ - `` - ); - 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 () {