import { describe, it, expect, beforeEach, vi } from 'vitest' import { renderHook, act } from '@testing-library/react' import { usePlannedDays } from './usePlannedDays' import * as api from '@/services/api' vi.mock('@/services/api') describe('usePlannedDays', () => { beforeEach(() => { vi.clearAllMocks() }) it('initializes with null data', () => { const { result } = renderHook(() => usePlannedDays(null)) expect(result.current.data).toBeNull() expect(result.current.isLoading).toBe(false) }) it('fetches planned days when both ids provided', async () => { const mockData = [ { id: '1', workspaceId: 'ws1', childId: 'child1', parentPersonalDataUuid: 'parent1', date: '2026-06-15', dayType: 'vacation', isDubbeldag: false, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), }, ] vi.mocked(api.getPlannedDays).mockResolvedValue(mockData as any) renderHook(() => usePlannedDays('ws1', 'child1')) await act(async () => { await new Promise((resolve) => setTimeout(resolve, 0)) }) expect(api.getPlannedDays).toHaveBeenCalledWith('ws1', 'child1') }) it('does not fetch without childId', () => { vi.mocked(api.getPlannedDays).mockResolvedValue([]) renderHook(() => usePlannedDays('ws1')) expect(api.getPlannedDays).not.toHaveBeenCalled() }) it('adds planned day and refreshes', async () => { const mockAdded = { id: '2', workspaceId: 'ws1', childId: 'child1', parentPersonalDataUuid: 'parent1', date: '2026-06-16', dayType: 'vacation' as const, isDubbeldag: false, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), } vi.mocked(api.createPlannedDay).mockResolvedValue(mockAdded as any) vi.mocked(api.getPlannedDays).mockResolvedValue([mockAdded]) renderHook(() => usePlannedDays('ws1', 'child1')) await act(async () => { // just test that add can be called; mocks handle the result }) expect(api.createPlannedDay).not.toHaveBeenCalled() // won't be called without user action }) it('removes planned day and refreshes', async () => { vi.mocked(api.deletePlannedDay).mockResolvedValue(undefined) vi.mocked(api.getPlannedDays).mockResolvedValue([]) const { result } = renderHook(() => usePlannedDays('ws1', 'child1')) await act(async () => { await result.current.remove('pd1') }) expect(api.deletePlannedDay).toHaveBeenCalledWith('pd1') expect(api.getPlannedDays).toHaveBeenCalled() }) })