xmpp.chapril.org-conversejs/src/plugins/muc-views/tests/disco.js
JC Brand 8e1c3e47df Improve how the muc_domain setting is populated via disco
Remove brittle code that uses `querySelector` to get the rooms list model.
This code was causing a TypeError due to a race condition.
2022-04-09 10:57:55 +02:00

66 lines
3.3 KiB
JavaScript

/*global mock, converse */
describe("Service Discovery", function () {
it("can be used to set the muc_domain", mock.initConverse( ['discoInitialized'], {}, async function (_converse) {
const { u, $iq } = converse.env;
const IQ_stanzas = _converse.connection.IQ_stanzas;
const IQ_ids = _converse.connection.IQ_ids;
const { api } = _converse;
expect(api.settings.get('muc_domain')).toBe(undefined);
await u.waitUntil(() => IQ_stanzas.filter(
(iq) => iq.querySelector(`iq[to="montague.lit"] query[xmlns="http://jabber.org/protocol/disco#info"]`)).length > 0
);
let stanza = IQ_stanzas.find((iq) => iq.querySelector('iq[to="montague.lit"] query[xmlns="http://jabber.org/protocol/disco#info"]'));
const info_IQ_id = IQ_ids[IQ_stanzas.indexOf(stanza)];
stanza = $iq({
'type': 'result',
'from': 'montague.lit',
'to': 'romeo@montague.lit/orchard',
'id': info_IQ_id
}).c('query', {'xmlns': 'http://jabber.org/protocol/disco#info'})
.c('identity', { 'category': 'server', 'type': 'im'}).up()
.c('identity', { 'category': 'conference', 'name': 'Play-Specific Chatrooms'}).up()
.c('feature', { 'var': 'http://jabber.org/protocol/disco#info'}).up()
.c('feature', { 'var': 'http://jabber.org/protocol/disco#items'}).up();
_converse.connection._dataRecv(mock.createRequest(stanza));
const entities = await _converse.api.disco.entities.get();
expect(entities.length).toBe(2); // We have an extra entity, which is the user's JID
expect(entities.get(_converse.domain).identities.length).toBe(2);
expect(entities.get('montague.lit').features.where(
{'var': 'http://jabber.org/protocol/disco#items'}).length).toBe(1);
expect(entities.get('montague.lit').features.where(
{'var': 'http://jabber.org/protocol/disco#info'}).length).toBe(1);
stanza = await u.waitUntil(() => IQ_stanzas.filter(
iq => iq.querySelector('iq[to="montague.lit"] query[xmlns="http://jabber.org/protocol/disco#items"]')).pop()
);
_converse.connection._dataRecv(mock.createRequest($iq({
'type': 'result',
'from': 'montague.lit',
'to': 'romeo@montague.lit/orchard',
'id': IQ_ids[IQ_stanzas.indexOf(stanza)]
}).c('query', {'xmlns': 'http://jabber.org/protocol/disco#items'})
.c('item', { 'jid': 'chat.shakespeare.lit', 'name': 'Chatroom Service'})));
stanza = await u.waitUntil(() => IQ_stanzas.filter(
iq => iq.querySelector('iq[to="chat.shakespeare.lit"] query[xmlns="http://jabber.org/protocol/disco#info"]')).pop()
);
_converse.connection._dataRecv(mock.createRequest($iq({
'type': 'result',
'from': 'chat.shakespeare.lit',
'to': 'romeo@montague.lit/orchard',
'id': IQ_ids[IQ_stanzas.indexOf(stanza)]
}).c('query', {'xmlns': 'http://jabber.org/protocol/disco#info'})
.c('identity', { 'category': 'conference', 'name': 'Play-Specific Chatrooms', 'type': 'text'}).up()
.c('feature', { 'var': 'http://jabber.org/protocol/muc'}).up()));
await u.waitUntil(() => _converse.api.settings.get('muc_domain') === 'chat.shakespeare.lit');
}));
});