@@ -3,6 +3,7 @@ import {delay, filter, firstValueFrom, Observable, of, Subject} from 'rxjs'
3
3
import { beforeEach , describe , expect , it , vi } from 'vitest'
4
4
5
5
import { getClientState } from '../client/clientStore'
6
+ import { sourceFor as getSource } from '../config/sanityConfig'
6
7
import { createSanityInstance , type SanityInstance } from '../store/createSanityInstance'
7
8
import { type StateSource } from '../store/createStateSourceAction'
8
9
import { getQueryState , resolveQuery } from './queryStore'
@@ -17,6 +18,7 @@ vi.mock('../client/clientStore', () => ({
17
18
} ) )
18
19
19
20
describe ( 'queryStore' , ( ) => {
21
+ const source = getSource ( { projectId : 'test' , dataset : 'test' } )
20
22
let instance : SanityInstance
21
23
let liveEvents : Subject < LiveEvent >
22
24
let fetch : SanityClient [ 'observable' ] [ 'fetch' ]
@@ -61,7 +63,7 @@ describe('queryStore', () => {
61
63
62
64
it ( 'initializes query state and cleans up after unsubscribe' , async ( ) => {
63
65
const query = '*[_type == "movie"]'
64
- const state = getQueryState ( instance , { query} )
66
+ const state = getQueryState ( instance , { query, source , perspective : 'drafts' } )
65
67
66
68
// Initially undefined before subscription
67
69
expect ( state . getCurrent ( ) ) . toBeUndefined ( )
@@ -90,7 +92,7 @@ describe('queryStore', () => {
90
92
91
93
it ( 'maintains state when multiple subscribers exist' , async ( ) => {
92
94
const query = '*[_type == "movie"]'
93
- const state = getQueryState ( instance , { query} )
95
+ const state = getQueryState ( instance , { query, source , perspective : 'drafts' } )
94
96
95
97
// Add two subscribers
96
98
const unsubscribe1 = state . subscribe ( )
@@ -127,13 +129,13 @@ describe('queryStore', () => {
127
129
it ( 'resolveQuery works without affecting subscriber cleanup' , async ( ) => {
128
130
const query = '*[_type == "movie"]'
129
131
130
- const state = getQueryState ( instance , { query} )
132
+ const state = getQueryState ( instance , { query, source , perspective : 'drafts' } )
131
133
132
134
// Check that getQueryState starts undefined
133
135
expect ( state . getCurrent ( ) ) . toBeUndefined ( )
134
136
135
137
// Use resolveQuery which should not add a subscriber
136
- const result = await resolveQuery ( instance , { query} )
138
+ const result = await resolveQuery ( instance , { query, source , perspective : 'drafts' } )
137
139
expect ( result ) . toEqual ( [
138
140
{ _id : 'movie1' , _type : 'movie' , title : 'Movie 1' } ,
139
141
{ _id : 'movie2' , _type : 'movie' , title : 'Movie 2' } ,
@@ -160,7 +162,12 @@ describe('queryStore', () => {
160
162
const abortController = new AbortController ( )
161
163
162
164
// Create a promise that will reject when aborted
163
- const queryPromise = resolveQuery ( instance , { query, signal : abortController . signal } )
165
+ const queryPromise = resolveQuery ( instance , {
166
+ query,
167
+ source,
168
+ perspective : 'drafts' ,
169
+ signal : abortController . signal ,
170
+ } )
164
171
165
172
// Abort the request
166
173
abortController . abort ( )
@@ -169,7 +176,9 @@ describe('queryStore', () => {
169
176
await expect ( queryPromise ) . rejects . toThrow ( 'The operation was aborted.' )
170
177
171
178
// Verify state is cleared after abort
172
- expect ( getQueryState ( instance , { query} ) . getCurrent ( ) ) . toBeUndefined ( )
179
+ expect (
180
+ getQueryState ( instance , { query, source, perspective : 'drafts' } ) . getCurrent ( ) ,
181
+ ) . toBeUndefined ( )
173
182
} )
174
183
175
184
it ( 'refetches query when receiving live event with matching sync tag' , async ( ) => {
@@ -188,7 +197,11 @@ describe('queryStore', () => {
188
197
)
189
198
190
199
const query = '*[_type == "movie"]'
191
- const state = getQueryState < { _id : string ; _type : string ; title : string } [ ] > ( instance , { query} )
200
+ const state = getQueryState < { _id : string ; _type : string ; title : string } [ ] > ( instance , {
201
+ query,
202
+ source,
203
+ perspective : 'drafts' ,
204
+ } )
192
205
193
206
const unsubscribe = state . subscribe ( )
194
207
await firstValueFrom ( state . observable . pipe ( filter ( ( i ) => i !== undefined ) ) )
@@ -219,7 +232,7 @@ describe('queryStore', () => {
219
232
)
220
233
221
234
const query = '*[_type == "movie"]'
222
- const state = getQueryState ( instance , { query} )
235
+ const state = getQueryState ( instance , { query, source , perspective : 'drafts' } )
223
236
224
237
const unsubscribe = state . subscribe ( )
225
238
await firstValueFrom ( state . observable . pipe ( filter ( ( i ) => i !== undefined ) ) )
@@ -252,7 +265,7 @@ describe('queryStore', () => {
252
265
)
253
266
254
267
const query = '*[_type == "movie"]'
255
- const state = getQueryState ( instance , { query} )
268
+ const state = getQueryState ( instance , { query, source , perspective : 'drafts' } )
256
269
257
270
const unsubscribe = state . subscribe ( )
258
271
await firstValueFrom ( state . observable . pipe ( filter ( ( i ) => i !== undefined ) ) )
@@ -289,7 +302,7 @@ describe('queryStore', () => {
289
302
)
290
303
291
304
const query = '*[_type == "movie"]'
292
- const state = getQueryState ( instance , { query} )
305
+ const state = getQueryState ( instance , { query, source , perspective : 'drafts' } )
293
306
const unsubscribe = state . subscribe ( )
294
307
295
308
// Verify error is thrown when accessing state
@@ -300,7 +313,7 @@ describe('queryStore', () => {
300
313
301
314
it ( 'delays query state removal after unsubscribe' , async ( ) => {
302
315
const query = '*[_type == "movie"]'
303
- const state = getQueryState ( instance , { query} )
316
+ const state = getQueryState ( instance , { query, source , perspective : 'drafts' } )
304
317
const unsubscribe = state . subscribe ( )
305
318
306
319
await firstValueFrom ( state . observable . pipe ( filter ( ( i ) => i !== undefined ) ) )
@@ -316,7 +329,7 @@ describe('queryStore', () => {
316
329
317
330
it ( 'preserves query state if a new subscriber subscribes before cleanup delay' , async ( ) => {
318
331
const query = '*[_type == "movie"]'
319
- const state = getQueryState ( instance , { query} )
332
+ const state = getQueryState ( instance , { query, source , perspective : 'drafts' } )
320
333
const unsubscribe1 = state . subscribe ( )
321
334
322
335
await firstValueFrom ( state . observable . pipe ( filter ( ( i ) => i !== undefined ) ) )
@@ -352,22 +365,16 @@ describe('queryStore', () => {
352
365
SanityClient [ 'observable' ] [ 'fetch' ]
353
366
>
354
367
} ) as SanityClient [ 'observable' ] [ 'fetch' ] )
355
-
356
- const draftsInstance = createSanityInstance ( {
357
- projectId : 'test ' ,
358
- dataset : 'test' ,
368
+ // Same query/options, different implicit perspectives via instance.config
369
+ const sDrafts = getQueryState < { _id : string } [ ] > ( instance , {
370
+ query : '*[_type == "movie"] ' ,
371
+ source ,
359
372
perspective : 'drafts' ,
360
373
} )
361
- const publishedInstance = createSanityInstance ( {
362
- projectId : 'test' ,
363
- dataset : 'test' ,
364
- perspective : 'published' ,
365
- } )
366
-
367
- // Same query/options, different implicit perspectives via instance.config
368
- const sDrafts = getQueryState < { _id : string } [ ] > ( draftsInstance , { query : '*[_type == "movie"]' } )
369
- const sPublished = getQueryState < { _id : string } [ ] > ( publishedInstance , {
374
+ const sPublished = getQueryState < { _id : string } [ ] > ( instance , {
370
375
query : '*[_type == "movie"]' ,
376
+ source,
377
+ perspective : 'published' ,
371
378
} )
372
379
373
380
const unsubDrafts = sDrafts . subscribe ( )
@@ -385,9 +392,6 @@ describe('queryStore', () => {
385
392
386
393
unsubDrafts ( )
387
394
unsubPublished ( )
388
-
389
- draftsInstance . dispose ( )
390
- publishedInstance . dispose ( )
391
395
} )
392
396
393
397
it ( 'separates cache entries by explicit perspective in options' , async ( ) => {
@@ -403,10 +407,12 @@ describe('queryStore', () => {
403
407
404
408
const sDrafts = getQueryState < { _id : string } [ ] > ( base , {
405
409
query : '*[_type == "movie"]' ,
410
+ source,
406
411
perspective : 'drafts' ,
407
412
} )
408
413
const sPublished = getQueryState < { _id : string } [ ] > ( base , {
409
414
query : '*[_type == "movie"]' ,
415
+ source,
410
416
perspective : 'published' ,
411
417
} )
412
418
0 commit comments