import { describe, it, expect, beforeEach } from 'vitest'; import type Database from 'better-sqlite3'; import { createDb } from '../src/lib/db'; import { createPost, updatePost, deletePost, getPostById, getPublishedBySlug, listPublished, listAllPosts, listRecent, listArchiveMonths, type PostInput, } from '../src/lib/posts'; let db: Database.Database; beforeEach(() => { db = createDb(':memory:'); }); const base: PostInput = { title: 'Titolo', slug: 'titolo', category: 'Contenuti educativi', excerpt: 'estratto', body_html: '
corpo
', cover: null, draft: false, }; describe('posts repository', () => { it('crea e rilegge un post pubblicato', () => { const id = createPost(db, base); const post = getPostById(db, id)!; expect(post.title).toBe('Titolo'); expect(post.draft).toBe(0); expect(post.published_at).not.toBeNull(); }); it('bozza non ha published_at e non appare nelle liste pubbliche', () => { const id = createPost(db, { ...base, slug: 'bozza', draft: true }); expect(getPostById(db, id)!.published_at).toBeNull(); expect(getPublishedBySlug(db, 'bozza')).toBeUndefined(); expect(listPublished(db).total).toBe(0); expect(listAllPosts(db)).toHaveLength(1); }); it('slug duplicato lancia', () => { createPost(db, base); expect(() => createPost(db, base)).toThrow(); }); it('update imposta published_at alla prima pubblicazione e lo conserva', () => { const id = createPost(db, { ...base, draft: true }); updatePost(db, id, { ...base, draft: false }); const first = getPostById(db, id)!.published_at; expect(first).not.toBeNull(); updatePost(db, id, { ...base, title: 'Nuovo', draft: false }); expect(getPostById(db, id)!.published_at).toBe(first); expect(getPostById(db, id)!.title).toBe('Nuovo'); }); it('listPublished filtra per categoria e pagina', () => { for (let i = 0; i < 12; i++) { createPost(db, { ...base, slug: `post-${i}`, category: i % 2 ? 'Contenuti educativi' : 'Eventi & Presidi' }); } const all = listPublished(db, { page: 1, perPage: 9 }); expect(all.total).toBe(12); expect(all.items).toHaveLength(9); const edu = listPublished(db, { category: 'Contenuti educativi' }); expect(edu.total).toBe(6); }); it('delete rimuove', () => { const id = createPost(db, base); deletePost(db, id); expect(getPostById(db, id)).toBeUndefined(); }); it('listRecent e archivio mesi', () => { createPost(db, base); expect(listRecent(db, 4)).toHaveLength(1); const months = listArchiveMonths(db); expect(months).toHaveLength(1); expect(months[0].count).toBe(1); expect(months[0].month).toMatch(/^\d{4}-\d{2}$/); }); });