1+ import { QueryClient } from "@tanstack/react-query" ;
12import type { ReactNode } from "react" ;
23import { act } from "react" ;
34import { createRoot } from "react-dom/client" ;
@@ -50,10 +51,20 @@ function createAdapter(): Adapter {
5051 } as unknown as Adapter ;
5152}
5253
53- function renderHarness ( props ?: { streamsUrl ?: string } ) {
54+ type RenderHarnessProps = {
55+ adapter ?: Adapter ;
56+ hasDatabase ?: boolean ;
57+ streamsUrl ?: string ;
58+ } ;
59+
60+ function renderHarness ( props ?: RenderHarnessProps ) {
5461 const container = document . createElement ( "div" ) ;
5562 document . body . appendChild ( container ) ;
5663 const root = createRoot ( container ) ;
64+ let currentProps = {
65+ ...props ,
66+ adapter : props ?. adapter ?? createAdapter ( ) ,
67+ } ;
5768
5869 let latestStudio : ReturnType < typeof useStudio > | undefined ;
5970
@@ -62,15 +73,20 @@ function renderHarness(props?: { streamsUrl?: string }) {
6273 return null ;
6374 }
6475
65- act ( ( ) => {
76+ function render ( ) {
6677 root . render (
6778 < StudioContextProvider
68- adapter = { createAdapter ( ) }
69- streamsUrl = { props ?. streamsUrl }
79+ adapter = { currentProps . adapter }
80+ hasDatabase = { currentProps . hasDatabase }
81+ streamsUrl = { currentProps . streamsUrl }
7082 >
7183 < Harness />
7284 </ StudioContextProvider > ,
7385 ) ;
86+ }
87+
88+ act ( ( ) => {
89+ render ( ) ;
7490 } ) ;
7591
7692 return {
@@ -83,6 +99,16 @@ function renderHarness(props?: { streamsUrl?: string }) {
8399 getLatestStudio ( ) {
84100 return latestStudio ;
85101 } ,
102+ rerender ( nextProps : RenderHarnessProps ) {
103+ currentProps = {
104+ ...currentProps ,
105+ ...nextProps ,
106+ } ;
107+
108+ act ( ( ) => {
109+ render ( ) ;
110+ } ) ;
111+ } ,
86112 } ;
87113}
88114
@@ -170,6 +196,33 @@ afterEach(() => {
170196 . VERSION_INJECTED_AT_BUILD_TIME ;
171197} ) ;
172198
199+ describe ( "StudioContextProvider database cache lifecycle" , ( ) => {
200+ it ( "resets cached queries only after the database configuration changes" , ( ) => {
201+ const resetQueriesSpy = vi
202+ . spyOn ( QueryClient . prototype , "resetQueries" )
203+ . mockResolvedValue ( ) ;
204+ const initialAdapter = createAdapter ( ) ;
205+ const harness = renderHarness ( { adapter : initialAdapter } ) ;
206+
207+ try {
208+ expect ( resetQueriesSpy ) . not . toHaveBeenCalled ( ) ;
209+
210+ const nextAdapter = createAdapter ( ) ;
211+ harness . rerender ( { adapter : nextAdapter } ) ;
212+ expect ( resetQueriesSpy ) . toHaveBeenCalledTimes ( 1 ) ;
213+
214+ harness . rerender ( { adapter : nextAdapter } ) ;
215+ expect ( resetQueriesSpy ) . toHaveBeenCalledTimes ( 1 ) ;
216+
217+ harness . rerender ( { adapter : nextAdapter , hasDatabase : false } ) ;
218+ expect ( resetQueriesSpy ) . toHaveBeenCalledTimes ( 2 ) ;
219+ } finally {
220+ harness . cleanup ( ) ;
221+ resetQueriesSpy . mockRestore ( ) ;
222+ }
223+ } ) ;
224+ } ) ;
225+
173226describe ( "StudioContextProvider pagination preferences" , ( ) => {
174227 it ( "persists shared page-size and infinite-scroll preferences across remounts" , ( ) => {
175228 const firstHarness = renderHarness ( ) ;
0 commit comments