diff --git a/packages/ui/src/components/chat/message/parts/UserTextPart.test.ts b/packages/ui/src/components/chat/message/parts/UserTextPart.test.ts new file mode 100644 index 00000000..04f72729 --- /dev/null +++ b/packages/ui/src/components/chat/message/parts/UserTextPart.test.ts @@ -0,0 +1,52 @@ +import { describe, expect, test } from 'bun:test'; + +import { prepareUserMarkdownContent } from './userTextPartContent'; + +describe('prepareUserMarkdownContent', () => { + test('keeps fenced code < and -> unescaped for the markdown renderer', () => { + const content = prepareUserMarkdownContent({ + textContent: '```rust\nlet values: Vec = vec![];\nlet next = old -> new;\n```', + skillNames: new Set(), + }); + + expect(content).toContain('Vec'); + expect(content).toContain('old -> new'); + expect(content).not.toContain('<'); + expect(content).not.toContain('->'); + }); + + test('escapes raw HTML outside fences so tags display as text', () => { + const content = prepareUserMarkdownContent({ + textContent: 'Use bold and ', + skillNames: new Set(), + }); + + expect(content).toContain('<b>bold</b>'); + expect(content).toContain('<script>alert("x")</script>'); + expect(content).not.toContain('bold'); + expect(content).not.toContain('