mirror of
https://github.com/zulip/zulip.git
synced 2026-06-24 21:08:25 +08:00
The default label for empty narrows depends on whether it's a stream/topic narrow or a PMs narrow. We leave some default text in compose.hbs for reply label because it take some time for the js to display the correct label.
461 lines
14 KiB
JavaScript
461 lines
14 KiB
JavaScript
"use strict";
|
|
|
|
const {strict: assert} = require("assert");
|
|
|
|
const {mock_cjs, mock_esm, with_field, zrequire} = require("../zjsunit/namespace");
|
|
const {run_test} = require("../zjsunit/test");
|
|
const $ = require("../zjsunit/zjquery");
|
|
const {page_params} = require("../zjsunit/zpage_params");
|
|
|
|
mock_cjs("jquery", $);
|
|
const stream_topic_history = mock_esm("../../static/js/stream_topic_history");
|
|
|
|
const hash_util = zrequire("hash_util");
|
|
const compose_state = zrequire("compose_state");
|
|
const narrow_banner = zrequire("narrow_banner");
|
|
const narrow_state = zrequire("narrow_state");
|
|
const people = zrequire("people");
|
|
const stream_data = zrequire("stream_data");
|
|
const {Filter} = zrequire("../js/filter");
|
|
const narrow = zrequire("narrow");
|
|
|
|
function set_filter(operators) {
|
|
operators = operators.map((op) => ({
|
|
operator: op[0],
|
|
operand: op[1],
|
|
}));
|
|
narrow_state.set_current_filter(new Filter(operators));
|
|
}
|
|
|
|
const me = {
|
|
email: "[email protected]",
|
|
user_id: 5,
|
|
full_name: "Me Myself",
|
|
};
|
|
|
|
const alice = {
|
|
email: "[email protected]",
|
|
user_id: 23,
|
|
full_name: "Alice Smith",
|
|
};
|
|
|
|
const ray = {
|
|
email: "[email protected]",
|
|
user_id: 22,
|
|
full_name: "Raymond",
|
|
};
|
|
|
|
function hide_all_empty_narrow_messages() {
|
|
const all_empty_narrow_messages = [
|
|
".empty_feed_notice",
|
|
"#empty_narrow_message",
|
|
"#nonsubbed_private_nonexistent_stream_narrow_message",
|
|
"#nonsubbed_stream_narrow_message",
|
|
"#empty_star_narrow_message",
|
|
"#empty_narrow_all_mentioned",
|
|
"#empty_narrow_all_private_message",
|
|
"#no_unread_narrow_message",
|
|
"#non_existing_user",
|
|
"#non_existing_users",
|
|
"#empty_narrow_private_message",
|
|
"#empty_narrow_self_private_message",
|
|
"#empty_narrow_multi_private_message",
|
|
"#empty_narrow_group_private_message",
|
|
"#silent_user",
|
|
"#empty_search_narrow_message",
|
|
];
|
|
for (const selector of all_empty_narrow_messages) {
|
|
$(selector).hide();
|
|
}
|
|
}
|
|
|
|
run_test("uris", () => {
|
|
people.add_active_user(ray);
|
|
people.add_active_user(alice);
|
|
people.add_active_user(me);
|
|
people.initialize_current_user(me.user_id);
|
|
|
|
let uri = hash_util.pm_with_uri(ray.email);
|
|
assert.equal(uri, "#narrow/pm-with/22-ray");
|
|
|
|
uri = hash_util.huddle_with_uri("22,23");
|
|
assert.equal(uri, "#narrow/pm-with/22,23-group");
|
|
|
|
uri = hash_util.by_sender_uri(ray.email);
|
|
assert.equal(uri, "#narrow/sender/22-ray");
|
|
|
|
let emails = hash_util.decode_operand("pm-with", "22,23-group");
|
|
assert.equal(emails, "[email protected],[email protected]");
|
|
|
|
emails = hash_util.decode_operand("pm-with", "5,22,23-group");
|
|
assert.equal(emails, "[email protected],[email protected]");
|
|
|
|
emails = hash_util.decode_operand("pm-with", "5-group");
|
|
assert.equal(emails, "[email protected]");
|
|
});
|
|
|
|
run_test("show_empty_narrow_message", () => {
|
|
page_params.stop_words = [];
|
|
|
|
narrow_state.reset_current_filter();
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert.equal($(".empty_feed_notice").visible(), false);
|
|
assert($("#empty_narrow_message").visible());
|
|
|
|
// for non-existent or private stream
|
|
set_filter([["stream", "Foo"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#nonsubbed_private_nonexistent_stream_narrow_message").visible());
|
|
|
|
// for non sub public stream
|
|
stream_data.add_sub({name: "ROME", stream_id: 99});
|
|
set_filter([["stream", "Rome"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#nonsubbed_stream_narrow_message").visible());
|
|
|
|
set_filter([["is", "starred"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_star_narrow_message").visible());
|
|
|
|
set_filter([["is", "mentioned"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_narrow_all_mentioned").visible());
|
|
|
|
set_filter([["is", "private"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_narrow_all_private_message").visible());
|
|
|
|
set_filter([["is", "unread"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#no_unread_narrow_message").visible());
|
|
|
|
set_filter([["pm-with", ["Yo"]]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#non_existing_user").visible());
|
|
|
|
people.add_active_user(alice);
|
|
set_filter([["pm-with", ["[email protected]", "Yo"]]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#non_existing_users").visible());
|
|
|
|
set_filter([["pm-with", "[email protected]"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_narrow_private_message").visible());
|
|
|
|
people.add_active_user(me);
|
|
people.initialize_current_user(me.user_id);
|
|
set_filter([["pm-with", me.email]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_narrow_self_private_message").visible());
|
|
|
|
set_filter([["pm-with", me.email + "," + alice.email]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_narrow_multi_private_message").visible());
|
|
|
|
set_filter([["group-pm-with", "[email protected]"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_narrow_group_private_message").visible());
|
|
|
|
set_filter([["sender", "[email protected]"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#silent_user").visible());
|
|
|
|
set_filter([["sender", "[email protected]"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#non_existing_user").visible());
|
|
|
|
const display = $("#empty_search_stop_words_string");
|
|
|
|
const items = [];
|
|
display.append = (html) => {
|
|
items.push(html);
|
|
};
|
|
|
|
set_filter([["search", "grail"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_search_narrow_message").visible());
|
|
|
|
assert.equal(items.length, 2);
|
|
assert.equal(items[0], " ");
|
|
assert.equal(items[1].text(), "grail");
|
|
|
|
set_filter([
|
|
["sender", "[email protected]"],
|
|
["stream", "Rome"],
|
|
]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_narrow_message").visible());
|
|
|
|
set_filter([["is", "invalid"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_narrow_message").visible());
|
|
|
|
const my_stream = {
|
|
name: "my stream",
|
|
stream_id: 103,
|
|
};
|
|
stream_data.add_sub(my_stream);
|
|
stream_data.subscribe_myself(my_stream);
|
|
|
|
set_filter([["stream", "my stream"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_narrow_message").visible());
|
|
|
|
set_filter([["stream", ""]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#nonsubbed_private_nonexistent_stream_narrow_message").visible());
|
|
});
|
|
|
|
run_test("hide_empty_narrow_message", () => {
|
|
$(".empty_feed_notice").show();
|
|
narrow_banner.hide_empty_narrow_message();
|
|
assert(!$(".empty_feed_notice").visible());
|
|
});
|
|
|
|
run_test("show_search_stopwords", () => {
|
|
page_params.stop_words = ["what", "about"];
|
|
|
|
narrow_state.reset_current_filter();
|
|
let items = [];
|
|
|
|
const display = $("#empty_search_stop_words_string");
|
|
|
|
display.append = (html) => {
|
|
if (html.text) {
|
|
items.push(html.selector + html.text());
|
|
}
|
|
};
|
|
|
|
set_filter([["search", "what about grail"]]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_search_narrow_message").visible());
|
|
|
|
assert.equal(items.length, 3);
|
|
assert.equal(items[0], "<del>what");
|
|
assert.equal(items[1], "<del>about");
|
|
assert.equal(items[2], "<span>grail");
|
|
|
|
items = [];
|
|
set_filter([
|
|
["stream", "streamA"],
|
|
["search", "what about grail"],
|
|
]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_search_narrow_message").visible());
|
|
|
|
assert.equal(items.length, 4);
|
|
assert.equal(items[0], "<span>stream: streamA");
|
|
assert.equal(items[1], "<del>what");
|
|
assert.equal(items[2], "<del>about");
|
|
assert.equal(items[3], "<span>grail");
|
|
|
|
items = [];
|
|
set_filter([
|
|
["stream", "streamA"],
|
|
["topic", "topicA"],
|
|
["search", "what about grail"],
|
|
]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_search_narrow_message").visible());
|
|
|
|
assert.equal(items.length, 4);
|
|
assert.equal(items[0], "<span>stream: streamA topic: topicA");
|
|
assert.equal(items[1], "<del>what");
|
|
assert.equal(items[2], "<del>about");
|
|
assert.equal(items[3], "<span>grail");
|
|
});
|
|
|
|
run_test("show_invalid_narrow_message", () => {
|
|
narrow_state.reset_current_filter();
|
|
const display = $("#empty_search_stop_words_string");
|
|
|
|
stream_data.add_sub({name: "streamA", stream_id: 88});
|
|
stream_data.add_sub({name: "streamB", stream_id: 77});
|
|
|
|
set_filter([
|
|
["stream", "streamA"],
|
|
["stream", "streamB"],
|
|
]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_search_narrow_message").visible());
|
|
assert.equal(
|
|
display.text(),
|
|
"translated: You are searching for messages that belong to more than one stream, which is not possible.",
|
|
);
|
|
|
|
set_filter([
|
|
["topic", "topicA"],
|
|
["topic", "topicB"],
|
|
]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_search_narrow_message").visible());
|
|
assert.equal(
|
|
display.text(),
|
|
"translated: You are searching for messages that belong to more than one topic, which is not possible.",
|
|
);
|
|
|
|
people.add_active_user(ray);
|
|
people.add_active_user(alice);
|
|
|
|
set_filter([
|
|
["sender", "[email protected]"],
|
|
["sender", "[email protected]"],
|
|
]);
|
|
hide_all_empty_narrow_messages();
|
|
narrow_banner.show_empty_narrow_message();
|
|
assert($("#empty_search_narrow_message").visible());
|
|
assert.equal(
|
|
display.text(),
|
|
"translated: You are searching for messages that are sent by more than one person, which is not possible.",
|
|
);
|
|
});
|
|
|
|
run_test("narrow_to_compose_target errors", () => {
|
|
function test() {
|
|
with_field(
|
|
narrow,
|
|
"activate",
|
|
() => {
|
|
throw new Error("should not activate!");
|
|
},
|
|
() => {
|
|
narrow.to_compose_target();
|
|
},
|
|
);
|
|
}
|
|
|
|
// No-op when not composing.
|
|
compose_state.set_message_type(false);
|
|
test();
|
|
|
|
// No-op when empty stream.
|
|
compose_state.set_message_type("stream");
|
|
compose_state.stream_name("");
|
|
test();
|
|
});
|
|
|
|
run_test("narrow_to_compose_target streams", (override) => {
|
|
const args = {called: false};
|
|
override(narrow, "activate", (operators, opts) => {
|
|
args.operators = operators;
|
|
args.opts = opts;
|
|
args.called = true;
|
|
});
|
|
|
|
compose_state.set_message_type("stream");
|
|
stream_data.add_sub({name: "ROME", stream_id: 99});
|
|
compose_state.stream_name("ROME");
|
|
override(stream_topic_history, "get_recent_topic_names", () => ["one", "two", "three"]);
|
|
|
|
// Test with existing topic
|
|
compose_state.topic("one");
|
|
args.called = false;
|
|
narrow.to_compose_target();
|
|
assert.equal(args.called, true);
|
|
assert.equal(args.opts.trigger, "narrow_to_compose_target");
|
|
assert.deepEqual(args.operators, [
|
|
{operator: "stream", operand: "ROME"},
|
|
{operator: "topic", operand: "one"},
|
|
]);
|
|
|
|
// Test with new topic
|
|
compose_state.topic("four");
|
|
args.called = false;
|
|
narrow.to_compose_target();
|
|
assert.equal(args.called, true);
|
|
assert.deepEqual(args.operators, [{operator: "stream", operand: "ROME"}]);
|
|
|
|
// Test with blank topic
|
|
compose_state.topic("");
|
|
args.called = false;
|
|
narrow.to_compose_target();
|
|
assert.equal(args.called, true);
|
|
assert.deepEqual(args.operators, [{operator: "stream", operand: "ROME"}]);
|
|
|
|
// Test with no topic
|
|
compose_state.topic(undefined);
|
|
args.called = false;
|
|
narrow.to_compose_target();
|
|
assert.equal(args.called, true);
|
|
assert.deepEqual(args.operators, [{operator: "stream", operand: "ROME"}]);
|
|
});
|
|
|
|
run_test("narrow_to_compose_target PMs", (override) => {
|
|
const args = {called: false};
|
|
override(narrow, "activate", (operators, opts) => {
|
|
args.operators = operators;
|
|
args.opts = opts;
|
|
args.called = true;
|
|
});
|
|
|
|
let emails;
|
|
override(compose_state, "private_message_recipient", () => emails);
|
|
|
|
compose_state.set_message_type("private");
|
|
people.add_active_user(ray);
|
|
people.add_active_user(alice);
|
|
people.add_active_user(me);
|
|
|
|
// Test with valid person
|
|
emails = "[email protected]";
|
|
args.called = false;
|
|
narrow.to_compose_target();
|
|
assert.equal(args.called, true);
|
|
assert.deepEqual(args.operators, [{operator: "pm-with", operand: "[email protected]"}]);
|
|
|
|
// Test with valid persons
|
|
emails = "[email protected],[email protected]";
|
|
args.called = false;
|
|
narrow.to_compose_target();
|
|
assert.equal(args.called, true);
|
|
assert.deepEqual(args.operators, [
|
|
{operator: "pm-with", operand: "[email protected],[email protected]"},
|
|
]);
|
|
|
|
// Test with some invalid persons
|
|
emails = "[email protected],random,[email protected]";
|
|
args.called = false;
|
|
narrow.to_compose_target();
|
|
assert.equal(args.called, true);
|
|
assert.deepEqual(args.operators, [{operator: "is", operand: "private"}]);
|
|
|
|
// Test with all invalid persons
|
|
emails = "alice,random,ray";
|
|
args.called = false;
|
|
narrow.to_compose_target();
|
|
assert.equal(args.called, true);
|
|
assert.deepEqual(args.operators, [{operator: "is", operand: "private"}]);
|
|
|
|
// Test with no persons
|
|
emails = "";
|
|
args.called = false;
|
|
narrow.to_compose_target();
|
|
assert.equal(args.called, true);
|
|
assert.deepEqual(args.operators, [{operator: "is", operand: "private"}]);
|
|
});
|