From 078281d0db680ef8abe8e502e9ca2663e27e2839 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Mon, 17 Dec 2018 14:39:58 +0100 Subject: [PATCH] Add a test for configuring a MUC --- .eslintrc.json | 2 +- spec/chatroom.js | 216 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 175 insertions(+), 43 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 5bf8e03c7..7a36c2365 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -21,7 +21,7 @@ "rules": { "lodash/prefer-lodash-method": [2, { "ignoreMethods": [ - "find", "endsWith", "startsWith", "filter", "reduce", "isArray", "create", + "keys", "find", "endsWith", "startsWith", "filter", "reduce", "isArray", "create", "map", "replace", "toLower", "split", "trim", "forEach", "toUpperCase", "includes" ] }], diff --git a/spec/chatroom.js b/spec/chatroom.js index 67835f89c..3f880da41 100644 --- a/spec/chatroom.js +++ b/spec/chatroom.js @@ -2156,53 +2156,185 @@ null, ['rosterGroupsFetched'], {'view_mode': 'fullscreen'}, async function (done, _converse) { - var sent_IQ, IQ_id; - var sendIQ = _converse.connection.sendIQ; - await test_utils.openAndEnterChatRoom(_converse, 'room', 'conference.example.org', 'dummy'); - var view = _converse.chatboxviews.get('room@conference.example.org'); - view.model.set({ - 'passwordprotected': false, - 'unsecured': true, - 'hidden': false, - 'public': true, - 'membersonly': false, - 'open': true, - 'persistent': false, - 'temporary': true, - 'nonanonymous': true, - 'semianonymous': false, - 'moderated': false, - 'unmoderated': true + let features = [ + 'http://jabber.org/protocol/muc', + 'jabber:iq:register', + 'muc_passwordprotected', + 'muc_publicroom', + 'muc_temporary', + 'muc_open', + 'muc_unmoderated', + 'muc_nonanonymous' + ]; + await test_utils.openAndEnterChatRoom(_converse, 'room', 'conference.example.org', 'dummy', features); + const jid = 'room@conference.example.org'; + const chatroomview = _converse.chatboxviews.get(jid); + let features_list = chatroomview.el.querySelector('.features-list'); + let features_shown = features_list.textContent.split('\n').map(s => s.trim()).filter(s => s); + expect(_.difference(["Password protected", "Open", "Temporary", "Not anonymous", "Not moderated"], features_shown).length).toBe(0); + expect(chatroomview.model.get('hidden')).toBe(false); + expect(chatroomview.model.get('mam_enabled')).toBe(false); + expect(chatroomview.model.get('membersonly')).toBe(false); + expect(chatroomview.model.get('moderated')).toBe(false); + expect(chatroomview.model.get('nonanonymous')).toBe(true); + expect(chatroomview.model.get('open')).toBe(true); + expect(chatroomview.model.get('passwordprotected')).toBe(true); + expect(chatroomview.model.get('persistent')).toBe(false); + expect(chatroomview.model.get('publicroom')).toBe(true); + expect(chatroomview.model.get('semianonymous')).toBe(false); + expect(chatroomview.model.get('temporary')).toBe(true); + expect(chatroomview.model.get('unmoderated')).toBe(true); + expect(chatroomview.model.get('unsecured')).toBe(false); + + chatroomview.el.querySelector('.configure-chatroom-button').click(); + + const IQs = _converse.connection.IQ_stanzas; + let iq = await test_utils.waitUntil(() => _.filter( + IQs, + iq => iq.nodeTree.querySelector( + `iq[to="${jid}"] query[xmlns="${Strophe.NS.MUC_OWNER}"]` + )).pop()); + + const response = Strophe.xmlHtmlNode( + ` + + + Configuration for room@conference.example.org + Complete and submit this form to configure the room. + + http://jabber.org/protocol/muc#roomconfig + + + Room information + + + Example Room + + + A brief description of the room + This room is used in tests + + + Indicate the primary language spoken in this room + en + + + Rooms are automatically deleted when they are empty, unless this option is enabled + 1 + + + Enable this to allow people to find the room + 1 + + Access to the room + + + Enable this to only allow access for room owners, admins and members + + + Permissions in the room + + + Choose whether anyone, or only moderators, may set the room's subject + + + In moderated rooms occupants must be given permission to speak by a room moderator + + + + + anyone + + Other options + + Specify the maximum number of previous messages that should be sent to users when they join the room + 50 + + + Specify the number of previous messages sent to new users when they join the room + 20 + + + + `); + const response_el = response.firstElementChild; + _converse.connection._dataRecv(test_utils.createRequest(response_el)); + const el = await test_utils.waitUntil(() => document.querySelector('.chatroom-form legend')); + expect(el.textContent).toBe("Configuration for room@conference.example.org"); + sizzle('[name="muc#roomconfig_membersonly"]', chatroomview.el).pop().click(); + chatroomview.el.querySelector('.btn-primary').click(); + + iq = await test_utils.waitUntil(() => _.filter(IQs, iq => u.matchesSelector(iq.nodeTree, `iq[to="${jid}"][type="set"]`)).pop()); + const result = $iq({ + "xmlns": "jabber:client", + "type": "result", + "to": "dummy@localhost/resource", + "from": "lounge@muc.localhost", + "id": iq.nodeTree.getAttribute('id') }); - expect(view.model.get('persistent')).toBe(false); - expect(view.model.get('temporary')).toBe(true); - view.model.set({'persistent': true}); - expect(view.model.get('persistent')).toBe(true); - expect(view.model.get('temporary')).toBe(false); - expect(view.model.get('unsecured')).toBe(true); - expect(view.model.get('passwordprotected')).toBe(false); - view.model.set({'passwordprotected': true}); - expect(view.model.get('unsecured')).toBe(false); - expect(view.model.get('passwordprotected')).toBe(true); + IQs.length = 0; // Empty the array + _converse.connection._dataRecv(test_utils.createRequest(result)); - expect(view.model.get('unmoderated')).toBe(true); - expect(view.model.get('moderated')).toBe(false); - view.model.set({'moderated': true}); - expect(view.model.get('unmoderated')).toBe(false); - expect(view.model.get('moderated')).toBe(true); + iq = await test_utils.waitUntil(() => _.filter( + IQs, + iq => iq.nodeTree.querySelector( + `iq[to="${jid}"] query[xmlns="http://jabber.org/protocol/disco#info"]` + )).pop()); - expect(view.model.get('nonanonymous')).toBe(true); - expect(view.model.get('semianonymous')).toBe(false); - view.model.set({'nonanonymous': false}); - expect(view.model.get('nonanonymous')).toBe(false); - expect(view.model.get('semianonymous')).toBe(true); + const features_stanza = $iq({ + 'from': jid, + 'id': iq.nodeTree.getAttribute('id'), + 'to': 'dummy@localhost/desktop', + 'type': 'result' + }).c('query', { 'xmlns': 'http://jabber.org/protocol/disco#info'}) + .c('identity', { + 'category': 'conference', + 'name': 'Room', + 'type': 'text' + }).up(); + features = [ + 'http://jabber.org/protocol/muc', + 'jabber:iq:register', + 'muc_passwordprotected', + 'muc_hidden', + 'muc_temporary', + 'muc_open', + 'muc_unmoderated', + 'muc_nonanonymous' + ]; + features.forEach(f => features_stanza.c('feature', {'var': f}).up()); + features_stanza.c('x', { 'xmlns':'jabber:x:data', 'type':'result'}) + .c('field', {'var':'FORM_TYPE', 'type':'hidden'}) + .c('value').t('http://jabber.org/protocol/muc#roominfo').up().up() + .c('field', {'type':'text-single', 'var':'muc#roominfo_description', 'label':'Description'}) + .c('value').t('This is the description').up().up() + .c('field', {'type':'text-single', 'var':'muc#roominfo_occupants', 'label':'Number of occupants'}) + .c('value').t(0); + _converse.connection._dataRecv(test_utils.createRequest(features_stanza)); - expect(view.model.get('open')).toBe(true); - expect(view.model.get('membersonly')).toBe(false); - view.model.set({'membersonly': true}); - expect(view.model.get('open')).toBe(false); - expect(view.model.get('membersonly')).toBe(true); + spyOn(chatroomview.occupantsview, 'renderRoomFeatures').and.callThrough(); + + await test_utils.waitUntil(() => chatroomview.occupantsview.renderRoomFeatures.calls.count()); + features_list = chatroomview.el.querySelector('.features-list'); + features_shown = features_list.textContent.split('\n').map(s => s.trim()).filter(s => s); + expect(_.difference(["Password protected", "Hidden", "Open", "Temporary", "Not anonymous", "Not moderated"], features_shown).length).toBe(0); + expect(chatroomview.model.get('hidden')).toBe(true); + expect(chatroomview.model.get('mam_enabled')).toBe(false); + expect(chatroomview.model.get('membersonly')).toBe(false); + expect(chatroomview.model.get('moderated')).toBe(false); + expect(chatroomview.model.get('nonanonymous')).toBe(true); + expect(chatroomview.model.get('open')).toBe(true); + expect(chatroomview.model.get('passwordprotected')).toBe(true); + expect(chatroomview.model.get('persistent')).toBe(false); + expect(chatroomview.model.get('publicroom')).toBe(false); + expect(chatroomview.model.get('semianonymous')).toBe(false); + expect(chatroomview.model.get('temporary')).toBe(true); + expect(chatroomview.model.get('unmoderated')).toBe(true); + expect(chatroomview.model.get('unsecured')).toBe(false); done(); }));