"use strict"; const {strict: assert} = require("assert"); const {mock_esm, zrequire} = require("./lib/namespace"); const {run_test} = require("./lib/test"); const unread = mock_esm("../src/unread"); mock_esm("../src/user_status", { get_status_emoji: () => ({ emoji_code: 20, }), }); const narrow_state = zrequire("narrow_state"); const people = zrequire("people"); const pm_conversations = zrequire("pm_conversations"); const pm_list_data = zrequire("pm_list_data"); const alice = { email: "alice@zulip.com", user_id: 101, full_name: "Alice", }; const bob = { email: "bob@zulip.com", user_id: 102, full_name: "Bob", }; const me = { email: "me@zulip.com", user_id: 103, full_name: "Me Myself", }; const zoe = { email: "zoe@zulip.com", user_id: 104, full_name: "Zoe", }; const cardelio = { email: "cardelio@zulip.com", user_id: 105, full_name: "Cardelio", }; const shiv = { email: "shiv@zulip.com", user_id: 106, full_name: "Shiv", }; const desdemona = { email: "desdemona@zulip.com", user_id: 107, full_name: "Desdemona", }; const lago = { email: "lago@zulip.com", user_id: 108, full_name: "Lago", }; const aaron = { email: "aaron@zulip.com", user_id: 109, full_name: "Aaron", }; const jai = { email: "jai@zulip.com", user_id: 110, full_name: "Jai", }; const shivam = { email: "shivam@zulip.com", user_id: 111, full_name: "Shivam", }; const bot_test = { email: "outgoingwebhook@zulip.com", user_id: 314, full_name: "Outgoing webhook", is_admin: false, is_bot: true, }; people.add_active_user(alice); people.add_active_user(bob); people.add_active_user(me); people.add_active_user(zoe); people.add_active_user(cardelio); people.add_active_user(shiv); people.add_active_user(desdemona); people.add_active_user(lago); people.add_active_user(aaron); people.add_active_user(jai); people.add_active_user(shivam); people.add_active_user(bot_test); people.initialize_current_user(me.user_id); function test(label, f) { run_test(label, (helpers) => { narrow_state.reset_current_filter(); pm_conversations.clear_for_testing(); f(helpers); }); } function get_list_info(zoomed) { return pm_list_data.get_list_info(zoomed); } test("get_conversations", ({override}) => { pm_conversations.recent.insert([alice.user_id, bob.user_id], 1); pm_conversations.recent.insert([me.user_id], 2); let num_unread_for_user_ids_string = 1; override(unread, "num_unread_for_user_ids_string", () => num_unread_for_user_ids_string); assert.equal(narrow_state.filter(), undefined); const expected_data = [ { is_active: false, is_group: false, is_zero: false, recipients: "Me Myself", unread: 1, url: "#narrow/pm-with/103-Me-Myself", user_circle_class: "user_circle_empty", user_ids_string: "103", status_emoji_info: { emoji_code: 20, }, }, { recipients: "Alice, Bob", user_ids_string: "101,102", unread: 1, is_zero: false, is_active: false, url: "#narrow/pm-with/101,102-group", user_circle_class: undefined, is_group: true, status_emoji_info: undefined, }, ]; let pm_data = pm_list_data.get_conversations(); assert.deepEqual(pm_data, expected_data); num_unread_for_user_ids_string = 0; pm_data = pm_list_data.get_conversations(); expected_data[0].unread = 0; expected_data[0].is_zero = true; expected_data[1].unread = 0; expected_data[1].is_zero = true; assert.deepEqual(pm_data, expected_data); pm_data = pm_list_data.get_conversations(); assert.deepEqual(pm_data, expected_data); }); test("get_conversations bot", ({override}) => { pm_conversations.recent.insert([alice.user_id, bob.user_id], 1); pm_conversations.recent.insert([bot_test.user_id], 2); override(unread, "num_unread_for_user_ids_string", () => 1); assert.equal(narrow_state.filter(), undefined); const expected_data = [ { recipients: "Outgoing webhook", user_ids_string: "314", unread: 1, is_zero: false, is_active: false, url: "#narrow/pm-with/314-Outgoing-webhook", status_emoji_info: undefined, user_circle_class: "user_circle_green", is_group: false, }, { recipients: "Alice, Bob", user_ids_string: "101,102", unread: 1, is_zero: false, is_active: false, url: "#narrow/pm-with/101,102-group", user_circle_class: undefined, status_emoji_info: undefined, is_group: true, }, ]; const pm_data = pm_list_data.get_conversations(); assert.deepEqual(pm_data, expected_data); }); test("get_active_user_ids_string", () => { assert.equal(pm_list_data.get_active_user_ids_string(), undefined); function set_filter_result(emails) { const active_filter = { operands(operand) { assert.equal(operand, "pm-with"); return emails; }, }; narrow_state.set_current_filter(active_filter); } set_filter_result([]); assert.equal(pm_list_data.get_active_user_ids_string(), undefined); set_filter_result(["bob@zulip.com,alice@zulip.com"]); assert.equal(pm_list_data.get_active_user_ids_string(), "101,102"); }); test("get_list_info", ({override}) => { let list_info; assert.equal(narrow_state.filter(), undefined); // Initialize an empty list to start. const empty_list_info = get_list_info(); assert.deepEqual(empty_list_info, { conversations_to_be_shown: [], more_conversations_unread_count: 0, }); // TODO: We should just initialize a Filter object with `new // Filter` rather than creating a mock. function set_filter_result(emails) { const active_filter = { operands(operand) { assert.equal(operand, "pm-with"); return emails; }, }; narrow_state.set_current_filter(active_filter); } set_filter_result([]); assert.equal(pm_list_data.get_active_user_ids_string(), undefined); // Mock to arrange that each user has exactly 1 unread. const num_unread_for_user_ids_string = 1; override(unread, "num_unread_for_user_ids_string", () => num_unread_for_user_ids_string); // Initially, we append 2 conversations and check for the // `conversations_to_be_shown` returned in list_info. pm_conversations.recent.insert([alice.user_id, bob.user_id], 1); pm_conversations.recent.insert([me.user_id], 2); list_info = get_list_info(false); const expected_list_info = [ { is_active: false, is_group: false, is_zero: false, recipients: "Me Myself", status_emoji_info: { emoji_code: 20, }, unread: 1, url: "#narrow/pm-with/103-Me-Myself", user_circle_class: "user_circle_empty", user_ids_string: "103", }, { recipients: "Alice, Bob", user_ids_string: "101,102", unread: 1, is_active: false, url: "#narrow/pm-with/101,102-group", user_circle_class: undefined, status_emoji_info: undefined, is_group: true, is_zero: false, }, ]; assert.deepEqual(list_info, { conversations_to_be_shown: expected_list_info, more_conversations_unread_count: 0, }); // Now, add additional conversations until we exceed // `max_conversations_to_show_with_unreads`. pm_conversations.recent.insert([zoe.user_id], 3); pm_conversations.recent.insert([cardelio.user_id], 4); pm_conversations.recent.insert([zoe.user_id, cardelio.user_id], 5); pm_conversations.recent.insert([shiv.user_id], 6); pm_conversations.recent.insert([cardelio.user_id, shiv.user_id], 7); pm_conversations.recent.insert([desdemona.user_id], 8); // We've now added a total of 8 conversations, which is the value // of `max_conversations_to_show_with_unreads` so even now, the // number of unreads in `more conversations` li-item should be 0. list_info = get_list_info(false); assert.deepEqual(list_info.conversations_to_be_shown.length, 8); assert.deepEqual(list_info.more_conversations_unread_count, 0); // Verify just the ordering of the conversations with unreads. assert.deepEqual( list_info.conversations_to_be_shown.map((conversation) => conversation.recipients), [ "Desdemona", "Cardelio, Shiv", "Shiv", "Cardelio, Zoe", "Cardelio", "Zoe", "Me Myself", "Alice, Bob", ], ); // After adding two more conversations, there will be 10 // conversations, which exceeds // `max_conversations_to_show_with_unreads`. Verify that the // oldest conversations are not shown and their unreads are counted in // more_conversations_unread_count. pm_conversations.recent.insert([lago.user_id], 9); pm_conversations.recent.insert([zoe.user_id, lago.user_id], 10); list_info = get_list_info(false); assert.deepEqual(list_info.conversations_to_be_shown.length, 8); assert.deepEqual(list_info.more_conversations_unread_count, 2); assert.deepEqual( list_info.conversations_to_be_shown.map((conversation) => conversation.recipients), [ "Lago, Zoe", "Lago", "Desdemona", "Cardelio, Shiv", "Shiv", "Cardelio, Zoe", "Cardelio", "Zoe", ], ); // If we are narrowed to an older conversation, then that one gets // included in the list despite not being among the 8 most recent. set_filter_result(["alice@zulip.com,bob@zulip.com"]); list_info = get_list_info(false); assert.deepEqual(list_info.conversations_to_be_shown.length, 9); assert.deepEqual(list_info.more_conversations_unread_count, 1); assert.deepEqual( list_info.conversations_to_be_shown.map((conversation) => conversation.recipients), [ "Lago, Zoe", "Lago", "Desdemona", "Cardelio, Shiv", "Shiv", "Cardelio, Zoe", "Cardelio", "Zoe", "Alice, Bob", ], ); // Verify that if the list is zoomed, we'll include all 10 // conversations in the correct order. list_info = get_list_info(true); assert.deepEqual(list_info.conversations_to_be_shown.length, 10); assert.deepEqual( list_info.conversations_to_be_shown.map((conversation) => conversation.recipients), [ "Lago, Zoe", "Lago", "Desdemona", "Cardelio, Shiv", "Shiv", "Cardelio, Zoe", "Cardelio", "Zoe", "Me Myself", "Alice, Bob", ], ); // We now test some no unreads cases. override(unread, "num_unread_for_user_ids_string", () => 0); pm_conversations.clear_for_testing(); pm_conversations.recent.insert([alice.user_id], 1); pm_conversations.recent.insert([bob.user_id], 2); pm_conversations.recent.insert([me.user_id], 3); pm_conversations.recent.insert([zoe.user_id], 4); pm_conversations.recent.insert([cardelio.user_id], 5); pm_conversations.recent.insert([shiv.user_id], 6); pm_conversations.recent.insert([alice.user_id, bob.user_id], 7); // We have 7 conversations in total, but only most recent 5 are visible. list_info = get_list_info(false); assert.deepEqual(list_info.conversations_to_be_shown.length, 5); // If we set the oldest conversation as active, it will // also be included in the list with the most recent 5. set_filter_result(["alice@zulip.com"]); assert.equal(pm_list_data.get_active_user_ids_string(), "101"); list_info = get_list_info(false); assert.deepEqual(list_info.conversations_to_be_shown.length, 6); assert.deepEqual(list_info.conversations_to_be_shown[5], { recipients: "Alice", user_ids_string: "101", unread: 0, is_zero: true, is_active: true, url: "#narrow/pm-with/101-Alice", status_emoji_info: {emoji_code: 20}, user_circle_class: "user_circle_empty", is_group: false, }); assert.deepEqual( list_info.conversations_to_be_shown.map((conversation) => conversation.recipients), ["Alice, Bob", "Shiv", "Cardelio", "Zoe", "Me Myself", "Alice"], ); });