From ce694c7cd5704f09f58ce279b0ea43cd86905b3f Mon Sep 17 00:00:00 2001 From: Zelys Date: Tue, 24 Mar 2026 12:26:11 -0500 Subject: [PATCH] test(eslint-plugin-query/no-void-query-fn): add coverage for useInfiniteQuery, useSuspenseQuery, queryOptions, fetchQuery The existing tests only exercised useQuery. The rule checks any object property named queryFn, so it applies equally to useInfiniteQuery, useSuspenseQuery, queryOptions(), and queryClient.fetchQuery(). Add valid + invalid cases for each to document and lock in that behavior. --- .../src/__tests__/no-void-query-fn.test.ts | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/packages/eslint-plugin-query/src/__tests__/no-void-query-fn.test.ts b/packages/eslint-plugin-query/src/__tests__/no-void-query-fn.test.ts index c136a2582c0..e26c21de8f6 100644 --- a/packages/eslint-plugin-query/src/__tests__/no-void-query-fn.test.ts +++ b/packages/eslint-plugin-query/src/__tests__/no-void-query-fn.test.ts @@ -162,6 +162,59 @@ ruleTester.run('no-void-query-fn', rule, { } `, }, + { + name: 'useInfiniteQuery queryFn returns a value', + code: normalizeIndent` + import { useInfiniteQuery } from '@tanstack/react-query' + + function Component() { + const query = useInfiniteQuery({ + queryKey: ['test'], + queryFn: ({ pageParam }) => ({ data: 'test', page: pageParam }), + initialPageParam: 0, + getNextPageParam: (lastPage) => undefined, + }) + return null + } + `, + }, + { + name: 'useSuspenseQuery queryFn returns a value', + code: normalizeIndent` + import { useSuspenseQuery } from '@tanstack/react-query' + + function Component() { + const query = useSuspenseQuery({ + queryKey: ['test'], + queryFn: () => ({ data: 'test' }), + }) + return null + } + `, + }, + { + name: 'queryOptions queryFn returns a value', + code: normalizeIndent` + import { queryOptions } from '@tanstack/react-query' + + const options = queryOptions({ + queryKey: ['test'], + queryFn: () => ({ data: 'test' }), + }) + `, + }, + { + name: 'fetchQuery queryFn returns a value', + code: normalizeIndent` + import { QueryClient } from '@tanstack/react-query' + + const queryClient = new QueryClient() + queryClient.fetchQuery({ + queryKey: ['test'], + queryFn: () => fetch('/api/test').then((r) => r.json()), + }) + `, + }, ], invalid: [ { @@ -321,5 +374,70 @@ ruleTester.run('no-void-query-fn', rule, { `, errors: [{ messageId: 'noVoidReturn' }], }, + { + name: 'useInfiniteQuery queryFn returns void', + code: normalizeIndent` + import { useInfiniteQuery } from '@tanstack/react-query' + + function Component() { + const query = useInfiniteQuery({ + queryKey: ['test'], + queryFn: async ({ pageParam }) => { + await fetch('/api/test?page=' + pageParam) + }, + initialPageParam: 0, + getNextPageParam: (lastPage) => undefined, + }) + return null + } + `, + errors: [{ messageId: 'noVoidReturn' }], + }, + { + name: 'useSuspenseQuery queryFn returns void', + code: normalizeIndent` + import { useSuspenseQuery } from '@tanstack/react-query' + + function Component() { + const query = useSuspenseQuery({ + queryKey: ['test'], + queryFn: () => { + console.log('fetching') + }, + }) + return null + } + `, + errors: [{ messageId: 'noVoidReturn' }], + }, + { + name: 'queryOptions queryFn returns void', + code: normalizeIndent` + import { queryOptions } from '@tanstack/react-query' + + const options = queryOptions({ + queryKey: ['test'], + queryFn: async () => { + await fetch('/api/test') + }, + }) + `, + errors: [{ messageId: 'noVoidReturn' }], + }, + { + name: 'fetchQuery queryFn returns void', + code: normalizeIndent` + import { QueryClient } from '@tanstack/react-query' + + const queryClient = new QueryClient() + queryClient.fetchQuery({ + queryKey: ['test'], + queryFn: async () => { + await fetch('/api/test') + }, + }) + `, + errors: [{ messageId: 'noVoidReturn' }], + }, ], })