Files
zulip/web/tests/common.test.js
Lauryn Menard 3e3ca26aae docs: Update keyboard shortcuts to always show "Fn" key option.
Previously, these were only shown for Mac OS users and replaced
the "Home", "End", "PgUp" and "PgDn" shortcuts. But as this really
depends on the keyboard the user is using (there are Mac keyboards
with the above keys), we instead show both options in our web app
and help center documentation on keyboard shortcuts.

The tooltip for the "Scroll to bottom" button will now always show
"End" for all users. Previously, it showed a "Fn" key option for
Mac users.

Fixes #31815.
2024-10-14 15:14:10 -07:00

212 lines
6.0 KiB
JavaScript

"use strict";
const assert = require("node:assert/strict");
const {mock_esm, set_global, zrequire} = require("./lib/namespace");
const {run_test, noop} = require("./lib/test");
const $ = require("./lib/zjquery");
mock_esm("tippy.js", {
default(arg) {
arg._tippy = {setContent: noop};
return arg._tippy;
},
});
set_global("document", {});
const navigator = set_global("navigator", {});
const common = zrequire("common");
run_test("phrase_match", () => {
assert.ok(common.phrase_match("tes", "test"));
assert.ok(common.phrase_match("Tes", "test"));
assert.ok(common.phrase_match("Tes", "Test"));
assert.ok(common.phrase_match("tes", "Stream Test"));
assert.ok(common.phrase_match("", "test"));
assert.ok(!common.phrase_match("tests", "test"));
assert.ok(!common.phrase_match("tes", "hostess"));
});
run_test("adjust_mac_kbd_tags non-mac", ({override}) => {
override(navigator, "platform", "Windows");
// The adjust_mac_kbd_tags has a really simple guard
// at the top, and we just test the early-return behavior
// by trying to pass it garbage.
common.adjust_mac_kbd_tags("selector-that-does-not-exist");
});
run_test("adjust_mac_kbd_tags mac", ({override}) => {
const keys_to_test_mac = new Map([
["Backspace", "Delete"],
["Enter", "Return"],
["Ctrl", "⌘"],
["Alt", "⌥"],
["#stream_name", "#stream_name"],
["Ctrl+K", "Ctrl+K"],
["[", "["],
["X", "X"],
["data-mac-following-key", "data-mac-following-key"],
]);
override(navigator, "platform", "MacIntel");
$("<span>").contents = () => $("<contents-stub>");
const test_items = [];
let key_no = 1;
for (const [old_key, mac_key] of keys_to_test_mac) {
const test_item = {};
const $stub = $.create("hotkey_" + key_no);
$stub.text(old_key);
if (old_key === "data-mac-following-key") {
$stub.attr("data-mac-following-key", "⌥");
$stub.after = ($plus, $elem) => {
assert.equal($plus.selector, "<contents-stub>");
assert.equal($elem.selector, "<kbd>");
assert.equal($elem.text(), $stub.attr("data-mac-following-key"));
};
}
test_item.$stub = $stub;
test_item.mac_key = mac_key;
test_items.push(test_item);
key_no += 1;
}
const children = test_items.map((test_item) => ({to_$: () => test_item.$stub}));
$.create(".markdown kbd", {children});
common.adjust_mac_kbd_tags(".markdown kbd");
for (const test_item of test_items) {
assert.equal(test_item.$stub.text(), test_item.mac_key);
}
});
run_test("adjust_mac_hotkey_hints non-mac", ({override}) => {
override(navigator, "platform", "Windows");
// The adjust_mac_hotkey_hints has a really simple guard
// at the top, and we just test the early-return behavior
// by trying to pass it garbage.
common.adjust_mac_hotkey_hints("not-an-array");
});
// Test default values of adjust_mac_hotkey_hints
// Expected values
run_test("adjust_mac_hotkey_hints mac expected", ({override}) => {
const keys_to_test_mac = new Map([
[["Backspace"], ["Delete"]],
[["Enter"], ["Return"]],
[["Ctrl"], ["⌘"]],
]);
override(navigator, "platform", "MacIntel");
const test_items = [];
for (const [old_key, mac_key] of keys_to_test_mac) {
const test_item = {};
common.adjust_mac_hotkey_hints(old_key);
test_item.mac_key = mac_key;
test_item.adjusted_key = old_key;
test_items.push(test_item);
}
for (const test_item of test_items) {
assert.deepStrictEqual(test_item.mac_key, test_item.adjusted_key);
}
});
// Test non-default values of adjust_mac_hotkey_hints
// Random values
run_test("adjust_mac_hotkey_hints mac random", ({override}) => {
const keys_to_test_mac = new Map([
[
["Ctrl", "["],
["⌘", "["],
],
[
["Ctrl", "K"],
["⌘", "K"],
],
[
["Shift", "G"],
["Shift", "G"],
],
[["Space"], ["Space"]],
]);
override(navigator, "platform", "MacIntel");
const test_items = [];
for (const [old_key, mac_key] of keys_to_test_mac) {
const test_item = {};
common.adjust_mac_hotkey_hints(old_key);
test_item.mac_key = mac_key;
test_item.adjusted_key = old_key;
test_items.push(test_item);
}
for (const test_item of test_items) {
assert.deepStrictEqual(test_item.mac_key, test_item.adjusted_key);
}
});
run_test("show password", () => {
const password_selector = "#id_password ~ .password_visibility_toggle";
$(password_selector)[0] = noop;
function set_attribute(type) {
$("#id_password").attr("type", type);
}
function check_assertion(type, present_class, absent_class) {
assert.equal($("#id_password").attr("type"), type);
assert.ok($(password_selector).hasClass(present_class));
assert.ok(!$(password_selector).hasClass(absent_class));
}
const click_ev = {
preventDefault() {},
stopPropagation() {},
};
const key_ev = {
key: "Enter",
preventDefault() {},
stopPropagation() {},
};
set_attribute("password");
common.setup_password_visibility_toggle("#id_password", password_selector);
const click_handler = $(password_selector).get_on_handler("click");
const key_handler = $(password_selector).get_on_handler("keydown");
click_handler(click_ev);
check_assertion("text", "fa-eye", "fa-eye-slash");
click_handler(click_ev);
check_assertion("password", "fa-eye-slash", "fa-eye");
key_handler(key_ev);
check_assertion("text", "fa-eye", "fa-eye-slash");
key_handler(key_ev);
check_assertion("password", "fa-eye-slash", "fa-eye");
click_handler(click_ev);
common.reset_password_toggle_icons("#id_password", password_selector);
check_assertion("password", "fa-eye-slash", "fa-eye");
});