docfast/src/__tests__/html.test.ts
Hoid 7808d85dde
All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 13m46s
fix: add .js extension to html test import (TypeScript moduleResolution)
2026-03-01 11:05:08 +01:00

49 lines
1.4 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { escapeHtml } from '../utils/html.js';
describe('escapeHtml', () => {
it('escapes ampersands', () => {
expect(escapeHtml('foo & bar')).toBe('foo & bar');
});
it('escapes less-than', () => {
expect(escapeHtml('a < b')).toBe('a &lt; b');
});
it('escapes greater-than', () => {
expect(escapeHtml('a > b')).toBe('a &gt; b');
});
it('escapes double quotes', () => {
expect(escapeHtml('say "hello"')).toBe('say &quot;hello&quot;');
});
it('escapes single quotes', () => {
expect(escapeHtml("it's")).toBe('it&#39;s');
});
it('returns empty string unchanged', () => {
expect(escapeHtml('')).toBe('');
});
it('passes through strings with no special chars', () => {
expect(escapeHtml('hello world 123')).toBe('hello world 123');
});
it('escapes multiple special chars combined', () => {
expect(escapeHtml('<div class="x">&</div>')).toBe('&lt;div class=&quot;x&quot;&gt;&amp;&lt;/div&gt;');
});
it('escapes XSS payload', () => {
expect(escapeHtml('<script>alert("xss")</script>')).toBe('&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;');
});
it('double-escapes existing entities', () => {
expect(escapeHtml('&amp;')).toBe('&amp;amp;');
expect(escapeHtml('&lt;')).toBe('&amp;lt;');
});
it('escapes single quotes in attributes', () => {
expect(escapeHtml("data-x='val'")).toBe('data-x=&#39;val&#39;');
});
});