/** * @vitest-environment node */ import { describe, expect, it, vi } from 'vitest' vi.mock('@sim/emcn', () => ({ Duplicate: () => null, Tooltip: {}, })) vi.mock('@/app/(interfaces)/chat/components/message/components/file-download', () => ({ ChatFileDownload: () => null, ChatFileDownloadAll: () => null, })) vi.mock('@/app/(interfaces)/chat/components/message/components/markdown-renderer', () => ({ default: () => null, })) import { escapeHtml } from '@/app/(interfaces)/chat/components/message/message' describe('escapeHtml', () => { it('escapes all five HTML-significant characters', () => { expect(escapeHtml('&<>"\'')).toBe('&<>"'') }) it('neutralizes a markup-breakout filename payload', () => { const payload = '' const escaped = escapeHtml(payload) expect(escaped).not.toContain('') expect(escaped).toBe('</title><img src=x onerror=alert(document.origin)>') }) it('escapes ampersands first so entities are not double-broken', () => { expect(escapeHtml('a & b < c')).toBe('a & b < c') }) it('leaves safe strings untouched', () => { expect(escapeHtml('report-2026.pdf')).toBe('report-2026.pdf') expect(escapeHtml('')).toBe('') }) })