import { describe, it, expect } from 'vitest'; import { renderHook, waitFor } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { http, HttpResponse } from 'msw'; import { type ReactNode } from 'react'; import { server } from '@/test/server'; import { useSearch } from '@/entities/search'; const API = '/api/v1'; function createWrapper() { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); return function Wrapper({ children }: { children: ReactNode }) { return {children}; }; } describe('useSearch', () => { it('does not fetch when query is empty', () => { const { result } = renderHook(() => useSearch(''), { wrapper: createWrapper() }); expect(result.current.isFetching).toBe(false); expect(result.current.data).toBeUndefined(); }); it('does not fetch when query is too short', () => { const { result } = renderHook(() => useSearch('a'), { wrapper: createWrapper() }); expect(result.current.data).toBeUndefined(); }); it('returns search results for valid query', async () => { const { result } = renderHook(() => useSearch('sber'), { wrapper: createWrapper() }); await waitFor(() => { expect(result.current.isSuccess).toBe(true); }); expect(result.current.data).toBeDefined(); expect(result.current.data?.length).toBeGreaterThan(0); expect(result.current.data?.[0].secid).toBe('SBER'); }); it('returns empty array when no results', async () => { server.use( http.get(`${API}/securities/search`, () => HttpResponse.json({ data: { data: [], meta: { fromCache: false, cachedAt: null } }, }), ), ); const { result } = renderHook(() => useSearch('zzzzz'), { wrapper: createWrapper() }); await waitFor(() => { expect(result.current.isSuccess).toBe(true); }); expect(result.current.data).toEqual([]); }); it('returns error state on network failure', async () => { server.use(http.get(`${API}/securities/search`, () => new HttpResponse(null, { status: 500 }))); const { result } = renderHook(() => useSearch('error'), { wrapper: createWrapper() }); await waitFor(() => { expect(result.current.isError).toBe(true); }); }); });