mirror of
https://github.com/zulip/zulip.git
synced 2025-10-31 20:13:46 +00:00
It doesn't make sense for us to track a separate current filter when it should just the be filter of current message list if there is one. This will reduce possible confusion in the codebase where filter returned by narrow_state is different from message_lists.current.
102 lines
2.9 KiB
JavaScript
102 lines
2.9 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");
|
|
const message_lists = zrequire("message_lists");
|
|
|
|
run_test("narrow_state", () => {
|
|
stream_data.clear_subscriptions();
|
|
stream_data.add_sub(denmark_stream);
|
|
message_lists.set_current(undefined);
|
|
|
|
// 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.
|
|
message_lists.set_current({
|
|
data: {
|
|
filter,
|
|
},
|
|
});
|
|
assert.equal(narrow_state.stream_name(), "Denmark");
|
|
assert.equal(narrow_state.topic(), "copenhagen");
|
|
});
|