Files
heygo/tests/markdown.test.ts
2026-06-20 21:40:24 +10:00

64 lines
2.4 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { parseMarkdown } from '../src/lib/markdown';
import { isTemplatedUrl, parseTemplateParameters, resolveTemplateUrl } from '../src/lib/templates';
describe('parseMarkdown', () => {
it('renders headings, paragraphs, and links', () => {
const html = parseMarkdown('# Title\n\nA paragraph with [a link](https://example.com).');
expect(html).toContain('<h1>Title</h1>');
expect(html).toContain('<a href="https://example.com"');
expect(html).toContain('a link</a>');
});
it('renders fenced code blocks and inline code', () => {
const html = parseMarkdown('Use `x` to do things.\n\n```js\nvar x = 1\n```');
expect(html).toContain('<code>x</code>');
expect(html).toContain('<pre>');
expect(html).toContain('var x = 1');
});
it('renders lists, bold, and italics', () => {
const html = parseMarkdown('- **bold** and *italic*\n- two');
expect(html).toContain('<ul>');
expect(html).toContain('<strong>bold</strong>');
expect(html).toContain('<em>italic</em>');
expect(html).toContain('<li>two</li>');
});
it('renders tables', () => {
const html = parseMarkdown('| a | b |\n|---|---|\n| 1 | 2 |');
expect(html).toContain('<table>');
expect(html).toContain('<th>a</th>');
expect(html).toContain('<td>1</td>');
});
});
describe('client template helpers', () => {
it('detects templated urls', () => {
expect(isTemplatedUrl('https://example.com/?q={query}')).toBe(true);
expect(isTemplatedUrl('https://example.com/static')).toBe(false);
expect(isTemplatedUrl(null)).toBe(false);
});
it('parses parameter names and defaults', () => {
const params = parseTemplateParameters('https://example.com/{region}/?q={query,default="go"}');
expect(params).toHaveLength(2);
expect(params[0].name).toBe('region');
expect(params[0].defaultValue).toBeUndefined();
expect(params[1].name).toBe('query');
expect(params[1].defaultValue).toBe('go');
});
it('resolves placeholders with provided values, falling back to defaults', () => {
const url = resolveTemplateUrl('https://example.com/{region}/?q={query,default="go"}', {
region: 'au',
});
expect(url).toBe('https://example.com/au/?q=go');
});
it('encodes parameter values', () => {
const url = resolveTemplateUrl('https://example.com/?q={query}', { query: 'go links & more' });
expect(url).toBe('https://example.com/?q=go%20links%20%26%20more');
});
});