import { describe, it, expect, beforeEach, vi } from 'vitest' import { renderHook, waitFor } from '@testing-library/react' import { useDayOverrides } from './useDayOverrides' import * as api from '@/services/api' vi.mock('@/services/api') describe('useDayOverrides', () => { const mockOverrides = [ { id: 'do-1', workspaceId: 'ws-1', date: '2026-12-24', isWorkingDay: true, note: 'Jobbade på juldagen', createdAt: '2026-01-01T00:00:00', updatedAt: '2026-01-01T00:00:00', }, { id: 'do-2', workspaceId: 'ws-1', date: '2026-06-20', isWorkingDay: false, note: 'Extra ledigt', createdAt: '2026-01-01T00:00:00', updatedAt: '2026-01-01T00:00:00', }, ] beforeEach(() => { vi.clearAllMocks() vi.mocked(api.listDayOverridesByWorkspace).mockResolvedValue(mockOverrides) vi.mocked(api.upsertDayOverride).mockResolvedValue(mockOverrides[0] as any) vi.mocked(api.deleteDayOverride).mockResolvedValue(undefined) }) it('fetches overrides on mount', async () => { const { result } = renderHook(() => useDayOverrides('ws-1')) expect(result.current.isLoading).toBe(true) await waitFor(() => expect(result.current.isLoading).toBe(false)) expect(result.current.data).toEqual(mockOverrides) expect(api.listDayOverridesByWorkspace).toHaveBeenCalledWith('ws-1') }) it('does not fetch if workspaceId is empty', async () => { renderHook(() => useDayOverrides('')) await waitFor(() => { expect(api.listDayOverridesByWorkspace).not.toHaveBeenCalled() }) }) it('upserts an override and refetches', async () => { const { result } = renderHook(() => useDayOverrides('ws-1')) await waitFor(() => expect(result.current.isLoading).toBe(false)) expect(result.current.data).toEqual(mockOverrides) await result.current.upsert({ workspaceId: 'ws-1', date: '2026-12-24', isWorkingDay: true, note: 'Test', }) expect(api.upsertDayOverride).toHaveBeenCalledWith({ workspaceId: 'ws-1', date: '2026-12-24', isWorkingDay: true, note: 'Test', }) expect(api.listDayOverridesByWorkspace).toHaveBeenCalledTimes(2) }) it('removes an override and refetches', async () => { const { result } = renderHook(() => useDayOverrides('ws-1')) await waitFor(() => expect(result.current.isLoading).toBe(false)) await result.current.remove('do-1') expect(api.deleteDayOverride).toHaveBeenCalledWith('do-1') expect(api.listDayOverridesByWorkspace).toHaveBeenCalledTimes(2) }) it('sets error when fetch fails', async () => { const mockError = new Error('Network error') vi.mocked(api.listDayOverridesByWorkspace).mockRejectedValueOnce(mockError) const { result } = renderHook(() => useDayOverrides('ws-1')) await waitFor(() => expect(result.current.isLoading).toBe(false)) expect(result.current.error).toBe('Network error') expect(result.current.data).toEqual([]) }) })