import { renderHook, waitFor, act } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { http, HttpResponse } from 'msw'; import { createElement } from 'react'; import { describe, expect, it, vi } from 'vitest'; import { server } from '@/mocks/server'; import { API_BASE } from '@/features/auth/mocks/fixtures'; import { useAddCmsInstance } from './useAddCmsInstance'; 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('useAddCmsInstance', () => { it('returns created instance on success', async () => { const { result } = renderHook(() => useAddCmsInstance(), { wrapper: createWrapper() }); await act(async () => { await result.current.mutateAsync({ name: 'Test CMS', url: 'http://test.example.com', apiKey: 'secret', }); }); await waitFor(() => expect(result.current.isSuccess).toBe(true)); expect(result.current.data?.name).toBe('Test CMS'); }); it('calls onError callback on HTTP 400', async () => { server.use(http.post(CMS_URL, () => HttpResponse.json({}, { status: 400 }))); const onError = vi.fn(); const { result } = renderHook(() => useAddCmsInstance({ onError }), { wrapper: createWrapper(), }); await act(async () => { try { await result.current.mutateAsync({ name: 'X', url: 'http://x.com', apiKey: 'k' }); } catch { // expected } }); await waitFor(() => expect(onError).toHaveBeenCalled()); }); });