zulip/frontend_tests/node_tests/message_events.js
Steve Howell 888214196c unread: Handle message edits that affect mentions.
We had a bug where if your peer mentioned you in
message, but then edited the message not to mention
you, the latter wouldn't reset your unread counts
for "Mentions".  And the same problem would happen
vice versa.

The fix basically extracts `update_message_for_mention`
and makes sure it handles all combinations of
unread/mentioned flags, instead of assuming
any invariants about which directions of change
are possible.

And then we call that new function from
`message_events.js` whenever we get message
edit events.

Fixes #14544
2020-04-11 12:00:46 -07:00

158 lines
3.9 KiB
JavaScript

zrequire('message_events');
zrequire('message_store');
zrequire('muting');
zrequire('people');
zrequire('recent_senders');
zrequire('stream_data');
zrequire('topic_data');
zrequire('unread');
set_global('alert_words', {});
set_global('condense', {});
set_global('current_msg_list', {});
set_global('message_edit', {});
set_global('message_list', {});
set_global('notifications', {});
set_global('page_params', {});
set_global('pm_list', {});
set_global('stream_list', {});
set_global('unread_ui', {});
alert_words.process_message = () => {};
const alice = {
email: '[email protected]',
user_id: 32,
full_name: 'Alice Patel',
};
people.add(alice);
const denmark = {
subscribed: false,
name: 'Denmark',
stream_id: 101,
};
stream_data.add_sub(denmark);
function test_helper(side_effects) {
const events = [];
for (const side_effect of side_effects) {
const parts = side_effect.split('.');
const module = parts[0];
const field = parts[1];
global[module][field] = () => {
events.push(side_effect);
};
}
const self = {};
self.verify = () => {
assert.deepEqual(side_effects, events);
};
return self;
}
run_test('update_messages', () => {
const original_message = {
id: 111,
display_recipient: denmark.name,
flags: ['mentioned'],
sender_id: alice.user_id,
stream_id: denmark.stream_id,
topic: 'lunch',
type: 'stream',
};
message_store.add_message_metadata(original_message);
message_store.set_message_booleans(original_message);
assert.equal(original_message.mentioned, true);
assert.equal(original_message.unread, true);
assert.deepEqual(
topic_data.get_recent_names(denmark.stream_id),
['lunch']
);
unread.update_message_for_mention(original_message);
assert(unread.unread_mentions_counter.has(original_message.id));
const events = [
{
message_id: original_message.id,
flags: [],
orig_content: 'old stuff',
content: '**new content**',
rendered_content: '<b>new content</b>',
},
];
current_msg_list.get_row = (message_id) => {
assert.equal(message_id, 111);
return ['row-stub'];
};
current_msg_list.view = {};
let rendered_mgs;
current_msg_list.view.rerender_messages = (msgs_to_rerender, message_content_edited) => {
rendered_mgs = msgs_to_rerender;
assert.equal(message_content_edited, true);
};
const side_effects = [
'condense.un_cache_message_content_height',
'message_edit.end',
'notifications.received_messages',
'unread_ui.update_unread_counts',
'stream_list.update_streams_sidebar',
'pm_list.update_private_messages',
];
const helper = test_helper(side_effects);
page_params.realm_allow_edit_history = false;
message_list.narrowed = 'stub-to-ignore';
// TEST THIS:
message_events.update_messages(events);
assert(!unread.unread_mentions_counter.has(original_message.id));
helper.verify();
assert.deepEqual(rendered_mgs, [
{
alerted: false,
collapsed: false,
content: '<b>new content</b>',
display_recipient: denmark.name,
historical: false,
id: 111,
is_stream: true,
last_edit_timestamp: undefined,
mentioned: false,
mentioned_me_directly: false,
raw_content: '**new content**',
reactions: [],
reply_to: alice.email,
sender_email: alice.email,
sender_full_name: alice.full_name,
sender_id: 32,
sent_by_me: false,
starred: false,
stream: denmark.name,
stream_id: denmark.stream_id,
topic: 'lunch',
type: 'stream',
unread: true,
},
]);
});