22 * @vitest -environment jsdom
33 */
44import { act } from 'react'
5+ import { NuqsTestingAdapter } from 'nuqs/adapters/testing'
56import { createRoot , type Root } from 'react-dom/client'
67import { afterEach , beforeEach , describe , expect , it , vi } from 'vitest'
78import { filesListPreferenceConfig } from '@/app/workspace/[workspaceId]/files/search-params'
@@ -30,12 +31,13 @@ interface HookProps {
3031
3132const mountedRoots : Root [ ] = [ ]
3233
33- function renderPreferenceHook ( props : HookProps ) {
34+ function renderPreferenceHook ( props : HookProps , searchParams = '' ) {
3435 ; ( globalThis as { IS_REACT_ACT_ENVIRONMENT ?: boolean } ) . IS_REACT_ACT_ENVIRONMENT = true
3536 const root = createRoot ( document . createElement ( 'div' ) )
3637 mountedRoots . push ( root )
3738 let result : ReturnType < typeof useResourceListPreferences >
3839 let currentProps = props
40+ let currentSearchParams = searchParams
3941
4042 function Probe ( ) {
4143 result = useResourceListPreferences ( {
@@ -46,14 +48,21 @@ function renderPreferenceHook(props: HookProps) {
4648 return null
4749 }
4850
49- act ( ( ) => root . render ( < Probe /> ) )
51+ const renderProbe = ( ) => (
52+ < NuqsTestingAdapter hasMemory searchParams = { currentSearchParams } >
53+ < Probe />
54+ </ NuqsTestingAdapter >
55+ )
56+
57+ act ( ( ) => root . render ( renderProbe ( ) ) )
5058 return {
5159 get current ( ) {
5260 return result
5361 } ,
54- rerender ( nextProps : HookProps ) {
62+ rerender ( nextProps : HookProps , nextSearchParams = currentSearchParams ) {
5563 currentProps = nextProps
56- act ( ( ) => root . render ( < Probe /> ) )
64+ currentSearchParams = nextSearchParams
65+ act ( ( ) => root . render ( renderProbe ( ) ) )
5766 } ,
5867 }
5968}
@@ -112,6 +121,23 @@ describe('useResourceListPreferences', () => {
112121 expect ( applyPreference ) . not . toHaveBeenCalled ( )
113122 } )
114123
124+ it . each ( [ 'sort=updated&dir=desc' , 'uploaded-by=' ] ) (
125+ 'honors explicitly default-valued URL state instead of restoring a saved preference (%s)' ,
126+ async ( searchParams ) => {
127+ seedPreference ( filteredPreference )
128+ const applyPreference = vi . fn ( )
129+ const result = renderPreferenceHook (
130+ { preference : defaultPreference , applyPreference } ,
131+ searchParams
132+ )
133+
134+ expect ( result . current . isReady ) . toBe ( true )
135+ await flushEffects ( )
136+ expect ( applyPreference ) . not . toHaveBeenCalled ( )
137+ expect ( useResourceListPreferencesStore . getState ( ) . preferences ) . toEqual ( { } )
138+ }
139+ )
140+
115141 it ( 'starts restoring a saved preference once on a clean visit' , async ( ) => {
116142 seedPreference ( filteredPreference )
117143 const applyPreference = vi . fn ( )
@@ -140,6 +166,23 @@ describe('useResourceListPreferences', () => {
140166 expect ( applyPreference ) . toHaveBeenCalledOnce ( )
141167 } )
142168
169+ it ( 'lets an explicit URL change cancel a pending saved-preference restoration' , async ( ) => {
170+ seedPreference ( filteredPreference )
171+ const applyPreference = vi . fn ( )
172+ const result = renderPreferenceHook ( { preference : defaultPreference , applyPreference } )
173+
174+ await flushEffects ( )
175+ expect ( result . current . isReady ) . toBe ( false )
176+ expect ( applyPreference ) . toHaveBeenCalledWith ( filteredPreference )
177+
178+ result . rerender ( { preference : defaultPreference , applyPreference } , 'sort=updated&dir=desc' )
179+ await flushEffects ( )
180+
181+ expect ( result . current . isReady ) . toBe ( true )
182+ expect ( applyPreference ) . toHaveBeenCalledOnce ( )
183+ expect ( useResourceListPreferencesStore . getState ( ) . preferences ) . toEqual ( { } )
184+ } )
185+
143186 it ( 'stays unready while a clean entry waits for hydration' , ( ) => {
144187 vi . spyOn ( useResourceListPreferencesStore . persist , 'rehydrate' ) . mockImplementation (
145188 ( ) => new Promise ( ( ) => undefined )
@@ -308,4 +351,8 @@ describe('module list preference configs', () => {
308351 filters : Object . fromEntries ( keys . map ( ( key ) => [ key , [ ] ] ) ) ,
309352 } )
310353 } )
354+
355+ it ( 'reuses the Files filter URL alias when detecting explicit preferences' , ( ) => {
356+ expect ( filesListPreferenceConfig . preferenceUrlKeys ) . toEqual ( { uploadedBy : 'uploaded-by' } )
357+ } )
311358} )
0 commit comments