@sanity/sdk-react 2.2.0 → 2.3.1
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.
- package/dist/index.d.ts +2 -3
- package/dist/index.js +101 -26
- package/dist/index.js.map +1 -1
- package/package.json +7 -6
- package/src/components/auth/AuthBoundary.test.tsx +33 -20
- package/src/components/auth/AuthBoundary.tsx +20 -5
- package/src/components/auth/LoginError.tsx +9 -12
- package/src/components/errors/CorsErrorComponent.test.tsx +48 -0
- package/src/components/errors/CorsErrorComponent.tsx +37 -0
- package/src/components/errors/Error.styles.ts +35 -0
- package/src/components/errors/Error.tsx +40 -0
- package/src/context/ComlinkTokenRefresh.test.tsx +87 -38
- package/src/context/ComlinkTokenRefresh.tsx +2 -1
- package/src/hooks/auth/useDashboardOrganizationId.test.tsx +16 -7
- package/src/hooks/auth/useVerifyOrgProjects.test.tsx +56 -14
- package/src/hooks/dashboard/{useManageFavorite.test.ts → useManageFavorite.test.tsx} +99 -44
- package/src/hooks/document/{useDocument.test.ts → useDocument.test.tsx} +25 -22
- package/src/hooks/document/{useDocumentEvent.test.ts → useDocumentEvent.test.tsx} +17 -16
- package/src/hooks/document/{useDocumentPermissions.test.ts → useDocumentPermissions.test.tsx} +101 -40
- package/src/hooks/document/{useEditDocument.test.ts → useEditDocument.test.tsx} +52 -22
- package/src/hooks/documents/useDocuments.test.tsx +63 -25
- package/src/hooks/helpers/createCallbackHook.test.tsx +41 -37
- package/src/hooks/paginatedDocuments/usePaginatedDocuments.test.tsx +2 -2
- package/src/hooks/presence/usePresence.test.tsx +9 -6
- package/src/hooks/preview/useDocumentPreview.test.tsx +15 -16
- package/src/hooks/projection/useDocumentProjection.test.tsx +23 -38
- package/src/hooks/projection/useDocumentProjection.ts +3 -8
- package/src/hooks/query/useQuery.test.tsx +18 -10
- package/src/hooks/releases/useActiveReleases.test.tsx +25 -21
- package/src/hooks/releases/usePerspective.test.tsx +16 -22
- package/src/hooks/users/useUser.test.tsx +32 -15
- package/src/hooks/users/useUsers.test.tsx +19 -11
- package/src/hooks/_synchronous-groq-js.mjs +0 -4
|
@@ -130,8 +130,9 @@ function DashboardTokenRefresh({children}: PropsWithChildren) {
|
|
|
130
130
|
export const ComlinkTokenRefreshProvider: React.FC<PropsWithChildren> = ({children}) => {
|
|
131
131
|
const instance = useSanityInstance()
|
|
132
132
|
const isInDashboard = useMemo(() => getIsInDashboardState(instance).getCurrent(), [instance])
|
|
133
|
+
const studioModeEnabled = !!instance.config.studioMode?.enabled
|
|
133
134
|
|
|
134
|
-
if (isInDashboard) {
|
|
135
|
+
if (isInDashboard && !studioModeEnabled) {
|
|
135
136
|
return <DashboardTokenRefresh>{children}</DashboardTokenRefresh>
|
|
136
137
|
}
|
|
137
138
|
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {getDashboardOrganizationId} from '@sanity/sdk'
|
|
2
2
|
import {renderHook} from '@testing-library/react'
|
|
3
3
|
import {throwError} from 'rxjs'
|
|
4
4
|
import {describe, expect, it, vi} from 'vitest'
|
|
5
5
|
|
|
6
|
+
import {ResourceProvider} from '../../context/ResourceProvider'
|
|
6
7
|
import {useDashboardOrganizationId} from './useDashboardOrganizationId'
|
|
7
8
|
|
|
8
|
-
vi.mock('../context/useSanityInstance', () => ({
|
|
9
|
-
useSanityInstance: vi.fn().mockReturnValue(createSanityInstance({projectId: 'p', dataset: 'd'})),
|
|
10
|
-
}))
|
|
11
|
-
|
|
12
9
|
vi.mock('@sanity/sdk', async (importOriginal) => {
|
|
13
10
|
const actual = await importOriginal()
|
|
14
11
|
return {...(actual || {}), getDashboardOrganizationId: vi.fn()}
|
|
@@ -23,7 +20,13 @@ describe('useDashboardOrganizationId', () => {
|
|
|
23
20
|
observable: throwError(() => new Error('Unexpected usage of observable')),
|
|
24
21
|
})
|
|
25
22
|
|
|
26
|
-
const {result} = renderHook(() => useDashboardOrganizationId()
|
|
23
|
+
const {result} = renderHook(() => useDashboardOrganizationId(), {
|
|
24
|
+
wrapper: ({children}) => (
|
|
25
|
+
<ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
|
|
26
|
+
{children}
|
|
27
|
+
</ResourceProvider>
|
|
28
|
+
),
|
|
29
|
+
})
|
|
27
30
|
expect(result.current).toBeUndefined()
|
|
28
31
|
})
|
|
29
32
|
|
|
@@ -36,7 +39,13 @@ describe('useDashboardOrganizationId', () => {
|
|
|
36
39
|
observable: throwError(() => new Error('Unexpected usage of observable')),
|
|
37
40
|
})
|
|
38
41
|
|
|
39
|
-
const {result} = renderHook(() => useDashboardOrganizationId()
|
|
42
|
+
const {result} = renderHook(() => useDashboardOrganizationId(), {
|
|
43
|
+
wrapper: ({children}) => (
|
|
44
|
+
<ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
|
|
45
|
+
{children}
|
|
46
|
+
</ResourceProvider>
|
|
47
|
+
),
|
|
48
|
+
})
|
|
40
49
|
expect(result.current).toBe(mockOrgId)
|
|
41
50
|
})
|
|
42
51
|
})
|
|
@@ -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 {
|
|
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(
|
|
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
|
-
|
|
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 {
|
|
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(() =>
|
|
214
|
-
|
|
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(() =>
|
|
227
|
-
|
|
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 {
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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 {
|
|
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]).
|
|
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
|
})
|