@sanity/sdk-react 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/index.d.ts +2 -3
  2. package/dist/index.js +92 -19
  3. package/dist/index.js.map +1 -1
  4. package/package.json +6 -5
  5. package/src/components/auth/AuthBoundary.test.tsx +33 -20
  6. package/src/components/auth/AuthBoundary.tsx +11 -1
  7. package/src/components/auth/LoginError.tsx +9 -12
  8. package/src/components/errors/CorsErrorComponent.test.tsx +48 -0
  9. package/src/components/errors/CorsErrorComponent.tsx +37 -0
  10. package/src/components/errors/Error.styles.ts +35 -0
  11. package/src/components/errors/Error.tsx +40 -0
  12. package/src/context/ComlinkTokenRefresh.test.tsx +53 -40
  13. package/src/hooks/auth/useDashboardOrganizationId.test.tsx +16 -7
  14. package/src/hooks/auth/useVerifyOrgProjects.test.tsx +56 -14
  15. package/src/hooks/dashboard/{useManageFavorite.test.ts → useManageFavorite.test.tsx} +99 -44
  16. package/src/hooks/document/{useDocument.test.ts → useDocument.test.tsx} +25 -22
  17. package/src/hooks/document/{useDocumentEvent.test.ts → useDocumentEvent.test.tsx} +17 -16
  18. package/src/hooks/document/{useDocumentPermissions.test.ts → useDocumentPermissions.test.tsx} +101 -40
  19. package/src/hooks/document/{useEditDocument.test.ts → useEditDocument.test.tsx} +52 -22
  20. package/src/hooks/documents/useDocuments.test.tsx +63 -25
  21. package/src/hooks/helpers/createCallbackHook.test.tsx +41 -37
  22. package/src/hooks/paginatedDocuments/usePaginatedDocuments.test.tsx +2 -2
  23. package/src/hooks/presence/usePresence.test.tsx +9 -6
  24. package/src/hooks/preview/useDocumentPreview.test.tsx +15 -16
  25. package/src/hooks/projection/useDocumentProjection.test.tsx +23 -38
  26. package/src/hooks/projection/useDocumentProjection.ts +3 -8
  27. package/src/hooks/query/useQuery.test.tsx +18 -10
  28. package/src/hooks/releases/useActiveReleases.test.tsx +25 -21
  29. package/src/hooks/releases/usePerspective.test.tsx +16 -22
  30. package/src/hooks/users/useUser.test.tsx +32 -15
  31. package/src/hooks/users/useUsers.test.tsx +19 -11
  32. package/src/hooks/_synchronous-groq-js.mjs +0 -4
@@ -3,7 +3,7 @@ import {act, renderHook, waitFor} from '@testing-library/react'
3
3
  import {Subject} from 'rxjs'
4
4
  import {describe, expect, it, vi} from 'vitest'
5
5
 
6
- import {useSanityInstance} from '../context/useSanityInstance'
6
+ import {ResourceProvider} from '../../context/ResourceProvider'
7
7
  import {useVerifyOrgProjects} from './useVerifyOrgProjects'
8
8
 
9
9
  // Mock dependencies
@@ -14,33 +14,46 @@ vi.mock('@sanity/sdk', async (importOriginal) => {
14
14
  observeOrganizationVerificationState: vi.fn(),
15
15
  }
16
16
  })
17
- vi.mock('../context/useSanityInstance')
18
17
 
