import { describe, expect, it } from 'vitest'; import type { PublicPage } from './api.types'; import { byPublication, isBlogPost } from './blog'; import { buildFeed } from './rss'; const post = (id: number, title: string, published_at: string, slug = 'blog') => ({ id, title, path: `/${title.toLowerCase().replace(/\s/g, '-')}`, excerpt: 'Resumen con & símbolos', published_at, category: { id: 9, slug, name: 'Blog' }, }) as unknown as PublicPage; describe('blog', () => { it("knows a post by its category, in the visitor's language", () => { expect(isBlogPost(post(1, 'Hola', '2026-01-01'), 'es')).toBe(true); expect(isBlogPost(post(2, 'Sobre', '2026-01-01', 'colectivo'), 'es')).toBe( false, ); }); it('orders posts newest first', () => { const ordered = byPublication([ post(1, 'Viejo', '2026-01-01'), post(2, 'Nuevo', '2026-09-01'), ]); expect(ordered.map((p) => p.title)).toEqual(['Nuevo', 'Viejo']); }); }); describe('buildFeed', () => { const xml = buildFeed( 'https://pireon.dev', 'es', { title: 'Pireon — Blog', description: 'Novedades', link: '/blog' }, [post(1, 'Primer post', '2026-09-01T10:00:00Z')], ); it('links every item absolutely, with its date', () => { expect(xml).toContain('https://pireon.dev/primer-post'); expect(xml).toContain('Tue, 01 Sep 2026 10:00:00 GMT'); }); it('escapes what it carries and parses as XML', () => { expect(xml).toContain('<etiquetas> & símbolos'); expect( new DOMParser() .parseFromString(xml, 'application/xml') .getElementsByTagName('parsererror'), ).toHaveLength(0); }); });