import { cleanup, render, screen } from '@testing-library/react'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { CapacityPage } from '../../src/CapacityPage'; afterEach(() => { cleanup(); vi.unstubAllGlobals(); }); describe('CapacityPage forecast qualification', () => { it('does not count an insufficient assessment as a forecast', async () => { vi.stubGlobal('fetch', vi.fn().mockResolvedValue(new Response(JSON.stringify({ contractVersion: 'v1', generatedAt: '2026-08-12T01:00:00Z', policy: { enabled: true, windowSeconds: 2592000, minPoints: 3, method: 'linear_median_rate' }, qualifiedCount: 0, items: [{ entityId: 'media', name: 'Media', kind: 'share', enabled: true, method: 'insufficient_data', windowSeconds: 2592000, dataPoints: 1, confidence: 'none', currentUsedBytes: 100, capacityBytes: 0, rateBytesPerDay: 0, reason: 'insufficient_points' }], }), { status: 200, headers: { 'Content-Type': 'application/json' } }))); render(); expect(await screen.findByText(/0 gekwalificeerde prognoses/)).toBeVisible(); expect(screen.getByRole('heading', { name: 'Media' })).toBeVisible(); expect(screen.getByText('Er zijn minder historische metingen dan het ingestelde minimum.')).toBeVisible(); expect(screen.queryByText('0 B / 0 B')).not.toBeInTheDocument(); }); it('renders a concrete empty state without a synthetic entity', async () => { vi.stubGlobal('fetch', vi.fn().mockResolvedValue(new Response(JSON.stringify({ contractVersion: 'v1', generatedAt: '2026-08-12T01:00:00Z', reason: 'source_unavailable', policy: { enabled: true, windowSeconds: 2592000, minPoints: 3, method: 'linear_median_rate' }, qualifiedCount: 0, items: [], }), { status: 200, headers: { 'Content-Type': 'application/json' } }))); render(); expect(await screen.findByRole('heading', { name: 'Nog geen bruikbare capaciteitsprognose' })).toBeVisible(); expect(screen.getByRole('link', { name: 'Bekijk shares en groeihistorie' })).toHaveAttribute('href', '/shares'); }); });