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,
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) {

View File

@@ -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(

View File

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

View File

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

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 {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

View File

@@ -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) {

View File

@@ -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");

View File

@@ -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");

View File

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