|
@@ -499,6 +499,87 @@
|
|
|
});
|
|
|
});
|
|
|
|
|
|
+
|
|
|
+ it("limits the amount of messages in the DOM based on the message_history_size config setting",
|
|
|
+ mock.initConverse(
|
|
|
+ ['rosterGroupsFetched'], {'clear_messages_on_reconnection': true, 'message_history_size': 3},
|
|
|
+ async function (done, _converse) {
|
|
|
+
|
|
|
+ const nick = mock.chatroom_names[0];
|
|
|
+ const muc_jid = 'lounge@montague.lit';
|
|
|
+ await test_utils.openAndEnterChatRoom(_converse, muc_jid , 'romeo');
|
|
|
+ const view = _converse.chatboxviews.get(muc_jid);
|
|
|
+ const promises = [];
|
|
|
+ for (let i=0; i<10; i++) {
|
|
|
+ const msg = $msg({
|
|
|
+ 'from': `${muc_jid}/${nick}`,
|
|
|
+ 'id': u.getUniqueId(),
|
|
|
+ 'to': 'romeo@montague.lit',
|
|
|
+ 'type': 'groupchat'
|
|
|
+ }).c('body').t(`Message ${i}`).tree();
|
|
|
+ promises.push(view.model.onMessage(msg));
|
|
|
+ }
|
|
|
+ await Promise.all(promises);
|
|
|
+ expect(view.model.messages.length).toBe(3);
|
|
|
+ expect(view.model.messages.at(0).get('message')).toBe('Message 7');
|
|
|
+ expect(view.model.messages.at(1).get('message')).toBe('Message 8');
|
|
|
+ expect(view.model.messages.at(2).get('message')).toBe('Message 9');
|
|
|
+ await u.waitUntil(() => view.el.querySelectorAll('.chat-msg__text').length === 3);
|
|
|
+
|
|
|
+ let msg = $msg({
|
|
|
+ 'from': `${muc_jid}/${mock.chatroom_names[1]}`,
|
|
|
+ 'id': u.getUniqueId(),
|
|
|
+ 'to': 'romeo@montague.lit',
|
|
|
+ 'type': 'groupchat'
|
|
|
+ }).c('body').t(`Another message`).tree();
|
|
|
+ await view.model.onMessage(msg);
|
|
|
+ expect(view.model.messages.length).toBe(3);
|
|
|
+ expect(view.model.messages.at(0).get('message')).toBe('Message 8');
|
|
|
+ expect(view.model.messages.at(1).get('message')).toBe('Message 9');
|
|
|
+ expect(view.model.messages.at(2).get('message')).toBe('Another message');
|
|
|
+ await u.waitUntil(() => view.el.querySelectorAll('.chat-msg__text').length === 3);
|
|
|
+
|
|
|
+ await test_utils.sendMessage(view, 'hello world');
|
|
|
+ expect(view.model.messages.length).toBe(3);
|
|
|
+ expect(view.model.messages.at(0).get('message')).toBe('Message 9');
|
|
|
+ expect(view.model.messages.at(1).get('message')).toBe('Another message');
|
|
|
+ expect(view.model.messages.at(2).get('message')).toBe('hello world');
|
|
|
+ expect(view.el.querySelectorAll('.chat-msg__text').length).toBe(3);
|
|
|
+
|
|
|
+ // chat-state messages don't trigger deletions
|
|
|
+ msg = $msg({
|
|
|
+ from: muc_jid+'/newguy',
|
|
|
+ id: u.getUniqueId(),
|
|
|
+ to: 'romeo@montague.lit',
|
|
|
+ type: 'groupchat'
|
|
|
+ }).c('body').c('composing', {'xmlns': Strophe.NS.CHATSTATES}).tree();
|
|
|
+
|
|
|
+ await view.model.onMessage(msg);
|
|
|
+ await u.waitUntil(() => view.el.querySelectorAll('.chat-state-notification').length);
|
|
|
+ expect(view.model.messages.length).toBe(4);
|
|
|
+ expect(view.model.messages.at(0).get('message')).toBe('Message 9');
|
|
|
+ expect(view.model.messages.at(1).get('message')).toBe('Another message');
|
|
|
+ expect(view.model.messages.at(2).get('message')).toBe('hello world');
|
|
|
+ expect(u.isOnlyChatStateNotification(view.model.messages.at(3))).toBe(true);
|
|
|
+ expect(view.el.querySelectorAll('.chat-msg__text').length).toBe(3);
|
|
|
+
|
|
|
+ msg = $msg({
|
|
|
+ 'from': `${muc_jid}/${mock.chatroom_names[1]}`,
|
|
|
+ 'id': u.getUniqueId(),
|
|
|
+ 'to': 'romeo@montague.lit',
|
|
|
+ 'type': 'groupchat'
|
|
|
+ }).c('body').t(`Yet another message`).tree();
|
|
|
+ await view.model.onMessage(msg);
|
|
|
+ expect(view.model.messages.length).toBe(4);
|
|
|
+ expect(view.model.messages.at(0).get('message')).toBe('Another message');
|
|
|
+ expect(view.model.messages.at(1).get('message')).toBe('hello world');
|
|
|
+ expect(u.isOnlyChatStateNotification(view.model.messages.at(2))).toBe(true);
|
|
|
+ expect(view.model.messages.at(3).get('message')).toBe('Yet another message');
|
|
|
+ expect(view.el.querySelectorAll('.chat-msg__text').length).toBe(3);
|
|
|
+ done()
|
|
|
+ }));
|
|
|
+
|
|
|
+
|
|
|
it("clears cached messages when it gets closed and clear_messages_on_reconnection is true",
|
|
|
mock.initConverse(
|
|
|
['rosterGroupsFetched'], {'clear_messages_on_reconnection': true},
|