Files
zulip/web/tests/topic_link_util.test.cjs
Kislay Verma 1ece5ad15e topic_link_util: Add support for empty topics in the frontend.
Though the frontend module generated correct urls for
empty topics, it would sometime generate incorrect
link text in the fallback md link syntax. (eg, if
empty string was provided as the topic name).

This commit fixes that.
2025-06-18 13:03:56 -07:00

160 lines
5.5 KiB
JavaScript

"use strict";
const assert = require("node:assert/strict");
const {zrequire, mock_esm} = require("./lib/namespace.cjs");
const {run_test} = require("./lib/test.cjs");
const topic_link_util = zrequire("topic_link_util");
const stream_data = zrequire("stream_data");
const settings_config = zrequire("settings_config");
mock_esm("../src/user_settings", {
user_settings: {
web_channel_default_view: settings_config.web_channel_default_view_values.channel_feed.code,
},
});
mock_esm("../src/state_data", {
realm: {realm_empty_topic_display_name: "general chat"},
});
const sweden_stream = {
name: "Sweden",
description: "Cold, mountains and home decor.",
stream_id: 1,
subscribed: true,
type: "stream",
};
const denmark_stream = {
name: "Denmark",
description: "Vikings and boats, in a serene and cold weather.",
stream_id: 2,
subscribed: true,
type: "stream",
};
const dollar_stream = {
name: "$$MONEY$$",
description: "Money money money",
stream_id: 6,
subscribed: true,
type: "stream",
};
const markdown_stream = {
name: "Markdown [md]",
description: "markdown",
stream_id: 7,
subscribed: true,
type: "stream",
};
stream_data.add_sub(sweden_stream);
stream_data.add_sub(denmark_stream);
stream_data.add_sub(dollar_stream);
stream_data.add_sub(markdown_stream);
run_test("stream_link_syntax_test", () => {
assert.equal(topic_link_util.get_stream_link_syntax("Sweden"), "#**Sweden**");
assert.equal(topic_link_util.get_stream_link_syntax("Denmark"), "#**Denmark**");
assert.equal(
topic_link_util.get_stream_link_syntax("$$MONEY$$"),
"[#$$MONEY$$](#narrow/channel/6-.24.24MONEY.24.24)",
);
assert.equal(
topic_link_util.get_stream_link_syntax("Markdown [md]"),
"[#Markdown [md]](#narrow/channel/7-Markdown-.5Bmd.5D)",
);
});
run_test("stream_topic_link_syntax_test", () => {
assert.equal(
topic_link_util.get_stream_topic_link_syntax("Sweden", "topic"),
"#**Sweden>topic**",
);
assert.equal(
topic_link_util.get_stream_topic_link_syntax("Sweden", "test `test` test"),
"[#Sweden > test `test` test](#narrow/channel/1-Sweden/topic/test.20.60test.60.20test)",
);
assert.equal(
topic_link_util.get_stream_topic_link_syntax("Denmark", "test `test` test`s"),
"[#Denmark > test `test` test`s](#narrow/channel/2-Denmark/topic/test.20.60test.60.20test.60s)",
);
assert.equal(
topic_link_util.get_stream_topic_link_syntax("Sweden", "error due to *"),
"[#Sweden > error due to *](#narrow/channel/1-Sweden/topic/error.20due.20to.20*)",
);
assert.equal(
topic_link_util.get_stream_topic_link_syntax("Sweden", "*asterisk"),
"[#Sweden > *asterisk](#narrow/channel/1-Sweden/topic/*asterisk)",
);
assert.equal(
topic_link_util.get_stream_topic_link_syntax("Sweden", "greaterthan>"),
"[#Sweden > greaterthan>](#narrow/channel/1-Sweden/topic/greaterthan.3E)",
);
assert.equal(
topic_link_util.get_stream_topic_link_syntax("$$MONEY$$", "dollar"),
"[#$$MONEY$$ > dollar](#narrow/channel/6-.24.24MONEY.24.24/topic/dollar)",
);
assert.equal(
topic_link_util.get_stream_topic_link_syntax("Sweden", "swe$$dish"),
"[#Sweden > swe$$dish](#narrow/channel/1-Sweden/topic/swe.24.24dish)",
);
assert.equal(
topic_link_util.get_fallback_markdown_link("Sweden"),
"[#Sweden](#narrow/channel/1-Sweden)",
);
assert.equal(
topic_link_util.get_fallback_markdown_link("$$MONEY$$"),
"[#$$MONEY$$](#narrow/channel/6-.24.24MONEY.24.24)",
);
assert.equal(
topic_link_util.get_fallback_markdown_link("Markdown [md]"),
"[#Markdown [md]](#narrow/channel/7-Markdown-.5Bmd.5D)",
);
assert.equal(
topic_link_util.get_stream_topic_link_syntax("Sweden", "&ab"),
"[#Sweden > &ab](#narrow/channel/1-Sweden/topic/.26ab)",
);
assert.equal(
topic_link_util.get_stream_topic_link_syntax("Sweden", "&ab]"),
"[#Sweden > &ab]](#narrow/channel/1-Sweden/topic/.26ab.5D)",
);
assert.equal(
topic_link_util.get_stream_topic_link_syntax("Sweden", "&a[b"),
"[#Sweden > &a[b](#narrow/channel/1-Sweden/topic/.26a.5Bb)",
);
assert.equal(topic_link_util.get_stream_topic_link_syntax("Sweden", ""), "#**Sweden>**");
assert.equal(
topic_link_util.get_stream_topic_link_syntax("$$MONEY$$", ""),
"[#$$MONEY$$ > translated: general chat](#narrow/channel/6-.24.24MONEY.24.24/topic/)",
);
assert.equal(
topic_link_util.get_fallback_markdown_link("Sweden", "abc", 123),
"[#Sweden > abc @ 💬](#narrow/channel/1-Sweden/topic/abc/near/123)",
);
assert.equal(
topic_link_util.get_fallback_markdown_link("Sweden", "", 123),
"[#Sweden > translated: general chat @ 💬](#narrow/channel/1-Sweden/topic//near/123)",
);
// Only for full coverage of the module.
assert.equal(topic_link_util.escape_invalid_stream_topic_characters("Sweden"), "Sweden");
assert.equal(
topic_link_util.as_html_link_syntax_unsafe("test", "example.com"),
'<a href="example.com">test</a>',
);
assert.equal(
topic_link_util.html_unescape_invalid_stream_topic_characters("&#36;&#36;MONEY&#36;&#36;"),
"$$MONEY$$",
);
});