import { beforeEach, describe, expect, it } from 'vitest' import { findEntry } from '~/data/repositories/entries' import { publishDueEntries } from '~/lib/publish-due' import { auditEntries, makeBrand, makeProject, resetAccounts } from '../support/admin' import { makePost } from '../support/entries' beforeEach(resetAccounts) const past = new Date('2026-07-30T06:00:00Z') const future = new Date('2026-08-30T06:00:00Z') const now = new Date('2026-07-30T08:00:00Z') describe('publishDueEntries', () => { it('veröffentlicht nur fällige terminierte Beiträge', async () => { const brand = await makeBrand() const project = await makeProject(brand.id) const due = await makePost(project.id, { number: 1, slug: 'faellig', status: 'scheduled', publishAt: past }) const later = await makePost(project.id, { number: 2, slug: 'spaeter', status: 'scheduled', publishAt: future }) const draft = await makePost(project.id, { number: 3, slug: 'entwurf', status: 'draft', publishAt: past }) const result = await publishDueEntries(now) expect(result.published.map(entry => entry.slug)).toEqual(['faellig']) expect((await findEntry(due.id))?.status).toBe('published') expect((await findEntry(later.id))?.status).toBe('scheduled') expect((await findEntry(draft.id))?.status).toBe('draft') }) it('behält den geplanten Zeitpunkt und schreibt ins Protokoll', async () => { const brand = await makeBrand() const project = await makeProject(brand.id) const due = await makePost(project.id, { number: 1, slug: 'faellig', status: 'scheduled', publishAt: past }) await publishDueEntries(now) const saved = await findEntry(due.id) const entries = await auditEntries() expect(saved?.publishAt?.toISOString()).toBe(past.toISOString()) expect(entries[0]).toMatchObject({ action: 'post.publish.due', entityId: due.id, actorType: 'client' }) }) it('veröffentlicht bei einem zweiten Lauf nichts noch einmal', async () => { const brand = await makeBrand() const project = await makeProject(brand.id) await makePost(project.id, { number: 1, slug: 'faellig', status: 'scheduled', publishAt: past }) const first = await publishDueEntries(now) const second = await publishDueEntries(now) expect(first.published).toHaveLength(1) expect(second.published).toHaveLength(0) }) })