Files
zulip/frontend_tests/node_tests/narrow.js
YashRE42 836f39ecbb narrow_banner: Hide all empty narrow messages before each test.
Previously we were liable to have false positives in our tests here
because we did not reset the visible state for these selectors, this
commit adds a helper and relevant calls to it in order to prevent such
false positives.
2021-04-01 07:38:39 -07:00

418 lines
13 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");
page_params.stop_words = ["what", "about"];
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: "me@example.com",
user_id: 5,
full_name: "Me Myself",
};
const alice = {
email: "alice@example.com",
user_id: 23,
full_name: "Alice Smith",
};
const ray = {
email: "ray@example.com",
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, "alice@example.com,ray@example.com");
emails = hash_util.decode_operand("pm-with", "5,22,23-group");
assert.equal(emails, "alice@example.com,ray@example.com");
emails = hash_util.decode_operand("pm-with", "5-group");
assert.equal(emails, "me@example.com");
});
run_test("show_empty_narrow_message", () => {
$("#left_bar_compose_reply_button_big").prop("disabled", false);
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());
assert.equal(
$("#left_bar_compose_reply_button_big").attr("title"),
"translated: There are no messages to reply to.",
);
assert($("#left_bar_compose_reply_button_big").prop("disabled"));
// 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});
stream_data.update_calculated_fields(stream_data.get_sub("ROME"));
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", ["alice@example.com", "Yo"]]]);
hide_all_empty_narrow_messages();
narrow_banner.show_empty_narrow_message();
assert($("#non_existing_users").visible());
set_filter([["pm-with", "alice@example.com"]]);
hide_all_empty_narrow_messages();
narrow_banner.show_empty_narrow_message();
assert($("#empty_narrow_private_message").visible());
set_filter([["group-pm-with", "alice@example.com"]]);
hide_all_empty_narrow_messages();
narrow_banner.show_empty_narrow_message();
assert($("#empty_narrow_group_private_message").visible());
set_filter([["sender", "ray@example.com"]]);
hide_all_empty_narrow_messages();
narrow_banner.show_empty_narrow_message();
assert($("#silent_user").visible());
set_filter([["sender", "sinwar@example.com"]]);
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");
});
run_test("show_search_stopwords", () => {
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", "alice@example.com"],
["sender", "ray@example.com"],
]);
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 = "alice@example.com";
args.called = false;
narrow.to_compose_target();
assert.equal(args.called, true);
assert.deepEqual(args.operators, [{operator: "pm-with", operand: "alice@example.com"}]);
// Test with valid persons
emails = "alice@example.com,ray@example.com";
args.called = false;
narrow.to_compose_target();
assert.equal(args.called, true);
assert.deepEqual(args.operators, [
{operator: "pm-with", operand: "alice@example.com,ray@example.com"},
]);
// Test with some invalid persons
emails = "alice@example.com,random,ray@example.com";
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"}]);
});