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 () {