import { cleanup, render, screen } from '@testing-library/react' import { afterEach, describe, expect, it, vi } from 'vitest' import { SourceFreshnessPanel } from './SourceFreshnessPanel' import type { SourceFreshnessReport } from '../../types' function props(overschrijf: Partial[0]> = {}) { return { report: null, loading: false, error: null, onRefresh: vi.fn(), catalogReport: null, catalogLoading: false, catalogError: null, onProbeCatalogs: vi.fn(), grbRefreshPlan: null, grbRefreshPlanLoading: false, grbRefreshPlanError: null, ...overschrijf, } } const leegRapport: SourceFreshnessReport = { project_id: 'p-1', generated_at: '2026-08-23T09:00:00Z', summary: { source_count: 0, dataset_count: 0, current_count: 0, due_count: 0, review_required_count: 0, local_count: 0, sources_with_integrity_issues: 0, integrity_issue_count: 0, }, items: [], limitations: [], } describe('SourceFreshnessPanel', () => { afterEach(() => cleanup()) it('blijft overeind bij een antwoord dat zijn eigen contract schendt', () => { // Het type zegt dat items altijd meekomt, maar een type is een belofte van // de compiler en geen garantie van het netwerk. Vandaar de optionele keten // in de component; deze test legt vast dat die er blijft. const zonderItems = { ...leegRapport, items: undefined } as unknown as SourceFreshnessReport expect(() => render()).not.toThrow() }) it('toont een leeg rapport zonder te struikelen', () => { expect(() => render()).not.toThrow() }) it('meldt een fout in plaats van hem te verzwijgen', () => { render() expect(screen.getByText(/kon de brondekking niet ophalen/i)).toBeTruthy() }) })