mirror of
https://github.com/zulip/zulip.git
synced 2026-06-30 21:11:04 +08:00
We change the "pm-with" and "sender" narrow urls
to be of "{user-id}-{encoded_name}" form instead
of using email. This change improves performance
of changing between PM views since parseOneAddress
function was slow and we remove its usage now by
using name instead of email.
The name is encoded such that the characters that
would be encoded by the browsers are replaced by
"-".
441 lines
13 KiB
JavaScript
441 lines
13 KiB
JavaScript
"use strict";
|
|
|
|
const {strict: assert} = require("assert");
|
|
|
|
const {mock_esm, zrequire} = require("../zjsunit/namespace");
|
|
const {run_test} = require("../zjsunit/test");
|
|
|
|
const unread = mock_esm("../../static/js/unread");
|
|
|
|
mock_esm("../../static/js/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: "[email protected]",
|
|
user_id: 101,
|
|
full_name: "Alice",
|
|
};
|
|
const bob = {
|
|
email: "[email protected]",
|
|
user_id: 102,
|
|
full_name: "Bob",
|
|
};
|
|
const me = {
|
|
email: "[email protected]",
|
|
user_id: 103,
|
|
full_name: "Me Myself",
|
|
};
|
|
const zoe = {
|
|
email: "[email protected]",
|
|
user_id: 104,
|
|
full_name: "Zoe",
|
|
};
|
|
const cardelio = {
|
|
email: "[email protected]",
|
|
user_id: 105,
|
|
full_name: "Cardelio",
|
|
};
|
|
const shiv = {
|
|
email: "[email protected]",
|
|
user_id: 106,
|
|
full_name: "Shiv",
|
|
};
|
|
const desdemona = {
|
|
email: "[email protected]",
|
|
user_id: 107,
|
|
full_name: "Desdemona",
|
|
};
|
|
const lago = {
|
|
email: "[email protected]",
|
|
user_id: 108,
|
|
full_name: "Lago",
|
|
};
|
|
const aaron = {
|
|
email: "[email protected]",
|
|
user_id: 109,
|
|
full_name: "Aaron",
|
|
};
|
|
const jai = {
|
|
email: "[email protected]",
|
|
user_id: 110,
|
|
full_name: "Jai",
|
|
};
|
|
const shivam = {
|
|
email: "[email protected]",
|
|
user_id: 111,
|
|
full_name: "Shivam",
|
|
};
|
|
const bot_test = {
|
|
email: "[email protected]",
|
|
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(["[email protected],[email protected]"]);
|
|
assert.equal(pm_list_data.get_active_user_ids_string(), "101,102");
|
|
});
|
|
|
|
function private_filter() {
|
|
return {
|
|
operands: (operand) => {
|
|
assert.equal(operand, "is");
|
|
return ["private", "starred"];
|
|
},
|
|
};
|
|
}
|
|
|
|
test("is_all_privates", () => {
|
|
assert.equal(narrow_state.filter(), undefined);
|
|
assert.equal(pm_list_data.is_all_privates(), false);
|
|
|
|
narrow_state.set_current_filter(private_filter());
|
|
assert.equal(pm_list_data.is_all_privates(), true);
|
|
});
|
|
|
|
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 converstaions 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(["[email protected],[email protected]"]);
|
|
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(["[email protected]"]);
|
|
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"],
|
|
);
|
|
});
|