Skip to content

Commit 5a48ee9

Browse files
committed
Add test for the return value of lazy query's trigger
1 parent fdf4cab commit 5a48ee9

File tree

1 file changed

+77
-1
lines changed

1 file changed

+77
-1
lines changed

packages/toolkit/src/query/tests/buildHooks.test.tsx

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ const api = createApi({
4848
}
4949
},
5050
endpoints: (build) => ({
51-
getUser: build.query<any, number>({
51+
getUser: build.query<{ name: string }, number>({
5252
query: (arg) => arg,
5353
}),
5454
getIncrementedAmount: build.query<any, void>({
@@ -774,6 +774,82 @@ describe('hooks tests', () => {
774774
.actions.filter(api.internalActions.unsubscribeQueryResult.match)
775775
).toHaveLength(4)
776776
})
777+
778+
test('useLazyQuery hook callback returns various properties to handle the result', async () => {
779+
function User() {
780+
const [getUser] = api.endpoints.getUser.useLazyQuery()
781+
const [successMsg, setSuccessMsg] = React.useState('')
782+
const [errMsg, setErrMsg] = React.useState('')
783+
const [isAborted, setIsAborted] = React.useState(false)
784+
785+
const handleClick = async () => {
786+
const res = getUser(1)
787+
788+
// no-op simply for clearer type assertions
789+
res.then((result) => {
790+
expectExactType<
791+
| {
792+
error: { status: number; data: unknown } | SerializedError
793+
}
794+
| {
795+
data: undefined
796+
}
797+
| {
798+
data: {
799+
name: string
800+
}
801+
}
802+
>(result)
803+
})
804+
805+
expectType<number>(res.arg)
806+
expectType<string>(res.requestId)
807+
expectType<() => void>(res.abort)
808+
expectType<() => Promise<{ name: string }>>(res.unwrap)
809+
expectType<() => void>(res.unsubscribe)
810+
expectType<(options: SubscriptionOptions) => void>(
811+
res.updateSubscriptionOptions
812+
)
813+
expectType<() => void>(res.refetch)
814+
815+
// abort the query immediately to force an error
816+
res.abort()
817+
res
818+
.unwrap()
819+
.then((result) => {
820+
expectType<{ name: string }>(result)
821+
setSuccessMsg(`Successfully fetched user ${result.name}`)
822+
})
823+
.catch((err) => {
824+
setErrMsg(`An error has occurred fetching userId: ${res.arg}`)
825+
if (err.name === 'AbortError') {
826+
setIsAborted(true)
827+
}
828+
})
829+
}
830+
831+
return (
832+
<div>
833+
<button onClick={handleClick}>Fetch User and abort</button>
834+
<div>{successMsg}</div>
835+
<div>{errMsg}</div>
836+
<div>{isAborted ? 'Request was aborted' : ''}</div>
837+
</div>
838+
)
839+
}
840+
841+
render(<User />, { wrapper: storeRef.wrapper })
842+
expect(screen.queryByText(/An error has occurred/i)).toBeNull()
843+
expect(screen.queryByText(/Successfully fetched user/i)).toBeNull()
844+
expect(screen.queryByText('Request was aborted')).toBeNull()
845+
846+
fireEvent.click(
847+
screen.getByRole('button', { name: 'Fetch User and abort' })
848+
)
849+
await screen.findByText('An error has occurred fetching userId: 1')
850+
expect(screen.queryByText(/Successfully fetched user/i)).toBeNull()
851+
screen.getByText('Request was aborted')
852+
})
777853
})
778854

779855
describe('useMutation', () => {

0 commit comments

Comments
 (0)