mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 14:03:30 +00:00 
			
		
		
		
	I didn't bother to keep the very last test from tutorial, which has some complications related to clearing stream_list data and was kind of overkill.
		
			
				
	
	
		
			125 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
const {strict: assert} = require("assert");
 | 
						|
 | 
						|
const {mock_esm, set_global, zrequire} = require("../zjsunit/namespace");
 | 
						|
const {run_test} = require("../zjsunit/test");
 | 
						|
 | 
						|
/*
 | 
						|
   Our test from an earlier example verifies that the update events
 | 
						|
   leads to a name change inside the people object, but it obviously
 | 
						|
   kind of glosses over the other interactions.
 | 
						|
 | 
						|
   We can go a step further and verify the sequence of operations that
 | 
						|
   happen during an event.  This concept is called "stubbing", and you
 | 
						|
   can find libraries to help do stubbing.  Here we will just build our
 | 
						|
   own lightweight stubbing system, which is almost trivially easy to
 | 
						|
   do in a language like JavaScript.
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
// First we tell the compiler to skip certain modules and just
 | 
						|
// replace them with {}.
 | 
						|
const huddle_data = mock_esm("../../static/js/huddle_data");
 | 
						|
const message_util = mock_esm("../../static/js/message_util");
 | 
						|
const notifications = mock_esm("../../static/js/notifications");
 | 
						|
const pm_list = mock_esm("../../static/js/pm_list");
 | 
						|
const resize = mock_esm("../../static/js/resize");
 | 
						|
const stream_list = mock_esm("../../static/js/stream_list");
 | 
						|
const unread_ops = mock_esm("../../static/js/unread_ops");
 | 
						|
const unread_ui = mock_esm("../../static/js/unread_ui");
 | 
						|
 | 
						|
set_global("home_msg_list", {});
 | 
						|
 | 
						|
// And we will also test some real code, of course.
 | 
						|
const message_events = zrequire("message_events");
 | 
						|
const message_store = zrequire("message_store");
 | 
						|
const narrow_state = zrequire("narrow_state");
 | 
						|
const people = zrequire("people");
 | 
						|
const recent_topics = zrequire("recent_topics");
 | 
						|
 | 
						|
const isaac = {
 | 
						|
    email: "isaac@example.com",
 | 
						|
    user_id: 30,
 | 
						|
    full_name: "Isaac Newton",
 | 
						|
};
 | 
						|
people.add_active_user(isaac);
 | 
						|
 | 
						|
/*
 | 
						|
   Next we create a test_helper that will allow us to redirect methods to an
 | 
						|
   events array, and we can then later verify that the sequence of side effect
 | 
						|
   is as predicted.
 | 
						|
 | 
						|
   (Note that for now we don't simulate return values nor do we inspect the
 | 
						|
   arguments to these functions.  We could easily extend our helper to do more.)
 | 
						|
 | 
						|
   The forthcoming example is a pretty extreme example, where we are calling a
 | 
						|
   pretty high level method that dispatches a lot of its work out to other
 | 
						|
   objects.
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
function test_helper(override) {
 | 
						|
    const events = [];
 | 
						|
 | 
						|
    return {
 | 
						|
        redirect: (module, func_name) => {
 | 
						|
            override(module, func_name, () => {
 | 
						|
                events.push([module, func_name]);
 | 
						|
            });
 | 
						|
        },
 | 
						|
        events,
 | 
						|
    };
 | 
						|
}
 | 
						|
 | 
						|
run_test("insert_message", (override) => {
 | 
						|
    message_store.clear_for_testing();
 | 
						|
 | 
						|
    override(pm_list, "update_private_messages", () => {});
 | 
						|
    override(recent_topics, "is_visible", () => false);
 | 
						|
 | 
						|
    const helper = test_helper(override);
 | 
						|
 | 
						|
    const new_message = {
 | 
						|
        sender_id: isaac.user_id,
 | 
						|
        id: 1001,
 | 
						|
        content: "example content",
 | 
						|
    };
 | 
						|
 | 
						|
    assert.equal(message_store.get(new_message.id), undefined);
 | 
						|
 | 
						|
    helper.redirect(huddle_data, "process_loaded_messages");
 | 
						|
    helper.redirect(message_util, "add_new_messages");
 | 
						|
    helper.redirect(notifications, "received_messages");
 | 
						|
    helper.redirect(resize, "resize_page_components");
 | 
						|
    helper.redirect(stream_list, "update_streams_sidebar");
 | 
						|
    helper.redirect(unread_ops, "process_visible");
 | 
						|
    helper.redirect(unread_ui, "update_unread_counts");
 | 
						|
 | 
						|
    narrow_state.reset_current_filter();
 | 
						|
 | 
						|
    message_events.insert_new_messages([new_message]);
 | 
						|
 | 
						|
    // Even though we have stubbed a *lot* of code, our
 | 
						|
    // tests can still verify the main "narrative" of how
 | 
						|
    // the code invokes various objects when a new message
 | 
						|
    // comes in:
 | 
						|
    assert.deepEqual(helper.events, [
 | 
						|
        [huddle_data, "process_loaded_messages"],
 | 
						|
        [message_util, "add_new_messages"],
 | 
						|
        [message_util, "add_new_messages"],
 | 
						|
        [unread_ui, "update_unread_counts"],
 | 
						|
        [resize, "resize_page_components"],
 | 
						|
        [unread_ops, "process_visible"],
 | 
						|
        [notifications, "received_messages"],
 | 
						|
        [stream_list, "update_streams_sidebar"],
 | 
						|
    ]);
 | 
						|
 | 
						|
    // Despite all of our stubbing/mocking, the call to
 | 
						|
    // insert_new_messages will have created a very important
 | 
						|
    // side effect that we can verify:
 | 
						|
    const inserted_message = message_store.get(new_message.id);
 | 
						|
    assert.equal(inserted_message.id, new_message.id);
 | 
						|
    assert.equal(inserted_message.content, "example content");
 | 
						|
});
 |