"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.ok($("#home").is_focused()); $.clear_initialize_function(); }); 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("tests", "test")); assert.ok(!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.ok(removed); assert.ok(faded_in); assert.ok(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.ok($(password_selector).hasClass(present_class)); assert.ok(!$(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"); });