|
@@ -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(
|
|
|
+ `<iq xmlns="jabber:client"
|
|
|
+ type="result"
|
|
|
+ to="dummy@localhost/pda"
|
|
|
+ from="room@conference.example.org" id="${iq.nodeTree.getAttribute('id')}">
|
|
|
+ <query xmlns="http://jabber.org/protocol/muc#owner">
|
|
|
+ <x xmlns="jabber:x:data" type="form">
|
|
|
+ <title>Configuration for room@conference.example.org</title>
|
|
|
+ <instructions>Complete and submit this form to configure the room.</instructions>
|
|
|
+ <field var="FORM_TYPE" type="hidden">
|
|
|
+ <value>http://jabber.org/protocol/muc#roomconfig</value>
|
|
|
+ </field>
|
|
|
+ <field type="fixed">
|
|
|
+ <value>Room information</value>
|
|
|
+ </field>
|
|
|
+ <field var="muc#roomconfig_roomname" type="text-single" label="Title">
|
|
|
+ <value>Example Room</value>
|
|
|
+ </field>
|
|
|
+ <field var="muc#roomconfig_roomdesc" type="text-single" label="Description">
|
|
|
+ <desc>A brief description of the room</desc>
|
|
|
+ <value>This room is used in tests</value>
|
|
|
+ </field>
|
|
|
+ <field var="muc#roomconfig_lang" type="text-single" label="Language tag for room (e.g. 'en', 'de', 'fr' etc.)">
|
|
|
+ <desc>Indicate the primary language spoken in this room</desc>
|
|
|
+ <value>en</value>
|
|
|
+ </field>
|
|
|
+ <field var="muc#roomconfig_persistentroom" type="boolean" label="Persistent (room should remain even when it is empty)">
|
|
|
+ <desc>Rooms are automatically deleted when they are empty, unless this option is enabled</desc>
|
|
|
+ <value>1</value>
|
|
|
+ </field>
|
|
|
+ <field var="muc#roomconfig_publicroom" type="boolean" label="Include room information in public lists">
|
|
|
+ <desc>Enable this to allow people to find the room</desc>
|
|
|
+ <value>1</value>
|
|
|
+ </field>
|
|
|
+ <field type="fixed"><value>Access to the room</value></field>
|
|
|
+ <field var="muc#roomconfig_roomsecret" type="text-private" label="Password"><value/></field>
|
|
|
+ <field var="muc#roomconfig_membersonly" type="boolean" label="Only allow members to join">
|
|
|
+ <desc>Enable this to only allow access for room owners, admins and members</desc>
|
|
|
+ </field>
|
|
|
+ <field var="{http://prosody.im/protocol/muc}roomconfig_allowmemberinvites" type="boolean" label="Allow members to invite new members"/>
|
|
|
+ <field type="fixed"><value>Permissions in the room</value>
|
|
|
+ </field>
|
|
|
+ <field var="muc#roomconfig_changesubject" type="boolean" label="Allow anyone to set the room's subject">
|
|
|
+ <desc>Choose whether anyone, or only moderators, may set the room's subject</desc>
|
|
|
+ </field>
|
|
|
+ <field var="muc#roomconfig_moderatedroom" type="boolean" label="Moderated (require permission to speak)">
|
|
|
+ <desc>In moderated rooms occupants must be given permission to speak by a room moderator</desc>
|
|
|
+ </field>
|
|
|
+ <field var="muc#roomconfig_whois" type="list-single" label="Addresses (JIDs) of room occupants may be viewed by:">
|
|
|
+ <option label="Moderators only"><value>moderators</value></option>
|
|
|
+ <option label="Anyone"><value>anyone</value></option>
|
|
|
+ <value>anyone</value>
|
|
|
+ </field>
|
|
|
+ <field type="fixed"><value>Other options</value></field>
|
|
|
+ <field var="muc#roomconfig_historylength" type="text-single" label="Maximum number of history messages returned by room">
|
|
|
+ <desc>Specify the maximum number of previous messages that should be sent to users when they join the room</desc>
|
|
|
+ <value>50</value>
|
|
|
+ </field>
|
|
|
+ <field var="muc#roomconfig_defaulthistorymessages" type="text-single" label="Default number of history messages returned by room">
|
|
|
+ <desc>Specify the number of previous messages sent to new users when they join the room</desc>
|
|
|
+ <value>20</value>
|
|
|
+ </field>
|
|
|
+ </x>
|
|
|
+ </query>
|
|
|
+ </iq>`);
|
|
|
+ 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);
|
|
|
|
|
|
- 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);
|
|
|
+ IQs.length = 0; // Empty the array
|
|
|
+ _converse.connection._dataRecv(test_utils.createRequest(result));
|
|
|
|
|
|
- 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);
|
|
|
+ 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('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);
|
|
|
+ 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));
|
|
|
+
|
|
|
+ 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();
|
|
|
}));
|
|
|
|