zulip/frontend_tests/node_tests/compose_pm_pill.js

197 lines
5.6 KiB
JavaScript

"use strict";
const {strict: assert} = require("assert");
const {mock_cjs, mock_esm, zrequire} = require("../zjsunit/namespace");
const {run_test} = require("../zjsunit/test");
const $ = require("../zjsunit/zjquery");
mock_cjs("jquery", $);
const compose_actions = mock_esm("../../static/js/compose_actions");
const people = zrequire("people");
const compose_pm_pill = zrequire("compose_pm_pill");
const input_pill = zrequire("input_pill");
let pills = {
pill: {},
};
run_test("pills", (override) => {
override(compose_actions, "update_placeholder_text", () => {});
const othello = {
user_id: 1,
email: "othello@example.com",
full_name: "Othello",
};
const iago = {
email: "iago@zulip.com",
user_id: 2,
full_name: "Iago",
};
const hamlet = {
email: "hamlet@example.com",
user_id: 3,
full_name: "Hamlet",
};
people.get_realm_users = () => [iago, othello, hamlet];
const recipient_stub = $("#private_message_recipient");
const pill_container_stub = "pill-container";
recipient_stub.set_parent(pill_container_stub);
let create_item_handler;
const all_pills = new Map();
pills.appendValidatedData = (item) => {
const id = item.user_id;
assert(!all_pills.has(id));
all_pills.set(id, item);
};
pills.items = () => Array.from(all_pills.values());
let text_cleared;
pills.clear_text = () => {
text_cleared = true;
};
let pills_cleared;
pills.clear = () => {
pills_cleared = true;
pills = {
pill: {},
};
all_pills.clear();
};
let appendValue_called;
pills.appendValue = function (value) {
appendValue_called = true;
assert.equal(value, "othello@example.com");
this.appendValidatedData(othello);
};
let get_by_email_called = false;
people.get_by_email = (user_email) => {
get_by_email_called = true;
if (user_email === iago.email) {
return iago;
}
if (user_email === othello.email) {
return othello;
}
throw new Error(`Unknown user email ${user_email}`);
};
let get_by_user_id_called = false;
people.get_by_user_id = (id) => {
get_by_user_id_called = true;
if (id === othello.user_id) {
return othello;
}
if (id === hamlet.user_id) {
return hamlet;
}
throw new Error(`Unknown user ID ${id}`);
};
function test_create_item(handler) {
(function test_rejection_path() {
const item = handler(othello.email, pills.items());
assert(get_by_email_called);
assert.equal(item, undefined);
})();
(function test_success_path() {
get_by_email_called = false;
const res = handler(iago.email, pills.items());
assert(get_by_email_called);
assert.equal(typeof res, "object");
assert.equal(res.user_id, iago.user_id);
assert.equal(res.display_value, iago.full_name);
})();
}
function input_pill_stub(opts) {
assert.equal(opts.container, pill_container_stub);
create_item_handler = opts.create_item_from_text;
assert(create_item_handler);
return pills;
}
input_pill.__Rewire__("create", input_pill_stub);
// We stub the return value of input_pill.create(), manually add widget functions to it.
pills.onPillCreate = (callback) => {
// Exercise our callback for line coverage. It is
// just compose_actions.update_placeholder_text(),
// which we override.
callback();
};
pills.onPillRemove = (callback) => {
callback();
};
compose_pm_pill.initialize();
assert(compose_pm_pill.widget);
compose_pm_pill.set_from_typeahead(othello);
compose_pm_pill.set_from_typeahead(hamlet);
const user_ids = compose_pm_pill.get_user_ids();
assert.deepEqual(user_ids, [othello.user_id, hamlet.user_id]);
const user_ids_string = compose_pm_pill.get_user_ids_string();
assert.equal(user_ids_string, "1,3");
const emails = compose_pm_pill.get_emails();
assert.equal(emails, "othello@example.com,hamlet@example.com");
const persons = [othello, iago, hamlet];
const items = compose_pm_pill.filter_taken_users(persons);
assert.deepEqual(items, [{email: "iago@zulip.com", user_id: 2, full_name: "Iago"}]);
test_create_item(create_item_handler);
compose_pm_pill.set_from_emails("othello@example.com");
assert(compose_pm_pill.widget);
assert(get_by_user_id_called);
assert(pills_cleared);
assert(appendValue_called);
assert(text_cleared);
});
run_test("has_unconverted_data", () => {
compose_pm_pill.__Rewire__("widget", {
is_pending: () => true,
});
// If the pill itself has pending data, we have unconverted
// data.
assert.equal(compose_pm_pill.has_unconverted_data(), true);
compose_pm_pill.__Rewire__("widget", {
is_pending: () => false,
items: () => [{user_id: 99}],
});
// Our pill is complete and all items contain user_id, so
// we do NOT have unconverted data.
assert.equal(compose_pm_pill.has_unconverted_data(), false);
compose_pm_pill.__Rewire__("widget", {
is_pending: () => false,
items: () => [{user_id: 99}, {email: "random@mit.edu"}],
});
// One of our items only knows email (as in a bridge-with-zephyr
// scenario where we might not have registered the user yet), so
// we have some unconverted data.
assert.equal(compose_pm_pill.has_unconverted_data(), true);
});