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
This commit is contained in:
Kislay Verma
2025-06-08 15:50:19 +05:30
committed by Tim Abbott
parent 5174dafb37
commit 2f696c5ec3
10 changed files with 59 additions and 95 deletions

View File

@@ -9,6 +9,7 @@ const {
buddy_list_add_other_user, buddy_list_add_other_user,
stub_buddy_list_elements, stub_buddy_list_elements,
} = require("./lib/buddy_list.cjs"); } = 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 {mock_esm, set_global, with_overrides, zrequire} = require("./lib/namespace.cjs");
const {run_test, noop} = require("./lib/test.cjs"); const {run_test, noop} = require("./lib/test.cjs");
const blueslip = require("./lib/zblueslip.cjs"); const blueslip = require("./lib/zblueslip.cjs");
@@ -50,7 +51,6 @@ const stream_data = zrequire("stream_data");
const peer_data = zrequire("peer_data"); const peer_data = zrequire("peer_data");
const message_lists = zrequire("message_lists"); const message_lists = zrequire("message_lists");
const util = zrequire("util"); const util = zrequire("util");
const {Filter} = zrequire("../src/filter");
const {set_current_user, set_realm} = zrequire("state_data"); const {set_current_user, set_realm} = zrequire("state_data");
const {initialize_user_settings} = zrequire("user_settings"); 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}; const rome_sub = {name: "Rome", subscribed: true, stream_id: 1001};
function add_sub_and_set_as_current_narrow(sub) { function add_sub_and_set_as_current_narrow(sub) {
stream_data.add_sub(sub); stream_data.add_sub(sub);
const filter = new Filter([{operator: "stream", operand: sub.stream_id}]); const filter_terms = [{operator: "stream", operand: sub.stream_id}];
message_lists.set_current({ message_lists.set_current(make_message_list(filter_terms));
data: {
filter,
},
});
} }
function test(label, f) { function test(label, f) {

View File

@@ -4,6 +4,7 @@ const assert = require("node:assert/strict");
const _ = require("lodash"); const _ = require("lodash");
const {make_message_list} = require("./lib/message_list.cjs");
const {mock_esm, zrequire} = require("./lib/namespace.cjs"); const {mock_esm, zrequire} = require("./lib/namespace.cjs");
const {noop, run_test} = require("./lib/test.cjs"); const {noop, run_test} = require("./lib/test.cjs");
const {page_params} = require("./lib/zpage_params.cjs"); const {page_params} = require("./lib/zpage_params.cjs");
@@ -27,7 +28,6 @@ const presence = zrequire("presence");
const stream_data = zrequire("stream_data"); const stream_data = zrequire("stream_data");
const user_status = zrequire("user_status"); const user_status = zrequire("user_status");
const buddy_data = zrequire("buddy_data"); const buddy_data = zrequire("buddy_data");
const {Filter} = zrequire("filter");
const message_lists = zrequire("message_lists"); const message_lists = zrequire("message_lists");
const {set_current_user, set_realm} = zrequire("state_data"); const {set_current_user, set_realm} = zrequire("state_data");
const {initialize_user_settings} = zrequire("user_settings"); const {initialize_user_settings} = zrequire("user_settings");
@@ -370,11 +370,7 @@ test("always show me", () => {
test("always show pm users", () => { test("always show pm users", () => {
people.add_active_user(selma); people.add_active_user(selma);
message_lists.set_current({ message_lists.set_current(make_message_list([{operator: "dm", operand: selma.email}]));
data: {
filter: new Filter([{operator: "dm", operand: selma.email}]),
},
});
assert.deepEqual(buddy_data.get_filtered_and_sorted_user_ids(""), [me.user_id, selma.user_id]); 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, me.user_id,
]); ]);
const filter = new Filter([ const filter_terms = [
{operator: "channel", operand: sub.stream_id}, {operator: "channel", operand: sub.stream_id},
{operator: "topic", operand: "Foo"}, {operator: "topic", operand: "Foo"},
]); ];
message_lists.set_current({ message_lists.set_current(make_message_list(filter_terms));
data: {
filter,
participants: {
visible: () => new Set(),
},
},
});
assert.deepEqual(buddy_data.get_filtered_and_sorted_user_ids(""), [ assert.deepEqual(buddy_data.get_filtered_and_sorted_user_ids(""), [
me.user_id, me.user_id,
alice.user_id, alice.user_id,
@@ -446,18 +435,15 @@ test("get_conversation_participants", () => {
stream_data.add_sub(rome_sub); stream_data.add_sub(rome_sub);
peer_data.set_subscribers(rome_sub.stream_id, [selma.user_id, me.user_id]); 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: "channel", operand: rome_sub.stream_id},
{operator: "topic", operand: "Foo"}, {operator: "topic", operand: "Foo"},
]); ];
message_lists.set_current({ message_lists.set_current(
data: { make_message_list(filter_terms, {
filter, visible_participants: [selma.user_id],
participants: { }),
visible: () => new Set([selma.user_id]), );
},
},
});
activity_ui.rerender_user_sidebar_participants(); activity_ui.rerender_user_sidebar_participants();
assert.deepEqual( assert.deepEqual(

View File

@@ -3,6 +3,7 @@
const assert = require("node:assert/strict"); const assert = require("node:assert/strict");
const {make_stream} = require("./lib/example_stream.cjs"); const {make_stream} = require("./lib/example_stream.cjs");
const {make_message_list} = require("./lib/message_list.cjs");
const {zrequire} = require("./lib/namespace.cjs"); const {zrequire} = require("./lib/namespace.cjs");
const {run_test} = require("./lib/test.cjs"); const {run_test} = require("./lib/test.cjs");
@@ -84,14 +85,8 @@ run_test("narrow_state", () => {
{operator: "topic", operand: "copenhagen"}, {operator: "topic", operand: "copenhagen"},
]; ];
const filter = new Filter(filter_terms);
// And here is where we actually change state. // And here is where we actually change state.
message_lists.set_current({ message_lists.set_current(make_message_list(filter_terms));
data: {
filter,
},
});
assert.equal(narrow_state.stream_name(), "Denmark"); assert.equal(narrow_state.stream_name(), "Denmark");
assert.equal(narrow_state.topic(), "copenhagen"); assert.equal(narrow_state.topic(), "copenhagen");
}); });

View File

@@ -3,6 +3,7 @@
const assert = require("node:assert/strict"); const assert = require("node:assert/strict");
const {make_user} = require("./lib/example_user.cjs"); 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 {mock_esm, zrequire} = require("./lib/namespace.cjs");
const {run_test} = require("./lib/test.cjs"); const {run_test} = require("./lib/test.cjs");
const $ = require("./lib/zjquery.cjs"); const $ = require("./lib/zjquery.cjs");
@@ -26,7 +27,6 @@ mock_esm("../src/settings_data", {
as that would help better understand the below test. as that would help better understand the below test.
*/ */
const {Filter} = zrequire("filter");
const message_lists = zrequire("message_lists"); const message_lists = zrequire("message_lists");
const people = zrequire("people"); const people = zrequire("people");
const {set_current_user} = zrequire("state_data"); 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 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 conversation_key = typing_data.get_direct_message_conversation_key(group);
const group_emails = `${anna.email},${vronsky.email},${levin.email},${kitty.email}`; const group_emails = `${anna.email},${vronsky.email},${levin.email},${kitty.email}`;
message_lists.set_current({ message_lists.set_current(make_message_list([{operator: "dm", operand: group_emails}]));
data: {
filter: new Filter([{operator: "dm", operand: group_emails}]),
},
});
// Based on typing_events.MAX_USERS_TO_DISPLAY_NAME (which is currently 3), // 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 // we display either the list of all users typing (if they do not exceed

View File

@@ -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;
};

View File

@@ -2,6 +2,7 @@
const assert = require("node:assert/strict"); const assert = require("node:assert/strict");
const {make_message_list} = require("./lib/message_list.cjs");
const {mock_esm, zrequire} = require("./lib/namespace.cjs"); const {mock_esm, zrequire} = require("./lib/namespace.cjs");
const {run_test, noop} = require("./lib/test.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 all_messages_data = zrequire("../src/all_messages_data");
const {Filter} = zrequire("../src/filter");
const {MessageListData} = zrequire("../src/message_list_data"); const {MessageListData} = zrequire("../src/message_list_data");
const narrow_state = zrequire("narrow_state"); const narrow_state = zrequire("narrow_state");
const message_view = zrequire("message_view"); const message_view = zrequire("message_view");
@@ -19,12 +19,9 @@ const message_lists = zrequire("message_lists");
const resolved_topic = zrequire("../shared/src/resolved_topic"); const resolved_topic = zrequire("../shared/src/resolved_topic");
function verify_fixture(fixture, override_rewire) { function verify_fixture(fixture, override_rewire) {
const filter = new Filter(fixture.filter_terms); const msg_list = make_message_list(fixture.filter_terms);
message_lists.set_current({ const filter = msg_list.data.filter;
data: { message_lists.set_current(msg_list);
filter,
},
});
// Make sure our simulated tests data satisfies the // Make sure our simulated tests data satisfies the
// invariant that the first unread message we find // invariant that the first unread message we find

View File

@@ -2,6 +2,7 @@
const assert = require("node:assert/strict"); const assert = require("node:assert/strict");
const {make_message_list} = require("./lib/message_list.cjs");
const {zrequire} = require("./lib/namespace.cjs"); const {zrequire} = require("./lib/namespace.cjs");
const {run_test} = require("./lib/test.cjs"); const {run_test} = require("./lib/test.cjs");
const {page_params} = require("./lib/zpage_params.cjs"); const {page_params} = require("./lib/zpage_params.cjs");
@@ -18,14 +19,10 @@ function set_filter(raw_terms) {
operator: op[0], operator: op[0],
operand: op[1], operand: op[1],
})); }));
const filter = new Filter(terms); const msg_list = make_message_list(terms);
message_lists.set_current({ message_lists.set_current(msg_list);
data: {
filter,
},
});
return filter; return msg_list.data.filter;
} }
function test(label, f) { function test(label, f) {

View File

@@ -2,6 +2,7 @@
const assert = require("node:assert/strict"); const assert = require("node:assert/strict");
const {make_message_list} = require("./lib/message_list.cjs");
const {mock_esm, zrequire} = require("./lib/namespace.cjs"); const {mock_esm, zrequire} = require("./lib/namespace.cjs");
const {run_test} = require("./lib/test.cjs"); const {run_test} = require("./lib/test.cjs");
const blueslip = require("./lib/zblueslip.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 narrow_state = zrequire("narrow_state");
const people = zrequire("people"); const people = zrequire("people");
const pm_conversations = zrequire("pm_conversations"); const pm_conversations = zrequire("pm_conversations");
@@ -91,12 +91,7 @@ function test(label, f) {
} }
function set_pm_with_filter(emails) { function set_pm_with_filter(emails) {
const active_filter = new Filter([{operator: "dm", operand: emails}]); message_lists.set_current(make_message_list([{operator: "dm", operand: emails}]));
message_lists.set_current({
data: {
filter: active_filter,
},
});
} }
function check_list_info(list, length, more_unread, recipients_array) { 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", () => { test("get_active_user_ids_string", () => {
assert.equal(pm_list_data.get_active_user_ids_string(), undefined); assert.equal(pm_list_data.get_active_user_ids_string(), undefined);
const stream_filter = new Filter([{operator: "stream", operand: "test"}]); message_lists.set_current(make_message_list([{operator: "stream", operand: "test"}]));
message_lists.set_current({
data: {
filter: stream_filter,
},
});
assert.equal(pm_list_data.get_active_user_ids_string(), undefined); assert.equal(pm_list_data.get_active_user_ids_string(), undefined);
set_pm_with_filter("bob@zulip.com,alice@zulip.com"); set_pm_with_filter("bob@zulip.com,alice@zulip.com");

View File

@@ -2,13 +2,13 @@
const assert = require("node:assert/strict"); const assert = require("node:assert/strict");
const {make_message_list} = require("./lib/message_list.cjs");
const {mock_esm, zrequire} = require("./lib/namespace.cjs"); const {mock_esm, zrequire} = require("./lib/namespace.cjs");
const {run_test} = require("./lib/test.cjs"); const {run_test} = require("./lib/test.cjs");
const $ = require("./lib/zjquery.cjs"); const $ = require("./lib/zjquery.cjs");
const settings_data = mock_esm("../src/settings_data"); const settings_data = mock_esm("../src/settings_data");
const {Filter} = zrequire("filter");
const message_lists = zrequire("message_lists"); const message_lists = zrequire("message_lists");
const people = zrequire("people"); const people = zrequire("people");
const {set_current_user, set_realm} = zrequire("state_data"); 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 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 conversation_key = typing_data.get_direct_message_conversation_key(group);
const group_emails = `${anna.email},${vronsky.email},${levin.email},${kitty.email}`; const group_emails = `${anna.email},${vronsky.email},${levin.email},${kitty.email}`;
message_lists.set_current({ message_lists.set_current(make_message_list([{operator: "dm", operand: group_emails}]));
data: {
filter: new Filter([{operator: "dm", operand: group_emails}]),
},
});
const $typing_notifications = $("#typing_notifications"); const $typing_notifications = $("#typing_notifications");

View File

@@ -2,6 +2,7 @@
const assert = require("node:assert/strict"); 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 {set_global, mock_esm, zrequire} = require("./lib/namespace.cjs");
const {run_test, noop} = require("./lib/test.cjs"); const {run_test, noop} = require("./lib/test.cjs");
const $ = require("./lib/zjquery.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 activity_ui = zrequire("activity_ui");
const buddy_data = zrequire("buddy_data"); const buddy_data = zrequire("buddy_data");
const {Filter} = zrequire("../src/filter");
const message_lists = zrequire("message_lists"); const message_lists = zrequire("message_lists");
const muted_users = zrequire("muted_users"); const muted_users = zrequire("muted_users");
const people = zrequire("people"); const people = zrequire("people");
@@ -148,11 +148,7 @@ test("fetch on search", async ({override}) => {
const office = {stream_id: 23, name: "office", subscribed: true}; const office = {stream_id: 23, name: "office", subscribed: true};
stream_data.add_sub(office); stream_data.add_sub(office);
message_lists.set_current({ message_lists.set_current(make_message_list([{operator: "stream", operand: office.stream_id}]));
data: {
filter: new Filter([{operator: "stream", operand: office.stream_id}]),
},
});
let get_call_count = 0; let get_call_count = 0;
channel.get = () => { channel.get = () => {
get_call_count += 1; get_call_count += 1;
@@ -176,17 +172,13 @@ test("fetch on search", async ({override}) => {
stream_data.add_sub(kitchen); stream_data.add_sub(kitchen);
const living_room = {stream_id: 26, name: "living_room", subscribed: true}; const living_room = {stream_id: 26, name: "living_room", subscribed: true};
stream_data.add_sub(living_room); stream_data.add_sub(living_room);
message_lists.set_current({ message_lists.set_current(
data: { make_message_list([{operator: "stream", operand: kitchen.stream_id}]),
filter: new Filter([{operator: "stream", operand: kitchen.stream_id}]), );
},
});
set_input_val("somevalue"); set_input_val("somevalue");
message_lists.set_current({ message_lists.set_current(
data: { make_message_list([{operator: "stream", operand: living_room.stream_id}]),
filter: new Filter([{operator: "stream", operand: living_room.stream_id}]), );
},
});
set_input_val("somevalue"); set_input_val("somevalue");
await activity_ui.await_pending_promise_for_testing(); await activity_ui.await_pending_promise_for_testing();
assert.equal(get_call_count, 2); assert.equal(get_call_count, 2);