Files
zulip/frontend_tests/node_tests/common.js
Tim Abbott 78c7d749d9 passwords: Set title/aria-label attributes dynamically.
This allows us to use different "Show password" and "Hide password"
for these labels, which is more consistent with how other products
implement this.

It also lets us delete N duplicate copies of these strings in the HTML.
2021-04-23 15:01:37 -07:00

175 lines
4.8 KiB
JavaScript

"use strict";
const {strict: assert} = require("assert");
const {mock_cjs, mock_esm, set_global, zrequire} = require("../zjsunit/namespace");
const {run_test} = require("../zjsunit/test");
const $ = require("../zjsunit/zjquery");
mock_cjs("jquery", $);
const noop = () => {};
mock_esm("tippy.js", {
default: (selector) => {
$(selector)[0]._tippy = noop;
$(selector)[0]._tippy.setContent = noop;
},
});
set_global("document", {});
const common = zrequire("common");
run_test("basics", () => {
common.autofocus("#home");
$.get_initialize_function()();
assert($("#home").is_focused());
$.clear_initialize_function();
});
run_test("phrase_match", () => {
assert(common.phrase_match("tes", "test"));
assert(common.phrase_match("Tes", "test"));
assert(common.phrase_match("Tes", "Test"));
assert(common.phrase_match("tes", "Stream Test"));
assert(!common.phrase_match("tests", "test"));
assert(!common.phrase_match("tes", "hostess"));
});
run_test("copy_data_attribute_value", (override) => {
const admin_emails_val = "iago@zulip.com";
const input = $.create("input");
let removed;
input.remove = () => {
removed = true;
};
override(document, "createElement", () => input);
override(document, "execCommand", noop);
$("body").append = noop;
$(input).val = (arg) => {
assert.equal(arg, admin_emails_val);
return {
trigger: noop,
};
};
const elem = {};
let faded_in = false;
let faded_out = false;
elem.data = (key) => {
assert.equal(key, "admin-emails");
return admin_emails_val;
};
elem.fadeOut = (val) => {
assert.equal(val, 250);
faded_out = true;
};
elem.fadeIn = (val) => {
assert.equal(val, 1000);
faded_in = true;
};
common.copy_data_attribute_value(elem, "admin-emails");
assert(removed);
assert(faded_in);
assert(faded_out);
});
run_test("adjust_mac_shortcuts non-mac", (override) => {
override(common, "has_mac_keyboard", () => false);
// The adjust_mac_shortcuts 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_shortcuts("selector-that-does-not-exist");
});
run_test("adjust_mac_shortcuts mac", (override) => {
const keys_to_test_mac = new Map([
["Backspace", "Delete"],
["Enter", "Return"],
["Home", "Fn + ←"],
["End", "Fn + →"],
["PgUp", "Fn + ↑"],
["PgDn", "Fn + ↓"],
["X + Shift", "X + Shift"],
["⌘ + Return", "⌘ + Return"],
["Enter or Backspace", "Return or Delete"],
["Ctrl", "⌘"],
["Ctrl + Shift", "⌘ + Shift"],
["Ctrl + Backspace + End", "⌘ + Delete + Fn + →"],
]);
override(common, "has_mac_keyboard", () => true);
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);
assert.equal(stub.hasClass("mac-cmd-key"), false);
test_item.stub = stub;
test_item.mac_key = mac_key;
test_item.is_cmd_key = old_key.includes("Ctrl");
test_items.push(test_item);
key_no += 1;
}
const children = test_items.map((test_item) => ({to_$: () => test_item.stub}));
$.create(".markdown_content", {children});
const require_cmd = true;
common.adjust_mac_shortcuts(".markdown_content", require_cmd);
for (const test_item of test_items) {
assert.equal(test_item.stub.hasClass("mac-cmd-key"), test_item.is_cmd_key);
assert.equal(test_item.stub.text(), test_item.mac_key);
}
});
run_test("show password", () => {
const password_selector = "#id_password ~ .password_visibility_toggle";
$(password_selector)[0] = () => {};
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($(password_selector).hasClass(present_class));
assert(!$(password_selector).hasClass(absent_class));
}
const ev = {
preventDefault: () => {},
stopPropagation: () => {},
};
set_attribute("password");
common.setup_password_visibility_toggle("#id_password", password_selector);
const handler = $(password_selector).get_on_handler("click");
handler(ev);
check_assertion("text", "fa-eye", "fa-eye-slash");
handler(ev);
check_assertion("password", "fa-eye-slash", "fa-eye");
handler(ev);
common.reset_password_toggle_icons("#id_password", password_selector);
check_assertion("password", "fa-eye-slash", "fa-eye");
});