import { describe, expect, it } from 'vitest' import { canTransition } from '~/domain/post-status' import type { PostStatus } from '~/domain/types' describe('canTransition', () => { it('erlaubt den Weg vom Entwurf bis zur Veröffentlichung', () => { expect(canTransition('draft', 'review')).toBe(true) expect(canTransition('review', 'published')).toBe(true) expect(canTransition('draft', 'published')).toBe(true) expect(canTransition('draft', 'scheduled')).toBe(true) expect(canTransition('scheduled', 'published')).toBe(true) }) it('erlaubt Zurückziehen und Wiederaufnahme', () => { expect(canTransition('published', 'archived')).toBe(true) expect(canTransition('archived', 'draft')).toBe(true) }) it('verbietet Sprünge zurück aus der Veröffentlichung in den Entwurf', () => { expect(canTransition('published', 'draft')).toBe(false) expect(canTransition('published', 'review')).toBe(false) }) it('verbietet gleichbleibenden Status als Übergang', () => { expect(canTransition('draft', 'draft')).toBe(false) }) }) describe('canTransition deckt alle 25 Paare ab', () => { const states: PostStatus[] = ['draft', 'review', 'scheduled', 'published', 'archived'] const expected: Record = { draft: ['review', 'scheduled', 'published', 'archived'], review: ['draft', 'scheduled', 'published', 'archived'], scheduled: ['draft', 'published', 'archived'], published: ['archived'], archived: ['draft'], } for (const from of states) { for (const to of states) { const allowed = expected[from].includes(to) it(`${from} nach ${to}: ${allowed}`, () => { expect(canTransition(from, to)).toBe(allowed) }) } } })