diff --git a/frontend_tests/node_tests/activity.js b/frontend_tests/node_tests/activity.js
index 1a7599b9e8..4ed9037fb6 100644
--- a/frontend_tests/node_tests/activity.js
+++ b/frontend_tests/node_tests/activity.js
@@ -381,36 +381,40 @@ test("first/prev/next", ({override, mock_template}) => {
let rendered_fred;
mock_template("user_presence_row.hbs", false, (data) => {
- if (data.user_id === alice.user_id) {
- rendered_alice = true;
- assert.deepEqual(data, {
- faded: true,
- href: "#narrow/pm-with/1-alice",
- is_current_user: false,
- my_user_status: undefined,
- name: "Alice Smith",
- num_unread: 0,
- user_circle_class: "user_circle_green",
- user_circle_status: "translated: Active",
- user_id: alice.user_id,
- status_emoji_info: undefined,
- });
- } else if (data.user_id === fred.user_id) {
- rendered_fred = true;
- assert.deepEqual(data, {
- href: "#narrow/pm-with/2-fred",
- name: "Fred Flintstone",
- user_id: fred.user_id,
- my_user_status: undefined,
- is_current_user: false,
- num_unread: 0,
- user_circle_class: "user_circle_green",
- user_circle_status: "translated: Active",
- faded: false,
- status_emoji_info: undefined,
- });
- } else {
- throw new Error(`we did not expect to have to render a row for ${data.name}`);
+ switch (data.user_id) {
+ case alice.user_id:
+ rendered_alice = true;
+ assert.deepEqual(data, {
+ faded: true,
+ href: "#narrow/pm-with/1-alice",
+ is_current_user: false,
+ my_user_status: undefined,
+ name: "Alice Smith",
+ num_unread: 0,
+ user_circle_class: "user_circle_green",
+ user_circle_status: "translated: Active",
+ user_id: alice.user_id,
+ status_emoji_info: undefined,
+ });
+ break;
+ case fred.user_id:
+ rendered_fred = true;
+ assert.deepEqual(data, {
+ href: "#narrow/pm-with/2-fred",
+ name: "Fred Flintstone",
+ user_id: fred.user_id,
+ my_user_status: undefined,
+ is_current_user: false,
+ num_unread: 0,
+ user_circle_class: "user_circle_green",
+ user_circle_status: "translated: Active",
+ faded: false,
+ status_emoji_info: undefined,
+ });
+ break;
+ /* istanbul ignore next */
+ default:
+ throw new Error(`we did not expect to have to render a row for ${data.name}`);
}
});
@@ -555,13 +559,8 @@ test("realm_presence_disabled", () => {
test("redraw_muted_user", () => {
muted_users.add_muted_user(mark.user_id);
- let appended_html;
- $("#user_presences").append = function (html) {
- appended_html = html;
- };
-
activity.redraw_user(mark.user_id);
- assert.equal(appended_html, undefined);
+ assert.equal($("#user_presences").html(), "never-been-set");
});
test("update_presence_info", ({override, override_rewire}) => {
diff --git a/frontend_tests/node_tests/billing.js b/frontend_tests/node_tests/billing.js
index 565cc6a10d..927b34bae8 100644
--- a/frontend_tests/node_tests/billing.js
+++ b/frontend_tests/node_tests/billing.js
@@ -136,14 +136,12 @@ run_test("licensechange", ({override, override_rewire}) => {
assert.ok(confirm_license_modal_shown);
override(helpers, "is_valid_input", () => false);
- let prevent_default_called = false;
const event = {
- prevent_default: () => {
- prevent_default_called = true;
+ preventDefault: /* istanbul ignore next */ () => {
+ throw new Error("unexpected preventDefault call");
},
};
update_licenses_button_click_handler(event);
- assert.ok(!prevent_default_called);
const update_next_renewal_licenses_button_click_handler = $(
"#update-licenses-at-next-renewal-button",
diff --git a/frontend_tests/node_tests/channel.js b/frontend_tests/node_tests/channel.js
index 690367e3c5..51b77a85fa 100644
--- a/frontend_tests/node_tests/channel.js
+++ b/frontend_tests/node_tests/channel.js
@@ -399,19 +399,18 @@ test("while_reloading", () => {
assert.equal(channel.get({ignore_reload: false}), undefined);
- let orig_success_called = false;
- let orig_error_called = false;
-
test_with_mock_ajax({
run_code() {
channel.del({
url: "/json/endpoint",
ignore_reload: true,
+ /* istanbul ignore next */
success() {
- orig_success_called = true;
+ throw new Error("unexpected success");
},
+ /* istanbul ignore next */
error() {
- orig_error_called = true;
+ throw new Error("unexpected error");
},
});
},
@@ -419,11 +418,9 @@ test("while_reloading", () => {
check_ajax_options(options) {
blueslip.expect("log", "Ignoring DELETE /json/endpoint response while reloading");
options.simulate_success();
- assert.ok(!orig_success_called);
blueslip.expect("log", "Ignoring DELETE /json/endpoint error response while reloading");
options.simulate_error();
- assert.ok(!orig_error_called);
},
});
});
diff --git a/frontend_tests/node_tests/components.js b/frontend_tests/node_tests/components.js
index 694b948ec0..9bafa27a4c 100644
--- a/frontend_tests/node_tests/components.js
+++ b/frontend_tests/node_tests/components.js
@@ -106,6 +106,7 @@ function make_switcher() {
switch (sel) {
case ".ind-tab":
return ind_tab;
+ /* istanbul ignore next */
default:
throw new Error("unknown selector: " + sel);
}
@@ -151,6 +152,7 @@ mock_jquery((sel, attributes) => {
);
return make_tab(tab_id);
}
+ /* istanbul ignore next */
default:
throw new Error("unknown selector: " + sel);
}
diff --git a/frontend_tests/node_tests/compose.js b/frontend_tests/node_tests/compose.js
index 91d5827291..9bd2067d68 100644
--- a/frontend_tests/node_tests/compose.js
+++ b/frontend_tests/node_tests/compose.js
@@ -145,10 +145,6 @@ test_ui("send_message", ({override, override_rewire}) => {
return stub_state;
}
- set_global("setTimeout", (func) => {
- func();
- });
-
override(server_events, "assert_get_events_running", () => {
stub_state.get_events_running_called += 1;
});
@@ -635,13 +631,15 @@ test_ui("on_events", ({override, override_rewire}) => {
);
helper.$container.data = (field) => {
- if (field === "user-id") {
- return "34";
+ switch (field) {
+ case "user-id":
+ return "34";
+ case "stream-id":
+ return "102";
+ /* istanbul ignore next */
+ default:
+ throw new Error(`Unknown field ${field}`);
}
- if (field === "stream-id") {
- return "102";
- }
- throw new Error(`Unknown field ${field}`);
};
helper.$target.prop("disabled", false);
@@ -737,9 +735,6 @@ test_ui("on_events", ({override, override_rewire}) => {
(function test_attach_files_compose_clicked() {
const handler = $("#compose").get_on_handler("click", ".compose_upload_file");
- $("#compose .file_input").clone = (param) => {
- assert.ok(param);
- };
let compose_file_input_clicked = false;
$("#compose .file_input").on("click", () => {
compose_file_input_clicked = true;
diff --git a/frontend_tests/node_tests/compose_actions.js b/frontend_tests/node_tests/compose_actions.js
index 90630c87bf..e4dfbe99cd 100644
--- a/frontend_tests/node_tests/compose_actions.js
+++ b/frontend_tests/node_tests/compose_actions.js
@@ -390,6 +390,7 @@ test("quote_and_reply", ({override, override_rewire}) => {
raw_content: "Testing.",
};
+ /* istanbul ignore next */
function whiny_get() {
assert.fail("channel.get should not be used if raw_content is present");
}
diff --git a/frontend_tests/node_tests/compose_fade.js b/frontend_tests/node_tests/compose_fade.js
index e64475b931..a08831a80c 100644
--- a/frontend_tests/node_tests/compose_fade.js
+++ b/frontend_tests/node_tests/compose_fade.js
@@ -19,6 +19,7 @@ mock_jquery((selector) => {
return "lunch";
},
};
+ /* istanbul ignore next */
default:
throw new Error(`Unknown selector ${selector}`);
}
diff --git a/frontend_tests/node_tests/compose_pm_pill.js b/frontend_tests/node_tests/compose_pm_pill.js
index 795a7d347c..7612433d46 100644
--- a/frontend_tests/node_tests/compose_pm_pill.js
+++ b/frontend_tests/node_tests/compose_pm_pill.js
@@ -41,8 +41,6 @@ run_test("pills", ({override}) => {
people.add_active_user(iago);
people.add_active_user(hamlet);
- people.get_realm_users = () => [iago, othello, hamlet];
-
const $recipient_stub = $("#private_message_recipient");
const pill_container_stub = "pill-container";
$recipient_stub.set_parent(pill_container_stub);
@@ -81,25 +79,29 @@ run_test("pills", ({override}) => {
let get_by_email_called = false;
people.get_by_email = (user_email) => {
get_by_email_called = true;
- if (user_email === iago.email) {
- return iago;
+ switch (user_email) {
+ case iago.email:
+ return iago;
+ case othello.email:
+ return othello;
+ /* istanbul ignore next */
+ default:
+ throw new Error(`Unknown user email ${user_email}`);
}
- if (user_email === othello.email) {
- return othello;
- }
- throw new Error(`Unknown user email ${user_email}`);
};
let get_by_user_id_called = false;
people.get_by_user_id = (id) => {
get_by_user_id_called = true;
- if (id === othello.user_id) {
- return othello;
+ switch (id) {
+ case othello.user_id:
+ return othello;
+ case hamlet.user_id:
+ return hamlet;
+ /* istanbul ignore next */
+ default:
+ throw new Error(`Unknown user ID ${id}`);
}
- if (id === hamlet.user_id) {
- return hamlet;
- }
- throw new Error(`Unknown user ID ${id}`);
};
function test_create_item(handler) {
diff --git a/frontend_tests/node_tests/compose_ui.js b/frontend_tests/node_tests/compose_ui.js
index e2dee76df7..7da6ddf9bc 100644
--- a/frontend_tests/node_tests/compose_ui.js
+++ b/frontend_tests/node_tests/compose_ui.js
@@ -71,6 +71,7 @@ function make_textbox(s) {
};
$widget.val = function (new_val) {
+ /* istanbul ignore if */
if (new_val) {
$widget.s = new_val;
return this;
@@ -301,6 +302,7 @@ run_test("quote_and_reply", ({override, override_rewire}) => {
textarea_caret_pos = arg;
return this;
}
+ /* istanbul ignore if */
if (typeof arg !== "string") {
console.info(arg);
throw new Error("We expected the actual code to pass in a string.");
diff --git a/frontend_tests/node_tests/compose_validate.js b/frontend_tests/node_tests/compose_validate.js
index a74f792033..fe209442d2 100644
--- a/frontend_tests/node_tests/compose_validate.js
+++ b/frontend_tests/node_tests/compose_validate.js
@@ -163,12 +163,10 @@ test_ui("validate", ({override, mock_template}) => {
add_content_to_compose_box();
let zephyr_checked = false;
- $("#zephyr-mirror-error").is = () => {
- if (!zephyr_checked) {
- zephyr_checked = true;
- return true;
- }
- return false;
+ $("#zephyr-mirror-error").is = (arg) => {
+ assert.equal(arg, ":visible");
+ zephyr_checked = true;
+ return true;
};
assert.ok(!compose_validate.validate());
assert.ok(zephyr_checked);
@@ -740,14 +738,17 @@ test_ui("warn_if_mentioning_unsubscribed_user", ({override, override_rewire, moc
let looked_for_existing;
$warning_row.data = (field) => {
- if (field === "user-id") {
- looked_for_existing = true;
- return "34";
+ switch (field) {
+ case "user-id":
+ looked_for_existing = true;
+ return "34";
+ /* istanbul ignore next */
+ case "stream-id":
+ return "111";
+ /* istanbul ignore next */
+ default:
+ throw new Error(`Unknown field ${field}`);
}
- if (field === "stream-id") {
- return "111";
- }
- throw new Error(`Unknown field ${field}`);
};
const $previous_users = $("#compose_invite_users .compose_invite_user");
diff --git a/frontend_tests/node_tests/compose_video.js b/frontend_tests/node_tests/compose_video.js
index 990f09147b..b10beafc92 100644
--- a/frontend_tests/node_tests/compose_video.js
+++ b/frontend_tests/node_tests/compose_video.js
@@ -32,6 +32,7 @@ const compose = zrequire("compose");
function stub_out_video_calls() {
const $elem = $("#below-compose-content .video_link");
$elem.toggle = (show) => {
+ /* istanbul ignore if */
if (show) {
$elem.show();
} else {
@@ -77,8 +78,6 @@ test("videos", ({override, override_rewire}) => {
compose.initialize();
(function test_no_provider_video_link_compose_clicked() {
- let called = false;
-
const $textarea = $.create("target-stub");
$textarea.set_parents_result(".message_edit_form", []);
@@ -90,15 +89,19 @@ test("videos", ({override, override_rewire}) => {
},
};
- override_rewire(compose_ui, "insert_syntax_and_focus", () => {
- called = true;
- });
+ override_rewire(
+ compose_ui,
+ "insert_syntax_and_focus",
+ /* istanbul ignore next */
+ () => {
+ throw new Error("unexpected insert_syntax_and_focus call");
+ },
+ );
const handler = $("body").get_on_handler("click", ".video_link");
$("#compose-textarea").val("");
handler(ev);
- assert.ok(!called);
})();
(function test_jitsi_video_link_compose_clicked() {
diff --git a/frontend_tests/node_tests/composebox_typeahead.js b/frontend_tests/node_tests/composebox_typeahead.js
index baf2c76644..a82c7eef26 100644
--- a/frontend_tests/node_tests/composebox_typeahead.js
+++ b/frontend_tests/node_tests/composebox_typeahead.js
@@ -54,9 +54,6 @@ const composebox_typeahead = zrequire("composebox_typeahead");
const settings_config = zrequire("settings_config");
const pygments_data = zrequire("../generated/pygments_data.json");
-// To be eliminated in next commit:
-stream_data.__Rewire__("set_filter_out_inactives", () => false);
-
const ct = composebox_typeahead;
// Use a slightly larger value than what's user-facing
@@ -143,19 +140,10 @@ const emojis_by_name = new Map(
headphones: emoji_headphones,
}),
);
-const emoji_list = Array.from(emojis_by_name.values(), (emoji_dict) => {
- if (emoji_dict.is_realm_emoji === true) {
- return {
- emoji_name: emoji_dict.name,
- emoji_url: emoji_dict.url,
- is_realm_emoji: true,
- };
- }
- return {
- emoji_name: emoji_dict.name,
- emoji_code: emoji_dict.emoji_code,
- };
-});
+const emoji_list = Array.from(emojis_by_name.values(), (emoji_dict) => ({
+ emoji_name: emoji_dict.name,
+ emoji_code: emoji_dict.emoji_code,
+}));
const me_slash = {
name: "me",
@@ -1070,14 +1058,8 @@ test("initialize", ({override, override_rewire, mock_template}) => {
stopPropagation: noop,
};
- $("#stream_message_recipient_topic").data = () => ({typeahead: {shown: true}});
$("form#send_message_form").trigger(event);
- const stub_typeahead_hidden = () => ({typeahead: {shown: false}});
- $("#stream_message_recipient_topic").data = stub_typeahead_hidden;
- $("#stream_message_recipient_stream").data = stub_typeahead_hidden;
- $("#private_message_recipient").data = stub_typeahead_hidden;
- $("#compose-textarea").data = stub_typeahead_hidden;
$("form#send_message_form").trigger(event);
event.key = "Tab";
@@ -1144,7 +1126,6 @@ test("initialize", ({override, override_rewire, mock_template}) => {
preventDefault: noop,
};
// We trigger keydown in order to make nextFocus !== false
- $("#stream_message_recipient_topic").data = () => ({typeahead: {shown: true}});
$("form#send_message_form").trigger(event);
$("#stream_message_recipient_topic").off("mouseup");
event.type = "keyup";
diff --git a/frontend_tests/node_tests/dropdown_list_widget.js b/frontend_tests/node_tests/dropdown_list_widget.js
index 9b5f975278..8a715e3320 100644
--- a/frontend_tests/node_tests/dropdown_list_widget.js
+++ b/frontend_tests/node_tests/dropdown_list_widget.js
@@ -78,7 +78,7 @@ run_test("no_default_value", () => {
widget_name: "my_setting",
data: ["one", "two", "three"].map((x) => ({name: x, value: x})),
default_text: $t({defaultMessage: "not set"}),
- render_text: (text) => `rendered: ${text}`,
+ render_text: /* istanbul ignore next */ (text) => `rendered: ${text}`,
null_value: "null-value",
};
diff --git a/frontend_tests/node_tests/example6.js b/frontend_tests/node_tests/example6.js
index 00f993a26a..a73d781d8d 100644
--- a/frontend_tests/node_tests/example6.js
+++ b/frontend_tests/node_tests/example6.js
@@ -17,11 +17,13 @@ run_test("explore make_stub", ({override}) => {
// Let's say you have to test the following code.
const app = {
+ /* istanbul ignore next */
notify_server_of_deposit(deposit_amount) {
// simulate difficulty
throw new Error(`We cannot report this value without wifi: ${deposit_amount}`);
},
+ /* istanbul ignore next */
pop_up_fancy_confirmation_screen(deposit_amount, label) {
// simulate difficulty
throw new Error(`We cannot make a ${label} dialog for amount ${deposit_amount}`);
diff --git a/frontend_tests/node_tests/example7.js b/frontend_tests/node_tests/example7.js
index a6543101bd..fd3a00325e 100644
--- a/frontend_tests/node_tests/example7.js
+++ b/frontend_tests/node_tests/example7.js
@@ -91,8 +91,6 @@ run_test("unread_ops", ({override, override_rewire}) => {
// We don't want recent topics to process message for this test.
override_rewire(recent_topics_util, "is_visible", () => false);
- // Show message_viewport as not visible so that messages will be stored as unread.
- override(message_viewport, "is_visible_and_focused", () => false);
// Make our test message appear to be unread, so that
// we then need to subsequently process them as read.
diff --git a/frontend_tests/node_tests/hotkey.js b/frontend_tests/node_tests/hotkey.js
index 07cbcc2b64..6aa250ad91 100644
--- a/frontend_tests/node_tests/hotkey.js
+++ b/frontend_tests/node_tests/hotkey.js
@@ -105,7 +105,6 @@ message_lists.current = {
flags: ["read", "starred"],
};
},
- selected_row() {},
get_row() {
return 101;
},
@@ -138,7 +137,6 @@ function stubbing_rewire(module, func_name_to_stub, test_function) {
}
// Set up defaults for most tests.
-hotkey.__Rewire__("in_content_editable_widget", () => false);
hotkey.__Rewire__("processing_text", () => false);
run_test("mappings", () => {
@@ -228,7 +226,7 @@ function process(s) {
};
try {
return hotkey.process_keypress(e);
- } catch (error) {
+ } catch (error) /* istanbul ignore next */ {
// An exception will be thrown here if a different
// function is called than the one declared. Try to
// provide a useful error message.
@@ -292,8 +290,8 @@ run_test("allow normal typing when processing text", ({override_rewire}) => {
run_test("streams", ({override}) => {
settings_data.user_can_create_private_streams = () => true;
- settings_data.user_can_create_public_streams = () => true;
- settings_data.user_can_create_web_public_streams = () => true;
+ delete settings_data.user_can_create_public_streams;
+ delete settings_data.user_can_create_web_public_streams;
override(overlays, "streams_open", () => true);
override(overlays, "is_active", () => true);
assert_mapping("S", stream_settings_ui, "keyboard_sub");
@@ -435,7 +433,7 @@ run_test("motion_keys", () => {
try {
return hotkey.process_keydown(e);
- } catch (error) {
+ } catch (error) /* istanbul ignore next */ {
// An exception will be thrown here if a different
// function is called than the one declared. Try to
// provide a useful error message.
@@ -493,12 +491,12 @@ run_test("motion_keys", () => {
overlays.streams_open = () => true;
assert_mapping("up_arrow", stream_settings_ui, "switch_rows");
assert_mapping("down_arrow", stream_settings_ui, "switch_rows");
- overlays.streams_open = () => false;
+ delete overlays.streams_open;
overlays.lightbox_open = () => true;
assert_mapping("left_arrow", lightbox, "prev");
assert_mapping("right_arrow", lightbox, "next");
- overlays.lightbox_open = () => false;
+ delete overlays.lightbox_open;
overlays.settings_open = () => true;
assert_unmapped("end");
@@ -507,12 +505,12 @@ run_test("motion_keys", () => {
assert_unmapped("page_up");
assert_unmapped("page_down");
assert_unmapped("spacebar");
- overlays.settings_open = () => false;
+ delete overlays.settings_open;
- overlays.is_active = () => true;
+ delete overlays.is_active;
overlays.drafts_open = () => true;
assert_mapping("up_arrow", drafts, "drafts_handle_events");
assert_mapping("down_arrow", drafts, "drafts_handle_events");
- overlays.is_active = () => false;
- overlays.drafts_open = () => false;
+ delete overlays.is_active;
+ delete overlays.drafts_open;
});
diff --git a/frontend_tests/node_tests/input_pill.js b/frontend_tests/node_tests/input_pill.js
index 21be4c2bfc..539fc276f5 100644
--- a/frontend_tests/node_tests/input_pill.js
+++ b/frontend_tests/node_tests/input_pill.js
@@ -644,7 +644,7 @@ run_test("appendValue/clear", ({mock_template}) => {
const config = {
$container,
create_item_from_text: (s) => ({type: "color", display_value: s}),
- get_text_from_item: (s) => s.display_value,
+ get_text_from_item: /* istanbul ignore next */ (s) => s.display_value,
};
$pill_input.before = () => {};
diff --git a/frontend_tests/node_tests/keydown_util.js b/frontend_tests/node_tests/keydown_util.js
index 5f5a0c26ab..96b03d6055 100644
--- a/frontend_tests/node_tests/keydown_util.js
+++ b/frontend_tests/node_tests/keydown_util.js
@@ -11,7 +11,7 @@ run_test("test_early_returns", () => {
const opts = {
$elem: $stub,
handlers: {
- ArrowLeft: () => {
+ ArrowLeft: /* istanbul ignore next */ () => {
throw new Error("do not dispatch this with alt key");
},
},
diff --git a/frontend_tests/node_tests/list_cursor.js b/frontend_tests/node_tests/list_cursor.js
index 0aae475143..1c6f0a1e13 100644
--- a/frontend_tests/node_tests/list_cursor.js
+++ b/frontend_tests/node_tests/list_cursor.js
@@ -34,8 +34,8 @@ function basic_conf({first_key, prev_key, next_key}) {
run_test("misc errors", ({override}) => {
const conf = basic_conf({
first_key: () => undefined,
- prev_key: () => undefined,
- next_key: () => undefined,
+ prev_key: /* istanbul ignore next */ () => undefined,
+ next_key: /* istanbul ignore next */ () => undefined,
});
const cursor = new ListCursor(conf);
@@ -64,7 +64,7 @@ run_test("single item list", ({override}) => {
const valid_key = "42";
const conf = basic_conf({
- first_key: () => valid_key,
+ first_key: /* istanbul ignore next */ () => valid_key,
next_key: () => undefined,
prev_key: () => undefined,
});
@@ -91,7 +91,7 @@ run_test("single item list", ({override}) => {
run_test("multiple item list", ({override}) => {
const conf = basic_conf({
- first_key: () => 1,
+ first_key: /* istanbul ignore next */ () => 1,
next_key: (key) => (key < 3 ? key + 1 : undefined),
prev_key: (key) => (key > 1 ? key - 1 : undefined),
});
diff --git a/frontend_tests/node_tests/list_widget.js b/frontend_tests/node_tests/list_widget.js
index 53ca433f82..ff0b7ece2f 100644
--- a/frontend_tests/node_tests/list_widget.js
+++ b/frontend_tests/node_tests/list_widget.js
@@ -43,13 +43,6 @@ const ListWidget = zrequire("list_widget");
function make_container() {
const $container = {};
- $container.length = () => 1;
- $container.is = () => false;
- $container.css = (prop) => {
- assert.equal(prop, "max-height");
- return "none";
- };
-
// Make our append function just set a field we can
// check in our tests.
$container.append = ($data) => {
@@ -123,6 +116,7 @@ function make_search_input() {
// Allow ourselves to be wrapped by $(...) and
// return ourselves.
+ /* istanbul ignore next */
$element.to_jquery = () => $element;
$element.on = (event_name, f) => {
@@ -322,6 +316,7 @@ function sort_button(opts) {
return opts.sort_type;
case "sort-prop":
return opts.prop_name;
+ /* istanbul ignore next */
default:
throw new Error("unknown selector: " + sel);
}
@@ -549,7 +544,7 @@ run_test("clear_event_handlers", () => {
modifier: () => {},
filter: {
$element: $filter_element,
- predicate: () => true,
+ predicate: /* istanbul ignore next */ () => true,
},
$simplebar_container: $scroll_container,
};
@@ -602,8 +597,8 @@ run_test("errors", () => {
blueslip.expect("error", "Filterer and predicate are mutually exclusive.");
ListWidget.create($container, list, {
filter: {
- filterer: () => true,
- predicate: () => true,
+ filterer: /* istanbul ignore next */ () => true,
+ predicate: /* istanbul ignore next */ () => true,
},
$simplebar_container: $scroll_container,
});
@@ -795,7 +790,8 @@ run_test("render item", () => {
blueslip.expect("error", "html_selector should be a function.");
ListWidget.create($container, list, {
name: "replace-list",
- modifier: (item) => `
${item.text}
\n`,
+ modifier: /* istanbul ignore next */ (item) =>
+ `${item.text}
\n`,
get_item,
html_selector: "hello world",
$simplebar_container: $scroll_container,
@@ -855,6 +851,7 @@ run_test("Multiselect dropdown retain_selected_items", () => {
if (element) {
return true;
}
+ /* istanbul ignore next */
return false;
}
diff --git a/frontend_tests/node_tests/markdown.js b/frontend_tests/node_tests/markdown.js
index ee5d8955c4..b40c07cafd 100644
--- a/frontend_tests/node_tests/markdown.js
+++ b/frontend_tests/node_tests/markdown.js
@@ -27,11 +27,6 @@ const example_realm_linkifiers = [
];
user_settings.translate_emoticons = false;
-function Image() {
- return {};
-}
-set_global("Image", Image);
-
set_global("document", {compatMode: "CSS1Compat"});
const emoji = zrequire("emoji");
@@ -244,6 +239,7 @@ test("marked_shared", () => {
for (const test of tests) {
// Ignore tests if specified
+ /* istanbul ignore if */
if (test.ignore === true) {
continue;
}
diff --git a/frontend_tests/node_tests/markdown_parse.js b/frontend_tests/node_tests/markdown_parse.js
index 1e58540928..13ecee7c21 100644
--- a/frontend_tests/node_tests/markdown_parse.js
+++ b/frontend_tests/node_tests/markdown_parse.js
@@ -24,7 +24,8 @@ function get_user_id_from_name(name) {
}
}
- return undefined;
+ /* istanbul ignore next */
+ throw new Error(`unexpected name ${name}`);
}
function is_valid_full_name_and_user_id(name, user_id) {
@@ -99,7 +100,8 @@ function get_emoji_name(codepoint) {
}
}
- return undefined;
+ /* istanbul ignore next */
+ throw new Error(`unexpected codepoint ${codepoint}`);
}
const realm_emoji_map = new Map();
diff --git a/frontend_tests/node_tests/message_fetch.js b/frontend_tests/node_tests/message_fetch.js
index b6fd6fedcc..96348492d2 100644
--- a/frontend_tests/node_tests/message_fetch.js
+++ b/frontend_tests/node_tests/message_fetch.js
@@ -93,17 +93,13 @@ function config_fake_channel(conf) {
// There's a separate call with anchor="newest" that happens
// unconditionally; do basic verification of that call.
if (opts.data.anchor === "newest") {
- if (!called_with_newest_flag) {
- called_with_newest_flag = true;
- assert.equal(opts.data.num_after, 0);
- return;
- }
- throw new Error("Only one 'newest' call allowed");
+ assert.ok(!called_with_newest_flag, "Only one 'newest' call allowed");
+ called_with_newest_flag = true;
+ assert.equal(opts.data.num_after, 0);
+ return;
}
- if (called && !conf.can_call_again) {
- throw new Error("only use this for one call");
- }
+ assert.ok(!called || conf.can_call_again, "only use this for one call");
if (!conf.can_call_again) {
assert.equal(self.success, undefined);
}
diff --git a/frontend_tests/node_tests/message_list_data.js b/frontend_tests/node_tests/message_list_data.js
index b1ad06e087..4723b36b68 100644
--- a/frontend_tests/node_tests/message_list_data.js
+++ b/frontend_tests/node_tests/message_list_data.js
@@ -2,19 +2,10 @@
const {strict: assert} = require("assert");
-const {
- set_global,
- with_function_call_disallowed_rewire,
- zrequire,
-} = require("../zjsunit/namespace");
+const {with_function_call_disallowed_rewire, zrequire} = require("../zjsunit/namespace");
const {run_test} = require("../zjsunit/test");
const blueslip = require("../zjsunit/zblueslip");
-set_global("setTimeout", (f, delay) => {
- assert.equal(delay, 0);
- return f();
-});
-
const muted_topics = zrequire("muted_topics");
const muted_users = zrequire("muted_users");
const {MessageListData} = zrequire("../js/message_list_data");
diff --git a/frontend_tests/node_tests/message_list_view.js b/frontend_tests/node_tests/message_list_view.js
index 1dad1e3194..712bfa4649 100644
--- a/frontend_tests/node_tests/message_list_view.js
+++ b/frontend_tests/node_tests/message_list_view.js
@@ -6,14 +6,11 @@ const _ = require("lodash");
const {mock_esm, set_global, zrequire} = require("../zjsunit/namespace");
const {run_test} = require("../zjsunit/test");
-const {user_settings} = require("../zjsunit/zpage_params");
set_global("document", "document-stub");
const noop = () => {};
-user_settings.twenty_four_hour_time = false;
-
mock_esm("../../static/js/message_lists", {home: "stub"});
// timerender calls setInterval when imported
@@ -25,9 +22,6 @@ mock_esm("../../static/js/timerender", {
return [{outerHTML: String(time1.getTime()) + " - " + String(time2.getTime())}];
},
stringify_time(time) {
- if (user_settings.twenty_four_hour_time) {
- return time.toString("HH:mm");
- }
return time.toString("h:mm TT");
},
});
diff --git a/frontend_tests/node_tests/narrow_activate.js b/frontend_tests/node_tests/narrow_activate.js
index b12fc189bc..a4ae3f66e8 100644
--- a/frontend_tests/node_tests/narrow_activate.js
+++ b/frontend_tests/node_tests/narrow_activate.js
@@ -160,13 +160,6 @@ run_test("basics", () => {
all_messages_data.all_messages_data = {
all_messages: () => messages,
- get: (msg_id) => {
- assert.equal(msg_id, selected_id);
- return selected_message;
- },
- fetch_status: {
- has_found_newest: () => true,
- },
empty: () => false,
first: () => ({id: 900}),
last: () => ({id: 1100}),
diff --git a/frontend_tests/node_tests/narrow_unread.js b/frontend_tests/node_tests/narrow_unread.js
index 638c176d74..01340550b6 100644
--- a/frontend_tests/node_tests/narrow_unread.js
+++ b/frontend_tests/node_tests/narrow_unread.js
@@ -26,7 +26,6 @@ const alice = {
people.init();
people.add_active_user(alice);
-people.is_my_user_id = () => false;
function set_filter(terms) {
const filter = new Filter(terms);
diff --git a/frontend_tests/node_tests/navbar_alerts.js b/frontend_tests/node_tests/navbar_alerts.js
index ce3215379b..29287baca8 100644
--- a/frontend_tests/node_tests/navbar_alerts.js
+++ b/frontend_tests/node_tests/navbar_alerts.js
@@ -56,13 +56,17 @@ test("allow_notification_alert", () => {
assert.equal(navbar_alerts.should_show_notifications(ls), false);
// Avoid showing if notification is already granted.
+ /* istanbul ignore next */
notifications.permission_state = () => "granted";
notifications.granted_desktop_notifications_permission = () => "granted";
assert.equal(navbar_alerts.should_show_notifications(ls), false);
// Don't ask for permission to spectator.
+ /* istanbul ignore next */
util.is_mobile = () => false;
+ /* istanbul ignore next */
notifications.granted_desktop_notifications_permission = () => false;
+ /* istanbul ignore next */
notifications.permission_state = () => "granted";
page_params.is_spectator = true;
assert.equal(navbar_alerts.should_show_notifications(ls), false);
diff --git a/frontend_tests/node_tests/password.js b/frontend_tests/node_tests/password.js
index cd338047ef..4f7b1e460a 100644
--- a/frontend_tests/node_tests/password.js
+++ b/frontend_tests/node_tests/password.js
@@ -11,12 +11,15 @@ function password_field(min_length, min_guesses) {
const self = {};
self.data = (field) => {
- if (field === "minLength") {
- return min_length;
- } else if (field === "minGuesses") {
- return min_guesses;
+ switch (field) {
+ case "minLength":
+ return min_length;
+ case "minGuesses":
+ return min_guesses;
+ /* istanbul ignore next */
+ default:
+ throw new Error(`Unknown field ${field}`);
}
- throw new Error(`Unknown field ${field}`);
};
return self;
diff --git a/frontend_tests/node_tests/people.js b/frontend_tests/node_tests/people.js
index d61e46802b..d596070665 100644
--- a/frontend_tests/node_tests/people.js
+++ b/frontend_tests/node_tests/people.js
@@ -835,9 +835,13 @@ test_people("extract_people_from_message", ({override_rewire}) => {
assert.ok(reported);
// Get line coverage
- people.__Rewire__("report_late_add", () => {
- throw new Error("unexpected late add");
- });
+ people.__Rewire__(
+ "report_late_add",
+ /* istanbul ignore next */
+ () => {
+ throw new Error("unexpected late add");
+ },
+ );
message = {
type: "private",
diff --git a/frontend_tests/node_tests/reactions.js b/frontend_tests/node_tests/reactions.js
index 33cd6366a6..c4bd7f1734 100644
--- a/frontend_tests/node_tests/reactions.js
+++ b/frontend_tests/node_tests/reactions.js
@@ -49,9 +49,6 @@ const spectators = mock_esm("../../static/js/spectators", {
});
message_lists.current = {
- selected_message() {
- return {sent_by_me: true};
- },
selected_row() {
return $(".selected-row");
},
diff --git a/frontend_tests/node_tests/recent_topics.js b/frontend_tests/node_tests/recent_topics.js
index fb29a14567..28db861237 100644
--- a/frontend_tests/node_tests/recent_topics.js
+++ b/frontend_tests/node_tests/recent_topics.js
@@ -63,9 +63,11 @@ const ListWidget = mock_esm("../../static/js/list_widget", {
hard_redraw: noop,
render_item: (item) => ListWidget.modifier(item),
replace_list_data: (data) => {
- if (expected_data_to_replace_in_list_widget === undefined) {
- throw new Error("You must set expected_data_to_replace_in_list_widget");
- }
+ assert.notEqual(
+ expected_data_to_replace_in_list_widget,
+ undefined,
+ "You must set expected_data_to_replace_in_list_widget",
+ );
assert.deepEqual(data, expected_data_to_replace_in_list_widget);
expected_data_to_replace_in_list_widget = undefined;
},
@@ -110,7 +112,6 @@ mock_esm("../../static/js/stream_data", {
// We only test via muted topics for now.
// TODO: Make muted streams and test them.
false,
- is_subscribed: () => true,
});
mock_esm("../../static/js/stream_list", {
handle_narrow_deactivated: noop,
diff --git a/frontend_tests/node_tests/rendered_markdown.js b/frontend_tests/node_tests/rendered_markdown.js
index 15facbd3cb..d54f33bf67 100644
--- a/frontend_tests/node_tests/rendered_markdown.js
+++ b/frontend_tests/node_tests/rendered_markdown.js
@@ -88,6 +88,7 @@ const get_content_element = () => {
// Fend off dumb security bugs by forcing devs to be
// intentional about HTML manipulation.
+ /* istanbul ignore next */
function security_violation() {
throw new Error(`
Be super careful about HTML manipulation.
@@ -401,9 +402,7 @@ function test_code_playground(mock_template, viewing_code) {
// our case "fake" zjquery objects).
const prepends = [];
$pre.prepend = (arg) => {
- if (!arg.__zjquery) {
- throw new Error("We should only prepend jQuery objects.");
- }
+ assert.ok(arg.__zjquery, "We should only prepend jQuery objects.");
prepends.push(arg);
};
diff --git a/frontend_tests/node_tests/search_future.js b/frontend_tests/node_tests/search_future.js
index 7251c6acd7..850c85094d 100644
--- a/frontend_tests/node_tests/search_future.js
+++ b/frontend_tests/node_tests/search_future.js
@@ -2,7 +2,7 @@
const {strict: assert} = require("assert");
-const {mock_esm, set_global, zrequire} = require("../zjsunit/namespace");
+const {mock_esm, zrequire} = require("../zjsunit/namespace");
const {run_test} = require("../zjsunit/test");
const $ = require("../zjsunit/zjquery");
const {page_params} = require("../zjsunit/zpage_params");
@@ -25,8 +25,6 @@ mock_esm("../../static/js/ui_util", {
place_caret_at_end: noop,
});
-set_global("setTimeout", (func) => func());
-
const search = zrequire("search");
const search_pill = zrequire("search_pill");
const {Filter} = zrequire("../js/filter");
@@ -63,14 +61,14 @@ test("update_button_visibility", () => {
$search_query.is = () => true;
$search_query.val("");
- narrow_state.active = () => false;
+ delete narrow_state.active;
$search_button.prop("disabled", true);
search.update_button_visibility();
assert.ok(!$search_button.prop("disabled"));
$search_query.is = () => false;
$search_query.val("Test search term");
- narrow_state.active = () => false;
+ delete narrow_state.active;
$search_button.prop("disabled", true);
search.update_button_visibility();
assert.ok(!$search_button.prop("disabled"));
@@ -144,9 +142,13 @@ test("initialize", () => {
let operators;
let is_blurred;
let is_append_search_string_called;
- $search_query_box.on("blur", () => {
- is_blurred = true;
- });
+ $search_query_box.on(
+ "blur",
+ /* istanbul ignore next */
+ () => {
+ is_blurred = true;
+ },
+ );
search_pill.append_search_string = () => {
is_append_search_string_called = true;
};
@@ -155,14 +157,17 @@ test("initialize", () => {
is_blurred = false;
is_append_search_string_called = false;
$search_query_box.val(search_box_val);
+ /* istanbul ignore next */
Filter.parse = (search_string) => {
assert.equal(search_string, search_box_val);
return operators;
};
+ /* istanbul ignore next */
narrow.activate = (raw_operators, options) => {
assert.deepEqual(raw_operators, operators);
assert.deepEqual(options, {trigger: "search"});
};
+ /* istanbul ignore next */
search_pill.get_search_string_for_current_filter = () => search_box_val;
};
@@ -285,6 +290,7 @@ test("initialize", () => {
type: "keyup",
which: 15,
};
+ /* istanbul ignore next */
$search_query_box.is = () => false;
$searchbox_form.trigger(ev);
diff --git a/frontend_tests/node_tests/search_now.js b/frontend_tests/node_tests/search_now.js
index 85dbf49422..ab2ebf20ac 100644
--- a/frontend_tests/node_tests/search_now.js
+++ b/frontend_tests/node_tests/search_now.js
@@ -53,14 +53,14 @@ run_test("update_button_visibility", () => {
$search_query.is = () => true;
$search_query.val("");
- narrow_state.active = () => false;
+ delete narrow_state.active;
$search_button.prop("disabled", true);
search.update_button_visibility();
assert.ok(!$search_button.prop("disabled"));
$search_query.is = () => false;
$search_query.val("Test search term");
- narrow_state.active = () => false;
+ delete narrow_state.active;
$search_button.prop("disabled", true);
search.update_button_visibility();
assert.ok(!$search_button.prop("disabled"));
@@ -247,6 +247,7 @@ run_test("initialize", () => {
_setup("");
ev.key = "a";
+ /* istanbul ignore next */
$search_query_box.is = () => false;
$searchbox_form.trigger(ev);
diff --git a/frontend_tests/node_tests/search_suggestion_future.js b/frontend_tests/node_tests/search_suggestion_future.js
index 16056954c3..d424a3e0da 100644
--- a/frontend_tests/node_tests/search_suggestion_future.js
+++ b/frontend_tests/node_tests/search_suggestion_future.js
@@ -676,8 +676,9 @@ test("topic_suggestions", ({override, override_rewire}) => {
return office_id;
case "devel":
return devel_id;
+ /* istanbul ignore next */
default:
- return undefined;
+ throw new Error(`unknown stream ${stream_name}`);
}
});
diff --git a/frontend_tests/node_tests/search_suggestion_now.js b/frontend_tests/node_tests/search_suggestion_now.js
index f827195197..ab87e73bba 100644
--- a/frontend_tests/node_tests/search_suggestion_now.js
+++ b/frontend_tests/node_tests/search_suggestion_now.js
@@ -641,8 +641,9 @@ test("topic_suggestions", ({override, override_rewire}) => {
return office_id;
case "devel":
return devel_id;
+ /* istanbul ignore next */
default:
- return undefined;
+ throw new Error(`unknown stream ${stream_name}`);
}
});
diff --git a/frontend_tests/node_tests/server_events.js b/frontend_tests/node_tests/server_events.js
index 200aac89ee..6f23b7cc0f 100644
--- a/frontend_tests/node_tests/server_events.js
+++ b/frontend_tests/node_tests/server_events.js
@@ -40,9 +40,6 @@ mock_esm("../../static/js/ui_report", {
hide_error() {
return false;
},
- show_error() {
- return false;
- },
});
mock_esm("../../static/js/stream_events", {
diff --git a/frontend_tests/node_tests/settings_muted_topics.js b/frontend_tests/node_tests/settings_muted_topics.js
index 787eb73e76..d8e9740b1f 100644
--- a/frontend_tests/node_tests/settings_muted_topics.js
+++ b/frontend_tests/node_tests/settings_muted_topics.js
@@ -60,15 +60,16 @@ run_test("settings", ({override_rewire}) => {
let topic_data_called = 0;
$topic_tr_html.attr = (opts) => {
- if (opts === "data-stream-id") {
- topic_data_called += 1;
- return frontend.stream_id;
+ topic_data_called += 1;
+ switch (opts) {
+ case "data-stream-id":
+ return frontend.stream_id;
+ case "data-topic":
+ return "js";
+ /* istanbul ignore next */
+ default:
+ throw new Error(`Unknown attribute ${opts}`);
}
- if (opts === "data-topic") {
- topic_data_called += 1;
- return "js";
- }
- throw new Error(`Unknown attribute ${opts}`);
};
let unmute_topic_called = false;
diff --git a/frontend_tests/node_tests/settings_muted_users.js b/frontend_tests/node_tests/settings_muted_users.js
index 35059f7263..ae1815e87c 100644
--- a/frontend_tests/node_tests/settings_muted_users.js
+++ b/frontend_tests/node_tests/settings_muted_users.js
@@ -51,11 +51,9 @@ run_test("settings", ({override_rewire}) => {
let row_attribute_fetched = false;
$fake_row.attr = (opts) => {
- if (opts === "data-user-id") {
- row_attribute_fetched += 1;
- return "5";
- }
- throw new Error(`Unknown attribute ${opts}`);
+ assert.equal(opts, "data-user-id");
+ row_attribute_fetched += 1;
+ return "5";
};
let unmute_user_called = false;
diff --git a/frontend_tests/node_tests/settings_org.js b/frontend_tests/node_tests/settings_org.js
index 4a99c38f6d..a9cebac9f3 100644
--- a/frontend_tests/node_tests/settings_org.js
+++ b/frontend_tests/node_tests/settings_org.js
@@ -47,7 +47,6 @@ const settings_bots = zrequire("settings_bots");
const stream_settings_data = zrequire("stream_settings_data");
const settings_account = zrequire("settings_account");
const settings_org = zrequire("settings_org");
-const sub_store = zrequire("sub_store");
const dropdown_list_widget = zrequire("dropdown_list_widget");
function test(label, f) {
@@ -195,7 +194,6 @@ function test_submit_settings_form(override, submit_form) {
let stubs = createSaveButtons(subsection);
let $save_button = stubs.$save_button;
$save_button.attr("id", `org-submit-${subsection}`);
- $save_button.replace = () => `${subsection}`;
$("#id_realm_waiting_period_threshold").val(10);
@@ -241,6 +239,7 @@ function test_submit_settings_form(override, submit_form) {
$add_custom_emoji_policy_elem,
$create_public_stream_policy_elem,
$create_private_stream_policy_elem,
+ $invite_to_realm_policy_elem,
$invite_to_stream_policy_elem,
]);
@@ -250,6 +249,7 @@ function test_submit_settings_form(override, submit_form) {
let expected_value = {
bot_creation_policy: 1,
+ invite_to_realm_policy: 2,
invite_to_stream_policy: 1,
email_address_visibility: 1,
add_custom_emoji_policy: 1,
@@ -925,10 +925,6 @@ test("misc", ({override_rewire}) => {
let setting_name = "realm_notifications_stream_id";
let $elem = $(`#${CSS.escape(setting_name)}_widget #${CSS.escape(setting_name)}_name`);
$elem.closest = () => $stub_notification_disable_parent;
- sub_store.__Rewire__("get", (stream_id) => {
- assert.equal(stream_id, 42);
- return {name: "some_stream"};
- });
settings_org.notifications_stream_widget.render(42);
assert.equal($elem.text(), "#some_stream");
assert.ok(!$elem.hasClass("text-warning"));
@@ -940,10 +936,6 @@ test("misc", ({override_rewire}) => {
setting_name = "realm_signup_notifications_stream_id";
$elem = $(`#${CSS.escape(setting_name)}_widget #${CSS.escape(setting_name)}_name`);
$elem.closest = () => $stub_notification_disable_parent;
- sub_store.__Rewire__("get", (stream_id) => {
- assert.equal(stream_id, 75);
- return {name: "some_stream"};
- });
settings_org.signup_notifications_stream_widget.render(75);
assert.equal($elem.text(), "#some_stream");
assert.ok(!$elem.hasClass("text-warning"));
diff --git a/frontend_tests/node_tests/settings_user_groups.js b/frontend_tests/node_tests/settings_user_groups.js
index 56b66ac512..533350ff28 100644
--- a/frontend_tests/node_tests/settings_user_groups.js
+++ b/frontend_tests/node_tests/settings_user_groups.js
@@ -116,8 +116,6 @@ test_ui("populate_user_groups", ({override_rewire, mock_template}) => {
user_groups.get_realm_user_groups = () => [realm_user_group];
- people.get_visible_email = () => bob.email;
-
let templates_render_called = false;
const $fake_rendered_temp = $.create("fake_admin_user_group_list_template_rendered");
mock_template("settings/admin_user_group_list.hbs", false, (args) => {
@@ -139,12 +137,6 @@ test_ui("populate_user_groups", ({override_rewire, mock_template}) => {
if (user_id === iago.user_id) {
return iago;
}
- if (user_id === alice.user_id) {
- return alice;
- }
- if (user_id === undefined) {
- return noop;
- }
assert.equal(user_id, 4);
blueslip.expect("warn", "Undefined user in function append_user");
get_by_user_id_called = true;
@@ -246,9 +238,6 @@ test_ui("populate_user_groups", ({override_rewire, mock_template}) => {
saved_fade_out_called = true;
};
$(cancel_selector).css = (data) => {
- if (typeof data === "string") {
- assert.equal(data, "display");
- }
assert.equal(typeof data, "object");
assert.equal(data.display, "inline-block");
assert.equal(data.opacity, "0");
@@ -258,9 +247,6 @@ test_ui("populate_user_groups", ({override_rewire, mock_template}) => {
cancel_fade_to_called = true;
};
$(instructions_selector).css = (data) => {
- if (typeof data === "string") {
- assert.equal(data, "display");
- }
assert.equal(typeof data, "object");
assert.equal(data.display, "block");
assert.equal(data.opacity, "0");
@@ -284,17 +270,15 @@ test_ui("populate_user_groups", ({override_rewire, mock_template}) => {
let get_by_email_called = false;
people.get_by_email = (user_email) => {
get_by_email_called = true;
- if (user_email === iago.email) {
- return iago;
+ switch (user_email) {
+ case iago.email:
+ return iago;
+ case bob.email:
+ return bob;
+ /* istanbul ignore next */
+ default:
+ throw new Error("Expected user email to be of Iago or Bob here.");
}
- if (user_email === bob.email) {
- return bob;
- }
- throw new Error("Expected user email to be of Alice or Iago here.");
- };
- pills.onPillCreate = (handler) => {
- assert.equal(typeof handler, "function");
- handler();
};
function test_create_item(handler) {
@@ -363,8 +347,9 @@ test_ui("with_external_user", ({override_rewire, mock_template}) => {
user_groups.get_realm_user_groups = () => [realm_user_group];
- // We return noop because these are already tested, so we skip them
- people.get_realm_users = () => noop;
+ // We return [] because these are already tested, so we skip them
+ /* istanbul ignore next */
+ people.get_realm_users = () => [];
mock_template(
"settings/admin_user_group_list.hbs",
@@ -372,9 +357,9 @@ test_ui("with_external_user", ({override_rewire, mock_template}) => {
() => "settings/admin_user_group_list.hbs",
);
- people.get_by_user_id = () => noop;
+ people.get_by_user_id = () => "user stub";
- override_rewire(user_pill, "append_person", () => noop);
+ override_rewire(user_pill, "append_person", noop);
let can_edit_called = 0;
override_rewire(settings_user_groups, "can_edit", () => {
@@ -391,30 +376,32 @@ test_ui("with_external_user", ({override_rewire, mock_template}) => {
const $description_field_stub = $.create("fake-description-field");
const $input_stub = $.create("fake-input");
$user_group_stub.find = (elem) => {
- if (elem === ".name") {
- user_group_find_called += 1;
- return $name_field_stub;
+ user_group_find_called += 1;
+ switch (elem) {
+ case ".name":
+ return $name_field_stub;
+ case ".description":
+ return $description_field_stub;
+ /* istanbul ignore next */
+ default:
+ throw new Error(`Unknown element ${elem}`);
}
- if (elem === ".description") {
- user_group_find_called += 1;
- return $description_field_stub;
- }
- throw new Error(`Unknown element ${elem}`);
};
const $pill_container_stub = $(`.pill-container[data-group-pills="${CSS.escape(1)}"]`);
const $pill_stub = $.create("fake-pill");
let pill_container_find_called = 0;
$pill_container_stub.find = (elem) => {
- if (elem === ".input") {
- pill_container_find_called += 1;
- return $input_stub;
+ pill_container_find_called += 1;
+ switch (elem) {
+ case ".input":
+ return $input_stub;
+ case ".pill":
+ return $pill_stub;
+ /* istanbul ignore next */
+ default:
+ throw new Error(`Unknown element ${elem}`);
}
- if (elem === ".pill") {
- pill_container_find_called += 1;
- return $pill_stub;
- }
- throw new Error(`Unknown element ${elem}`);
};
$input_stub.css = (property, val) => {
@@ -437,10 +424,10 @@ test_ui("with_external_user", ({override_rewire, mock_template}) => {
assert.equal(value, "0.5");
};
- // We return noop because these are already tested, so we skip them
- $pill_container_stub.children = () => noop;
+ // We return [] because these are already tested, so we skip them
+ $pill_container_stub.children = () => [];
- $("#user-groups").append = () => noop;
+ $("#user-groups").append = noop;
reset_test_setup($pill_container_stub);
@@ -621,6 +608,7 @@ test_ui("on_events", ({override_rewire, mock_template}) => {
(function test_do_not_blur() {
const blur_event_classes = [".name", ".description", ".input"];
let api_endpoint_called = false;
+ /* istanbul ignore next */
channel.post = () => {
api_endpoint_called = true;
};
@@ -658,10 +646,8 @@ test_ui("on_events", ({override_rewire, mock_template}) => {
api_endpoint_called = false;
$fake_this.closest = (class_name) => {
- if (class_name === ".typeahead") {
- return [1];
- }
- return [];
+ assert.equal(class_name, ".typeahead");
+ return [1];
};
handler.call($fake_this, event);
assert.ok(!api_endpoint_called);
@@ -755,9 +741,6 @@ test_ui("on_events", ({override_rewire, mock_template}) => {
cancel_fade_out_called = true;
};
$(saved_selector).css = (data) => {
- if (typeof data === "string") {
- assert.equal(data, "display");
- }
assert.equal(typeof data, "object");
assert.equal(data.display, "inline-block");
assert.equal(data.opacity, "0");
diff --git a/frontend_tests/node_tests/stream_settings_ui.js b/frontend_tests/node_tests/stream_settings_ui.js
index 07d31fba7c..46aa60792c 100644
--- a/frontend_tests/node_tests/stream_settings_ui.js
+++ b/frontend_tests/node_tests/stream_settings_ui.js
@@ -10,7 +10,6 @@ const denmark_stream_id = 101;
const ui = mock_esm("../../static/js/ui", {
get_content_element: ($element) => $element,
- get_scroll_element: ($element) => $element,
});
mock_esm("../../static/js/hash_util", {
diff --git a/frontend_tests/node_tests/stream_topic_history.js b/frontend_tests/node_tests/stream_topic_history.js
index 35e0cc0fad..559c22ac12 100644
--- a/frontend_tests/node_tests/stream_topic_history.js
+++ b/frontend_tests/node_tests/stream_topic_history.js
@@ -81,7 +81,7 @@ test("basics", () => {
max_message_id = stream_topic_history.get_max_message_id(stream_id);
assert.deepEqual(max_message_id, 103);
- message_util.get_messages_in_topic = () => [{id: 102}];
+ delete message_util.get_messages_in_topic;
// Removing first topic1 message has no effect.
stream_topic_history.remove_messages({
stream_id,
@@ -163,8 +163,6 @@ test("server_history", () => {
const stream_id = sub.stream_id;
stream_data.add_sub(sub);
- all_messages_data.all_messages_data.fetch_status.has_found_newest = () => false;
-
assert.equal(stream_topic_history.is_complete_for_stream_id(stream_id), false);
stream_topic_history.add_message({
@@ -332,6 +330,7 @@ test("server_history_end_to_end", () => {
// Try getting server history for a second time.
+ /* istanbul ignore next */
channel.get = () => {
throw new Error("We should not get more data.");
};
diff --git a/frontend_tests/node_tests/transmit.js b/frontend_tests/node_tests/transmit.js
index f2ff9627e7..ade9e8a3ff 100644
--- a/frontend_tests/node_tests/transmit.js
+++ b/frontend_tests/node_tests/transmit.js
@@ -60,9 +60,14 @@ run_test("transmit_message_ajax", () => {
});
run_test("transmit_message_ajax_reload_pending", () => {
+ /* istanbul ignore next */
const success = () => {
throw new Error("unexpected success");
};
+ /* istanbul ignore next */
+ const error = () => {
+ throw new Error("unexpected error");
+ };
reload_state.is_pending = () => true;
@@ -80,13 +85,6 @@ run_test("transmit_message_ajax_reload_pending", () => {
const request = {foo: "bar"};
- let error_func_called;
- const error = (response) => {
- assert.equal(response, "Error sending message");
- error_func_called = true;
- };
-
- error_func_called = false;
channel.post = (opts) => {
assert.equal(opts.url, "/json/messages");
assert.equal(opts.data.foo, "bar");
@@ -94,7 +92,6 @@ run_test("transmit_message_ajax_reload_pending", () => {
opts.error(xhr, "bad request");
};
transmit.send_message(request, success, error);
- assert.ok(!error_func_called);
assert.ok(reload_initiated);
});
@@ -143,8 +140,6 @@ run_test("reply_message_private", ({override_rewire}) => {
};
people.add_active_user(fred);
- people.is_my_user_id = () => false;
-
const pm_message = {
type: "private",
display_recipient: [{id: fred.user_id}],
diff --git a/frontend_tests/node_tests/typeahead_helper.js b/frontend_tests/node_tests/typeahead_helper.js
index d6acdef8c8..81700a944c 100644
--- a/frontend_tests/node_tests/typeahead_helper.js
+++ b/frontend_tests/node_tests/typeahead_helper.js
@@ -453,6 +453,7 @@ test("sort_recipients pm counts", () => {
"zman@test.net",
]);
+ /* istanbul ignore next */
function compare() {
throw new Error("We do not expect to need a tiebreaker here.");
}
diff --git a/frontend_tests/node_tests/unread.js b/frontend_tests/node_tests/unread.js
index c58d51d251..53e533c65b 100644
--- a/frontend_tests/node_tests/unread.js
+++ b/frontend_tests/node_tests/unread.js
@@ -250,10 +250,8 @@ test("num_unread_for_topic", ({override_rewire}) => {
const stream_id = 301;
override_rewire(sub_store, "get", (arg) => {
- if (arg === stream_id) {
- return {name: "Some stream"};
- }
- throw new Error(`Unknown stream ${arg}`);
+ assert.equal(arg, stream_id);
+ return {name: "Some stream"};
});
let count = unread.num_unread_for_topic(stream_id, "lunch");
diff --git a/frontend_tests/node_tests/upgrade.js b/frontend_tests/node_tests/upgrade.js
index eebb9e207d..3aeb39ecf4 100644
--- a/frontend_tests/node_tests/upgrade.js
+++ b/frontend_tests/node_tests/upgrade.js
@@ -63,6 +63,7 @@ run_test("initialize", ({override_rewire}) => {
};
success_callback();
break;
+ /* istanbul ignore next */
default:
throw new Error("Unhandled case");
}
@@ -85,9 +86,6 @@ run_test("initialize", ({override_rewire}) => {
$("input[type=radio][name=schedule]:checked").val = () =>
document.querySelector("input[type=radio][name=schedule]:checked").value;
- $("#autopay-form").data = (key) =>
- document.querySelector("#autopay-form").getAttribute("data-" + key);
-
const initialize_function = $.get_initialize_function();
initialize_function();
diff --git a/frontend_tests/node_tests/vdom.js b/frontend_tests/node_tests/vdom.js
index f8126af301..83f7dda6a3 100644
--- a/frontend_tests/node_tests/vdom.js
+++ b/frontend_tests/node_tests/vdom.js
@@ -175,6 +175,7 @@ run_test("partial updates", () => {
assert.equal(rendered_html, "");
+ /* istanbul ignore next */
replace_content = () => {
throw new Error("should not replace entire html");
};
@@ -209,6 +210,7 @@ run_test("partial updates", () => {
});
run_test("eq_array easy cases", () => {
+ /* istanbul ignore next */
const bogus_eq = () => {
throw new Error("we should not be comparing elements");
};
diff --git a/frontend_tests/zjsunit/i18n.js b/frontend_tests/zjsunit/i18n.js
index 0d05a40fea..4746c0622f 100644
--- a/frontend_tests/zjsunit/i18n.js
+++ b/frontend_tests/zjsunit/i18n.js
@@ -12,6 +12,7 @@ exports.intl = createIntl(
defaultRichTextElements: Object.fromEntries(
["b", "code", "em", "i", "kbd", "p", "strong"].map((tag) => [
tag,
+ /* istanbul ignore next */
(content_html) => `<${tag}>${content_html}${tag}>`,
]),
),
diff --git a/frontend_tests/zjsunit/index.js b/frontend_tests/zjsunit/index.js
index 720e82f04f..6ba7de59f0 100644
--- a/frontend_tests/zjsunit/index.js
+++ b/frontend_tests/zjsunit/index.js
@@ -1,5 +1,6 @@
"use strict";
+const {strict: assert} = require("assert");
const path = require("path");
require("css.escape");
@@ -39,9 +40,7 @@ function immediate(f) {
// Find the files we need to run.
const files = process.argv.slice(2);
-if (files.length === 0) {
- throw new Error("No tests found");
-}
+assert.notEqual(files.length, 0, "No tests found");
// Set up our namespace helpers.
const window = new Proxy(global, {
@@ -73,6 +72,7 @@ handlebars.hook_require();
const noop = function () {};
+/* istanbul ignore next */
function short_tb(tb) {
const lines = tb.split("\n");
@@ -102,7 +102,6 @@ try {
for (const file of files) {
namespace.start();
namespace.set_global("window", window);
- namespace.set_global("to_$", () => window);
namespace.set_global("location", dom.window.location);
window.location.href = "http://zulip.zulipdev.com/#";
namespace.set_global("setTimeout", noop);
@@ -132,7 +131,7 @@ try {
namespace.finish();
}
-} catch (error) {
+} catch (error) /* istanbul ignore next */ {
if (process.env.USING_INSTRUMENTED_CODE) {
console.info(`
TEST FAILED! Before using the --coverage option please make sure that your
diff --git a/frontend_tests/zjsunit/markdown_assert.js b/frontend_tests/zjsunit/markdown_assert.js
index 7df585a13f..1d616ef573 100644
--- a/frontend_tests/zjsunit/markdown_assert.js
+++ b/frontend_tests/zjsunit/markdown_assert.js
@@ -36,6 +36,7 @@ class MarkdownComparer {
constructor(output_formatter) {
this._output_formatter =
output_formatter ||
+ /* istanbul ignore next */
function (actual, expected) {
return ["Actual and expected output do not match.", actual, "!=", expected].join(
"\n",
@@ -44,6 +45,7 @@ class MarkdownComparer {
this._document = new JSDOM().window.document;
}
+ /* istanbul ignore next */
setFormatter(output_formatter) {
this._output_formatter = output_formatter || this._output_formatter;
}
@@ -88,6 +90,7 @@ class MarkdownComparer {
} else if (name_a > name_b) {
return 1;
}
+ /* istanbul ignore next */
return 0;
});
@@ -139,6 +142,7 @@ class MarkdownComparer {
message = message || "";
message += "\n";
+ /* istanbul ignore if */
if (comparison_results.are_equivalent === false) {
throw new assert.AssertionError({
message:
@@ -157,6 +161,7 @@ class MarkdownComparer {
message = message || "";
message += "\n";
+ /* istanbul ignore if */
if (comparison_results.are_equivalent) {
throw new assert.AssertionError({
message:
@@ -174,11 +179,13 @@ class MarkdownComparer {
function returnComparer() {
if (!_markdownComparerInstance) {
- _markdownComparerInstance = new MarkdownComparer((actual, expected) =>
- [
- "Actual and expected output do not match. Showing diff",
- mdiff.diff_strings(actual, expected),
- ].join("\n"),
+ _markdownComparerInstance = new MarkdownComparer(
+ /* istanbul ignore next */
+ (actual, expected) =>
+ [
+ "Actual and expected output do not match. Showing diff",
+ mdiff.diff_strings(actual, expected),
+ ].join("\n"),
);
}
return _markdownComparerInstance;
@@ -193,6 +200,7 @@ module.exports = {
returnComparer().assertNotEqual(actual, expected, message);
},
+ /* istanbul ignore next */
setFormatter(output_formatter) {
returnComparer().setFormatter(output_formatter);
},
diff --git a/frontend_tests/zjsunit/namespace.js b/frontend_tests/zjsunit/namespace.js
index 698879188a..b16d3ac091 100644
--- a/frontend_tests/zjsunit/namespace.js
+++ b/frontend_tests/zjsunit/namespace.js
@@ -1,5 +1,6 @@
"use strict";
+const {strict: assert} = require("assert");
const Module = require("module");
const path = require("path");
@@ -24,6 +25,7 @@ let jquery_function;
const template_path = "/static/templates/";
+/* istanbul ignore next */
function need_to_mock_template_error(filename) {
const i = filename.indexOf(template_path);
@@ -100,6 +102,7 @@ function template_stub({filename, actual_render}) {
// Force devs to call mock_template on every top-level template
// render so they can introspect the data.
+ /* istanbul ignore if */
if (!template_mocks.has(filename)) {
throw new Error(need_to_mock_template_error(filename));
}
@@ -126,9 +129,7 @@ function template_stub({filename, actual_render}) {
}
exports.start = () => {
- if (actual_load !== undefined) {
- throw new Error("namespace.start was called twice in a row.");
- }
+ assert.equal(actual_load, undefined, "namespace.start was called twice in a row.");
actual_load = Module._load;
Module._load = load;
};
@@ -163,11 +164,11 @@ exports.start = () => {
// format preferred by Webpack.
exports.mock_cjs = (module_path, obj) => {
- if (module_path === "jquery") {
- throw new Error(
- "We automatically mock jquery to zjquery. Grep for mock_jquery if you want more control.",
- );
- }
+ assert.notEqual(
+ module_path,
+ "jquery",
+ "We automatically mock jquery to zjquery. Grep for mock_jquery if you want more control.",
+ );
const filename = Module._resolveFilename(
module_path,
@@ -175,13 +176,12 @@ exports.mock_cjs = (module_path, obj) => {
false,
);
- if (module_mocks.has(filename)) {
- throw new Error(`You already set up a mock for ${filename}`);
- }
+ assert.ok(!module_mocks.has(filename), `You already set up a mock for ${filename}`);
- if (filename in require.cache) {
- throw new Error(`It is too late to mock ${filename}; call this earlier.`);
- }
+ assert.ok(
+ !(filename in require.cache),
+ `It is too late to mock ${filename}; call this earlier.`,
+ );
module_mocks.set(filename, obj);
return obj;
@@ -199,11 +199,10 @@ exports._start_template_mocking = () => {
exports._finish_template_mocking = () => {
for (const filename of template_mocks.keys()) {
- if (!used_templates.has(filename)) {
- throw new Error(
- `You called mock_template with ${filename} but we never saw it get used.`,
- );
- }
+ assert.ok(
+ used_templates.has(filename),
+ `You called mock_template with ${filename} but we never saw it get used.`,
+ );
}
template_mocks.clear();
used_templates.clear();
@@ -222,9 +221,7 @@ exports._mock_template = (fn, exercise_template, f) => {
};
exports.mock_esm = (module_path, obj = {}) => {
- if (typeof obj !== "object") {
- throw new TypeError("An ES module must be mocked with an object");
- }
+ assert.equal(typeof obj, "object", "An ES module must be mocked with an object");
return exports.mock_cjs(module_path, {...obj, __esModule: true});
};
@@ -235,24 +232,19 @@ exports.unmock_module = (module_path) => {
false,
);
- if (!module_mocks.has(filename)) {
- throw new Error(`Cannot unmock ${filename}, which was not mocked`);
- }
+ assert.ok(module_mocks.has(filename), `Cannot unmock ${filename}, which was not mocked`);
- if (!used_module_mocks.has(filename)) {
- throw new Error(`You asked to mock ${filename} but we never saw it during compilation.`);
- }
+ assert.ok(
+ used_module_mocks.has(filename),
+ `You asked to mock ${filename} but we never saw it during compilation.`,
+ );
module_mocks.delete(filename);
used_module_mocks.delete(filename);
};
exports.set_global = function (name, val) {
- if (val === null) {
- throw new Error(`
- We try to avoid using null in our codebase.
- `);
- }
+ assert.notEqual(val, null, `We try to avoid using null in our codebase.`);
if (!(name in old_globals)) {
if (!(name in global)) {
@@ -265,14 +257,16 @@ exports.set_global = function (name, val) {
};
exports.zrequire = function (short_fn) {
- if (short_fn === "templates") {
- throw new Error(`
+ assert.notEqual(
+ short_fn,
+ "templates",
+ `
There is no need to zrequire templates.js.
The test runner automatically registers the
Handlebar extensions.
- `);
- }
+ `,
+ );
return require(`../../static/js/${short_fn}`);
};
@@ -281,6 +275,7 @@ const staticPath = path.resolve(__dirname, "../../static") + path.sep;
exports.complain_about_unused_mocks = function () {
for (const filename of module_mocks.keys()) {
+ /* istanbul ignore if */
if (!used_module_mocks.has(filename)) {
console.error(`You asked to mock ${filename} but we never saw it during compilation.`);
}
@@ -298,9 +293,7 @@ exports.finish = function () {
*/
jquery_function = undefined;
- if (actual_load === undefined) {
- throw new Error("namespace.finish was called without namespace.start.");
- }
+ assert.notEqual(actual_load, undefined, "namespace.finish was called without namespace.start.");
Module._load = actual_load;
actual_load = undefined;
@@ -321,11 +314,10 @@ exports.finish = function () {
};
exports.with_field = function (obj, field, val, f) {
- if ("__esModule" in obj && "__Rewire__" in obj) {
- throw new TypeError(
- "Cannot mutate an ES module from outside. Consider exporting a test helper function from it instead.",
- );
- }
+ assert.ok(
+ !("__esModule" in obj && "__Rewire__" in obj),
+ "Cannot mutate an ES module from outside. Consider exporting a test helper function from it instead.",
+ );
const had_val = Object.hasOwn(obj, field);
const old_val = obj[field];
@@ -350,9 +342,11 @@ exports.with_field_rewire = function (obj, field, val, f) {
// https://github.com/rosswarren/babel-plugin-rewire-ts/issues/15
const old_val = field in obj ? obj[field] : obj.__GetDependency__(field);
- if (typeof old_val === "function") {
- throw new TypeError("Please try to avoid mocking here, or use override_rewire.");
- }
+ assert.notEqual(
+ typeof old_val,
+ "function",
+ "Please try to avoid mocking here, or use override_rewire.",
+ );
try {
obj.__Rewire__(field, val);
@@ -369,14 +363,16 @@ exports.with_function_call_disallowed_rewire = function (obj, field, f) {
// https://github.com/rosswarren/babel-plugin-rewire-ts/issues/15
const old_val = field in obj ? obj[field] : obj.__GetDependency__(field);
- if (typeof old_val !== "function") {
- throw new TypeError(`Expected a function for ${field}`);
- }
+ assert.equal(typeof old_val, "function", `Expected a function for ${field}`);
try {
- obj.__Rewire__(field, () => {
- throw new Error(`unexpected call to ${field}`);
- });
+ obj.__Rewire__(
+ field,
+ /* istanbul ignore next */
+ () => {
+ throw new Error(`unexpected call to ${field}`);
+ },
+ );
return f();
} finally {
obj.__Rewire__(field, old_val);
@@ -397,28 +393,29 @@ exports.with_overrides = function (test_function) {
// step. Generally our code calls `run_test`, which wraps
// `with_overrides`.
- if ("__esModule" in obj && "__Rewire__" in obj) {
- throw new TypeError(
- "Cannot mutate an ES module from outside. Consider exporting a test helper function from it instead.",
- );
- }
+ assert.ok(
+ !("__esModule" in obj && "__Rewire__" in obj),
+ "Cannot mutate an ES module from outside. Consider exporting a test helper function from it instead.",
+ );
- if (typeof f !== "function") {
- throw new TypeError(
- "You can only override with a function. Use with_field for non-functions.",
- );
- }
+ assert.equal(
+ typeof f,
+ "function",
+ "You can only override with a function. Use with_field for non-functions.",
+ );
- if (typeof obj !== "object" && typeof obj !== "function") {
- throw new TypeError(`We cannot override a function for ${typeof obj} objects`);
- }
+ assert.ok(
+ typeof obj === "object" || typeof obj === "function",
+ `We cannot override a function for ${typeof obj} objects`,
+ );
- if (obj[func_name] !== undefined && typeof obj[func_name] !== "function") {
- throw new TypeError(`
+ assert.ok(
+ obj[func_name] === undefined || typeof obj[func_name] === "function",
+ `
You are overriding a non-function with a function.
This is almost certainly an error.
- `);
- }
+ `,
+ );
if (!unused_funcs.has(obj)) {
unused_funcs.set(obj, new Map());
@@ -449,22 +446,24 @@ exports.with_overrides = function (test_function) {
// as exporting a helper function for tests from the module
// containing the function you need to mock.
- if (typeof f !== "function") {
- throw new TypeError(
- "You can only override with a function. Use with_field for non-functions.",
- );
- }
+ assert.equal(
+ typeof f,
+ "function",
+ "You can only override with a function. Use with_field for non-functions.",
+ );
- if (typeof obj !== "object" && typeof obj !== "function") {
- throw new TypeError(`We cannot override a function for ${typeof obj} objects`);
- }
+ assert.ok(
+ typeof obj === "object" || typeof obj === "function",
+ `We cannot override a function for ${typeof obj} objects`,
+ );
- if (obj[func_name] !== undefined && typeof obj[func_name] !== "function") {
- throw new TypeError(`
+ assert.ok(
+ obj[func_name] === undefined || typeof obj[func_name] === "function",
+ `
You are overriding a non-function with a function.
This is almost certainly an error.
- `);
- }
+ `,
+ );
if (!unused_funcs.has(obj)) {
unused_funcs.set(obj, new Map());
@@ -497,6 +496,7 @@ exports.with_overrides = function (test_function) {
for (const module_unused_funcs of unused_funcs.values()) {
for (const unused_name of module_unused_funcs.keys()) {
+ /* istanbul ignore next */
throw new Error(unused_name + " never got invoked!");
}
}
diff --git a/frontend_tests/zjsunit/test.js b/frontend_tests/zjsunit/test.js
index f9109f0a89..1b605eef8f 100644
--- a/frontend_tests/zjsunit/test.js
+++ b/frontend_tests/zjsunit/test.js
@@ -19,6 +19,7 @@ exports.set_verbose = (value) => {
exports.run_test = (label, f, opts) => {
const {sloppy_$} = opts || {};
+ /* istanbul ignore if */
if (verbose) {
console.info(" test: " + label);
}
@@ -34,7 +35,7 @@ exports.run_test = (label, f, opts) => {
f({override, override_rewire, mock_template: namespace._mock_template});
});
namespace._finish_template_mocking();
- } catch (error) {
+ } catch (error) /* istanbul ignore next */ {
console.info("-".repeat(50));
console.info(`test failed: ${current_file_name} > ${label}`);
console.info();
diff --git a/frontend_tests/zjsunit/zblueslip.js b/frontend_tests/zjsunit/zblueslip.js
index 7d96225a8e..305181ff3a 100644
--- a/frontend_tests/zjsunit/zblueslip.js
+++ b/frontend_tests/zjsunit/zblueslip.js
@@ -1,5 +1,7 @@
"use strict";
+const {strict: assert} = require("assert");
+
function make_zblueslip() {
const lib = {};
@@ -15,6 +17,7 @@ function make_zblueslip() {
const names = Array.from(Object.keys(opts));
// For fatal messages, we should use assert.throws
+ /* istanbul ignore next */
lib.fatal = (msg) => {
throw new Error(msg);
};
@@ -28,14 +31,13 @@ function make_zblueslip() {
lib.test_logs[name] = [];
}
- lib.expect = (name, message, count = 1) => {
- if (opts[name] === undefined) {
- throw new Error("unexpected arg for expect: " + name);
- }
- if (count <= 0 && Number.isInteger(count)) {
- throw new Error("expected count should be a positive integer");
- }
- const obj = {message, count, expected_count: count};
+ lib.expect = (name, message, expected_count = 1) => {
+ assert.notEqual(opts[name], undefined, `unexpected arg for expect: ${name}`);
+ assert.ok(
+ expected_count > 0 && Number.isInteger(expected_count),
+ "expected count should be a positive integer",
+ );
+ const obj = {message, count: 0, expected_count};
lib.test_data[name].push(obj);
};
@@ -52,22 +54,16 @@ function make_zblueslip() {
}
continue;
}
- lib.test_data[name][i].count -= 1;
+ lib.test_data[name][i].count += 1;
}
for (const obj of lib.test_data[name]) {
const message = obj.message;
- if (obj.count > 0) {
- throw new Error(
- `We did not see expected ${obj.expected_count} of '${name}': ${message}`,
- );
- } else if (obj.count < 0) {
- throw new Error(
- `We saw ${obj.expected_count - obj.count} (expected ${
- obj.expected_count
- }) of '${name}': ${message}`,
- );
- }
+ assert.equal(
+ obj.count,
+ obj.expected_count,
+ `Expected ${obj.expected_count} of '${name}': ${message}`,
+ );
}
}
};
@@ -95,6 +91,7 @@ function make_zblueslip() {
continue;
}
lib[name] = function (message, more_info, stack) {
+ /* istanbul ignore if */
if (typeof message !== "string") {
// We may catch exceptions in blueslip, and if
// so our stub should include that.
@@ -121,6 +118,7 @@ function make_zblueslip() {
lib.measure_time = (label, f) => f();
+ /* istanbul ignore next */
lib.preview_node = (node) => "node:" + node;
return lib;
diff --git a/frontend_tests/zjsunit/zjquery.js b/frontend_tests/zjsunit/zjquery.js
index 5eb48e53cd..8be4bc04f9 100644
--- a/frontend_tests/zjsunit/zjquery.js
+++ b/frontend_tests/zjsunit/zjquery.js
@@ -23,16 +23,15 @@ function verify_selector_for_zulip(selector) {
selector.includes(".") ||
(selector.includes("[") && selector.indexOf("]") >= selector.indexOf("["));
- if (!is_valid) {
+ assert.ok(
+ is_valid,
// Check if selector has only english alphabets and space.
// Then, the user is probably trying to use a tag as a selector
// like $('div a').
- if (/^[ A-Za-z]+$/.test(selector)) {
- throw new Error("Selector too broad! Use id, class or attributes of target instead.");
- } else {
- throw new Error("Invalid selector: " + selector + " Use $.create() maybe?");
- }
- }
+ /^[ A-Za-z]+$/.test(selector)
+ ? "Selector too broad! Use id, class or attributes of target instead."
+ : `Invalid selector: ${selector}. Use $.create() maybe?`,
+ );
}
function make_zjquery() {
@@ -56,15 +55,16 @@ function make_zjquery() {
// Handle the special case of equality checks, which
// we can infer by assert.equal trying to access the
// "stack" key.
- if (key === "stack") {
- const error =
- "\nInstead of doing equality checks on a full object, " +
- 'do `assert_equal($foo.selector, ".some_class")\n';
- throw new Error(error);
- }
+ assert.notEqual(
+ key,
+ "stack",
+ "\nInstead of doing equality checks on a full object, " +
+ 'do `assert.equal($foo.selector, ".some_class")\n',
+ );
const val = target[key];
+ /* istanbul ignore if */
if (val === undefined && typeof key !== "symbol" && key !== "inspect") {
// For undefined values, we'll throw errors to devs saying
// they need to create stubs. We ignore certain keys that
@@ -85,16 +85,17 @@ function make_zjquery() {
const zjquery = function (arg, arg2) {
if (typeof arg === "function") {
- if (initialize_function) {
- throw new Error(`
+ assert.ok(
+ !initialize_function,
+ `
We are trying to avoid the $(...) mechanism
for initializing modules in our codebase,
and the code that you are compiling/running
has tried to do this twice. Please either
clean up the real code or reduce the scope
of what you are testing in this test module.
- `);
- }
+ `,
+ );
initialize_function = arg;
return undefined;
}
@@ -116,12 +117,15 @@ function make_zjquery() {
return arg.to_$();
}
- if (arg2 !== undefined) {
- throw new Error("We only use one-argument variations of $(...) in Zulip code.");
- }
+ assert.equal(
+ arg2,
+ undefined,
+ "We only use one-argument variations of $(...) in Zulip code.",
+ );
const selector = arg;
+ /* istanbul ignore if */
if (typeof selector !== "string") {
console.info(arg);
throw new Error("zjquery does not know how to wrap this object yet");
@@ -152,10 +156,7 @@ function make_zjquery() {
return $elem;
};
- zjquery.trim = function (s) {
- return s;
- };
-
+ /* istanbul ignore next */
zjquery.state = function () {
// useful for debugging
let res = Array.from(elems.values(), ($v) => $v.debug());
@@ -169,6 +170,7 @@ function make_zjquery() {
zjquery.Event = FakeEvent;
+ /* istanbul ignore next */
fn.popover = () => {
throw new Error(`
Do not try to test $.fn.popover code unless
@@ -186,6 +188,7 @@ function make_zjquery() {
return true;
}
+ /* istanbul ignore next */
throw new Error(`
Please don't use node tests to test code
that extends $.fn unless you really know
@@ -209,6 +212,7 @@ function make_zjquery() {
};
zjquery.validator = {
+ /* istanbul ignore next */
addMethod() {
throw new Error("You must create your own $.validator.addMethod stub.");
},
@@ -229,6 +233,7 @@ const $ = new Proxy(make_zjquery(), {
return true;
}
+ /* istanbul ignore next */
throw new Error(`
Please don't modify $.${prop} if you are using zjquery.
diff --git a/frontend_tests/zjsunit/zjquery_element.js b/frontend_tests/zjsunit/zjquery_element.js
index 2ea968e517..6d8132af8c 100644
--- a/frontend_tests/zjsunit/zjquery_element.js
+++ b/frontend_tests/zjsunit/zjquery_element.js
@@ -48,6 +48,7 @@ function FakeElement(selector, opts) {
delay() {
return $self;
},
+ /* istanbul ignore next */
debug() {
return {
value,
@@ -61,9 +62,6 @@ function FakeElement(selector, opts) {
}
return $self;
},
- eq() {
- return $self;
- },
expectOne() {
// silently do nothing
return $self;
@@ -80,6 +78,7 @@ function FakeElement(selector, opts) {
// if ($.find().length) { //success }
return [];
}
+ /* istanbul ignore next */
throw new Error(`
We need you to simulate the results of $(...).find(...)
by using set_find_results. You want something like this:
@@ -100,9 +99,7 @@ function FakeElement(selector, opts) {
return classes.has(class_name);
},
height() {
- if (height === undefined) {
- throw new Error(`Please call $("${selector}").set_height`);
- }
+ assert.notEqual(height, undefined, `Please call $("${selector}").set_height`);
return height;
},
hide() {
@@ -117,13 +114,15 @@ function FakeElement(selector, opts) {
return html;
},
is(arg) {
- if (arg === ":visible") {
- return shown;
+ switch (arg) {
+ case ":visible":
+ return shown;
+ case ":focus":
+ return $self.is_focused();
+ /* istanbul ignore next */
+ default:
+ throw new Error("zjquery does not support this is() call");
}
- if (arg === ":focus") {
- return $self.is_focused();
- }
- return $self;
},
is_focused() {
// is_focused is not a jQuery thing; this is
@@ -144,6 +143,7 @@ function FakeElement(selector, opts) {
event_store.on(...args);
return $self;
},
+ /* istanbul ignore next */
one(...args) {
event_store.one(...args);
return $self;
@@ -181,6 +181,7 @@ function FakeElement(selector, opts) {
}
return $self;
},
+ /* istanbul ignore next */
remove() {
throw new Error(`
We don't support remove in zjquery.
@@ -192,21 +193,12 @@ function FakeElement(selector, opts) {
`);
},
removeData: noop,
- replaceWith() {
- return $self;
- },
- scrollTop() {
- return $self;
- },
- serializeArray() {
- return $self;
- },
set_find_results(find_selector, $jquery_object) {
- if ($jquery_object === undefined) {
- throw new Error(
- "Please make the 'find result' be something like $.create('unused')",
- );
- }
+ assert.notEqual(
+ $jquery_object,
+ undefined,
+ "Please make the 'find result' be something like $.create('unused')",
+ );
find_results.set(find_selector, $jquery_object);
},
set_height(fake_height) {
@@ -222,9 +214,6 @@ function FakeElement(selector, opts) {
shown = true;
return $self;
},
- slice() {
- return $self;
- },
stop() {
return $self;
},
@@ -242,9 +231,6 @@ function FakeElement(selector, opts) {
shown = show;
return $self;
},
- tooltip() {
- return $self;
- },
trigger(ev) {
event_store.trigger($self, ev);
return $self;
@@ -314,9 +300,7 @@ function make_event_store(selector) {
if (child_selector === undefined) {
handler = on_functions.get(name);
- if (!handler) {
- throw new Error("no " + name + " handler for " + selector);
- }
+ assert.ok(handler, `no ${name} handler for ${selector}`);
return handler;
}
@@ -325,9 +309,7 @@ function make_event_store(selector) {
handler = child_on.get(name);
}
- if (!handler) {
- throw new Error("no " + name + " handler for " + selector + " " + child_selector);
- }
+ assert.ok(handler, `no ${name} handler for ${selector} ${child_selector}`);
return handler;
},
@@ -342,6 +324,7 @@ function make_event_store(selector) {
// .off in code that we test: $(...).off('click', child_sel);
//
// So we don't support this for now.
+ /* istanbul ignore next */
throw new Error("zjquery does not support this call sequence");
},
@@ -351,6 +334,7 @@ function make_event_store(selector) {
// (event_name, sel, handler)
if (args.length === 1) {
const [handler] = args;
+ /* istanbul ignore if */
if (on_functions.has(event_name)) {
console.info("\nEither the app or the test can be at fault here..");
console.info("(sometimes you just want to call $.clear_all_elements();)\n");
@@ -361,9 +345,7 @@ function make_event_store(selector) {
return;
}
- if (args.length !== 2) {
- throw new Error("wrong number of arguments passed in");
- }
+ assert.equal(args.length, 2, "wrong number of arguments passed in");
const [sel, handler] = args;
assert.equal(typeof sel, "string", "String selectors expected here.");
@@ -375,13 +357,15 @@ function make_event_store(selector) {
const child_on = child_on_functions.get(sel);
- if (child_on.has(event_name)) {
- throw new Error("dup " + event_name + " handler for " + selector + " " + sel);
- }
+ assert.ok(
+ !child_on.has(event_name),
+ `dup ${event_name} handler for ${selector} ${sel}`,
+ );
child_on.set(event_name, handler);
},
+ /* istanbul ignore next */
one(event_name, handler) {
self.on(event_name, function (ev) {
self.off(event_name);
diff --git a/frontend_tests/zjsunit/zjquery_event.js b/frontend_tests/zjsunit/zjquery_event.js
index 0bed14c300..b125f1b704 100644
--- a/frontend_tests/zjsunit/zjquery_event.js
+++ b/frontend_tests/zjsunit/zjquery_event.js
@@ -2,9 +2,6 @@
class FakeEvent {
constructor(type, props) {
- if (!(this instanceof FakeEvent)) {
- return new FakeEvent(type, props);
- }
this.type = type;
Object.assign(this, props);
}
diff --git a/tools/test-js-with-node b/tools/test-js-with-node
index 2c138aa032..39a4523480 100755
--- a/tools/test-js-with-node
+++ b/tools/test-js-with-node
@@ -44,6 +44,8 @@ def make_set(files: List[str]) -> Set[str]:
# We do not yet require 100% line coverage for these files:
EXEMPT_FILES = make_set(
[
+ "frontend_tests/node_tests/event_status.js",
+ "frontend_tests/zjsunit/mdiff.js",
"static/js/about_zulip.js",
"static/js/add_subscribers_pill.js",
"static/js/admin.js",
@@ -372,14 +374,16 @@ def read_coverage() -> Any:
def enforce_proper_coverage(coverage_json: Any) -> bool:
- all_js_files = set(
- glob.glob("static/js/*.js")
- + glob.glob("static/js/*.ts")
- + glob.glob("static/shared/js/*.js")
- + glob.glob("static/shared/js/*.ts")
- + glob.glob("static/js/billing/*.js"),
- )
- enforce_fully_covered = all_js_files - EXEMPT_FILES
+ all_js_files = {
+ *glob.glob("frontend_tests/node_tests/*.js"),
+ *glob.glob("frontend_tests/zjsunit/*.js"),
+ *glob.glob("static/js/*.js"),
+ *glob.glob("static/js/*.ts"),
+ *glob.glob("static/shared/js/*.js"),
+ *glob.glob("static/shared/js/*.ts"),
+ *glob.glob("static/js/billing/*.js"),
+ }
+ enforce_fully_covered = sorted(all_js_files - EXEMPT_FILES)
coverage_lost = False
for relative_path in enforce_fully_covered: