set_global('$', global.make_zjquery()); const noop = () => {}; let form_data; const _jQuery = { each: function (lst, f) { for (const [k, v] of lst.entries()) { f(k, v); } }, }; const _FormData = function () { return form_data; }; const _loading = { make_indicator: noop, destroy_indicator: noop, }; const _page_params = { is_admin: false, realm_domains: [ { domain: 'example.com', allow_subdomains: true }, { domain: 'example.org', allow_subdomains: false }, ], realm_authentication_methods: {}, }; const _realm_icon = {}; const _channel = {}; global.stub_templates((name, data) => { if (name === 'settings/admin_realm_domains_list') { assert(data.realm_domain.domain); return 'stub-domains-list'; } }); const _overlays = {}; const _ui_report = { success: function (msg, elem) { elem.val(msg); }, error: function (msg, xhr, elem) { elem.val(msg); }, }; const _realm_logo = { build_realm_logo_widget: noop, }; const _list_render = { create: () => ({ init: noop }), }; set_global('channel', _channel); set_global('csrf_token', 'token-stub'); set_global('FormData', _FormData); set_global('jQuery', _jQuery); set_global('loading', _loading); set_global('overlays', _overlays); set_global('page_params', _page_params); set_global('realm_icon', _realm_icon); set_global('realm_logo', _realm_logo); set_global('ui_report', _ui_report); set_global('list_render', _list_render); const settings_config = zrequire('settings_config'); const settings_bots = zrequire('settings_bots'); zrequire('stream_data'); zrequire('settings_account'); zrequire('settings_org'); zrequire('settings_ui'); zrequire('dropdown_list_widget'); run_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() { $('#realm_domains_table tbody').set_find_results( 'tr', $.create('realm-tr-stub') ); let appended; $("#realm_domains_table tbody").append = function (html) { appended = true; assert.equal(html, 'stub-domains-list'); }; return function verify() { assert(appended); }; } function test_realms_domain_modal(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; channel.post = function (req) { posted = true; assert.equal(req.url, '/json/realm/domains'); success_callback = req.success; error_callback = req.error; }; add_realm_domain(); assert(posted); success_callback(); assert.equal(info.val(), 'translated: Added successfully!'); error_callback({}); assert.equal(info.val(), 'translated: Failed'); } function createSaveButtons(subsection) { const stub_save_button_header = $(`#org-${subsection}`); const save_button_controls = $('.save-button-controls'); const stub_save_button = $(`#org-submit-${subsection}`); const stub_discard_button = $(`#org-discard-${subsection}`); const stub_save_button_text = $('.icon-button-text'); stub_save_button_header.set_find_results( '.subsection-failed-status p', $('') ); 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( '.icon-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-${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: props, save_button: stub_save_button, discard_button: stub_discard_button, save_button_header: stub_save_button_header, save_button_controls: save_button_controls, save_button_text: stub_save_button_text, }; } function test_submit_settings_form(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_emoji_by_admins_only: true, realm_create_stream_by_admins_only: true, realm_waiting_period_threshold: 1, realm_default_language: '"es"', realm_default_twenty_four_hour_time: false, realm_invite_to_stream_policy: settings_config.invite_to_stream_policy_values.by_admins_only.code, realm_create_stream_policy: settings_config.create_stream_policy_values.by_members.code, }); global.patch_builtin('setTimeout', (func) => func()); const ev = { preventDefault: noop, stopPropagation: noop, }; let patched; let data; let success_callback; 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-${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_stream_policy_elem = $("#id_realm_create_stream_policy"); create_stream_policy_elem.val('2'); create_stream_policy_elem.attr("id", 'id_realm_create_stream_policy'); create_stream_policy_elem.data = () => "number"; const add_emoji_by_admins_only_elem = $("#id_realm_add_emoji_by_admins_only"); add_emoji_by_admins_only_elem.val("by_anyone"); add_emoji_by_admins_only_elem.attr("id", 'id_realm_add_emoji_by_admins_only'); 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"; let subsection_elem = $(`#org-${subsection}`); subsection_elem.closest = () => subsection_elem; subsection_elem.set_find_results('.prop-element', [ bot_creation_policy_elem, email_address_visibility_elem, add_emoji_by_admins_only_elem, create_stream_policy_elem, invite_to_stream_policy_elem, ]); patched = false; submit_form(ev); assert(patched); let expected_value = { bot_creation_policy: '1', invite_to_stream_policy: '1', email_address_visibility: '1', add_emoji_by_admins_only: false, create_stream_policy: '2', }; assert.deepEqual(data, expected_value); subsection = 'user-defaults'; ev.currentTarget = `#org-submit-${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"; const realm_default_twenty_four_hour_time_elem = $("#id_realm_default_twenty_four_hour_time"); realm_default_twenty_four_hour_time_elem.val('true'); realm_default_twenty_four_hour_time_elem.attr('id', 'id_realm_default_twenty_four_hour_time'); realm_default_twenty_four_hour_time_elem.data = () => "boolean"; subsection_elem = $(`#org-${subsection}`); subsection_elem.closest = () => subsection_elem; subsection_elem.set_find_results('.prop-element', [ realm_default_language_elem, realm_default_twenty_four_hour_time_elem, ]); submit_form(ev); assert(patched); expected_value = { default_language: '"en"', default_twenty_four_hour_time: 'true', }; 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(upload_realm_logo_or_icon) { form_data = { append: function (field, val) { form_data[field] = val; }, }; const file_input = [ {files: ['image1.png', 'image2.png']}, ]; let posted; channel.post = function (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(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 = function (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(''); 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: Update successful: Subdomains allowed for example.com'); error_callback({}); assert.equal(info.val(), 'translated: Failed'); allow = false; elem_obj.prop('checked', allow); change_allow_subdomains.call(elem_obj, ev); success_callback(); assert.equal(info.val(), 'translated: 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'); } { /* Test that when create stream policy is set to "full members" that the dropdown is set to the correct value. */ const property_elem = $('#id_realm_create_stream_policy'); property_elem.length = 1; property_elem.attr('id', 'id_realm_create_stream_policy'); page_params.realm_create_stream_policy = 3; settings_org.sync_realm_settings('create_stream_policy'); assert.equal($("#id_realm_create_stream_policy").val(), settings_config.create_stream_policy_values.by_full_members.code); } { /* Test that when create stream policy is set to "by members" that the dropdown is set to the correct value. */ const property_elem = $('#id_realm_create_stream_policy'); property_elem.length = 1; property_elem.attr('id', 'id_realm_create_stream_policy'); page_params.realm_create_stream_policy = 1; settings_org.sync_realm_settings('create_stream_policy'); assert.equal($("#id_realm_create_stream_policy").val(), settings_config.create_stream_policy_values.by_members.code); } { /* Test that when create stream policy is set to "by admins only" that the dropdown is set to the correct value. */ const property_elem = $('#id_realm_create_stream_policy'); property_elem.length = 1; property_elem.attr('id', 'id_realm_create_stream_policy'); page_params.realm_create_stream_policy = 2; settings_org.sync_realm_settings('create_stream_policy'); assert.equal($("#id_realm_create_stream_policy").val(), settings_config.create_stream_policy_values.by_admins_only.code); } { /* Test that when invite to stream policy is set to "full members" that the dropdown is set to the correct value. */ const property_elem = $('#id_realm_invite_to_stream_policy'); property_elem.length = 1; property_elem.attr('id', 'id_realm_invite_to_stream_policy'); page_params.realm_invite_to_stream_policy = 3; settings_org.sync_realm_settings('invite_to_stream_policy'); assert.equal($("#id_realm_invite_to_stream_policy").val(), settings_config.create_stream_policy_values.by_full_members.code); } { /* Test that when create stream policy is set to "by members" that the dropdown is set to the correct value. */ const property_elem = $('#id_realm_invite_to_stream_policy'); property_elem.length = 1; property_elem.attr('id', 'id_realm_invite_to_stream_policy'); page_params.realm_invite_to_stream_policy = 1; settings_org.sync_realm_settings('invite_to_stream_policy'); assert.equal($("#id_realm_invite_to_stream_policy").val(), settings_config.create_stream_policy_values.by_members.code); } { /* Test that when create stream policy is set to "by admins only" that the dropdown is set to the correct value. */ const property_elem = $('#id_realm_invite_to_stream_policy'); property_elem.length = 1; property_elem.attr('id', 'id_realm_invite_to_stream_policy'); page_params.realm_invite_to_stream_policy = 2; settings_org.sync_realm_settings('invite_to_stream_policy'); assert.equal($("#id_realm_invite_to_stream_policy").val(), settings_config.create_stream_policy_values.by_admins_only.code); } { /* 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_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_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); global.page_params.realm_message_content_edit_limit_seconds = settings_org.parse_time_limit(elem); assert.equal(expected_value, settings_org.get_realm_time_limits_in_minutes( 'realm_message_content_edit_limit_seconds')); }; 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_allow_community_topic_editing = true; page_params.realm_allow_message_editing = true; page_params.realm_message_content_edit_limit_seconds = 3600; page_params.realm_allow_message_deleting = true; page_params.realm_message_content_delete_limit_seconds = 120; const allow_edit_history = $('#id_realm_allow_edit_history').prop('checked', false); const allow_community_topic_editing = $('#id_realm_allow_community_topic_editing').prop('checked', true); 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'); allow_community_topic_editing.attr('id', 'id_realm_allow_community_topic_editing'); 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, allow_community_topic_editing, 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.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(allow_community_topic_editing.prop('checked'), true); 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.change_save_button_state = stubbed_function; } run_test('set_up', () => { const callbacks = {}; const set_callback = (name) => (f) => { callbacks[name] = f; }; 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: "Big Blue Button", }, }; $('#id_realm_video_chat_provider').change = set_callback('realm_video_chat_provider'); $("#id_realm_org_join_restrictions").change = set_callback('change_org_join_restrictions'); $('#submit-add-realm-domain').click = set_callback('add_realm_domain'); let submit_settings_form; let discard_changes; $('.organization').on = function (action, selector, f) { if (selector === '.subsection-header .subsection-changes-save .button') { assert.equal(action, 'click'); submit_settings_form = f; } else if (selector === '.subsection-header .subsection-changes-discard .button') { assert.equal(action, 'click'); discard_changes = f; } }; let change_allow_subdomains; $('#realm_domains_table').on = function (action, selector, f) { if (action === 'change') { assert.equal(selector, '.allow-subdomains'); change_allow_subdomains = f; } }; let upload_realm_logo_or_icon; realm_icon.build_realm_icon_widget = function (f) { upload_realm_logo_or_icon = f; }; const dropdown_list_widget_backup = dropdown_list_widget; window.dropdown_list_widget = () => ({ render: noop, update: noop, }); $("#id_realm_message_content_edit_limit_minutes").set_parent($.create('')); $("#id_realm_message_content_delete_limit_minutes").set_parent($.create('')); $("#id_realm_message_retention_days").set_parent($.create('')); $("#id_realm_message_retention_setting").change = noop; $("#message_content_in_email_notifications_label").set_parent($.create('')); $("#enable_digest_emails_label").set_parent($.create('')); $("#id_realm_digest_weekday").set_parent($.create('')); $("#id_realm_msg_edit_limit_setting").change = noop; $('#id_realm_msg_delete_limit_setting').change = noop; $("#allowed_domains_label").set_parent($.create('')); const waiting_period_parent_elem = $.create('waiting-period-parent-stub'); $('#id_realm_waiting_period_threshold').set_parent(waiting_period_parent_elem); $("#id_realm_waiting_period_setting").change = noop; const allow_topic_edit_label_parent = $.create('allow-topic-edit-label-parent'); $('#id_realm_allow_community_topic_editing_label').set_parent(allow_topic_edit_label_parent); channel.get = function (opts) { assert.equal(opts.url, '/json/export/realm'); }; // TEST set_up() here, but this mostly just allows us to // get access to the click handlers. settings_org.maybe_disable_widgets = noop; settings_org.set_up(); verify_realm_domains(); test_realms_domain_modal(callbacks.add_realm_domain); test_submit_settings_form(submit_settings_form); test_upload_realm_icon(upload_realm_logo_or_icon); test_change_allow_subdomains(change_allow_subdomains); test_extract_property_name(); test_change_save_button_state(); test_sync_realm_settings(); test_parse_time_limit(); test_discard_changes_button(discard_changes); window.dropdown_list_widget = dropdown_list_widget_backup; }); run_test('test get_organization_settings_options', () => { const sorted_option_values = settings_org.get_organization_settings_options(); const sorted_create_stream_policy_values = sorted_option_values.create_stream_policy_values; const expected_create_stream_policy_values = [ { key: 'by_admins_only', order: 1, code: 2, description: i18n.t("Admins"), }, { key: 'by_full_members', order: 2, code: 3, description: i18n.t("Admins and full members"), }, { key: 'by_members', order: 3, code: 1, description: i18n.t("Admins and members"), }, ]; assert.deepEqual(sorted_create_stream_policy_values, expected_create_stream_policy_values); }); run_test('test get_sorted_options_list', () => { const option_values_1 = { by_admins_only: { order: 3, code: 2, description: i18n.t("Admins"), }, by_members: { order: 2, code: 1, description: i18n.t("Admins and members"), }, by_full_members: { order: 1, code: 3, description: i18n.t("Admins and full members"), }, }; let expected_option_values = [ { key: 'by_full_members', order: 1, code: 3, description: i18n.t("Admins and full members"), }, { key: 'by_members', order: 2, code: 1, description: i18n.t("Admins and members"), }, { key: 'by_admins_only', order: 3, code: 2, description: i18n.t("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: i18n.t("Admins"), }, by_members: { code: 2, description: i18n.t("Admins and members"), }, by_full_members: { code: 3, description: i18n.t("Admins and full members"), }, }; expected_option_values = [ { key: 'by_admins_only', code: 1, description: i18n.t("Admins"), }, { key: 'by_full_members', code: 3, description: i18n.t("Admins and full members"), }, { key: 'by_members', code: 2, description: i18n.t("Admins and members"), }, ]; assert.deepEqual(settings_org.get_sorted_options_list(option_values_2), expected_option_values); }); run_test('misc', () => { page_params.is_admin = false; const stub_notification_disable_parent = $.create('')); page_params.realm_name_changes_disabled = false; page_params.server_name_changes_disabled = false; settings_account.update_name_change_display(); assert.equal($('#full_name').attr('disabled'), false); 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.equal($('#full_name').attr('disabled'), 'disabled'); assert($('.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.equal($('#full_name').attr('disabled'), 'disabled'); assert($('.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.equal($('#full_name').attr('disabled'), 'disabled'); assert($('.change_name_tooltip').is(':visible')); page_params.realm_email_changes_disabled = false; settings_account.update_email_change_display(); assert.equal($("#change_email .button").attr('disabled'), false); page_params.realm_email_changes_disabled = true; settings_account.update_email_change_display(); assert.equal($("#change_email .button").attr('disabled'), 'disabled'); page_params.realm_avatar_changes_disabled = false; page_params.server_avatar_changes_disabled = false; settings_account.update_avatar_change_display(); assert.equal($('#user-avatar-upload-widget .image_upload_button').attr('disabled'), false); assert.equal($("#user-avatar-upload-widget .settings-page-delete-button .button").attr('disabled'), false); page_params.realm_avatar_changes_disabled = true; page_params.server_avatar_changes_disabled = false; settings_account.update_avatar_change_display(); assert.equal($('#user-avatar-upload-widget .image_upload_button').attr('disabled'), 'disabled'); assert.equal($("#user-avatar-upload-widget .settings-page-delete-button .button").attr('disabled'), 'disabled'); page_params.realm_avatar_changes_disabled = false; page_params.server_avatar_changes_disabled = true; settings_account.update_avatar_change_display(); assert.equal($('#user-avatar-upload-widget .image_upload_button').attr('disabled'), 'disabled'); assert.equal($("#user-avatar-upload-widget .settings-page-delete-button .button").attr('disabled'), 'disabled'); page_params.realm_avatar_changes_disabled = true; page_params.server_avatar_changes_disabled = true; settings_account.update_avatar_change_display(); assert.equal($('#user-avatar-upload-widget .image_upload_button').attr('disabled'), 'disabled'); assert.equal($("#user-avatar-upload-widget .settings-page-delete-button .button").attr('disabled'), 'disabled'); // If organization admin, these UI elements are never disabled. page_params.is_admin = true; settings_account.update_name_change_display(); assert.equal($('#full_name').attr('disabled'), false); assert.equal($('.change_name_tooltip').is(':visible'), false); settings_account.update_email_change_display(); assert.equal($("#change_email .button").attr('disabled'), false); stream_data.get_streams_for_settings_page = () => { const arr = []; arr.push({name: "some_stream", stream_id: 75}); arr.push({name: "some_stream", stream_id: 42}); return arr; }; // 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(``); dropdown_list_parent.set_find_results('.dropdown_list_reset_button:not([disabled])', $.create('')); widget_settings.forEach((name) => { const elem = $.create(`#${name}_widget #${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 = $(`#${setting_name}_widget #${setting_name}_name`); elem.closest = function () { return stub_notification_disable_parent; }; stream_data.get_sub_by_id = function (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(!elem.hasClass('text-warning')); stream_data.get_sub_by_id = noop; settings_org.notifications_stream_widget.render(undefined); assert.equal(elem.text(), 'translated: Disabled'); assert(elem.hasClass('text-warning')); setting_name = 'realm_signup_notifications_stream_id'; elem = $(`#${setting_name}_widget #${setting_name}_name`); elem.closest = function () { return stub_notification_disable_parent; }; stream_data.get_sub_by_id = function (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(!elem.hasClass('text-warning')); stream_data.get_sub_by_id = noop; settings_org.signup_notifications_stream_widget.render(undefined); assert.equal(elem.text(), 'translated: Disabled'); assert(elem.hasClass('text-warning')); });