@@ -319,6 +319,71 @@ describe('useDataProvider', () => {
319
319
expect ( onFailure . mock . calls [ 0 ] [ 0 ] ) . toEqual ( new Error ( 'foo' ) ) ;
320
320
} ) ;
321
321
322
+ it ( 'should accept an enabled option to block the query until a condition is met' , async ( ) => {
323
+ const UseGetOneWithEnabled = ( ) => {
324
+ const [ data , setData ] = useState ( ) ;
325
+ const [ error , setError ] = useState ( ) ;
326
+ const [ isEnabled , setIsEnabled ] = useState ( false ) ;
327
+ const dataProvider = useDataProvider ( ) ;
328
+ useEffect ( ( ) => {
329
+ dataProvider
330
+ . getOne ( 'dummy' , { } , { enabled : isEnabled } )
331
+ . then ( res => {
332
+ if ( res ) {
333
+ // @fzaninotto I don't think this is correct
334
+ // because we return a empty resolved Promise,
335
+ // res is undefined here
336
+ setData ( res . data ) ;
337
+ }
338
+ } )
339
+ . catch ( e => setError ( e ) ) ;
340
+ } , [ dataProvider , isEnabled ] ) ;
341
+
342
+ let content = < div data-testid = "loading" > loading</ div > ;
343
+ if ( error )
344
+ content = < div data-testid = "error" > { error . message } </ div > ;
345
+ if ( data )
346
+ content = (
347
+ < div data-testid = "data" > { JSON . stringify ( data ) } </ div >
348
+ ) ;
349
+ return (
350
+ < div >
351
+ { content }
352
+ < button onClick = { ( ) => setIsEnabled ( e => ! e ) } >
353
+ toggle
354
+ </ button >
355
+ </ div >
356
+ ) ;
357
+ } ;
358
+ const getOne = jest
359
+ . fn ( )
360
+ . mockResolvedValue ( { data : { id : 1 , title : 'foo' } } ) ;
361
+ const dataProvider = { getOne } ;
362
+ const { queryByTestId, getByRole } = renderWithRedux (
363
+ < DataProviderContext . Provider value = { dataProvider } >
364
+ < UseGetOneWithEnabled />
365
+ </ DataProviderContext . Provider >
366
+ ) ;
367
+ expect ( queryByTestId ( 'loading' ) ) . not . toBeNull ( ) ;
368
+ await act ( async ( ) => {
369
+ await new Promise ( resolve => setTimeout ( resolve ) ) ;
370
+ } ) ;
371
+ expect ( getOne ) . not . toBeCalled ( ) ;
372
+ expect ( queryByTestId ( 'loading' ) ) . not . toBeNull ( ) ;
373
+
374
+ // enable the query
375
+ fireEvent . click ( getByRole ( 'button' , { name : 'toggle' } ) ) ;
376
+
377
+ await act ( async ( ) => {
378
+ await new Promise ( resolve => setTimeout ( resolve ) ) ;
379
+ } ) ;
380
+ expect ( getOne ) . toBeCalledTimes ( 1 ) ;
381
+ expect ( queryByTestId ( 'loading' ) ) . toBeNull ( ) ;
382
+ expect ( queryByTestId ( 'data' ) . textContent ) . toBe (
383
+ '{"id":1,"title":"foo"}'
384
+ ) ;
385
+ } ) ;
386
+
322
387
describe ( 'mutationMode' , ( ) => {
323
388
it ( 'should wait for response to dispatch side effects in pessimistic mode' , async ( ) => {
324
389
let resolveUpdate ;
0 commit comments