/*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); })); }); });