deno.land / x / jotai@v1.8.4 / tests / urql / atomWithMutation.test.tsx

atomWithMutation.test.tsx
نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import { StrictMode, Suspense } from 'react'import { fireEvent, render, waitFor } from '@testing-library/react'import type { Client } from '@urql/core'import { delay, fromValue, pipe, take, toPromise } from 'wonka'import { atom, useAtom } from 'jotai'import { atomWithMutation } from 'jotai/urql'import { getTestProvider, itSkipIfVersionedWrite } from '../testUtils'
const withPromise = (source$: any) => { source$.toPromise = () => pipe(source$, take(1), toPromise) return source$}
const generateClient = (error?: () => boolean) => ({ mutation: () => { const source$ = withPromise( pipe( fromValue( error?.() ? { error: new Error('fetch error') } : { data: { count: 1 } } ), delay(100) ) ) return source$ }, } as unknown as Client)
const Provider = getTestProvider()
it('mutation basic test', async () => { const countAtom = atomWithMutation<{ count: number }, Record<string, never>>( () => 'mutation Test { count }', () => generateClient() ) const mutateAtom = atom(null, (_get, set) => set(countAtom, { variables: {} }) )
const Counter = () => { const [{ data }] = useAtom(countAtom) return ( <> <div>count: {data?.count}</div> </> ) }
const Controls = () => { const [, mutate] = useAtom(mutateAtom) return <button onClick={() => mutate()}>mutate</button> }
const { getByText, findByText } = render( <StrictMode> <Provider> <Suspense fallback="loading"> <Counter /> </Suspense> <Controls /> </Provider> </StrictMode> )
await findByText('loading')
await new Promise((r) => setTimeout(r, 100)) fireEvent.click(getByText('mutate')) await findByText('count: 1')})
describe('error handling', () => { itSkipIfVersionedWrite('mutation error test', async () => { const countAtom = atomWithMutation< { count: number }, Record<string, never> >( () => 'mutation Test { count }', () => generateClient(() => true) ) const mutateAtom = atom(null, (_get, set) => set(countAtom, { variables: {} }) )
const Counter = () => { const [{ data }] = useAtom(countAtom) return ( <> <div>count: {data?.count}</div> </> ) }
let errored = false const Controls = () => { const [, mutate] = useAtom(mutateAtom) const handleClick = async () => { try { await mutate() } catch { errored = true } } return <button onClick={handleClick}>mutate</button> }
const { getByText, findByText } = render( <StrictMode> <Provider> <Suspense fallback="loading"> <Counter /> </Suspense> <Controls /> </Provider> </StrictMode> )
await findByText('loading')
await new Promise((r) => setTimeout(r, 100)) fireEvent.click(getByText('mutate')) await waitFor(() => { expect(errored).toBe(true) }) })})
jotai

Version Info

Tagged at
a year ago