19
18
  describe('useVerifyOrgProjects', () => {
20
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
- const mockInstance = {config: {}} as any // Dummy instance
22
19
  const mockObserve = vi.mocked(observeOrganizationVerificationState)
23
- const mockUseInstance = vi.mocked(useSanityInstance)
24
20
  const testProjectIds = ['proj-1']
25
21
 
26
22
  beforeEach(() => {
27
23
  vi.clearAllMocks()
28
- mockUseInstance.mockReturnValue(mockInstance)
29
24
  })
30
25
 
31
26
  it('should return null and not observe state if disabled', () => {
32
- const {result} = renderHook(() => useVerifyOrgProjects(true, testProjectIds))
27
+ const {result} = renderHook(() => useVerifyOrgProjects(true, testProjectIds), {
28
+ wrapper: ({children}) => (
29
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
30
+ {children}
31
+ </ResourceProvider>
32
+ ),
33
+ })
33
34
 
34
35
  expect(result.current).toBeNull()
35
36
  expect(mockObserve).not.toHaveBeenCalled()
36
37
  })
37
38
 
38
39
  it('should return null and not observe state if projectIds is missing or empty', () => {
39
- const {result: resultUndefined} = renderHook(() => useVerifyOrgProjects(false, undefined))
40
+ const {result: resultUndefined} = renderHook(() => useVerifyOrgProjects(false, undefined), {
41
+ wrapper: ({children}) => (
42
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
43
+ {children}
44
+ </ResourceProvider>
45
+ ),
46
+ })
40
47
  expect(resultUndefined.current).toBeNull()
41
48
  expect(mockObserve).not.toHaveBeenCalled()
42
49
 
43
- const {result: resultEmpty} = renderHook(() => useVerifyOrgProjects(false, []))
50
+ const {result: resultEmpty} = renderHook(() => useVerifyOrgProjects(false, []), {
51
+ wrapper: ({children}) => (
52
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
53
+ {children}
54
+ </ResourceProvider>
55
+ ),
56
+ })
44
57
  expect(resultEmpty.current).toBeNull()
45
58
  expect(mockObserve).not.toHaveBeenCalled()
46
59
  })
@@ -49,17 +62,29 @@ describe('useVerifyOrgProjects', () => {
49
62
  const subject = new Subject<OrgVerificationResult>()
50
63
  mockObserve.mockReturnValue(subject.asObservable())
51
64
 
52
- const {result} = renderHook(() => useVerifyOrgProjects(false, testProjectIds))
65
+ const {result} = renderHook(() => useVerifyOrgProjects(false, testProjectIds), {
66
+ wrapper: ({children}) => (
67
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
68
+ {children}
69
+ </ResourceProvider>
70
+ ),
71
+ })
53
72
 
54
73
  expect(result.current).toBeNull()
55
- expect(mockObserve).toHaveBeenCalledWith(mockInstance, testProjectIds)
74
+ expect(mockObserve).toHaveBeenCalledWith(expect.any(Object), testProjectIds)
56
75
  })
57
76
 
58
77
  it('should return null if observable emits { error: null }', async () => {
59
78
  const subject = new Subject<OrgVerificationResult>()
60
79
  mockObserve.mockReturnValue(subject.asObservable())
61
80
 
62
- const {result} = renderHook(() => useVerifyOrgProjects(false, testProjectIds))
81
+ const {result} = renderHook(() => useVerifyOrgProjects(false, testProjectIds), {
82
+ wrapper: ({children}) => (
83
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
84
+ {children}
85
+ </ResourceProvider>
86
+ ),
87
+ })
63
88
 
64
89
  act(() => {
65
90
  subject.next({error: null})
@@ -75,7 +100,13 @@ describe('useVerifyOrgProjects', () => {
75
100
  const errorMessage = 'Org mismatch'
76
101
  mockObserve.mockReturnValue(subject.asObservable())
77
102
 
78
- const {result} = renderHook(() => useVerifyOrgProjects(false, testProjectIds))
103
+ const {result} = renderHook(() => useVerifyOrgProjects(false, testProjectIds), {
104
+ wrapper: ({children}) => (
105
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
106
+ {children}
107
+ </ResourceProvider>
108
+ ),
109
+ })
79
110
 
80
111
  act(() => {
81
112
  subject.next({error: errorMessage})
@@ -91,7 +122,13 @@ describe('useVerifyOrgProjects', () => {
91
122
  const unsubscribeSpy = vi.spyOn(subject, 'unsubscribe')
92
123
  mockObserve.mockReturnValue(subject)
93
124
 
94
- const {unmount} = renderHook(() => useVerifyOrgProjects(false, testProjectIds))
125
+ const {unmount} = renderHook(() => useVerifyOrgProjects(false, testProjectIds), {
126
+ wrapper: ({children}) => (
127
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
128
+ {children}
129
+ </ResourceProvider>
130
+ ),
131
+ })
95
132
 
96
133
  expect(unsubscribeSpy).not.toHaveBeenCalled()
97
134
  unmount()
@@ -114,6 +151,11 @@ describe('useVerifyOrgProjects', () => {
114
151
  ({disabled, pIds}) => useVerifyOrgProjects(disabled, pIds),
115
152
  {
116
153
  initialProps: {disabled: false, pIds: testProjectIds},
154
+ wrapper: ({children}) => (
155
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
156
+ {children}
157
+ </ResourceProvider>
158
+ ),
117
159
  },
118
160
  )
119
161
 
@@ -1,16 +1,11 @@
1
1
  import {type Message} from '@sanity/comlink'
2
- import {
3
- type FavoriteStatusResponse,
4
- getFavoritesState,
5
- resolveFavoritesState,
6
- type SanityInstance,
7
- } from '@sanity/sdk'
2
+ import {type FavoriteStatusResponse, getFavoritesState, resolveFavoritesState} from '@sanity/sdk'
3
+ import {act, renderHook} from '@testing-library/react'
8
4
  import {BehaviorSubject} from 'rxjs'
9
5
  import {beforeEach, describe, expect, it, vi} from 'vitest'
10
6
 
11
- import {act, renderHook} from '../../../test/test-utils'
7
+ import {ResourceProvider} from '../../context/ResourceProvider'
12
8
  import {useWindowConnection, type WindowConnection} from '../comlink/useWindowConnection'
13
- import {useSanityInstance} from '../context/useSanityInstance'
14
9
  import {useManageFavorite} from './useManageFavorite'
15
10
 
16
11
  vi.mock(import('@sanity/sdk'), async (importOriginal) => {
@@ -22,8 +17,6 @@ vi.mock(import('@sanity/sdk'), async (importOriginal) => {
22
17
  }
23
18
  })
24
19
 
25
- vi.mock('../context/useSanityInstance')
26
-
27
20
  vi.mock('../comlink/useWindowConnection', () => ({
28
21
  useWindowConnection: vi.fn(),
29
22
  }))
@@ -62,14 +55,6 @@ describe('useManageFavorite', () => {
62
55
  return newValue
63
56
  })
64
57
 
65
- // Default mock for useSanityInstance
66
- vi.mocked(useSanityInstance).mockReturnValue({
67
- config: {
68
- projectId: 'test',
69
- dataset: 'test',
70
- },
71
- } as unknown as SanityInstance)
72
-
73
58
  // Mock useWindowConnection
74
59
  mockFetch = vi.fn().mockResolvedValue({success: true})
75
60
  mockSendMessage = vi.fn()
@@ -88,13 +73,25 @@ describe('useManageFavorite', () => {
88
73
  })
89
74
 
90
75
  it('should initialize with default states', () => {
91
- const {result} = renderHook(() => useManageFavorite(mockDocumentHandle))
76
+ const {result} = renderHook(() => useManageFavorite(mockDocumentHandle), {
77
+ wrapper: ({children}) => (
78
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
79
+ {children}
80
+ </ResourceProvider>
81
+ ),
82
+ })
92
83
 
93
84
  expect(result.current.isFavorited).toBe(false)
94
85
  })
95
86
 
96
87
  it('should handle favorite action and update state', async () => {
97
- const {result} = renderHook(() => useManageFavorite(mockDocumentHandle))
88
+ const {result} = renderHook(() => useManageFavorite(mockDocumentHandle), {
89
+ wrapper: ({children}) => (
90
+ <ResourceProvider projectId="test" dataset="test" fallback={null}>
91
+ {children}
92
+ </ResourceProvider>
93
+ ),
94
+ })
98
95
 
99
96
  expect(result.current.isFavorited).toBe(false)
100
97
 
@@ -123,7 +120,13 @@ describe('useManageFavorite', () => {
123
120
  })
124
121
 
125
122
  it('should handle unfavorite action and update state', async () => {
126
- const {result} = renderHook(() => useManageFavorite(mockDocumentHandle))
123
+ const {result} = renderHook(() => useManageFavorite(mockDocumentHandle), {
124
+ wrapper: ({children}) => (
125
+ <ResourceProvider projectId="test" dataset="test" fallback={null}>
126
+ {children}
127
+ </ResourceProvider>
128
+ ),
129
+ })
127
130
 
128
131
  // Set initial state to favorited
129
132
  await act(async () => {
@@ -158,7 +161,13 @@ describe('useManageFavorite', () => {
158
161
  it('should not update state if favorite action fails', async () => {
159
162
  mockFetch.mockResolvedValueOnce({success: false})
160
163
 
161
- const {result} = renderHook(() => useManageFavorite(mockDocumentHandle))
164
+ const {result} = renderHook(() => useManageFavorite(mockDocumentHandle), {
165
+ wrapper: ({children}) => (
166
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
167
+ {children}
168
+ </ResourceProvider>
169
+ ),
170
+ })
162
171
 
163
172
  expect(result.current.isFavorited).toBe(false)
164
173
 
@@ -178,7 +187,13 @@ describe('useManageFavorite', () => {
178
187
  throw new Error(errorMessage)
179
188
  })
180
189
 
181
- const {result} = renderHook(() => useManageFavorite(mockDocumentHandle))
190
+ const {result} = renderHook(() => useManageFavorite(mockDocumentHandle), {
191
+ wrapper: ({children}) => (
192
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
193
+ {children}
194
+ </ResourceProvider>
195
+ ),
196
+ })
182
197
 
183
198
  await act(async () => {
184
199
  await expect(result.current.favorite()).rejects.toThrow(errorMessage)
@@ -196,23 +211,21 @@ describe('useManageFavorite', () => {
196
211
  })
197
212
 
198
213
  it('should throw error when studio resource is missing projectId or dataset', () => {
199
- // Mock the Sanity instance to not have projectId or dataset
200
- vi.mocked(useSanityInstance).mockReturnValue({
201
- config: {
202
- projectId: undefined,
203
- dataset: undefined,
204
- },
205
- } as unknown as SanityInstance)
206
-
207
214
  const mockDocumentHandleWithoutProjectId = {
208
215
  documentId: 'mock-id',
209
216
  documentType: 'mock-type',
210
217
  resourceType: 'studio' as const,
211
218
  }
212
219
 
213
- expect(() => renderHook(() => useManageFavorite(mockDocumentHandleWithoutProjectId))).toThrow(
214
- 'projectId and dataset are required for studio resources',
215
- )
220
+ expect(() =>
221
+ renderHook(() => useManageFavorite(mockDocumentHandleWithoutProjectId), {
222
+ wrapper: ({children}) => (
223
+ <ResourceProvider projectId={undefined} dataset={undefined} fallback={null}>
224
+ {children}
225
+ </ResourceProvider>
226
+ ),
227
+ }),
228
+ ).toThrow('projectId and dataset are required for studio resources')
216
229
  })
217
230
 
218
231
  it('should throw error when resourceId is missing for non-studio resources', () => {
@@ -223,9 +236,15 @@ describe('useManageFavorite', () => {
223
236
  resourceId: undefined,
224
237
  }
225
238
 
226
- expect(() => renderHook(() => useManageFavorite(mockMediaDocumentHandle))).toThrow(
227
- 'resourceId is required for media-library and canvas resources',
228
- )
239
+ expect(() =>
240
+ renderHook(() => useManageFavorite(mockMediaDocumentHandle), {
241
+ wrapper: ({children}) => (
242
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
243
+ {children}
244
+ </ResourceProvider>
245
+ ),
246
+ }),
247
+ ).toThrow('resourceId is required for media-library and canvas resources')
229
248
  })
230
249
 
231
250
  it('should include schemaName in payload when provided', async () => {
@@ -233,7 +252,13 @@ describe('useManageFavorite', () => {
233
252
  ...mockDocumentHandle,
234
253
  schemaName: 'testSchema',
235
254
  }
236
- const {result} = renderHook(() => useManageFavorite(mockDocumentHandleWithSchema))
255
+ const {result} = renderHook(() => useManageFavorite(mockDocumentHandleWithSchema), {
256
+ wrapper: ({children}) => (
257
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
258
+ {children}
259
+ </ResourceProvider>
260
+ ),
261
+ })
237
262
 
238
263
  await act(async () => {
239
264
  await result.current.favorite()
@@ -246,7 +271,7 @@ describe('useManageFavorite', () => {
246
271
  id: 'mock-id',
247
272
  type: 'mock-type',
248
273
  resource: {
249
- id: 'test.test',
274
+ id: 'test-project.test-dataset',
250
275
  type: 'studio',
251
276
  schemaName: 'testSchema',
252
277
  },
@@ -268,7 +293,13 @@ describe('useManageFavorite', () => {
268
293
  getCurrent: () => undefined,
269
294
  observable: favoriteStatusSubject.asObservable(),
270
295
  }))
271
- const {result} = renderHook(() => useManageFavorite(mockDocumentHandle))
296
+ const {result} = renderHook(() => useManageFavorite(mockDocumentHandle), {
297
+ wrapper: ({children}) => (
298
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
299
+ {children}
300
+ </ResourceProvider>
301
+ ),
302
+ })
272
303
  expect(result.current.isFavorited).toBe(false)
273
304
  })
274
305
 
@@ -277,7 +308,13 @@ describe('useManageFavorite', () => {
277
308
  fetch: undefined,
278
309
  sendMessage: mockSendMessage,
279
310
  } as unknown as WindowConnection<Message>)
280
- const {result} = renderHook(() => useManageFavorite(mockDocumentHandle))
311
+ const {result} = renderHook(() => useManageFavorite(mockDocumentHandle), {
312
+ wrapper: ({children}) => (
313
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
314
+ {children}
315
+ </ResourceProvider>
316
+ ),
317
+ })
281
318
  await act(async () => {
282
319
  await result.current.favorite()
283
320
  await result.current.unfavorite()
@@ -288,7 +325,13 @@ describe('useManageFavorite', () => {
288
325
  it('should do nothing if documentId is missing', async () => {
289
326
  const handle = {...mockDocumentHandle, documentId: undefined}
290
327
  // @ts-expect-error -- no access to ManageFavorite props type
291
- const {result} = renderHook(() => useManageFavorite(handle))
328
+ const {result} = renderHook(() => useManageFavorite(handle), {
329
+ wrapper: ({children}) => (
330
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
331
+ {children}
332
+ </ResourceProvider>
333
+ ),
334
+ })
292
335
  await act(async () => {
293
336
  await result.current.favorite()
294
337
  await result.current.unfavorite()
@@ -299,7 +342,13 @@ describe('useManageFavorite', () => {
299
342
  it('should do nothing if documentType is missing', async () => {
300
343
  const handle = {...mockDocumentHandle, documentType: undefined}
301
344
  // @ts-expect-error -- no access to ManageFavorite props type
302
- const {result} = renderHook(() => useManageFavorite(handle))
345
+ const {result} = renderHook(() => useManageFavorite(handle), {
346
+ wrapper: ({children}) => (
347
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
348
+ {children}
349
+ </ResourceProvider>
350
+ ),
351
+ })
303
352
  await act(async () => {
304
353
  await result.current.favorite()
305
354
  await result.current.unfavorite()
@@ -310,7 +359,13 @@ describe('useManageFavorite', () => {
310
359
  it('should do nothing if resourceType is missing', async () => {
311
360
  const handle = {...mockDocumentHandle, resourceType: undefined, resourceId: 'studio'}
312
361
  // @ts-expect-error -- no access to ManageFavorite props type
313
- const {result} = renderHook(() => useManageFavorite(handle))
362
+ const {result} = renderHook(() => useManageFavorite(handle), {
363
+ wrapper: ({children}) => (
364
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
365
+ {children}
366
+ </ResourceProvider>
367
+ ),
368
+ })
314
369
  await act(async () => {
315
370
  await result.current.favorite()
316
371
  await result.current.unfavorite()
@@ -1,16 +1,11 @@
1
1
  // tests/useDocument.test.ts
2
- import {
3
- createSanityInstance,
4
- getDocumentState,
5
- resolveDocument,
6
- type StateSource,
7
- } from '@sanity/sdk'
2
+ import {getDocumentState, resolveDocument, type StateSource} from '@sanity/sdk'
8
3
  import {type SanityDocument} from '@sanity/types'
9
4
  import {renderHook} from '@testing-library/react'
10
5
  import {type SchemaOrigin} from 'groq'
11
6
  import {beforeEach, describe, expect, it, vi} from 'vitest'
12
7
 
13
- import {useSanityInstance} from '../context/useSanityInstance'
8
+ import {ResourceProvider} from '../../context/ResourceProvider'
14
9
  import {useDocument} from './useDocument'
15
10
 
16
11
  vi.mock('@sanity/sdk', async (importOriginal) => {
@@ -18,10 +13,6 @@ vi.mock('@sanity/sdk', async (importOriginal) => {
18
13
  return {...original, getDocumentState: vi.fn(), resolveDocument: vi.fn()}
19
14
  })
20
15
 
21
- vi.mock('../context/useSanityInstance', () => ({
22
- useSanityInstance: vi.fn(),
23
- }))
24
-
25
16
  // Define a single generic TestDocument type
26
17
  type UseDocumentTestType = SchemaOrigin<
27
18
  SanityDocument & {
@@ -56,8 +47,6 @@ declare module 'groq' {
56
47
  }
57
48
  }
58
49
 
59
- // Create a fake instance to be returned by useSanityInstance.
60
- const instance = createSanityInstance({projectId: 'p', dataset: 'd'})
61
50
  const book: SanityDocument = {
62
51
  _id: 'doc1',
63
52
  foo: 'bar',
@@ -70,7 +59,6 @@ const book: SanityDocument = {
70
59
  describe('useDocument hook', () => {
71
60
  beforeEach(() => {
72
61
  vi.resetAllMocks()
73
- vi.mocked(useSanityInstance).mockReturnValue(instance)
74
62
  })
75
63
 
76
64
  it('returns the current document when ready (without a path)', () => {
@@ -81,7 +69,13 @@ describe('useDocument hook', () => {
81
69
  subscribe,
82
70
  } as unknown as StateSource<unknown>)
83
71
 
84
- const {result} = renderHook(() => useDocument({documentId: 'doc1', documentType: 'book'}))
72
+ const {result} = renderHook(() => useDocument({documentId: 'doc1', documentType: 'book'}), {
73
+ wrapper: ({children}) => (
74
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
75
+ {children}
76
+ </ResourceProvider>
77
+ ),
78
+ })
85
79
 
86
80
  expect(result.current.data).toEqual(book)
87
81
  expect(getCurrent).toHaveBeenCalled()
@@ -102,13 +96,22 @@ describe('useDocument hook', () => {
102
96
  vi.mocked(resolveDocument).mockReturnValue(resolveDocPromise)
103
97
 
104
98
  // Render the hook and capture the thrown promise.
105
- const {result} = renderHook(() => {
106
- try {
107
- return useDocument({documentId: 'doc1', documentType: 'book'})
108
- } catch (e) {
109
- return e
110
- }
111
- })
99
+ const {result} = renderHook(
100
+ () => {
101
+ try {
102
+ return useDocument({documentId: 'doc1', documentType: 'book'})
103
+ } catch (e) {
104
+ return e
105
+ }
106
+ },
107
+ {
108
+ wrapper: ({children}) => (
109
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
110
+ {children}
111
+ </ResourceProvider>
112
+ ),
113
+ },
114
+ )
112
115
 
113
116
  // When the document is not ready, the hook throws the promise from resolveDocument.
114
117
  expect(result.current).toBe(resolveDocPromise)
@@ -1,14 +1,9 @@
1
1
  // tests/useDocumentEvent.test.ts
2
- import {
3
- createSanityInstance,
4
- type DocumentEvent,
5
- type DocumentHandle,
6
- subscribeDocumentEvents,
7
- } from '@sanity/sdk'
2
+ import {type DocumentEvent, type DocumentHandle, subscribeDocumentEvents} from '@sanity/sdk'
8
3
  import {renderHook} from '@testing-library/react'
9
4
  import {beforeEach, describe, expect, it, vi} from 'vitest'
10
5
 
11
- import {useSanityInstance} from '../context/useSanityInstance'
6
+ import {ResourceProvider} from '../../context/ResourceProvider'
12
7
  import {useDocumentEvent} from './useDocumentEvent'
13
8
 
14
9
  vi.mock('@sanity/sdk', async (importOriginal) => {
@@ -16,11 +11,6 @@ vi.mock('@sanity/sdk', async (importOriginal) => {
16
11
  return {...original, subscribeDocumentEvents: vi.fn()}
17
12
  })
18
13
 
19
- vi.mock('../context/useSanityInstance', () => ({
20
- useSanityInstance: vi.fn(),
21
- }))
22
-
23
- const instance = createSanityInstance({projectId: 'p', dataset: 'd'})
24
14
  const docHandle: DocumentHandle = {
25
15
  documentId: 'doc1',
26
16
  documentType: 'book',
@@ -29,7 +19,6 @@ const docHandle: DocumentHandle = {
29
19
  describe('useDocumentEvent hook', () => {
30
20
  beforeEach(() => {
31
21
  vi.resetAllMocks()
32
- vi.mocked(useSanityInstance).mockReturnValue(instance)
33
22
  })
34
23
 
35
24
  it('calls subscribeDocumentEvents with instance and a stable handler', () => {
@@ -37,10 +26,16 @@ describe('useDocumentEvent hook', () => {
37
26
  const unsubscribe = vi.fn()
38
27
  vi.mocked(subscribeDocumentEvents).mockReturnValue(unsubscribe)
39
28
 
40
- renderHook(() => useDocumentEvent({...docHandle, onEvent: handleEvent}))
29
+ renderHook(() => useDocumentEvent({...docHandle, onEvent: handleEvent}), {
30
+ wrapper: ({children}) => (
31
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
32
+ {children}
33
+ </ResourceProvider>
34
+ ),
35
+ })
41
36
 
42
37
  expect(vi.mocked(subscribeDocumentEvents)).toHaveBeenCalledTimes(1)
43
- expect(vi.mocked(subscribeDocumentEvents).mock.calls[0][0]).toBe(instance)
38
+ expect(vi.mocked(subscribeDocumentEvents).mock.calls[0][0]).toEqual(expect.any(Object))
44
39
 
45
40
  const stableHandler = vi.mocked(subscribeDocumentEvents).mock.calls[0][1]
46
41
  expect(typeof stableHandler).toBe('function')
@@ -55,7 +50,13 @@ describe('useDocumentEvent hook', () => {
55
50
  const unsubscribe = vi.fn()
56
51
  vi.mocked(subscribeDocumentEvents).mockReturnValue(unsubscribe)
57
52
 
58
- const {unmount} = renderHook(() => useDocumentEvent({...docHandle, onEvent: handleEvent}))
53
+ const {unmount} = renderHook(() => useDocumentEvent({...docHandle, onEvent: handleEvent}), {
54
+ wrapper: ({children}) => (
55
+ <ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
56
+ {children}
57
+ </ResourceProvider>
58
+ ),
59
+ })
59
60
  unmount()
60
61
  expect(unsubscribe).toHaveBeenCalledTimes(1)
61
62
  })