Skip to content

Commit 54070fc

Browse files
committed
test: removing mocking of useSanityInstance hook
This is easily replaced by actually placing a real instance in the context.
1 parent 60996a7 commit 54070fc

20 files changed

+710
-408
lines changed

packages/core/src/store/createSanityInstance.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ export function createSanityInstance(config: SanityConfig = {}): SanityInstance
107107
),
108108
match: (targetConfig) => {
109109
if (
110-
Object.entries(pick(targetConfig, 'auth', 'projectId', 'dataset')).every(
111-
([key, value]) => config[key as keyof SanityConfig] === value,
112-
)
110+
Object.entries(pick(targetConfig, 'auth', 'projectId', 'dataset'))
111+
.filter(([_, value]) => value !== undefined)
112+
.every(([key, value]) => config[key as keyof SanityConfig] === value)
113113
) {
114114
return instance
115115
}

packages/react/src/components/auth/AuthBoundary.test.tsx

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {ResourceProvider} from '../../context/ResourceProvider'
88
import {useAuthState} from '../../hooks/auth/useAuthState'
99
import {useLoginUrl} from '../../hooks/auth/useLoginUrl'
1010
import {useVerifyOrgProjects} from '../../hooks/auth/useVerifyOrgProjects'
11-
import {useSanityInstance} from '../../hooks/context/useSanityInstance'
1211
import {AuthBoundary} from './AuthBoundary'
1312

1413
// Mock hooks
@@ -23,9 +22,6 @@ vi.mock('../../hooks/auth/useHandleAuthCallback', () => ({
2322
vi.mock('../../hooks/auth/useLogOut', () => ({
2423
useLogOut: vi.fn(() => async () => {}),
2524
}))
26-
vi.mock('../../hooks/context/useSanityInstance', () => ({
27-
useSanityInstance: vi.fn(),
28-
}))
2925

3026
// Mock AuthError throwing scenario
3127
vi.mock('./AuthError', async (importOriginal) => {
@@ -109,7 +105,6 @@ describe('AuthBoundary', () => {
109105
const mockUseAuthState = vi.mocked(useAuthState)
110106
const mockUseLoginUrl = vi.mocked(useLoginUrl)
111107
const mockUseVerifyOrgProjects = vi.mocked(useVerifyOrgProjects)
112-
const mockUseSanityInstance = vi.mocked(useSanityInstance)
113108
const testProjectIds = ['proj-test'] // Example project ID for tests
114109

115110
// Mock Sanity instance
@@ -139,8 +134,6 @@ describe('AuthBoundary', () => {
139134
mockUseLoginUrl.mockReturnValue('http://example.com/login')
140135
// Default mock for useVerifyOrgProjects - returns null (no error)
141136
mockUseVerifyOrgProjects.mockImplementation(() => null)
142-
// Mock useSanityInstance to return our mock instance
143-
mockUseSanityInstance.mockReturnValue(mockSanityInstance)
144137
})
145138

146139
afterEach(() => {
@@ -170,7 +163,9 @@ describe('AuthBoundary', () => {
170163
isExchangingToken: false,
171164
})
172165
const {container} = render(
173-
<AuthBoundary projectIds={testProjectIds}>Protected Content</AuthBoundary>,
166+
<ResourceProvider projectId="p" dataset="d" fallback={null}>
167+
<AuthBoundary projectIds={testProjectIds}>Protected Content</AuthBoundary>
168+
</ResourceProvider>,
174169
)
175170

176171
// The callback screen renders null check that it renders nothing
@@ -184,7 +179,11 @@ describe('AuthBoundary', () => {
184179
currentUser: null,
185180
token: 'exampleToken',
186181
})
187-
render(<AuthBoundary projectIds={testProjectIds}>Protected Content</AuthBoundary>)
182+
render(
183+
<ResourceProvider projectId="p" dataset="d" fallback={null}>
184+
<AuthBoundary projectIds={testProjectIds}>Protected Content</AuthBoundary>
185+
</ResourceProvider>,
186+
)
188187

189188
expect(screen.getByText('Protected Content')).toBeInTheDocument()
190189
})
@@ -194,7 +193,11 @@ describe('AuthBoundary', () => {
194193
type: AuthStateType.ERROR,
195194
error: new Error('test error'),
196195
})
197-
render(<AuthBoundary projectIds={testProjectIds}>Protected Content</AuthBoundary>)
196+
render(
197+
<ResourceProvider projectId="p" dataset="d" fallback={null}>
198+
<AuthBoundary projectIds={testProjectIds}>Protected Content</AuthBoundary>
199+
</ResourceProvider>,
200+
)
198201

199202
// The AuthBoundary should throw an AuthError internally
200203
// and then display the LoginError component as the fallback.
@@ -207,7 +210,11 @@ describe('AuthBoundary', () => {
207210
})
208211

209212
it('renders children when logged in and org verification passes', () => {
210-
render(<AuthBoundary projectIds={testProjectIds}>Protected Content</AuthBoundary>)
213+
render(
214+
<ResourceProvider projectId="p" dataset="d" fallback={null}>
215+
<AuthBoundary projectIds={testProjectIds}>Protected Content</AuthBoundary>
216+
</ResourceProvider>,
217+
)
211218
expect(screen.getByText('Protected Content')).toBeInTheDocument()
212219
})
213220

@@ -226,9 +233,11 @@ describe('AuthBoundary', () => {
226233

227234
// Need to catch the error thrown during render. ErrorBoundary mock handles this.
228235
render(
229-
<AuthBoundary verifyOrganization={true} projectIds={testProjectIds}>
230-
<div>Protected Content</div>
231-
</AuthBoundary>,
236+
<ResourceProvider projectId="p" dataset="d" fallback={null}>
237+
<AuthBoundary verifyOrganization={true} projectIds={testProjectIds}>
238+
<div>Protected Content</div>
239+
</AuthBoundary>
240+
</ResourceProvider>,
232241
)
233242

234243
// The ErrorBoundary's FallbackComponent should be rendered
@@ -256,9 +265,11 @@ describe('AuthBoundary', () => {
256265
})
257266

258267
render(
259-
<AuthBoundary verifyOrganization={false} projectIds={testProjectIds}>
260-
<div>Protected Content</div>
261-
</AuthBoundary>,
268+
<ResourceProvider projectId="p" dataset="d" fallback={null}>
269+
<AuthBoundary verifyOrganization={false} projectIds={testProjectIds}>
270+
<div>Protected Content</div>
271+
</AuthBoundary>
272+
</ResourceProvider>,
262273
)
263274

264275
// Should render children because verification is disabled
@@ -279,9 +290,11 @@ describe('AuthBoundary', () => {
279290
mockUseVerifyOrgProjects.mockImplementation(() => null)
280291

281292
render(
282-
<AuthBoundary projectIds={testProjectIds}>
283-
<div>Protected Content</div>
284-
</AuthBoundary>,
293+
<ResourceProvider projectId="p" dataset="d" fallback={null}>
294+
<AuthBoundary projectIds={testProjectIds}>
295+
<div>Protected Content</div>
296+
</AuthBoundary>
297+
</ResourceProvider>,
285298
)
286299

287300
await waitFor(() => {

packages/react/src/context/ComlinkTokenRefresh.test.tsx

Lines changed: 53 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import {afterEach, beforeEach, describe, expect, it, type Mock, vi} from 'vitest
55

66
import {useAuthState} from '../hooks/auth/useAuthState'
77
import {useWindowConnection} from '../hooks/comlink/useWindowConnection'
8-
import {useSanityInstance} from '../hooks/context/useSanityInstance'
98
import {ComlinkTokenRefreshProvider} from './ComlinkTokenRefresh'
9+
import {ResourceProvider} from './ResourceProvider'
1010

1111
// Mocks
1212
vi.mock('@sanity/sdk', async () => {
@@ -26,28 +26,20 @@ vi.mock('../hooks/comlink/useWindowConnection', () => ({
2626
useWindowConnection: vi.fn(),
2727
}))
2828

29-
vi.mock('../hooks/context/useSanityInstance', () => ({
30-
useSanityInstance: vi.fn(),
31-
}))
32-
3329
// Use simpler mock typings
3430
const mockGetIsInDashboardState = getIsInDashboardState as Mock
3531
const mockSetAuthToken = setAuthToken as Mock
3632
const mockUseAuthState = useAuthState as Mock
3733
const mockUseWindowConnection = useWindowConnection as Mock
38-
const mockUseSanityInstance = useSanityInstance as Mock
3934

4035
const mockFetch = vi.fn()
41-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
42-
const mockSanityInstance: any = {projectId: 'test', dataset: 'test'}
4336

4437
describe('ComlinkTokenRefresh', () => {
4538
beforeEach(() => {
4639
vi.useFakeTimers()
4740
mockGetIsInDashboardState.mockReturnValue({getCurrent: vi.fn(() => false)})
4841
mockUseAuthState.mockReturnValue({type: AuthStateType.LOGGED_IN})
4942
mockUseWindowConnection.mockReturnValue({fetch: mockFetch})
50-
mockUseSanityInstance.mockReturnValue(mockSanityInstance)
5143
})
5244

5345
afterEach(() => {
@@ -64,9 +56,11 @@ describe('ComlinkTokenRefresh', () => {
6456
it('should not request new token on 401 if not in dashboard', async () => {
6557
mockUseAuthState.mockReturnValue({type: AuthStateType.LOGGED_IN})
6658
const {rerender} = render(
67-
<ComlinkTokenRefreshProvider>
68-
<div>Test</div>
69-
</ComlinkTokenRefreshProvider>,
59+
<ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
60+
<ComlinkTokenRefreshProvider>
61+
<div>Test</div>
62+
</ComlinkTokenRefreshProvider>
63+
</ResourceProvider>,
7064
)
7165

7266
mockUseAuthState.mockReturnValue({
@@ -75,9 +69,11 @@ describe('ComlinkTokenRefresh', () => {
7569
})
7670
act(() => {
7771
rerender(
78-
<ComlinkTokenRefreshProvider>
79-
<div>Test</div>
80-
</ComlinkTokenRefreshProvider>,
72+
<ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
73+
<ComlinkTokenRefreshProvider>
74+
<div>Test</div>
75+
</ComlinkTokenRefreshProvider>
76+
</ResourceProvider>,
8177
)
8278
})
8379

@@ -95,9 +91,11 @@ describe('ComlinkTokenRefresh', () => {
9591

9692
it('should initialize useWindowConnection with correct parameters', () => {
9793
render(
98-
<ComlinkTokenRefreshProvider>
99-
<div>Test</div>
100-
</ComlinkTokenRefreshProvider>,
94+
<ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
95+
<ComlinkTokenRefreshProvider>
96+
<div>Test</div>
97+
</ComlinkTokenRefreshProvider>
98+
</ResourceProvider>,
10199
)
102100

103101
expect(mockUseWindowConnection).toHaveBeenCalledWith(
@@ -116,16 +114,18 @@ describe('ComlinkTokenRefresh', () => {
116114
mockFetch.mockResolvedValueOnce({token: 'new-token'})
117115

118116
render(
119-
<ComlinkTokenRefreshProvider>
120-
<div>Test</div>
121-
</ComlinkTokenRefreshProvider>,
117+
<ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
118+
<ComlinkTokenRefreshProvider>
119+
<div>Test</div>
120+
</ComlinkTokenRefreshProvider>
121+
</ResourceProvider>,
122122
)
123123

124124
await act(async () => {
125125
await vi.advanceTimersByTimeAsync(100)
126126
})
127127

128-
expect(mockSetAuthToken).toHaveBeenCalledWith(mockSanityInstance, 'new-token')
128+
expect(mockSetAuthToken).toHaveBeenCalledWith(expect.any(Object), 'new-token')
129129
expect(mockFetch).toHaveBeenCalledTimes(1)
130130
})
131131

@@ -137,9 +137,11 @@ describe('ComlinkTokenRefresh', () => {
137137
mockFetch.mockResolvedValueOnce({token: null})
138138

139139
render(
140-
<ComlinkTokenRefreshProvider>
141-
<div>Test</div>
142-
</ComlinkTokenRefreshProvider>,
140+
<ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
141+
<ComlinkTokenRefreshProvider>
142+
<div>Test</div>
143+
</ComlinkTokenRefreshProvider>
144+
</ResourceProvider>,
143145
)
144146

145147
await act(async () => {
@@ -157,9 +159,11 @@ describe('ComlinkTokenRefresh', () => {
157159
mockFetch.mockRejectedValueOnce(new Error('Fetch failed'))
158160

159161
render(
160-
<ComlinkTokenRefreshProvider>
161-
<div>Test</div>
162-
</ComlinkTokenRefreshProvider>,
162+
<ResourceProvider projectId="test-project" dataset="test-dataset" fallback={null}>
163+
<ComlinkTokenRefreshProvider>
164+
<div>Test</div>
165+
</ComlinkTokenRefreshProvider>
166+
</ResourceProvider>,
163167
)
164168

165169
await act(async () => {
@@ -173,9 +177,12 @@ describe('ComlinkTokenRefresh', () => {
173177
it('should not request new token for non-401 errors', async () => {
174178
mockUseAuthState.mockReturnValue({type: AuthStateType.LOGGED_IN})
175179
const {rerender} = render(
176-
<ComlinkTokenRefreshProvider>
177-
<div>Test</div>
178-
</ComlinkTokenRefreshProvider>,
180+
<ResourceProvider fallback={null}>
181+
<ComlinkTokenRefreshProvider>
182+
<div>Test</div>
183+
</ComlinkTokenRefreshProvider>
184+
,
185+
</ResourceProvider>,
179186
)
180187

181188
mockUseAuthState.mockReturnValue({
@@ -184,9 +191,11 @@ describe('ComlinkTokenRefresh', () => {
184191
})
185192
act(() => {
186193
rerender(
187-
<ComlinkTokenRefreshProvider>
188-
<div>Test</div>
189-
</ComlinkTokenRefreshProvider>,
194+
<ResourceProvider fallback={null}>
195+
<ComlinkTokenRefreshProvider>
196+
<div>Test</div>
197+
</ComlinkTokenRefreshProvider>
198+
</ResourceProvider>,
190199
)
191200
})
192201

@@ -199,17 +208,21 @@ describe('ComlinkTokenRefresh', () => {
199208
it('should request new token on LOGGED_OUT state', async () => {
200209
mockUseAuthState.mockReturnValue({type: AuthStateType.LOGGED_IN})
201210
const {rerender} = render(
202-
<ComlinkTokenRefreshProvider>
203-
<div>Test</div>
204-
</ComlinkTokenRefreshProvider>,
211+
<ResourceProvider fallback={null}>
212+
<ComlinkTokenRefreshProvider>
213+
<div>Test</div>
214+
</ComlinkTokenRefreshProvider>
215+
</ResourceProvider>,
205216
)
206217

207218
mockUseAuthState.mockReturnValue({type: AuthStateType.LOGGED_OUT})
208219
act(() => {
209220
rerender(
210-
<ComlinkTokenRefreshProvider>
211-
<div>Test</div>
212-
</ComlinkTokenRefreshProvider>,
221+
<ResourceProvider fallback={null}>
222+
<ComlinkTokenRefreshProvider>
223+
<div>Test</div>
224+
</ComlinkTokenRefreshProvider>
225+
</ResourceProvider>,
213226
)
214227
})
215228

packages/react/src/hooks/auth/useDashboardOrganizationId.test.tsx

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import {createSanityInstance, getDashboardOrganizationId} from '@sanity/sdk'
1+
import {getDashboardOrganizationId} from '@sanity/sdk'
22
import {renderHook} from '@testing-library/react'
33
import {throwError} from 'rxjs'
44
import {describe, expect, it, vi} from 'vitest'
55

6+
import {ResourceProvider} from '../../context/ResourceProvider'
67
import {useDashboardOrganizationId} from './useDashboardOrganizationId'
78

8-
vi.mock('../context/useSanityInstance', () => ({
9-
useSanityInstance: vi.fn().mockReturnValue(createSanityInstance({projectId: 'p', dataset: 'd'})),
10-
}))
11-
129
vi.mock('@sanity/sdk', async (importOriginal) => {
1310
const actual = await importOriginal()
1411
return {...(actual || {}), getDashboardOrganizationId: vi.fn()}
@@ -23,7 +20,13 @@ describe('useDashboardOrganizationId', () => {
2320
observable: throwError(() => new Error('Unexpected usage of observable')),
2421
})
2522

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+
})
2730
expect(result.current).toBeUndefined()
2831
})
2932

@@ -36,7 +39,13 @@ describe('useDashboardOrganizationId', () => {
3639
observable: throwError(() => new Error('Unexpected usage of observable')),
3740
})
3841

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+
})
4049
expect(result.current).toBe(mockOrgId)
4150
})
4251
})

0 commit comments

Comments
 (0)