import { renderHook, waitFor } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { http, HttpResponse } from 'msw'; import { createElement } from 'react'; import { describe, expect, it } from 'vitest'; import { server } from '@/mocks/server'; import { API_BASE } from '@/features/auth/mocks/fixtures'; import { getMockCmsInstances } from '@/features/cms/mocks/handlers'; import { useCmsInstances } from './useCmsInstances'; function createWrapper() { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false }, mutations: { retry: false } }, }); return ({ children }: { children: React.ReactNode }) => createElement(QueryClientProvider, { client: queryClient }, children); } const CMS_URL = `${API_BASE}/api/v1/CmsInstances`; describe('useCmsInstances', () => { it('starts in loading state', () => { const { result } = renderHook(() => useCmsInstances(), { wrapper: createWrapper() }); expect(result.current.isPending).toBe(true); }); it('returns the instances list on success', async () => { const { result } = renderHook(() => useCmsInstances(), { wrapper: createWrapper() }); await waitFor(() => expect(result.current.isPending).toBe(false)); expect(result.current.isError).toBe(false); expect(result.current.data).toHaveLength(getMockCmsInstances().length); expect(result.current.data?.[0].name).toBe(getMockCmsInstances()[0].name); }); it('enters error state on network error', async () => { server.use(http.get(CMS_URL, () => HttpResponse.json({}, { status: 500 }))); const { result } = renderHook(() => useCmsInstances(), { wrapper: createWrapper() }); await waitFor(() => expect(result.current.isPending).toBe(false)); expect(result.current.isError).toBe(true); }); });