diff --git a/src/headless/plugins/smacks/tests/smacks.js b/src/headless/plugins/smacks/tests/smacks.js index 1373b3b08..6b5c3aea2 100644 --- a/src/headless/plugins/smacks/tests/smacks.js +++ b/src/headless/plugins/smacks/tests/smacks.js @@ -19,6 +19,7 @@ describe("XEP-0198 Stream Management", function () { async function (_converse) { await _converse.api.user.login('romeo@montague.lit/orchard', 'secret'); + const sent_stanzas = _converse.connection.sent_stanzas; let stanza = await u.waitUntil(() => sent_stanzas.filter(s => (s.tagName === 'enable'), 1000).pop()); @@ -32,31 +33,37 @@ describe("XEP-0198 Stream Management", function () { let IQ_stanzas = _converse.connection.IQ_stanzas; await u.waitUntil(() => IQ_stanzas.length === 5); - let iq = IQ_stanzas[IQ_stanzas.length-1]; - expect(Strophe.serialize(iq)).toBe( - ``); + expect(Strophe.serialize(IQ_stanzas[0])).toBe( + ``); + + const carbons_response = $iq({ + 'type': 'result', + 'from': _converse.bare_jid, + 'to': _converse.jid, + 'id': IQ_stanzas[0].getAttribute('id') + }); + _converse.connection._dataRecv(mock.createRequest(carbons_response)); + + const disco_iq = IQ_stanzas[1]; + expect(Strophe.serialize(disco_iq)).toBe( + ``+ + ``); + + expect(Strophe.serialize(IQ_stanzas[2])).toBe( + ``); await mock.waitForRoster(_converse, 'current', 1); - IQ_stanzas.pop(); - const expected_IQs = disco_iq => ([ - ``+ - ``, + expect(Strophe.serialize(IQ_stanzas[3])).toBe( + ``+ + ``); - ``+ - ``, - - ``+ - ``]); + const omemo_iq = IQ_stanzas[4]; + expect(Strophe.serialize(omemo_iq)).toBe( + ``+ + ``); await u.waitUntil(() => sent_stanzas.filter(s => (s.nodeName === 'presence')).length); - const disco_iq = IQ_stanzas.pop(); - expect(expected_IQs(disco_iq).includes(Strophe.serialize(disco_iq))).toBe(true); - iq = IQ_stanzas.pop(); - expect(expected_IQs(disco_iq).includes(Strophe.serialize(disco_iq))).toBe(true); - iq = IQ_stanzas.pop(); - expect(expected_IQs(disco_iq).includes(Strophe.serialize(disco_iq))).toBe(true); - expect(sent_stanzas.filter(s => (s.nodeName === 'r')).length).toBe(3); expect(_converse.session.get('unacked_stanzas').length).toBe(6); @@ -69,9 +76,9 @@ describe("XEP-0198 Stream Management", function () { let r = u.toStanza(``); _converse.connection._dataRecv(mock.createRequest(r)); + // "h" is 2 because we received two IQ responses, for carbons and the roster ack = await u.waitUntil(() => sent_stanzas.filter(s => (s.nodeName === 'a')).pop()); - expect(Strophe.serialize(ack)).toBe(''); - + expect(Strophe.serialize(ack)).toBe(''); const disco_result = $iq({ 'type': 'result', @@ -91,10 +98,25 @@ describe("XEP-0198 Stream Management", function () { _converse.connection._dataRecv(mock.createRequest(ack)); expect(_converse.session.get('unacked_stanzas').length).toBe(3); + expect(_converse.session.get('unacked_stanzas')[0]).toBe( + ``+ + ``); + + expect(_converse.session.get('unacked_stanzas')[1]).toBe( + ``+ + ``); + + expect(_converse.session.get('unacked_stanzas')[2]).toBe( + `0`+ + ``+ + ``); + r = u.toStanza(``); _converse.connection._dataRecv(mock.createRequest(r)); - ack = await u.waitUntil(() => sent_stanzas.filter(s => (s.nodeName === 'a' && s.getAttribute('h') === '1')).pop()); - expect(Strophe.serialize(ack)).toBe(''); + + ack = await u.waitUntil(() => sent_stanzas.filter(s => (s.nodeName === 'a' && s.getAttribute('h') === '2')).pop()); + + expect(Strophe.serialize(ack)).toBe(''); await _converse.api.waitUntil('rosterInitialized'); // test session resumption @@ -102,7 +124,7 @@ describe("XEP-0198 Stream Management", function () { IQ_stanzas = _converse.connection.IQ_stanzas; await _converse.api.connection.reconnect(); stanza = await u.waitUntil(() => sent_stanzas.filter(s => (s.tagName === 'resume')).pop(), 1000); - expect(Strophe.serialize(stanza)).toEqual(''); + expect(Strophe.serialize(stanza)).toEqual(''); result = u.toStanza(``); _converse.connection._dataRecv(mock.createRequest(result)); @@ -112,17 +134,24 @@ describe("XEP-0198 Stream Management", function () { expect(_converse.session.get('smacks_enabled')).toBe(true); await new Promise(resolve => _converse.api.listen.once('reconnected', resolve)); - await u.waitUntil(() => IQ_stanzas.length === 2); + await u.waitUntil(() => IQ_stanzas.length === 3); // Test that unacked stanzas get resent out - iq = IQ_stanzas.pop(); - expect(Strophe.serialize(iq)).toBe(``); + let iq = IQ_stanzas.pop(); + expect(Strophe.serialize(iq)).toBe( + ``+ + ``); iq = IQ_stanzas.pop(); expect(Strophe.serialize(iq)).toBe( ``+ ``); + iq = IQ_stanzas.pop(); + expect(Strophe.serialize(iq)).toBe( + ``+ + ``); + expect(IQ_stanzas.filter(iq => sizzle('query[xmlns="jabber:iq:roster"]', iq).pop()).length).toBe(0); })); diff --git a/src/shared/chat/message-actions.js b/src/shared/chat/message-actions.js index 6ae11ecad..1393644fd 100644 --- a/src/shared/chat/message-actions.js +++ b/src/shared/chat/message-actions.js @@ -1,4 +1,4 @@ -import log from '@converse/headless/log'; +import log from '@converse/headless/log.js'; import { CustomElement } from 'shared/components/element.js'; import { __ } from 'i18n'; import { _converse, api, converse } from '@converse/headless/core.js';