"use strict"; const {strict: assert} = require("assert"); const {mock_esm, zrequire} = require("../zjsunit/namespace"); const {run_test} = require("../zjsunit/test"); const $ = require("../zjsunit/zjquery"); const {page_params} = require("../zjsunit/zpage_params"); const loading = mock_esm("../../static/js/loading"); const SHORT_TEXT_ID = 1; const SELECT_ID = 3; const EXTERNAL_ACCOUNT_ID = 7; const SHORT_TEXT_NAME = "Short text"; const SELECT_NAME = "Select"; const EXTERNAL_ACCOUNT_NAME = "External account"; const custom_profile_field_types = { SHORT_TEXT: { id: SHORT_TEXT_ID, name: SHORT_TEXT_NAME, }, SELECT: { id: SELECT_ID, name: SELECT_NAME, }, EXTERNAL_ACCOUNT: { id: EXTERNAL_ACCOUNT_ID, name: EXTERNAL_ACCOUNT_NAME, }, }; page_params.custom_profile_field_types = custom_profile_field_types; mock_esm("sortablejs", {Sortable: {create: () => {}}}); const settings_profile_fields = zrequire("settings_profile_fields"); function test_populate(opts, template_data) { const fields_data = opts.fields_data; page_params.is_admin = opts.is_admin; const $table = $("#admin_profile_fields_table"); const $rows = $.create("rows"); const $form = $.create("forms"); $table.set_find_results("tr.profile-field-row", $rows); $table.set_find_results("tr.profile-field-form", $form); $table[0] = "stub"; $rows.remove = () => {}; $form.remove = () => {}; let num_appends = 0; $table.append = () => { num_appends += 1; }; loading.destroy_indicator = () => {}; settings_profile_fields.do_populate_profile_fields(fields_data); assert.deepEqual(template_data, opts.expected_template_data); assert.equal(num_appends, fields_data.length); } run_test("populate_profile_fields", ({mock_template}) => { page_params.custom_profile_fields = {}; page_params.realm_default_external_accounts = JSON.stringify({}); const template_data = []; mock_template("settings/admin_profile_field_list.hbs", false, (data) => { template_data.push(data); return "whatever"; }); const fields_data = [ { type: SHORT_TEXT_ID, id: 10, name: "favorite color", hint: "blue?", field_data: "", }, { type: SELECT_ID, id: 30, name: "meal", hint: "lunch", field_data: JSON.stringify([ { text: "lunch", order: 0, }, { text: "dinner", order: 1, }, ]), }, { type: EXTERNAL_ACCOUNT_ID, id: 20, name: "github profile", hint: "username only", field_data: JSON.stringify({ subtype: "github", }), }, { type: EXTERNAL_ACCOUNT_ID, id: 21, name: "zulip profile", hint: "username only", field_data: JSON.stringify({ subtype: "custom", url_pattern: "https://chat.zulip.com/%(username)s", }), }, ]; const expected_template_data = [ { profile_field: { id: 10, name: "favorite color", hint: "blue?", type: SHORT_TEXT_NAME, choices: [], is_select_field: false, is_external_account_field: false, }, can_modify: true, realm_default_external_accounts: page_params.realm_default_external_accounts, }, { profile_field: { id: 30, name: "meal", hint: "lunch", type: SELECT_NAME, choices: [ {order: 0, value: "0", text: "lunch"}, {order: 1, value: "1", text: "dinner"}, ], is_select_field: true, is_external_account_field: false, }, can_modify: true, realm_default_external_accounts: page_params.realm_default_external_accounts, }, { profile_field: { id: 20, name: "github profile", hint: "username only", type: EXTERNAL_ACCOUNT_NAME, choices: [], is_select_field: false, is_external_account_field: true, }, can_modify: true, realm_default_external_accounts: page_params.realm_default_external_accounts, }, { profile_field: { id: 21, name: "zulip profile", hint: "username only", type: EXTERNAL_ACCOUNT_NAME, choices: [], is_select_field: false, is_external_account_field: true, }, can_modify: true, realm_default_external_accounts: page_params.realm_default_external_accounts, }, ]; test_populate( { fields_data, expected_template_data, is_admin: true, }, template_data, ); });