67 lines
2.3 KiB
TypeScript
67 lines
2.3 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|||
|
|
import { renderMarkdown, summarise, toMediaImage } from '../../frontend/server/utils/pocketbase'
|
||
|
|
|
||
|
|
describe('renderMarkdown', () => {
|
||
|
|
it('returns an empty string for null/undefined/empty input', () => {
|
||
|
|
expect(renderMarkdown(null)).toBe('')
|
||
|
|
expect(renderMarkdown(undefined)).toBe('')
|
||
|
|
expect(renderMarkdown('')).toBe('')
|
||
|
|
})
|
||
|
|
|
||
|
|
it('converts Markdown to HTML', () => {
|
||
|
|
const html = renderMarkdown('# Titolo\n\nCorpo **grassetto**.')
|
||
|
|
expect(html).toContain('<h1>Titolo</h1>')
|
||
|
|
expect(html).toContain('<strong>grassetto</strong>')
|
||
|
|
})
|
||
|
|
})
|
||
|
|
|
||
|
|
describe('summarise', () => {
|
||
|
|
it('returns short text unchanged, stripped of Markdown syntax', () => {
|
||
|
|
expect(summarise('# Titolo\n\nTesto breve.')).toBe('Titolo Testo breve.')
|
||
|
|
})
|
||
|
|
|
||
|
|
it('strips code fences, images and unwraps links', () => {
|
||
|
|
const source = '```js\nconst x = 1\n```\n [testo](https://example.com) fine.'
|
||
|
|
expect(summarise(source)).toBe('testo fine.')
|
||
|
|
})
|
||
|
|
|
||
|
|
it('clips long text on a word boundary with an ellipsis', () => {
|
||
|
|
const source = 'parola '.repeat(40).trim()
|
||
|
|
const result = summarise(source, 20)
|
||
|
|
expect(result.length).toBeLessThanOrEqual(21)
|
||
|
|
expect(result.endsWith('…')).toBe(true)
|
||
|
|
expect(result).not.toContain(' …')
|
||
|
|
})
|
||
|
|
|
||
|
|
it('returns an empty string for null/undefined input', () => {
|
||
|
|
expect(summarise(null)).toBe('')
|
||
|
|
expect(summarise(undefined)).toBe('')
|
||
|
|
})
|
||
|
|
})
|
||
|
|
|
||
|
|
describe('toMediaImage', () => {
|
||
|
|
it('returns null when there is no filename', () => {
|
||
|
|
expect(toMediaImage('articles', 'abc123', '', 'alt')).toBeNull()
|
||
|
|
expect(toMediaImage('articles', 'abc123', null, 'alt')).toBeNull()
|
||
|
|
expect(toMediaImage('articles', 'abc123', undefined, 'alt')).toBeNull()
|
||
|
|
})
|
||
|
|
|
||
|
|
it('builds the PocketBase file URL from collection, id and filename', () => {
|
||
|
|
expect(toMediaImage('articles', 'abc123', 'cover.jpg', 'Testo alternativo')).toEqual({
|
||
|
|
url: '/api/files/articles/abc123/cover.jpg',
|
||
|
|
alt: 'Testo alternativo',
|
||
|
|
})
|
||
|
|
})
|
||
|
|
|
||
|
|
it('normalises a missing/empty alt to null', () => {
|
||
|
|
expect(toMediaImage('articles', 'abc123', 'cover.jpg', null)).toEqual({
|
||
|
|
url: '/api/files/articles/abc123/cover.jpg',
|
||
|
|
alt: null,
|
||
|
|
})
|
||
|
|
expect(toMediaImage('articles', 'abc123', 'cover.jpg', '')).toEqual({
|
||
|
|
url: '/api/files/articles/abc123/cover.jpg',
|
||
|
|
alt: null,
|
||
|
|
})
|
||
|
|
})
|
||
|
|
})
|