@@ -414,6 +414,99 @@ describe("AppProviders lifecycle recovery", () => {
414414 expect ( sendCommand ) . toHaveBeenCalledWith ( "settings.get" , { } , undefined ) ;
415415 } ) ;
416416
417+ it ( "preserves a newer local terminal copy-on-select update when startup hydration resolves later" , async ( ) => {
418+ const store = createStore ( ) ;
419+ setVisibilityState ( "visible" ) ;
420+
421+ let resolveSettingsGet : ( ( value : Record < string , unknown > ) => void ) | undefined ;
422+ const settingsGetPromise = new Promise < Record < string , unknown > > ( ( resolve ) => {
423+ resolveSettingsGet = resolve ;
424+ } ) ;
425+ const sendCommand = vi . fn ( ) . mockImplementation ( async ( op : string ) => {
426+ if ( op === "settings.get" ) {
427+ return await settingsGetPromise ;
428+ }
429+
430+ return undefined ;
431+ } ) ;
432+ wsState . client ! . sendCommand = sendCommand ;
433+
434+ renderProviders ( store ) ;
435+
436+ await vi . waitFor ( ( ) => {
437+ expect ( wsState . client ?. connect ) . toHaveBeenCalled ( ) ;
438+ } ) ;
439+
440+ act ( ( ) => {
441+ wsState . client ?. statusHandler ?.( "connected" ) ;
442+ } ) ;
443+
444+ await vi . waitFor ( ( ) => {
445+ expect ( sendCommand ) . toHaveBeenCalledWith ( "settings.get" , { } , undefined ) ;
446+ } ) ;
447+
448+ act ( ( ) => {
449+ store . set ( terminalPreferencesAtom , { copyOnSelect : true } ) ;
450+ } ) ;
451+
452+ await act ( async ( ) => {
453+ resolveSettingsGet ?.( { } ) ;
454+ await settingsGetPromise ;
455+ } ) ;
456+
457+ expect ( store . get ( terminalPreferencesAtom ) ) . toEqual ( { copyOnSelect : true } ) ;
458+ } ) ;
459+
460+ it ( "preserves an ABA local terminal copy-on-select update when startup hydration resolves later" , async ( ) => {
461+ const store = createStore ( ) ;
462+ setVisibilityState ( "visible" ) ;
463+
464+ act ( ( ) => {
465+ store . set ( terminalPreferencesAtom , { copyOnSelect : true } ) ;
466+ } ) ;
467+
468+ let resolveSettingsGet : ( ( value : Record < string , unknown > ) => void ) | undefined ;
469+ const settingsGetPromise = new Promise < Record < string , unknown > > ( ( resolve ) => {
470+ resolveSettingsGet = resolve ;
471+ } ) ;
472+ const sendCommand = vi . fn ( ) . mockImplementation ( async ( op : string ) => {
473+ if ( op === "settings.get" ) {
474+ return await settingsGetPromise ;
475+ }
476+
477+ return undefined ;
478+ } ) ;
479+ wsState . client ! . sendCommand = sendCommand ;
480+
481+ renderProviders ( store ) ;
482+
483+ await vi . waitFor ( ( ) => {
484+ expect ( wsState . client ?. connect ) . toHaveBeenCalled ( ) ;
485+ } ) ;
486+
487+ act ( ( ) => {
488+ wsState . client ?. statusHandler ?.( "connected" ) ;
489+ } ) ;
490+
491+ await vi . waitFor ( ( ) => {
492+ expect ( sendCommand ) . toHaveBeenCalledWith ( "settings.get" , { } , undefined ) ;
493+ } ) ;
494+
495+ act ( ( ) => {
496+ store . set ( terminalPreferencesAtom , { copyOnSelect : false } ) ;
497+ store . set ( terminalPreferencesAtom , { copyOnSelect : true } ) ;
498+ } ) ;
499+
500+ await act ( async ( ) => {
501+ resolveSettingsGet ?.( {
502+ "appearance.terminalCopyOnSelect" : false ,
503+ } ) ;
504+ await settingsGetPromise ;
505+ } ) ;
506+
507+ expect ( store . get ( terminalPreferencesAtom ) ) . toEqual ( { copyOnSelect : true } ) ;
508+ } ) ;
509+
417510 it ( "marks the session authenticated when /auth/status confirms an existing server session" , async ( ) => {
418511 globalThis . fetch = vi . fn ( ) . mockResolvedValue ( {
419512 json : async ( ) => ( { authEnabled : true , authenticated : true } ) ,
0 commit comments