mirror of
				https://github.com/zulip/zulip.git
				synced 2025-10-31 20:13:46 +00:00 
			
		
		
		
	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>
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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");
 | |
| });
 |