73 lines
2.3 KiB
TypeScript
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)
|
|
})
|
|
})
|
|
})
|