/*global mock, converse */
const { Strophe, u } = converse.env;
describe("Message Archive Management", function () {
describe("A placeholder message", function () {
it("is created to indicate a gap in the history",
mock.initConverse(
['discoInitialized'],
{
'archived_messages_page_size': 2,
'persistent_store': 'localStorage',
'mam_request_all_pages': false
},
async function (_converse) {
const sent_IQs = _converse.connection.IQ_stanzas;
const muc_jid = 'orchard@chat.shakespeare.lit';
const msgid = u.getUniqueId();
// We put an already cached message in localStorage
const key_prefix = `converse-test-persistent/${_converse.bare_jid}`;
let key = `${key_prefix}/converse.messages-${muc_jid}-${_converse.bare_jid}`;
localStorage.setItem(key, `["converse.messages-${muc_jid}-${_converse.bare_jid}-${msgid}"]`);
key = `${key_prefix}/converse.messages-${muc_jid}-${_converse.bare_jid}-${msgid}`;
const msgtxt = "existing cached message";
localStorage.setItem(key, `{
"body": "${msgtxt}",
"message": "${msgtxt}",
"editable":true,
"from": "${muc_jid}/romeo",
"fullname": "Romeo",
"id": "${msgid}",
"is_archived": false,
"is_only_emojis": false,
"nick": "jc",
"origin_id": "${msgid}",
"received": "2021-06-15T11:17:15.451Z",
"sender": "me",
"stanza_id ${muc_jid}": "1e1c2355-c5b8-4d48-9e33-1310724578c2",
"time": "2021-06-15T11:17:15.424Z",
"type": "groupchat",
"msgid": "${msgid}"
}`);
await mock.openAndEnterChatRoom(_converse, muc_jid, 'romeo');
const view = _converse.chatboxviews.get(muc_jid);
let iq_get = await u.waitUntil(() => sent_IQs.filter(iq => iq.querySelector(`iq query[xmlns="${Strophe.NS.MAM}"]`)).pop());
const first_msg_id = _converse.connection.getUniqueId();
const second_msg_id = _converse.connection.getUniqueId();
const third_msg_id = _converse.connection.getUniqueId();
let message = u.toStanza(
`
2nd MAM Message
`);
_converse.connection._dataRecv(mock.createRequest(message));
message = u.toStanza(
`
3rd MAM Message
`);
_converse.connection._dataRecv(mock.createRequest(message));
// Clear so that we don't match the older query
while (sent_IQs.length) { sent_IQs.pop(); }
let result = u.toStanza(
`
${second_msg_id}
${third_msg_id}
3
`);
_converse.connection._dataRecv(mock.createRequest(result));
await u.waitUntil(() => view.model.messages.length === 4);
const msg = view.model.messages.at(1);
expect(msg instanceof _converse.MAMPlaceholderMessage).toBe(true);
expect(msg.get('time')).toBe('2021-06-15T11:18:22.999Z');
const placeholder_el = view.querySelector('converse-mam-placeholder');
placeholder_el.firstElementChild.click();
await u.waitUntil(() => view.querySelector('converse-mam-placeholder .spinner'));
iq_get = await u.waitUntil(() => sent_IQs.filter(iq => iq.querySelector(`iq query[xmlns="${Strophe.NS.MAM}"]`)).pop());
expect(Strophe.serialize(iq_get)).toBe(
``+
``+
``+
`urn:xmpp:mam:2`+
`2021-06-15T11:17:15.424Z`+
``+
`${view.model.messages.at(2).get(`stanza_id ${muc_jid}`)}`+
`2`+
``+
``+
``);
message = u.toStanza(
`
1st MAM Message
`);
_converse.connection._dataRecv(mock.createRequest(message));
// Clear so that we don't match the older query
while (sent_IQs.length) { sent_IQs.pop(); }
result = u.toStanza(
`
${first_msg_id}
${first_msg_id}
1
`);
_converse.connection._dataRecv(mock.createRequest(result));
await u.waitUntil(() => view.model.messages.length === 4);
await u.waitUntil(() => view.querySelector('converse-mam-placeholder') === null);
}));
it("is not created when there isn't a gap because the cached history is empty",
mock.initConverse(['discoInitialized'], {'archived_messages_page_size': 2},
async function (_converse) {
const sent_IQs = _converse.connection.IQ_stanzas;
const muc_jid = 'orchard@chat.shakespeare.lit';
await mock.openAndEnterChatRoom(_converse, muc_jid, 'romeo');
const view = _converse.chatboxviews.get(muc_jid);
const iq_get = await u.waitUntil(() => sent_IQs.filter(iq => iq.querySelector(`iq query[xmlns="${Strophe.NS.MAM}"]`)).pop());
const first_msg_id = _converse.connection.getUniqueId();
const last_msg_id = _converse.connection.getUniqueId();
let message = u.toStanza(
`
2nd Message
`);
_converse.connection._dataRecv(mock.createRequest(message));
message = u.toStanza(
`
3rd Message
`);
_converse.connection._dataRecv(mock.createRequest(message));
// Clear so that we don't match the older query
while (sent_IQs.length) { sent_IQs.pop(); }
const result = u.toStanza(
`
${first_msg_id}
${last_msg_id}
3
`);
_converse.connection._dataRecv(mock.createRequest(result));
await u.waitUntil(() => view.model.messages.length === 2);
expect(true).toBe(true);
}));
});
});