From 2f696c5ec3b21319a654b1c0a1868c3003d7dd20 Mon Sep 17 00:00:00 2001 From: Kislay Verma Date: Sun, 8 Jun 2025 15:50:19 +0530 Subject: [PATCH] tests: Add library function to create message lists. This function actually instantiates the `MessageList` and `MessageListData` classes instead of just mocking its structure as it is currently done. It addresses https://github.com/zulip/zulip/pull/34645#discussion_r2099058418 --- web/tests/activity.test.cjs | 10 +++------ web/tests/buddy_data.test.cjs | 38 ++++++++++---------------------- web/tests/example3.test.cjs | 9 ++------ web/tests/example8.test.cjs | 8 ++----- web/tests/lib/message_list.cjs | 19 ++++++++++++++++ web/tests/narrow_local.test.cjs | 11 ++++----- web/tests/narrow_state.test.cjs | 11 ++++----- web/tests/pm_list_data.test.cjs | 16 +++----------- web/tests/typing_events.test.cjs | 8 ++----- web/tests/user_search.test.cjs | 24 +++++++------------- 10 files changed, 59 insertions(+), 95 deletions(-) create mode 100644 web/tests/lib/message_list.cjs diff --git a/web/tests/activity.test.cjs b/web/tests/activity.test.cjs index 4d643a2699..53999b80ac 100644 --- a/web/tests/activity.test.cjs +++ b/web/tests/activity.test.cjs @@ -9,6 +9,7 @@ const { buddy_list_add_other_user, stub_buddy_list_elements, } = require("./lib/buddy_list.cjs"); +const {make_message_list} = require("./lib/message_list.cjs"); const {mock_esm, set_global, with_overrides, zrequire} = require("./lib/namespace.cjs"); const {run_test, noop} = require("./lib/test.cjs"); const blueslip = require("./lib/zblueslip.cjs"); @@ -50,7 +51,6 @@ const stream_data = zrequire("stream_data"); const peer_data = zrequire("peer_data"); const message_lists = zrequire("message_lists"); const util = zrequire("util"); -const {Filter} = zrequire("../src/filter"); const {set_current_user, set_realm} = zrequire("state_data"); const {initialize_user_settings} = zrequire("user_settings"); @@ -114,12 +114,8 @@ const $fred_stub = $.create("fred stub"); const rome_sub = {name: "Rome", subscribed: true, stream_id: 1001}; function add_sub_and_set_as_current_narrow(sub) { stream_data.add_sub(sub); - const filter = new Filter([{operator: "stream", operand: sub.stream_id}]); - message_lists.set_current({ - data: { - filter, - }, - }); + const filter_terms = [{operator: "stream", operand: sub.stream_id}]; + message_lists.set_current(make_message_list(filter_terms)); } function test(label, f) { diff --git a/web/tests/buddy_data.test.cjs b/web/tests/buddy_data.test.cjs index ad01056122..590db4bd0e 100644 --- a/web/tests/buddy_data.test.cjs +++ b/web/tests/buddy_data.test.cjs @@ -4,6 +4,7 @@ const assert = require("node:assert/strict"); const _ = require("lodash"); +const {make_message_list} = require("./lib/message_list.cjs"); const {mock_esm, zrequire} = require("./lib/namespace.cjs"); const {noop, run_test} = require("./lib/test.cjs"); const {page_params} = require("./lib/zpage_params.cjs"); @@ -27,7 +28,6 @@ const presence = zrequire("presence"); const stream_data = zrequire("stream_data"); const user_status = zrequire("user_status"); const buddy_data = zrequire("buddy_data"); -const {Filter} = zrequire("filter"); const message_lists = zrequire("message_lists"); const {set_current_user, set_realm} = zrequire("state_data"); const {initialize_user_settings} = zrequire("user_settings"); @@ -370,11 +370,7 @@ test("always show me", () => { test("always show pm users", () => { people.add_active_user(selma); - message_lists.set_current({ - data: { - filter: new Filter([{operator: "dm", operand: selma.email}]), - }, - }); + message_lists.set_current(make_message_list([{operator: "dm", operand: selma.email}])); assert.deepEqual(buddy_data.get_filtered_and_sorted_user_ids(""), [me.user_id, selma.user_id]); }); @@ -414,18 +410,11 @@ test("show offline channel subscribers for small channels", ({override_rewire}) me.user_id, ]); - const filter = new Filter([ + const filter_terms = [ {operator: "channel", operand: sub.stream_id}, {operator: "topic", operand: "Foo"}, - ]); - message_lists.set_current({ - data: { - filter, - participants: { - visible: () => new Set(), - }, - }, - }); + ]; + message_lists.set_current(make_message_list(filter_terms)); assert.deepEqual(buddy_data.get_filtered_and_sorted_user_ids(""), [ me.user_id, alice.user_id, @@ -446,18 +435,15 @@ test("get_conversation_participants", () => { stream_data.add_sub(rome_sub); peer_data.set_subscribers(rome_sub.stream_id, [selma.user_id, me.user_id]); - const filter = new Filter([ + const filter_terms = [ {operator: "channel", operand: rome_sub.stream_id}, {operator: "topic", operand: "Foo"}, - ]); - message_lists.set_current({ - data: { - filter, - participants: { - visible: () => new Set([selma.user_id]), - }, - }, - }); + ]; + message_lists.set_current( + make_message_list(filter_terms, { + visible_participants: [selma.user_id], + }), + ); activity_ui.rerender_user_sidebar_participants(); assert.deepEqual( diff --git a/web/tests/example3.test.cjs b/web/tests/example3.test.cjs index a1026d67d0..286670278f 100644 --- a/web/tests/example3.test.cjs +++ b/web/tests/example3.test.cjs @@ -3,6 +3,7 @@ const assert = require("node:assert/strict"); const {make_stream} = require("./lib/example_stream.cjs"); +const {make_message_list} = require("./lib/message_list.cjs"); const {zrequire} = require("./lib/namespace.cjs"); const {run_test} = require("./lib/test.cjs"); @@ -84,14 +85,8 @@ run_test("narrow_state", () => { {operator: "topic", operand: "copenhagen"}, ]; - const filter = new Filter(filter_terms); - // And here is where we actually change state. - message_lists.set_current({ - data: { - filter, - }, - }); + message_lists.set_current(make_message_list(filter_terms)); assert.equal(narrow_state.stream_name(), "Denmark"); assert.equal(narrow_state.topic(), "copenhagen"); }); diff --git a/web/tests/example8.test.cjs b/web/tests/example8.test.cjs index f72bc85731..851fe6b7f1 100644 --- a/web/tests/example8.test.cjs +++ b/web/tests/example8.test.cjs @@ -3,6 +3,7 @@ const assert = require("node:assert/strict"); const {make_user} = require("./lib/example_user.cjs"); +const {make_message_list} = require("./lib/message_list.cjs"); const {mock_esm, zrequire} = require("./lib/namespace.cjs"); const {run_test} = require("./lib/test.cjs"); const $ = require("./lib/zjquery.cjs"); @@ -26,7 +27,6 @@ mock_esm("../src/settings_data", { as that would help better understand the below test. */ -const {Filter} = zrequire("filter"); const message_lists = zrequire("message_lists"); const people = zrequire("people"); const {set_current_user} = zrequire("state_data"); @@ -86,11 +86,7 @@ run_test("typing_events.render_notifications_for_narrow", ({override, mock_templ const group = [anna.user_id, vronsky.user_id, levin.user_id, kitty.user_id]; const conversation_key = typing_data.get_direct_message_conversation_key(group); const group_emails = `${anna.email},${vronsky.email},${levin.email},${kitty.email}`; - message_lists.set_current({ - data: { - filter: new Filter([{operator: "dm", operand: group_emails}]), - }, - }); + message_lists.set_current(make_message_list([{operator: "dm", operand: group_emails}])); // Based on typing_events.MAX_USERS_TO_DISPLAY_NAME (which is currently 3), // we display either the list of all users typing (if they do not exceed diff --git a/web/tests/lib/message_list.cjs b/web/tests/lib/message_list.cjs new file mode 100644 index 0000000000..166eaf4986 --- /dev/null +++ b/web/tests/lib/message_list.cjs @@ -0,0 +1,19 @@ +"use strict"; + +const {zrequire} = require("./namespace.cjs"); + +const {Filter} = zrequire("filter"); +const {MessageList} = zrequire("message_list"); +const {MessageListData} = zrequire("message_list_data"); + +exports.make_message_list = (filter_terms, opts = {}) => { + const filter = new Filter(filter_terms); + const default_message_list = new MessageList({ + data: new MessageListData({ + filter, + }), + is_node_test: true, + }); + default_message_list.data.participants.humans = new Set(opts.visible_participants ?? []); + return default_message_list; +}; diff --git a/web/tests/narrow_local.test.cjs b/web/tests/narrow_local.test.cjs index 988d2314b7..587f3f92cc 100644 --- a/web/tests/narrow_local.test.cjs +++ b/web/tests/narrow_local.test.cjs @@ -2,6 +2,7 @@ const assert = require("node:assert/strict"); +const {make_message_list} = require("./lib/message_list.cjs"); const {mock_esm, zrequire} = require("./lib/namespace.cjs"); const {run_test, noop} = require("./lib/test.cjs"); @@ -11,7 +12,6 @@ mock_esm("../src/people.ts", { const all_messages_data = zrequire("../src/all_messages_data"); -const {Filter} = zrequire("../src/filter"); const {MessageListData} = zrequire("../src/message_list_data"); const narrow_state = zrequire("narrow_state"); const message_view = zrequire("message_view"); @@ -19,12 +19,9 @@ const message_lists = zrequire("message_lists"); const resolved_topic = zrequire("../shared/src/resolved_topic"); function verify_fixture(fixture, override_rewire) { - const filter = new Filter(fixture.filter_terms); - message_lists.set_current({ - data: { - filter, - }, - }); + const msg_list = make_message_list(fixture.filter_terms); + const filter = msg_list.data.filter; + message_lists.set_current(msg_list); // Make sure our simulated tests data satisfies the // invariant that the first unread message we find diff --git a/web/tests/narrow_state.test.cjs b/web/tests/narrow_state.test.cjs index b6673146bb..2470b8f7a7 100644 --- a/web/tests/narrow_state.test.cjs +++ b/web/tests/narrow_state.test.cjs @@ -2,6 +2,7 @@ const assert = require("node:assert/strict"); +const {make_message_list} = require("./lib/message_list.cjs"); const {zrequire} = require("./lib/namespace.cjs"); const {run_test} = require("./lib/test.cjs"); const {page_params} = require("./lib/zpage_params.cjs"); @@ -18,14 +19,10 @@ function set_filter(raw_terms) { operator: op[0], operand: op[1], })); - const filter = new Filter(terms); - message_lists.set_current({ - data: { - filter, - }, - }); + const msg_list = make_message_list(terms); + message_lists.set_current(msg_list); - return filter; + return msg_list.data.filter; } function test(label, f) { diff --git a/web/tests/pm_list_data.test.cjs b/web/tests/pm_list_data.test.cjs index c088791dda..74feac5623 100644 --- a/web/tests/pm_list_data.test.cjs +++ b/web/tests/pm_list_data.test.cjs @@ -2,6 +2,7 @@ const assert = require("node:assert/strict"); +const {make_message_list} = require("./lib/message_list.cjs"); const {mock_esm, zrequire} = require("./lib/namespace.cjs"); const {run_test} = require("./lib/test.cjs"); const blueslip = require("./lib/zblueslip.cjs"); @@ -24,7 +25,6 @@ mock_esm("../src/user_status", { }), }); -const {Filter} = zrequire("filter"); const narrow_state = zrequire("narrow_state"); const people = zrequire("people"); const pm_conversations = zrequire("pm_conversations"); @@ -91,12 +91,7 @@ function test(label, f) { } function set_pm_with_filter(emails) { - const active_filter = new Filter([{operator: "dm", operand: emails}]); - message_lists.set_current({ - data: { - filter: active_filter, - }, - }); + message_lists.set_current(make_message_list([{operator: "dm", operand: emails}])); } function check_list_info(list, length, more_unread, recipients_array) { @@ -247,12 +242,7 @@ test("get_conversations bot", ({override}) => { test("get_active_user_ids_string", () => { assert.equal(pm_list_data.get_active_user_ids_string(), undefined); - const stream_filter = new Filter([{operator: "stream", operand: "test"}]); - message_lists.set_current({ - data: { - filter: stream_filter, - }, - }); + message_lists.set_current(make_message_list([{operator: "stream", operand: "test"}])); assert.equal(pm_list_data.get_active_user_ids_string(), undefined); set_pm_with_filter("bob@zulip.com,alice@zulip.com"); diff --git a/web/tests/typing_events.test.cjs b/web/tests/typing_events.test.cjs index 99008a3656..92c3a0fc44 100644 --- a/web/tests/typing_events.test.cjs +++ b/web/tests/typing_events.test.cjs @@ -2,13 +2,13 @@ const assert = require("node:assert/strict"); +const {make_message_list} = require("./lib/message_list.cjs"); const {mock_esm, zrequire} = require("./lib/namespace.cjs"); const {run_test} = require("./lib/test.cjs"); const $ = require("./lib/zjquery.cjs"); const settings_data = mock_esm("../src/settings_data"); -const {Filter} = zrequire("filter"); const message_lists = zrequire("message_lists"); const people = zrequire("people"); const {set_current_user, set_realm} = zrequire("state_data"); @@ -54,11 +54,7 @@ run_test("render_notifications_for_narrow", ({override, mock_template}) => { const group = [anna.user_id, vronsky.user_id, levin.user_id, kitty.user_id]; const conversation_key = typing_data.get_direct_message_conversation_key(group); const group_emails = `${anna.email},${vronsky.email},${levin.email},${kitty.email}`; - message_lists.set_current({ - data: { - filter: new Filter([{operator: "dm", operand: group_emails}]), - }, - }); + message_lists.set_current(make_message_list([{operator: "dm", operand: group_emails}])); const $typing_notifications = $("#typing_notifications"); diff --git a/web/tests/user_search.test.cjs b/web/tests/user_search.test.cjs index deef4e3944..eda3da003f 100644 --- a/web/tests/user_search.test.cjs +++ b/web/tests/user_search.test.cjs @@ -2,6 +2,7 @@ const assert = require("node:assert/strict"); +const {make_message_list} = require("./lib/message_list.cjs"); const {set_global, mock_esm, zrequire} = require("./lib/namespace.cjs"); const {run_test, noop} = require("./lib/test.cjs"); const $ = require("./lib/zjquery.cjs"); @@ -37,7 +38,6 @@ const sidebar_ui = mock_esm("../src/sidebar_ui"); const activity_ui = zrequire("activity_ui"); const buddy_data = zrequire("buddy_data"); -const {Filter} = zrequire("../src/filter"); const message_lists = zrequire("message_lists"); const muted_users = zrequire("muted_users"); const people = zrequire("people"); @@ -148,11 +148,7 @@ test("fetch on search", async ({override}) => { const office = {stream_id: 23, name: "office", subscribed: true}; stream_data.add_sub(office); - message_lists.set_current({ - data: { - filter: new Filter([{operator: "stream", operand: office.stream_id}]), - }, - }); + message_lists.set_current(make_message_list([{operator: "stream", operand: office.stream_id}])); let get_call_count = 0; channel.get = () => { get_call_count += 1; @@ -176,17 +172,13 @@ test("fetch on search", async ({override}) => { stream_data.add_sub(kitchen); const living_room = {stream_id: 26, name: "living_room", subscribed: true}; stream_data.add_sub(living_room); - message_lists.set_current({ - data: { - filter: new Filter([{operator: "stream", operand: kitchen.stream_id}]), - }, - }); + message_lists.set_current( + make_message_list([{operator: "stream", operand: kitchen.stream_id}]), + ); set_input_val("somevalue"); - message_lists.set_current({ - data: { - filter: new Filter([{operator: "stream", operand: living_room.stream_id}]), - }, - }); + message_lists.set_current( + make_message_list([{operator: "stream", operand: living_room.stream_id}]), + ); set_input_val("somevalue"); await activity_ui.await_pending_promise_for_testing(); assert.equal(get_call_count, 2);