Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
148 lines
5.4 KiB
JavaScript
148 lines
5.4 KiB
JavaScript
"use strict";
|
|
|
|
const assert = require("node:assert/strict");
|
|
|
|
const _ = require("lodash");
|
|
|
|
const {zrequire, set_global, mock_esm} = require("./lib/namespace.cjs");
|
|
const {run_test} = require("./lib/test.cjs");
|
|
|
|
const emoji = zrequire("emoji");
|
|
const emoji_frequency = zrequire("emoji_frequency");
|
|
|
|
const map = new Map();
|
|
const emoji_frequency_data = mock_esm("../src/emoji_frequency_data", {
|
|
reaction_data: {
|
|
set: (emoji, emoji_usage) => map.set(emoji, emoji_usage),
|
|
},
|
|
preferred_emoji_list() {
|
|
const emojis = map
|
|
.values()
|
|
.toArray()
|
|
.toSorted((a, b) => b.score - a.score);
|
|
const count = emojis.length;
|
|
const emojis_per_row = 6;
|
|
return emojis.slice(0, count - (count % emojis_per_row));
|
|
},
|
|
});
|
|
|
|
const emoji_picker = zrequire("emoji_picker");
|
|
const typeahead = zrequire("typeahead");
|
|
|
|
const emoji_codes = zrequire("../../static/generated/emoji/emoji_codes.json");
|
|
|
|
set_global("document", "document-stub");
|
|
|
|
run_test("initialize", () => {
|
|
emoji.initialize({
|
|
realm_emoji: {},
|
|
emoji_codes,
|
|
});
|
|
typeahead.set_frequently_used_emojis(typeahead.get_popular_emojis());
|
|
emoji_picker.initialize();
|
|
|
|
const complete_emoji_catalog = _.sortBy(emoji_picker.complete_emoji_catalog, "name");
|
|
assert.equal(complete_emoji_catalog.length, 11);
|
|
assert.equal(emoji.emojis_by_name.size, 1884);
|
|
|
|
let total_emoji_in_categories = 0;
|
|
|
|
function assert_emoji_category(ele, icon, num) {
|
|
assert.equal(ele.icon, icon);
|
|
assert.equal(ele.emojis.length, num);
|
|
function check_emojis(val) {
|
|
for (const this_emoji of ele.emojis) {
|
|
assert.equal(this_emoji.is_realm_emoji, val);
|
|
}
|
|
}
|
|
if (ele.name === "Custom") {
|
|
check_emojis(true);
|
|
} else {
|
|
check_emojis(false);
|
|
total_emoji_in_categories += ele.emojis.length;
|
|
}
|
|
}
|
|
const popular_emoji_count = 6;
|
|
const zulip_emoji_count = 1;
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-car", 195);
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-hashtag", 224);
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-smile-o", 169);
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-thumbs-o-up", 386);
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-lightbulb-o", 264);
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-star-o", popular_emoji_count);
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-cutlery", 131);
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-flag", 270);
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-cog", 1);
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-leaf", 159);
|
|
assert_emoji_category(complete_emoji_catalog.pop(), "fa-soccer-ball-o", 85);
|
|
|
|
// The popular emoji appear twice in the picker, and the zulip emoji is special
|
|
assert.equal(
|
|
emoji.emojis_by_name.size,
|
|
total_emoji_in_categories - popular_emoji_count + zulip_emoji_count,
|
|
);
|
|
|
|
const make_emoji = (emoji_code, score) => ({
|
|
emoji_code,
|
|
emoji_type: "unicode_emoji",
|
|
score,
|
|
});
|
|
|
|
// Note: The 18 here no longer matches POPULAR_EMOJIS_BONUS_WEIGHT
|
|
const popular_emojis = typeahead.popular_emojis.map((emoji_code) => make_emoji(emoji_code, 18));
|
|
const non_popular_emoji_codes = [
|
|
"1f3df", // stadium
|
|
"1f4b0", // money bag
|
|
"1f3e3", // japanese post office
|
|
"1f43c", // panda face
|
|
"1f648", // see no evil
|
|
"1f600", // grinning face
|
|
"1f680", // rocket
|
|
];
|
|
const non_popular_emojis_usage = Array.from(
|
|
non_popular_emoji_codes,
|
|
(non_popular_emoji_code, i) => make_emoji(non_popular_emoji_code, i + 10),
|
|
);
|
|
for (const emoji of [...popular_emojis, ...non_popular_emojis_usage]) {
|
|
emoji_frequency_data.reaction_data.set(emoji.emoji_code, emoji);
|
|
}
|
|
emoji_frequency.update_frequently_used_emojis_list();
|
|
non_popular_emoji_codes.reverse();
|
|
|
|
assert.equal(typeahead.frequently_used_emojis.length, 12);
|
|
assert.deepEqual(
|
|
typeahead.frequently_used_emojis.map((emoji) => emoji.emoji_code),
|
|
[...typeahead.popular_emojis, ...non_popular_emoji_codes.slice(0, 6)],
|
|
);
|
|
});
|
|
|
|
run_test("is_emoji_present_in_text", () => {
|
|
const thermometer_emoji = {
|
|
name: "thermometer",
|
|
emoji_code: "1f321",
|
|
reaction_type: "unicode_emoji",
|
|
};
|
|
const headphones_emoji = {
|
|
name: "headphones",
|
|
emoji_code: "1f3a7",
|
|
reaction_type: "unicode_emoji",
|
|
};
|
|
assert.equal(emoji_picker.is_emoji_present_in_text("🌡", thermometer_emoji), true);
|
|
assert.equal(
|
|
emoji_picker.is_emoji_present_in_text("no emojis at all", thermometer_emoji),
|
|
false,
|
|
);
|
|
assert.equal(emoji_picker.is_emoji_present_in_text("😎", thermometer_emoji), false);
|
|
assert.equal(emoji_picker.is_emoji_present_in_text("😎🌡🎧", thermometer_emoji), true);
|
|
assert.equal(emoji_picker.is_emoji_present_in_text("😎🎧", thermometer_emoji), false);
|
|
assert.equal(emoji_picker.is_emoji_present_in_text("😎🌡🎧", headphones_emoji), true);
|
|
assert.equal(
|
|
emoji_picker.is_emoji_present_in_text("emojis with text 😎🌡🎧", thermometer_emoji),
|
|
true,
|
|
);
|
|
assert.equal(
|
|
emoji_picker.is_emoji_present_in_text("emojis with text no space😎🌡🎧", headphones_emoji),
|
|
true,
|
|
);
|
|
});
|