zulip/frontend_tests/node_tests/settings_org.js

952 lines
35 KiB
JavaScript

"use strict";
const {strict: assert} = require("assert");
const {$t} = require("../zjsunit/i18n");
const {mock_esm, set_global, zrequire} = require("../zjsunit/namespace");
const {run_test} = require("../zjsunit/test");
const blueslip = require("../zjsunit/zblueslip");
const $ = require("../zjsunit/zjquery");
const {page_params} = require("../zjsunit/zpage_params");
const noop = () => {};
let form_data;
const _FormData = function () {
return form_data;
};
const realm_icon = mock_esm("../../static/js/realm_icon");
const channel = mock_esm("../../static/js/channel");
const overlays = mock_esm("../../static/js/overlays");
mock_esm("../../static/js/csrf", {csrf_token: "token-stub"});
mock_esm("../../static/js/list_widget", {
create: () => ({init: noop}),
});
mock_esm("../../static/js/loading", {
make_indicator: noop,
destroy_indicator: noop,
});
mock_esm("../../static/js/ui_report", {
success(msg, elem) {
elem.val(msg);
},
error(msg, xhr, elem) {
elem.val(msg);
},
});
set_global("FormData", _FormData);
const settings_config = zrequire("settings_config");
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) {
run_test(label, ({override, mock_template}) => {
$("#realm-icon-upload-widget .upload-spinner-background").css = () => {};
page_params.is_admin = false;
page_params.realm_domains = [
{domain: "example.com", allow_subdomains: true},
{domain: "example.org", allow_subdomains: false},
];
page_params.realm_authentication_methods = {};
settings_org.reset();
f({override, mock_template});
});
}
test("unloaded", () => {
// This test mostly gets us line coverage, and makes
// sure things don't explode before set_up is called.
settings_org.reset();
settings_org.populate_realm_domains();
settings_org.populate_auth_methods();
});
function simulate_realm_domains_table() {
const tr_stub = $.create("realm-tr-stub");
$("#realm_domains_table tbody").set_find_results("tr", tr_stub);
tr_stub.remove = () => {};
let appended;
$("#realm_domains_table tbody").append = (html) => {
appended = true;
assert.equal(html, "stub-domains-list");
};
return function verify() {
assert.ok(appended);
};
}
function test_realms_domain_modal(override, add_realm_domain) {
const info = $(".realm_domains_info");
$("#add-realm-domain-widget").set_find_results(
".new-realm-domain",
$.create("new-realm-domain-stub"),
);
$("#add-realm-domain-widget").set_find_results(
".new-realm-domain-allow-subdomains",
$.create("new-realm-domain-allow-subdomains-stub"),
);
let posted;
let success_callback;
let error_callback;
override(channel, "post", (req) => {
posted = true;
assert.equal(req.url, "/json/realm/domains");
success_callback = req.success;
error_callback = req.error;
});
add_realm_domain();
assert.ok(posted);
success_callback();
assert.equal(info.val(), "translated HTML: Added successfully!");
error_callback({});
assert.equal(info.val(), "translated HTML: Failed");
}
function createSaveButtons(subsection) {
const stub_save_button_header = $(`#org-${CSS.escape(subsection)}`);
const save_button_controls = $(".save-button-controls");
const stub_save_button = $(`#org-submit-${CSS.escape(subsection)}`);
const stub_discard_button = $(`#org-discard-${CSS.escape(subsection)}`);
const stub_save_button_text = $(".save-discard-widget-button-text");
stub_save_button_header.set_find_results(
".subsection-failed-status p",
$("<failed status element>"),
);
stub_save_button.closest = () => stub_save_button_header;
save_button_controls.set_find_results(".save-button", stub_save_button);
stub_save_button.set_find_results(".save-discard-widget-button-text", stub_save_button_text);
stub_save_button_header.set_find_results(".save-button-controls", save_button_controls);
stub_save_button_header.set_find_results(
".subsection-changes-discard button",
$(`#org-discard-${CSS.escape(subsection)}`),
);
save_button_controls.set_find_results(".discard-button", stub_discard_button);
const props = {};
props.hidden = false;
save_button_controls.fadeIn = () => {
props.hidden = false;
};
save_button_controls.fadeOut = () => {
props.hidden = true;
};
return {
props,
save_button: stub_save_button,
discard_button: stub_discard_button,
save_button_header: stub_save_button_header,
save_button_controls,
save_button_text: stub_save_button_text,
};
}
function test_submit_settings_form(override, submit_form) {
Object.assign(page_params, {
realm_bot_creation_policy: settings_bots.bot_creation_policy_values.restricted.code,
realm_email_address_visibility:
settings_config.email_address_visibility_values.admins_only.code,
realm_add_custom_emoji_policy: settings_config.common_policy_values.by_admins_only.code,
realm_waiting_period_threshold: 1,
realm_default_language: '"es"',
realm_invite_to_stream_policy: settings_config.common_policy_values.by_admins_only.code,
realm_create_private_stream_policy: settings_config.common_policy_values.by_members.code,
realm_create_public_stream_policy: settings_config.common_policy_values.by_members.code,
realm_invite_to_realm_policy: settings_config.common_policy_values.by_members.code,
});
override(global, "setTimeout", (func) => func());
const ev = {
preventDefault: noop,
stopPropagation: noop,
};
let patched;
let data;
let success_callback;
override(channel, "patch", (req) => {
patched = true;
assert.equal(req.url, "/json/realm");
data = req.data;
success_callback = req.success;
});
let subsection = "other-permissions";
ev.currentTarget = `#org-submit-${CSS.escape(subsection)}`;
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);
const invite_to_stream_policy_elem = $("#id_realm_invite_to_stream_policy");
invite_to_stream_policy_elem.val("1");
invite_to_stream_policy_elem.attr("id", "id_realm_invite_to_stream_policy");
invite_to_stream_policy_elem.data = () => "number";
const create_public_stream_policy_elem = $("#id_realm_create_public_stream_policy");
create_public_stream_policy_elem.val("2");
create_public_stream_policy_elem.attr("id", "id_realm_create_public_stream_policy");
create_public_stream_policy_elem.data = () => "number";
const create_private_stream_policy_elem = $("#id_realm_create_private_stream_policy");
create_private_stream_policy_elem.val("2");
create_private_stream_policy_elem.attr("id", "id_realm_create_private_stream_policy");
create_private_stream_policy_elem.data = () => "number";
const add_custom_emoji_policy_elem = $("#id_realm_add_custom_emoji_policy");
add_custom_emoji_policy_elem.val("1");
add_custom_emoji_policy_elem.attr("id", "id_realm_add_custom_emoji_policy");
add_custom_emoji_policy_elem.data = () => "number";
const bot_creation_policy_elem = $("#id_realm_bot_creation_policy");
bot_creation_policy_elem.val("1");
bot_creation_policy_elem.attr("id", "id_realm_bot_creation_policy");
bot_creation_policy_elem.data = () => "number";
const email_address_visibility_elem = $("#id_realm_email_address_visibility");
email_address_visibility_elem.val("1");
email_address_visibility_elem.attr("id", "id_realm_email_address_visibility");
email_address_visibility_elem.data = () => "number";
const invite_to_realm_policy_elem = $("#id_realm_invite_to_realm_policy");
invite_to_realm_policy_elem.val("2");
invite_to_realm_policy_elem.attr("id", "id_realm_invite_to_realm_policy");
invite_to_realm_policy_elem.data = () => "number";
let subsection_elem = $(`#org-${CSS.escape(subsection)}`);
subsection_elem.closest = () => subsection_elem;
subsection_elem.set_find_results(".prop-element", [
bot_creation_policy_elem,
email_address_visibility_elem,
add_custom_emoji_policy_elem,
create_public_stream_policy_elem,
create_private_stream_policy_elem,
invite_to_stream_policy_elem,
]);
patched = false;
submit_form(ev);
assert.ok(patched);
let expected_value = {
bot_creation_policy: 1,
invite_to_stream_policy: 1,
email_address_visibility: 1,
add_custom_emoji_policy: 1,
create_public_stream_policy: 2,
create_private_stream_policy: 2,
};
assert.deepEqual(data, expected_value);
subsection = "user-defaults";
ev.currentTarget = `#org-submit-${CSS.escape(subsection)}`;
stubs = createSaveButtons(subsection);
save_button = stubs.save_button;
save_button.attr("id", `org-submit-${subsection}`);
const realm_default_language_elem = $("#id_realm_default_language");
realm_default_language_elem.val("en");
realm_default_language_elem.attr("id", "id_realm_default_language");
realm_default_language_elem.data = () => "string";
subsection_elem = $(`#org-${CSS.escape(subsection)}`);
subsection_elem.closest = () => subsection_elem;
subsection_elem.set_find_results(".prop-element", [realm_default_language_elem]);
submit_form(ev);
assert.ok(patched);
expected_value = {
default_language: "en",
};
assert.deepEqual(data, expected_value);
// Testing only once for since callback is same for all cases
success_callback();
assert.equal(stubs.props.hidden, true);
assert.equal(save_button.attr("data-status"), "saved");
assert.equal(stubs.save_button_text.text(), "translated: Saved");
}
function test_change_save_button_state() {
const {save_button_controls, save_button_text, save_button, discard_button, props} =
createSaveButtons("msg-editing");
save_button.attr("id", "org-submit-msg-editing");
{
settings_org.change_save_button_state(save_button_controls, "unsaved");
assert.equal(save_button_text.text(), "translated: Save changes");
assert.equal(props.hidden, false);
assert.equal(save_button.attr("data-status"), "unsaved");
assert.equal(discard_button.visible(), true);
}
{
settings_org.change_save_button_state(save_button_controls, "saved");
assert.equal(save_button_text.text(), "translated: Save changes");
assert.equal(props.hidden, true);
assert.equal(save_button.attr("data-status"), "");
}
{
settings_org.change_save_button_state(save_button_controls, "saving");
assert.equal(save_button_text.text(), "translated: Saving");
assert.equal(save_button.attr("data-status"), "saving");
assert.equal(save_button.hasClass("saving"), true);
assert.equal(discard_button.visible(), false);
}
{
settings_org.change_save_button_state(save_button_controls, "discarded");
assert.equal(props.hidden, true);
}
{
settings_org.change_save_button_state(save_button_controls, "succeeded");
assert.equal(props.hidden, true);
assert.equal(save_button.attr("data-status"), "saved");
assert.equal(save_button_text.text(), "translated: Saved");
}
{
settings_org.change_save_button_state(save_button_controls, "failed");
assert.equal(props.hidden, false);
assert.equal(save_button.attr("data-status"), "failed");
assert.equal(save_button_text.text(), "translated: Save changes");
}
}
function test_upload_realm_icon(override, upload_realm_logo_or_icon) {
form_data = {
append(field, val) {
form_data[field] = val;
},
};
const file_input = [{files: ["image1.png", "image2.png"]}];
let posted;
override(channel, "post", (req) => {
posted = true;
assert.equal(req.url, "/json/realm/icon");
assert.equal(req.data.csrfmiddlewaretoken, "token-stub");
assert.equal(req.data["file-0"], "image1.png");
assert.equal(req.data["file-1"], "image2.png");
});
upload_realm_logo_or_icon(file_input, null, true);
assert.ok(posted);
}
function test_change_allow_subdomains(change_allow_subdomains) {
const ev = {
stopPropagation: noop,
};
const info = $(".realm_domains_info");
info.fadeOut = noop;
const domain = "example.com";
let allow = true;
let success_callback;
let error_callback;
channel.patch = (req) => {
assert.equal(req.url, "/json/realm/domains/example.com");
assert.equal(req.data.allow_subdomains, JSON.stringify(allow));
success_callback = req.success;
error_callback = req.error;
};
const domain_obj = $.create("domain object");
domain_obj.text(domain);
const elem_obj = $.create("<elem html>");
const parents_obj = $.create("parents object");
elem_obj.set_parents_result("tr", parents_obj);
parents_obj.set_find_results(".domain", domain_obj);
elem_obj.prop("checked", allow);
change_allow_subdomains.call(elem_obj, ev);
success_callback();
assert.equal(
info.val(),
"translated HTML: Update successful: Subdomains allowed for example.com",
);
error_callback({});
assert.equal(info.val(), "translated HTML: Failed");
allow = false;
elem_obj.prop("checked", allow);
change_allow_subdomains.call(elem_obj, ev);
success_callback();
assert.equal(
info.val(),
"translated HTML: Update successful: Subdomains no longer allowed for example.com",
);
}
function test_extract_property_name() {
$("#id_realm_allow_message_editing").attr("id", "id_realm_allow_message_editing");
assert.equal(
settings_org.extract_property_name($("#id_realm_allow_message_editing")),
"realm_allow_message_editing",
);
$("#id_realm_message_content_edit_limit_minutes_label").attr(
"id",
"id_realm_message_content_edit_limit_minutes_label",
);
assert.equal(
settings_org.extract_property_name($("#id_realm_message_content_edit_limit_minutes_label")),
"realm_message_content_edit_limit_minutes_label",
);
$("#id-realm-allow-message-deleting").attr("id", "id-realm-allow-message-deleting");
assert.equal(
settings_org.extract_property_name($("#id-realm-allow-message-deleting")),
"realm_allow_message_deleting",
);
}
function test_sync_realm_settings() {
overlays.settings_open = () => true;
{
/* Test invalid settings property sync */
const property_elem = $("#id_realm_invalid_settings_property");
property_elem.attr("id", "id_realm_invalid_settings_property");
property_elem.length = 1;
blueslip.expect(
"error",
"Element refers to unknown property realm_invalid_settings_property",
);
settings_org.sync_realm_settings("invalid_settings_property");
}
function test_common_policy(property_name) {
const property_elem = $(`#id_realm_${CSS.escape(property_name)}`);
property_elem.length = 1;
property_elem.attr("id", `id_realm_${CSS.escape(property_name)}`);
/* Each policy is initialized to 'by_members' and then all the values are tested
in the following order - by_admins_only, by_moderators_only, by_full_members,
by_members. */
page_params[`realm_${property_name}`] =
settings_config.common_policy_values.by_members.code;
property_elem.val(settings_config.common_policy_values.by_members.code);
for (const policy_value of Array.from(
Object.values(settings_config.common_policy_values),
)) {
page_params[`realm_${property_name}`] = policy_value.code;
settings_org.sync_realm_settings(property_name);
assert.equal(property_elem.val(), policy_value.code);
}
}
test_common_policy("create_private_stream_policy");
test_common_policy("create_public_stream_policy");
test_common_policy("invite_to_stream_policy");
test_common_policy("invite_to_realm_policy");
{
/* Test message content edit limit minutes sync */
const property_elem = $("#id_realm_message_content_edit_limit_minutes");
property_elem.length = 1;
property_elem.attr("id", "id_realm_message_content_edit_limit_minutes");
page_params.realm_create_public_stream_policy = 1;
page_params.realm_message_content_edit_limit_seconds = 120;
settings_org.sync_realm_settings("message_content_edit_limit_seconds");
assert.equal($("#id_realm_message_content_edit_limit_minutes").val(), "2");
}
{
/* Test message content edit limit dropdown value sync */
const property_elem = $("#id_realm_msg_edit_limit_setting");
property_elem.length = 1;
property_elem.attr("id", "id_realm_msg_edit_limit_setting");
page_params.realm_allow_message_editing = false;
page_params.realm_message_content_edit_limit_seconds = 120;
settings_org.sync_realm_settings("allow_message_editing");
assert.equal($("#id_realm_msg_edit_limit_setting").val(), "never");
page_params.realm_allow_message_editing = true;
page_params.realm_message_content_edit_limit_seconds = 120;
settings_org.sync_realm_settings("allow_message_editing");
assert.equal($("#id_realm_msg_edit_limit_setting").val(), "upto_two_min");
page_params.realm_message_content_edit_limit_seconds = 130;
settings_org.sync_realm_settings("allow_message_editing");
assert.equal($("#id_realm_msg_edit_limit_setting").val(), "custom_limit");
}
{
/* Test message content edit limit minutes sync */
const property_elem = $("#id_realm_message_content_edit_limit_minutes");
property_elem.length = 1;
property_elem.attr("id", "id_realm_message_content_edit_limit_minutes");
page_params.realm_create_public_stream_policy = 1;
page_params.realm_message_content_edit_limit_seconds = 120;
settings_org.sync_realm_settings("message_content_edit_limit_seconds");
assert.equal($("#id_realm_message_content_edit_limit_minutes").val(), "2");
}
{
/* Test organization joining restrictions settings sync */
const property_elem = $("#id_realm_org_join_restrictions");
property_elem.length = 1;
property_elem.attr("id", "id_realm_org_join_restrictions");
page_params.realm_emails_restricted_to_domains = true;
page_params.realm_disallow_disposable_email_addresses = false;
settings_org.sync_realm_settings("emails_restricted_to_domains");
assert.equal($("#id_realm_org_join_restrictions").val(), "only_selected_domain");
page_params.realm_emails_restricted_to_domains = false;
page_params.realm_disallow_disposable_email_addresses = true;
settings_org.sync_realm_settings("emails_restricted_to_domains");
assert.equal($("#id_realm_org_join_restrictions").val(), "no_disposable_email");
page_params.realm_disallow_disposable_email_addresses = false;
settings_org.sync_realm_settings("emails_restricted_to_domains");
assert.equal($("#id_realm_org_join_restrictions").val(), "no_restriction");
}
}
function test_parse_time_limit() {
const elem = $("#id_realm_message_content_edit_limit_minutes");
const test_function = (value, expected_value = value) => {
elem.val(value);
page_params.realm_message_content_edit_limit_seconds = settings_org.parse_time_limit(elem);
assert.equal(
settings_org.get_realm_time_limits_in_minutes(
"realm_message_content_edit_limit_seconds",
),
expected_value,
);
};
test_function("0.01", "0");
test_function("0.1");
test_function("0.122", "0.1");
test_function("0.155", "0.2");
test_function("0.150", "0.1");
test_function("0.5");
test_function("1");
test_function("1.1");
test_function("10.5");
test_function("50.3");
test_function("100");
test_function("100.1");
test_function("127.79", "127.8");
test_function("201.1");
test_function("501.15", "501.1");
test_function("501.34", "501.3");
}
function test_discard_changes_button(discard_changes) {
const ev = {
preventDefault: noop,
stopPropagation: noop,
target: "#org-discard-msg-editing",
};
page_params.realm_allow_edit_history = true;
page_params.realm_edit_topic_policy =
settings_config.common_message_policy_values.by_everyone.code;
page_params.realm_allow_message_editing = true;
page_params.realm_message_content_edit_limit_seconds = 3600;
page_params.realm_delete_own_message_policy =
settings_config.common_message_policy_values.by_everyone.code;
page_params.realm_message_content_delete_limit_seconds = 120;
const allow_edit_history = $("#id_realm_allow_edit_history").prop("checked", false);
const edit_topic_policy = $("#id_realm_edit_topic_policy").val(
settings_config.common_message_policy_values.by_admins_only.code,
);
const msg_edit_limit_setting = $("#id_realm_msg_edit_limit_setting").val("custom_limit");
const message_content_edit_limit_minutes = $(
"#id_realm_message_content_edit_limit_minutes",
).val(130);
const msg_delete_limit_setting = $("#id_realm_msg_delete_limit_setting").val("custom_limit");
const message_content_delete_limit_minutes = $(
"#id_realm_message_content_delete_limit_minutes",
).val(130);
allow_edit_history.attr("id", "id_realm_allow_edit_history");
msg_edit_limit_setting.attr("id", "id_realm_msg_edit_limit_setting");
msg_delete_limit_setting.attr("id", "id_realm_msg_delete_limit_setting");
edit_topic_policy.attr("id", "id_realm_edit_topic_policy");
message_content_edit_limit_minutes.attr("id", "id_realm_message_content_edit_limit_minutes");
message_content_delete_limit_minutes.attr(
"id",
"id_realm_message_content_delete_limit_minutes",
);
const discard_button_parent = $(".org-subsection-parent");
discard_button_parent.find = () => [
allow_edit_history,
msg_edit_limit_setting,
msg_delete_limit_setting,
edit_topic_policy,
message_content_edit_limit_minutes,
message_content_delete_limit_minutes,
];
$("#org-discard-msg-editing").closest = () => discard_button_parent;
const stubbed_function = settings_org.change_save_button_state;
settings_org.__Rewire__("change_save_button_state", (save_button_controls, state) => {
assert.equal(state, "discarded");
});
discard_changes(ev);
assert.equal(allow_edit_history.prop("checked"), true);
assert.equal(
edit_topic_policy.val(),
settings_config.common_message_policy_values.by_everyone.code,
);
assert.equal(msg_edit_limit_setting.val(), "upto_one_hour");
assert.equal(message_content_edit_limit_minutes.val(), "60");
assert.equal(msg_delete_limit_setting.val(), "upto_two_min");
assert.equal(message_content_delete_limit_minutes.val(), "2");
settings_org.__Rewire__("change_save_button_state", stubbed_function);
}
test("set_up", ({override, mock_template}) => {
mock_template("settings/admin_realm_domains_list.hbs", false, () => "stub-domains-list");
const verify_realm_domains = simulate_realm_domains_table();
page_params.realm_available_video_chat_providers = {
jitsi_meet: {
id: 1,
name: "Jitsi Meet",
},
zoom: {
id: 3,
name: "Zoom",
},
big_blue_button: {
id: 4,
name: "BigBlueButton",
},
};
let upload_realm_logo_or_icon;
realm_icon.build_realm_icon_widget = (f) => {
upload_realm_logo_or_icon = f;
};
override(dropdown_list_widget, "DropdownListWidget", () => ({
render: noop,
update: noop,
}));
$("#id_realm_message_content_edit_limit_minutes").set_parent(
$.create("<stub edit limit parent>"),
);
$("#id_realm_message_content_delete_limit_minutes").set_parent(
$.create("<stub delete limit parent>"),
);
$("#id_realm_message_retention_days").set_parent($.create("<stub retention period parent>"));
$("#message_content_in_email_notifications_label").set_parent(
$.create("<stub in-content setting checkbox>"),
);
$("#enable_digest_emails_label").set_parent($.create("<stub digest setting checkbox>"));
$("#id_realm_digest_weekday").set_parent($.create("<stub digest weekday setting dropdown>"));
$("#allowed_domains_label").set_parent($.create("<stub-allowed-domain-label-parent>"));
const waiting_period_parent_elem = $.create("waiting-period-parent-stub");
$("#id_realm_waiting_period_threshold").set_parent(waiting_period_parent_elem);
// TEST set_up() here, but this mostly just allows us to
// get access to the click handlers.
override(settings_org, "maybe_disable_widgets", noop);
settings_org.set_up();
verify_realm_domains();
test_realms_domain_modal(override, () => $("#submit-add-realm-domain").trigger("click"));
test_submit_settings_form(
override,
$(".admin-realm-form").get_on_handler(
"click",
".subsection-header .subsection-changes-save button",
),
);
test_upload_realm_icon(override, upload_realm_logo_or_icon);
test_change_allow_subdomains(
$("#realm_domains_table").get_on_handler("change", ".allow-subdomains"),
);
test_extract_property_name();
test_change_save_button_state();
test_sync_realm_settings();
test_parse_time_limit();
test_discard_changes_button(
$(".admin-realm-form").get_on_handler(
"click",
".subsection-header .subsection-changes-discard button",
),
);
});
test("test get_organization_settings_options", () => {
const sorted_option_values = settings_org.get_organization_settings_options();
const sorted_common_policy_values = sorted_option_values.common_policy_values;
const expected_common_policy_values = [
{
key: "by_admins_only",
order: 1,
code: 2,
description: $t({defaultMessage: "Admins"}),
},
{
key: "by_moderators_only",
order: 2,
code: 4,
description: $t({defaultMessage: "Admins and moderators"}),
},
{
key: "by_full_members",
order: 3,
code: 3,
description: $t({defaultMessage: "Admins, moderators and full members"}),
},
{
key: "by_members",
order: 4,
code: 1,
description: $t({defaultMessage: "Admins, moderators and members"}),
},
];
assert.deepEqual(sorted_common_policy_values, expected_common_policy_values);
});
test("test get_sorted_options_list", () => {
const option_values_1 = {
by_admins_only: {
order: 3,
code: 2,
description: $t({defaultMessage: "Admins"}),
},
by_members: {
order: 2,
code: 1,
description: $t({defaultMessage: "Admins, moderators and members"}),
},
by_full_members: {
order: 1,
code: 3,
description: $t({defaultMessage: "Admins, moderators and full members"}),
},
};
let expected_option_values = [
{
key: "by_full_members",
order: 1,
code: 3,
description: $t({defaultMessage: "Admins, moderators and full members"}),
},
{
key: "by_members",
order: 2,
code: 1,
description: $t({defaultMessage: "Admins, moderators and members"}),
},
{
key: "by_admins_only",
order: 3,
code: 2,
description: $t({defaultMessage: "Admins"}),
},
];
assert.deepEqual(settings_org.get_sorted_options_list(option_values_1), expected_option_values);
const option_values_2 = {
by_admins_only: {
code: 1,
description: $t({defaultMessage: "Admins"}),
},
by_members: {
code: 2,
description: $t({defaultMessage: "Admins, moderators and members"}),
},
by_full_members: {
code: 3,
description: $t({defaultMessage: "Admins, moderators and full members"}),
},
};
expected_option_values = [
{
key: "by_admins_only",
code: 1,
description: $t({defaultMessage: "Admins"}),
},
{
key: "by_full_members",
code: 3,
description: $t({defaultMessage: "Admins, moderators and full members"}),
},
{
key: "by_members",
code: 2,
description: $t({defaultMessage: "Admins, moderators and members"}),
},
];
assert.deepEqual(settings_org.get_sorted_options_list(option_values_2), expected_option_values);
});
test("misc", ({override}) => {
page_params.is_admin = false;
const stub_notification_disable_parent = $.create("<stub notification_disable parent");
stub_notification_disable_parent.set_find_results(
".dropdown_list_reset_button:enabled",
$.create("<disable link>"),
);
page_params.realm_name_changes_disabled = false;
page_params.server_name_changes_disabled = false;
settings_account.update_name_change_display();
assert.ok(!$("#full_name").prop("disabled"));
assert.equal($(".change_name_tooltip").is(":visible"), false);
page_params.realm_name_changes_disabled = true;
page_params.server_name_changes_disabled = false;
settings_account.update_name_change_display();
assert.ok($("#full_name").prop("disabled"));
assert.ok($(".change_name_tooltip").is(":visible"));
page_params.realm_name_changes_disabled = true;
page_params.server_name_changes_disabled = true;
settings_account.update_name_change_display();
assert.ok($("#full_name").prop("disabled"));
assert.ok($(".change_name_tooltip").is(":visible"));
page_params.realm_name_changes_disabled = false;
page_params.server_name_changes_disabled = true;
settings_account.update_name_change_display();
assert.ok($("#full_name").prop("disabled"));
assert.ok($(".change_name_tooltip").is(":visible"));
page_params.realm_email_changes_disabled = false;
settings_account.update_email_change_display();
assert.ok(!$("#change_email").prop("disabled"));
page_params.realm_email_changes_disabled = true;
settings_account.update_email_change_display();
assert.ok($("#change_email").prop("disabled"));
page_params.realm_avatar_changes_disabled = false;
page_params.server_avatar_changes_disabled = false;
settings_account.update_avatar_change_display();
assert.ok($("#user-avatar-upload-widget .image_upload_button").is(":visible"));
page_params.realm_avatar_changes_disabled = true;
page_params.server_avatar_changes_disabled = false;
settings_account.update_avatar_change_display();
assert.ok(!$("#user-avatar-upload-widget .image_upload_button").is(":visible"));
page_params.realm_avatar_changes_disabled = false;
page_params.server_avatar_changes_disabled = true;
settings_account.update_avatar_change_display();
assert.ok(!$("#user-avatar-upload-widget .image_upload_button").is(":visible"));
page_params.realm_avatar_changes_disabled = true;
page_params.server_avatar_changes_disabled = true;
settings_account.update_avatar_change_display();
assert.ok(!$("#user-avatar-upload-widget .image_upload_button").is(":visible"));
// If organization admin, these UI elements are never disabled.
page_params.is_admin = true;
settings_account.update_name_change_display();
assert.ok(!$("#full_name").prop("disabled"));
assert.equal($(".change_name_tooltip").is(":visible"), false);
settings_account.update_email_change_display();
assert.ok(!$("#change_email").prop("disabled"));
override(stream_settings_data, "get_streams_for_settings_page", () => [
{name: "some_stream", stream_id: 75},
{name: "some_stream", stream_id: 42},
]);
// Set stubs for dropdown_list_widget:
const widget_settings = [
"realm_notifications_stream_id",
"realm_signup_notifications_stream_id",
"realm_default_code_block_language",
];
const dropdown_list_parent = $.create("<list parent>");
dropdown_list_parent.set_find_results(
".dropdown_list_reset_button:enabled",
$.create("<disable button>"),
);
for (const name of widget_settings) {
const elem = $.create(`#${CSS.escape(name)}_widget #${CSS.escape(name)}_name`);
elem.closest = () => dropdown_list_parent;
}
// We do not define any settings we need in page_params yet, but we don't need to for this test.
blueslip.expect(
"warn",
"dropdown-list-widget: Called without a default value; using null value",
3,
);
settings_org.init_dropdown_widgets();
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"));
settings_org.notifications_stream_widget.render(undefined);
assert.equal(elem.text(), "translated: Disabled");
assert.ok(elem.hasClass("text-warning"));
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"));
settings_org.signup_notifications_stream_widget.render(undefined);
assert.equal(elem.text(), "translated: Disabled");
assert.ok(elem.hasClass("text-warning"));
});