import { test } from 'node:test'; import assert from 'node:assert/strict'; import { buildTopicContent } from './topicMarkdown'; test('a URL with underscores is sent verbatim (#262)', () => { const t = 'Rules: https://wiki.lotusguild.org/en/server_rules_and_faq'; assert.deepEqual(buildTopicContent(t), { topic: t }); }); test('a markdown link keeps its underscored URL in both fields (#262)', () => { const c = buildTopicContent('[Our wiki](https://wiki.example.org/my_cool_page)'); assert.ok('formatted_body' in c); assert.match(c.formatted_body, /href="https:\/\/wiki\.example\.org\/my_cool_page"/); assert.equal(c.topic, 'Our wiki (https://wiki.example.org/my_cool_page)'); }); test('room aliases and user IDs with underscores are untouched (#262)', () => { for (const t of [ 'Join #my_room_name:matrix.org', 'Ask @some_user_x:matrix.org', 'see snake_case_word', ]) { assert.deepEqual(buildTopicContent(t), { topic: t }); } }); test('emphasis still works at word boundaries', () => { const c = buildTopicContent('this is _really_ *great* and **bold**'); assert.ok('formatted_body' in c); assert.match(c.formatted_body, /really<\/i>/); assert.match(c.formatted_body, /great<\/i>/); assert.match(c.formatted_body, /bold<\/strong>/); assert.equal(c.topic, 'this is really great and bold'); }); test('emphasis around an alias keeps the alias intact', () => { const c = buildTopicContent('**Join #my_room:matrix.org**'); assert.ok('formatted_body' in c); assert.match(c.formatted_body, /Join #my_room:matrix\.org<\/strong>/); assert.equal(c.topic, 'Join #my_room:matrix.org'); }); test('inline code keeps its underscores and no backslashes appear', () => { const c = buildTopicContent('run `a_b_c` now'); assert.ok('formatted_body' in c); assert.match(c.formatted_body, /a_b_c<\/code>/); assert.equal(c.topic, 'run a_b_c now'); }); test('a double quote in a link target cannot break out of the attribute (#262)', () => { const c = buildTopicContent('[x](https://a" onclick="alert(1))'); assert.ok('formatted_body' in c); assert.doesNotMatch(c.formatted_body, /" onclick="/); }); test('HTML in the topic is escaped, and the plain topic shows it as typed', () => { const c = buildTopicContent('**hi & bye**'); assert.ok('formatted_body' in c); assert.match(c.formatted_body, /<b>hi<\/b> & bye/); assert.equal(c.topic, 'hi & bye'); }); test('line breaks become
and survive in the plain topic', () => { const c = buildTopicContent('**Rules**\nBe nice'); assert.ok('formatted_body' in c); assert.equal(c.formatted_body, 'Rules
Be nice'); assert.equal(c.topic, 'Rules\nBe nice'); }); test('plain text with no markdown is sent as typed', () => { assert.deepEqual(buildTopicContent("It's & games"), { topic: "It's & games" }); });