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';