mirror of https://github.com/zulip/zulip.git
68 lines
2.2 KiB
JavaScript
68 lines
2.2 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
const {strict: assert} = require("assert");
|
||
|
|
||
|
const {make_stub} = require("../zjsunit/stub");
|
||
|
const {run_test} = require("../zjsunit/test");
|
||
|
|
||
|
/*
|
||
|
The previous example was a bit extreme. Generally we just
|
||
|
use the make_stub helper that comes with zjsunit.
|
||
|
|
||
|
We will step away from the actual Zulip codebase for a
|
||
|
second and just explore a contrived example.
|
||
|
*/
|
||
|
|
||
|
run_test("explore make_stub", (override) => {
|
||
|
// Let's say you have to test the following code.
|
||
|
|
||
|
const app = {
|
||
|
notify_server_of_deposit(deposit_amount) {
|
||
|
// simulate difficulty
|
||
|
throw new Error(`We cannot report this value without wifi: ${deposit_amount}`);
|
||
|
},
|
||
|
|
||
|
pop_up_fancy_confirmation_screen(deposit_amount, label) {
|
||
|
// simulate difficulty
|
||
|
throw new Error(`We cannot make a ${label} dialog for amount ${deposit_amount}`);
|
||
|
},
|
||
|
};
|
||
|
|
||
|
let balance = 40;
|
||
|
|
||
|
function deposit_paycheck(paycheck_amount) {
|
||
|
balance += paycheck_amount;
|
||
|
app.notify_server_of_deposit(paycheck_amount);
|
||
|
app.pop_up_fancy_confirmation_screen(paycheck_amount, "paycheck");
|
||
|
}
|
||
|
|
||
|
// Our deposit_paycheck should be easy to unit test for its
|
||
|
// core functionality (updating your balance), but the side
|
||
|
// effects get in the way. We have to override them to do
|
||
|
// the simple test here.
|
||
|
|
||
|
override(app, "notify_server_of_deposit", () => {});
|
||
|
override(app, "pop_up_fancy_confirmation_screen", () => {});
|
||
|
deposit_paycheck(10);
|
||
|
assert.equal(balance, 50);
|
||
|
|
||
|
// But we can do a little better here. Even though
|
||
|
// the two side-effect functions are awkward here, we can
|
||
|
// at least make sure they are invoked correctly. Let's
|
||
|
// use stubs.
|
||
|
|
||
|
const notify_stub = make_stub();
|
||
|
const pop_up_stub = make_stub();
|
||
|
|
||
|
// This time we'll just use our override helper to connect the
|
||
|
// stubs.
|
||
|
override(app, "notify_server_of_deposit", notify_stub.f);
|
||
|
override(app, "pop_up_fancy_confirmation_screen", pop_up_stub.f);
|
||
|
|
||
|
deposit_paycheck(25);
|
||
|
assert.equal(balance, 75);
|
||
|
|
||
|
assert.deepEqual(notify_stub.get_args("amount"), {amount: 25});
|
||
|
assert.deepEqual(pop_up_stub.get_args("amount", "label"), {amount: 25, label: "paycheck"});
|
||
|
});
|