Files
zulip/web/tests/example3.test.js
Anders Kaseorg b9e62c7af8 page_params: Split out state data for realm.
For spectators, the chunk of page_params that originates from
do_events_register isn’t assigned until ui_init.js.  That means the
TypeScript type of page_params is mostly a lie during module load
time: reading a parameter too early silently results in undefined
rather than the declared type, with unpredictable results later on.

We want to make such an early read into an immediate runtime error,
for both users and spectators consistently, and pave the way for
runtime validation of the page_params type.  As a second step, split
out the subset of fields that pertain to the entire realm.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-02-15 10:22:52 -08:00

98 lines
2.8 KiB
JavaScript

"use strict";
const {strict: assert} = require("assert");
const {zrequire} = require("./lib/namespace");
const {run_test} = require("./lib/test");
const {realm} = require("./lib/zpage_params");
// In the Zulip app you can narrow your message stream by topic, by
// sender, by direct message recipient, by search keywords, etc.
// We will discuss narrows more broadly, but first let's test out a
// core piece of code that makes things work.
const {Filter} = zrequire("../src/filter");
const stream_data = zrequire("stream_data");
// This is the first time we have to deal with `realm`.
// `realm` has a lot of important data shared by various
// modules. Most of the data is irrelevant to our tests.
// Use this to explicitly say we are not a special Zephyr
// realm, since we want to test the "normal" codepath.
realm.realm_is_zephyr_mirror_realm = false;
const denmark_stream = {
color: "blue",
name: "Denmark",
stream_id: 101,
subscribed: false,
};
run_test("filter", () => {
stream_data.clear_subscriptions();
stream_data.add_sub(denmark_stream);
const filter_terms = [
{operator: "stream", operand: "Denmark"},
{operator: "topic", operand: "copenhagen"},
];
const filter = new Filter(filter_terms);
const predicate = filter.predicate();
// We don't need full-fledged messages to test the gist of
// our filter. If there are details that are distracting from
// your test, you should not feel guilty about removing them.
assert.equal(predicate({type: "personal"}), false);
assert.equal(
predicate({
type: "stream",
stream_id: denmark_stream.stream_id,
topic: "does not match filter",
}),
false,
);
assert.equal(
predicate({
type: "stream",
stream_id: denmark_stream.stream_id,
topic: "copenhagen",
}),
true,
);
});
// We have a "narrow" abstraction that sits roughly on top of the
// "filter" abstraction. If you are in a narrow, we track the
// state with the narrow_state module.
const narrow_state = zrequire("narrow_state");
run_test("narrow_state", () => {
stream_data.clear_subscriptions();
stream_data.add_sub(denmark_stream);
narrow_state.reset_current_filter();
// As we often do, first make assertions about the starting
// state:
assert.equal(narrow_state.stream_name(), undefined);
// Now set up a Filter object.
const filter_terms = [
{operator: "stream", operand: "Denmark"},
{operator: "topic", operand: "copenhagen"},
];
const filter = new Filter(filter_terms);
// And here is where we actually change state.
narrow_state.set_current_filter(filter);
assert.equal(narrow_state.stream_name(), "Denmark");
assert.equal(narrow_state.topic(), "copenhagen");
});