73 lines
2.3 KiB
TypeScript

import { server } from '@mocks/server'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { renderHook, waitFor } from '@testing-library/react'
import { HttpResponse, http } from 'msw'
import type { ReactNode } from 'react'
import { describe, expect, it } from 'vitest'
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 <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
}
}
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)
})
})
})