@@ -117,6 +117,69 @@ describe('useOnyx', () => {
117117 expect ( result . current [ 0 ] ) . toBeUndefined ( ) ;
118118 expect ( result . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
119119 } ) ;
120+
121+ it ( 'should return the new value when switching from a key with data to another key with different data' , async ( ) => {
122+ Onyx . set ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 1` , 'value_one' ) ;
123+ Onyx . set ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 2` , 'value_two' ) ;
124+
125+ const { result, rerender} = renderHook ( ( key : string ) => useOnyx ( key ) , { initialProps : `${ ONYXKEYS . COLLECTION . TEST_KEY } 1` as string } ) ;
126+
127+ await act ( async ( ) => waitForPromisesToResolve ( ) ) ;
128+
129+ expect ( result . current [ 0 ] ) . toEqual ( 'value_one' ) ;
130+ expect ( result . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
131+
132+ // Switch to another key that also has data
133+ rerender ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 2` ) ;
134+
135+ await act ( async ( ) => waitForPromisesToResolve ( ) ) ;
136+
137+ expect ( result . current [ 0 ] ) . toEqual ( 'value_two' ) ;
138+ expect ( result . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
139+ } ) ;
140+
141+ it ( 'should apply the selector against the new key data when switching keys' , async ( ) => {
142+ Onyx . set ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 1` , { id : 'entry1_id' , name : 'entry1_name' } ) ;
143+ Onyx . set ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 2` , { id : 'entry2_id' , name : 'entry2_name' } ) ;
144+
145+ const selector = ( ( entry : OnyxEntry < { id : string ; name : string } > ) => entry ?. name ) as UseOnyxSelector < OnyxKey , string | undefined > ;
146+
147+ const { result, rerender} = renderHook ( ( key : string ) => useOnyx ( key , { selector} ) , { initialProps : `${ ONYXKEYS . COLLECTION . TEST_KEY } 1` as string } ) ;
148+
149+ await act ( async ( ) => waitForPromisesToResolve ( ) ) ;
150+
151+ expect ( result . current [ 0 ] ) . toEqual ( 'entry1_name' ) ;
152+ expect ( result . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
153+
154+ // Switch key — selector should run against the new key's data
155+ rerender ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 2` ) ;
156+
157+ await act ( async ( ) => waitForPromisesToResolve ( ) ) ;
158+
159+ expect ( result . current [ 0 ] ) . toEqual ( 'entry2_name' ) ;
160+ expect ( result . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
161+ } ) ;
162+
163+ it ( 'should handle rapid key switching and settle on the final key value' , async ( ) => {
164+ Onyx . set ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 1` , 'value_one' ) ;
165+ Onyx . set ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 2` , 'value_two' ) ;
166+ Onyx . set ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 3` , 'value_three' ) ;
167+
168+ const { result, rerender} = renderHook ( ( key : string ) => useOnyx ( key ) , { initialProps : `${ ONYXKEYS . COLLECTION . TEST_KEY } 1` as string } ) ;
169+
170+ await act ( async ( ) => waitForPromisesToResolve ( ) ) ;
171+
172+ expect ( result . current [ 0 ] ) . toEqual ( 'value_one' ) ;
173+
174+ // Rapidly switch keys without waiting for promises between switches
175+ rerender ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 2` ) ;
176+ rerender ( `${ ONYXKEYS . COLLECTION . TEST_KEY } 3` ) ;
177+
178+ await act ( async ( ) => waitForPromisesToResolve ( ) ) ;
179+
180+ expect ( result . current [ 0 ] ) . toEqual ( 'value_three' ) ;
181+ expect ( result . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
182+ } ) ;
120183 } ) ;
121184
122185 describe ( 'misc' , ( ) => {
0 commit comments