import { describe, expect, it } from 'vitest' import { CAPACITY_TOLERANCE, evaluateCapacity } from '@/lib/timetable/capacity' import type { ArtistEngagement, Performance, Stage } from '@/types/timetable' const stage: Stage = { id: 's1', event_id: 'ev1', name: 'Hardstyle', color: '#ff0000', capacity: 1000, sort_order: 0, created_at: null, updated_at: null, } const perf: Performance = { id: 'p1', engagement_id: 'e1', event_id: 'ev1', stage_id: 's1', lane: 0, lane_resolved: 0, start_at: null, end_at: null, version: 0, notes: null, warnings: [], created_at: null, updated_at: null, deleted_at: null, } function eng(crew: number, guests: number, draw: number | null = null): ArtistEngagement { return { crew_count: crew, guests_count: guests, artist: draw === null ? undefined : { default_draw: draw } as ArtistEngagement['artist'], } as ArtistEngagement } describe('evaluateCapacity', () => { it('returns null when stage has no capacity', () => { expect(evaluateCapacity(perf, { ...stage, capacity: null }, eng(0, 0, 500))).toBeNull() }) it('returns null when no expected attendance is available', () => { expect(evaluateCapacity(perf, stage, eng(0, 0))).toBeNull() }) it('returns null when below the tolerance', () => { expect(evaluateCapacity(perf, stage, eng(0, 0, 1100))).toBeNull() }) it('returns warn when ratio between tolerance and 1.5×', () => { const result = evaluateCapacity(perf, stage, eng(0, 0, 1200)) expect(result?.level).toBe('warn') }) it('returns critical when ratio > 1.5', () => { const result = evaluateCapacity(perf, stage, eng(0, 0, 1700)) expect(result?.level).toBe('critical') }) it('prefers crew + guests when present', () => { const result = evaluateCapacity(perf, stage, eng(800, 800)) expect(result?.expected).toBe(1600) expect(result?.level).toBe('critical') }) it('exposes the tolerance constant', () => { expect(CAPACITY_TOLERANCE).toBeGreaterThan(1) }) })