diff --git a/frontend_tests/node_tests/topic_list.js b/frontend_tests/node_tests/topic_list.js index a5eb8bbe36..c6716002f7 100644 --- a/frontend_tests/node_tests/topic_list.js +++ b/frontend_tests/node_tests/topic_list.js @@ -18,18 +18,138 @@ const devel = { name: 'devel', }; +const general = { + stream_id: 556, + name: 'general', +}; + stream_data.add_sub('devel', devel); +stream_data.add_sub('general', general); -run_test('topic_list_build_widget', () => { - +function clear() { + narrow_state.topic = () => undefined; topic_data.reset(); - topic_data.add_message({ - stream_id: devel.stream_id, - topic_name: 'coding', - message_id: 400, + stream_popover.hide_topic_popover = function () {}; + muting.is_topic_muted = () => false; +} + +function get_list_info() { + const stream_id = general.stream_id; + const widget = topic_list.widget(undefined, stream_id); + return widget.get_list_info(); +} + +run_test('get_list_info w/real topic_data', () => { + clear(); + + const empty_list_info = get_list_info(); + + assert.deepEqual(empty_list_info, { + items: [], + more_topics_unreads: 0, + num_possible_topics: 0, }); - stream_popover.hide_topic_popover = function () {}; + _.each(_.range(7), (i) => { + const topic_name = 'topic ' + i; + topic_data.add_message({ + stream_id: general.stream_id, + topic_name: topic_name, + message_id: 1000 + i, + }); + }); + + const list_info = get_list_info(); + assert.equal(list_info.items.length, 5); + assert.equal(list_info.more_topics_unreads, 0); + assert.equal(list_info.num_possible_topics, 7); + + assert.deepEqual(list_info.items[0], { + is_active_topic: false, + is_muted: false, + is_zero: true, + topic_name: 'topic 6', + unread: 0, + url: '#narrow/stream/556-general/topic/topic.206', + }); +}); + +run_test('get_list_info unreads', () => { + clear(); + + let list_info; + + // Going forward, we just stub get_recent_names + // for simpler test setup. + topic_data.get_recent_names = () => { + return _.map(_.range(15), (i) => { + return 'topic ' + i; + }); + }; + + const unread_cnt = {}; + unread.num_unread_for_topic = (stream_id, topic_name) => { + assert.equal(stream_id, general.stream_id); + return unread_cnt[topic_name] || 0; + }; + + /* + We have 15 topics, but we only show up + to 8 topics, depending on how many have + unread counts. We only show a max of 5 + fully-read topics. + + So first we'll get 7 topics, where 2 are + unread. + */ + unread_cnt['topic 8'] = 8; + unread_cnt['topic 9'] = 9; + + list_info = get_list_info(); + assert.equal(list_info.items.length, 7); + assert.equal(list_info.more_topics_unreads, 0); + assert.equal(list_info.num_possible_topics, 15); + + assert.deepEqual( + _.map(list_info.items, (li) => li.topic_name), + [ + 'topic 0', + 'topic 1', + 'topic 2', + 'topic 3', + 'topic 4', + 'topic 8', + 'topic 9', + ]); + + unread_cnt['topic 6'] = 6; + unread_cnt['topic 7'] = 7; + + list_info = get_list_info(); + assert.equal(list_info.items.length, 8); + assert.equal(list_info.more_topics_unreads, 9); + assert.equal(list_info.num_possible_topics, 15); + + assert.deepEqual( + _.map(list_info.items, (li) => li.topic_name), + [ + 'topic 0', + 'topic 1', + 'topic 2', + 'topic 3', + 'topic 4', + 'topic 6', + 'topic 7', + 'topic 8', + ]); +}); + +run_test('topic_list_build_widget', () => { + clear(); + + topic_data.get_recent_names = () => { + return ['coding']; + }; narrow_state.topic = function () { return 'testing';