@@ -469,4 +469,110 @@ describe('Devtools', () => {
469469 expect ( rendered . queryByRole ( 'tooltip' ) ) . not . toBeInTheDocument ( )
470470 } )
471471 } )
472+
473+ describe ( 'query details' , ( ) => {
474+ it ( 'should open the query details panel when a query row is clicked' , ( ) => {
475+ queryClient . setQueryData ( [ 'posts' ] , [ { id : 1 } ] )
476+ const rendered = renderDevtools ( { initialIsOpen : true } )
477+
478+ fireEvent . click ( rendered . getByLabelText ( / Q u e r y k e y \[ " p o s t s " \] / ) )
479+
480+ expect ( rendered . getByText ( 'Query Details' ) ) . toBeInTheDocument ( )
481+ } )
482+
483+ it ( 'should close the query details panel when the same row is clicked again' , ( ) => {
484+ queryClient . setQueryData ( [ 'details-toggle' ] , [ { id : 1 } ] )
485+ const rendered = renderDevtools ( { initialIsOpen : true } )
486+
487+ fireEvent . click ( rendered . getByLabelText ( / Q u e r y k e y \[ " d e t a i l s - t o g g l e " \] / ) )
488+ fireEvent . click ( rendered . getByLabelText ( / Q u e r y k e y \[ " d e t a i l s - t o g g l e " \] / ) )
489+
490+ expect ( rendered . queryByText ( 'Query Details' ) ) . not . toBeInTheDocument ( )
491+ } )
492+ } )
493+
494+ describe ( 'query actions' , ( ) => {
495+ it ( 'should remove the query when the "Remove" button is clicked' , ( ) => {
496+ queryClient . setQueryData ( [ 'action-remove' ] , [ { id : 1 } ] )
497+ const rendered = renderDevtools ( { initialIsOpen : true } )
498+
499+ fireEvent . click ( rendered . getByLabelText ( / Q u e r y k e y \[ " a c t i o n - r e m o v e " \] / ) )
500+ fireEvent . click ( rendered . getByText ( 'Remove' ) )
501+
502+ expect (
503+ rendered . queryByLabelText ( / Q u e r y k e y \[ " a c t i o n - r e m o v e " \] / ) ,
504+ ) . not . toBeInTheDocument ( )
505+ } )
506+
507+ it ( 'should reset the query when the "Reset" button is clicked' , ( ) => {
508+ queryClient . setQueryData ( [ 'action-reset' ] , [ { id : 1 } ] )
509+ const rendered = renderDevtools ( { initialIsOpen : true } )
510+
511+ fireEvent . click ( rendered . getByLabelText ( / Q u e r y k e y \[ " a c t i o n - r e s e t " \] / ) )
512+ fireEvent . click ( rendered . getByText ( 'Reset' ) )
513+
514+ expect ( queryClient . getQueryData ( [ 'action-reset' ] ) ) . toBeUndefined ( )
515+ } )
516+
517+ it ( 'should invalidate the query when the "Invalidate" button is clicked' , ( ) => {
518+ queryClient . setQueryData ( [ 'action-invalidate' ] , [ { id : 1 } ] )
519+ const rendered = renderDevtools ( { initialIsOpen : true } )
520+
521+ fireEvent . click (
522+ rendered . getByLabelText ( / Q u e r y k e y \[ " a c t i o n - i n v a l i d a t e " \] / ) ,
523+ )
524+ fireEvent . click ( rendered . getByText ( 'Invalidate' ) )
525+
526+ expect (
527+ queryClient . getQueryState ( [ 'action-invalidate' ] ) ?. isInvalidated ,
528+ ) . toBe ( true )
529+ } )
530+
531+ it ( 'should dispatch a "REFETCH" event when "Refetch" is clicked' , ( ) => {
532+ queryClient . setQueryData ( [ 'action-refetch' ] , [ { id : 1 } ] )
533+ const rendered = renderDevtools ( { initialIsOpen : true } )
534+
535+ const listener = vi . fn ( )
536+ window . addEventListener ( '@tanstack/query-devtools-event' , listener )
537+
538+ try {
539+ fireEvent . click (
540+ rendered . getByLabelText ( / Q u e r y k e y \[ " a c t i o n - r e f e t c h " \] / ) ,
541+ )
542+ fireEvent . click ( rendered . getByText ( 'Refetch' ) )
543+
544+ const dispatched = listener . mock . calls . some (
545+ ( [ e ] ) => ( e as CustomEvent ) . detail . type === 'REFETCH' ,
546+ )
547+ expect ( dispatched ) . toBe ( true )
548+ } finally {
549+ window . removeEventListener ( '@tanstack/query-devtools-event' , listener )
550+ }
551+ } )
552+
553+ it ( 'should set the query status to "error" when "Trigger Error" is clicked' , ( ) => {
554+ queryClient . setQueryData ( [ 'action-error' ] , [ { id : 1 } ] )
555+ const rendered = renderDevtools ( { initialIsOpen : true } )
556+
557+ fireEvent . click ( rendered . getByLabelText ( / Q u e r y k e y \[ " a c t i o n - e r r o r " \] / ) )
558+ fireEvent . click ( rendered . getByText ( 'Trigger Error' ) )
559+
560+ expect ( queryClient . getQueryState ( [ 'action-error' ] ) ?. status ) . toBe ( 'error' )
561+ } )
562+
563+ it ( 'should restore the query status when "Restore Error" is clicked after "Trigger Error"' , ( ) => {
564+ queryClient . setQueryData ( [ 'action-restore-error' ] , [ { id : 1 } ] )
565+ const rendered = renderDevtools ( { initialIsOpen : true } )
566+
567+ fireEvent . click (
568+ rendered . getByLabelText ( / Q u e r y k e y \[ " a c t i o n - r e s t o r e - e r r o r " \] / ) ,
569+ )
570+ fireEvent . click ( rendered . getByText ( 'Trigger Error' ) )
571+ fireEvent . click ( rendered . getByText ( 'Restore Error' ) )
572+
573+ expect ( queryClient . getQueryState ( [ 'action-restore-error' ] ) ?. status ) . toBe (
574+ 'pending' ,
575+ )
576+ } )
577+ } )
472578} )
0 commit comments