11import { act , renderHook } from '@testing-library/react-native' ;
2- import type { OnyxCollection , OnyxEntry } from '../../lib' ;
2+ import type { OnyxCollection , OnyxEntry , OnyxKey } from '../../lib' ;
33import Onyx , { useOnyx } from '../../lib' ;
44import OnyxCache from '../../lib/OnyxCache' ;
55import StorageMock from '../../lib/storage' ;
66import type GenericCollection from '../utils/GenericCollection' ;
77import waitForPromisesToResolve from '../utils/waitForPromisesToResolve' ;
88import * as Logger from '../../lib/Logger' ;
99import onyxSnapshotCache from '../../lib/OnyxSnapshotCache' ;
10+ import type { UseOnyxSelector } from '../../lib/useOnyx' ;
1011
1112const ONYXKEYS = {
1213 TEST_KEY : 'test' ,
@@ -236,7 +237,7 @@ describe('useOnyx', () => {
236237 expect ( result2 . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
237238 } ) ;
238239
239- it ( 'should return updated state when connecting to the same key after an Onyx.clear() call' , async ( ) => {
240+ it ( 'should return updated state when connecting to the same regular key after an Onyx.clear() call' , async ( ) => {
240241 await StorageMock . setItem ( ONYXKEYS . TEST_KEY , 'test' ) ;
241242
242243 const { result : result1 } = renderHook ( ( ) => useOnyx ( ONYXKEYS . TEST_KEY ) ) ;
@@ -270,6 +271,41 @@ describe('useOnyx', () => {
270271 expect ( result3 . current [ 0 ] ) . toEqual ( 'test2' ) ;
271272 expect ( result3 . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
272273 } ) ;
274+
275+ it ( 'should return updated state when connecting to the same colection member key after an Onyx.clear() call' , async ( ) => {
276+ await StorageMock . setItem < string > ( `${ ONYXKEYS . COLLECTION . TEST_KEY } entry1` , 'test' ) ;
277+
278+ const { result : result1 } = renderHook ( ( ) => useOnyx ( `${ ONYXKEYS . COLLECTION . TEST_KEY } entry1` ) ) ;
279+
280+ await act ( async ( ) => waitForPromisesToResolve ( ) ) ;
281+
282+ expect ( result1 . current [ 0 ] ) . toEqual ( 'test' ) ;
283+ expect ( result1 . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
284+
285+ await act ( async ( ) => Onyx . clear ( ) ) ;
286+
287+ const { result : result2 } = renderHook ( ( ) => useOnyx ( `${ ONYXKEYS . COLLECTION . TEST_KEY } entry1` ) ) ;
288+ const { result : result3 } = renderHook ( ( ) => useOnyx ( `${ ONYXKEYS . COLLECTION . TEST_KEY } entry1` ) ) ;
289+
290+ await act ( async ( ) => waitForPromisesToResolve ( ) ) ;
291+
292+ expect ( result1 . current [ 0 ] ) . toBeUndefined ( ) ;
293+ expect ( result1 . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
294+ expect ( result2 . current [ 0 ] ) . toBeUndefined ( ) ;
295+ expect ( result2 . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
296+ expect ( result3 . current [ 0 ] ) . toBeUndefined ( ) ;
297+ expect ( result3 . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
298+
299+ Onyx . merge ( `${ ONYXKEYS . COLLECTION . TEST_KEY } entry1` , 'test2' ) ;
300+ await act ( async ( ) => waitForPromisesToResolve ( ) ) ;
301+
302+ expect ( result1 . current [ 0 ] ) . toEqual ( 'test2' ) ;
303+ expect ( result1 . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
304+ expect ( result2 . current [ 0 ] ) . toEqual ( 'test2' ) ;
305+ expect ( result2 . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
306+ expect ( result3 . current [ 0 ] ) . toEqual ( 'test2' ) ;
307+ expect ( result3 . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
308+ } ) ;
273309 } ) ;
274310
275311 describe ( 'selector' , ( ) => {
@@ -278,8 +314,7 @@ describe('useOnyx', () => {
278314
279315 const { result} = renderHook ( ( ) =>
280316 useOnyx ( ONYXKEYS . TEST_KEY , {
281- // @ts -expect-error bypass
282- selector : ( entry : OnyxEntry < { id : string ; name : string } > ) => `id - ${ entry ?. id } , name - ${ entry ?. name } ` ,
317+ selector : ( ( entry : OnyxEntry < { id : string ; name : string } > ) => `id - ${ entry ?. id } , name - ${ entry ?. name } ` ) as UseOnyxSelector < OnyxKey , string > ,
283318 } ) ,
284319 ) ;
285320
@@ -301,12 +336,11 @@ describe('useOnyx', () => {
301336
302337 const { result} = renderHook ( ( ) =>
303338 useOnyx ( ONYXKEYS . COLLECTION . TEST_KEY , {
304- // @ts -expect-error bypass
305- selector : ( entries : OnyxCollection < { id : string ; name : string } > ) =>
339+ selector : ( ( entries : OnyxCollection < { id : string ; name : string } > ) =>
306340 Object . entries ( entries ?? { } ) . reduce < NonNullable < OnyxCollection < string > > > ( ( acc , [ key , value ] ) => {
307341 acc [ key ] = value ?. id ;
308342 return acc ;
309- } , { } ) ,
343+ } , { } ) ) as UseOnyxSelector < OnyxKey , NonNullable < OnyxCollection < string > > > ,
310344 } ) ,
311345 ) ;
312346
@@ -334,24 +368,21 @@ describe('useOnyx', () => {
334368 // primitive
335369 const { result : primitiveResult } = renderHook ( ( ) =>
336370 useOnyx ( ONYXKEYS . TEST_KEY , {
337- // @ts -expect-error bypass
338- selector : ( entry : OnyxEntry < { id : string ; name : string } > ) => entry ?. id ,
371+ selector : ( ( entry : OnyxEntry < { id : string ; name : string } > ) => entry ?. id ) as UseOnyxSelector < OnyxKey , string > ,
339372 } ) ,
340373 ) ;
341374
342375 // object
343376 const { result : objectResult } = renderHook ( ( ) =>
344377 useOnyx ( ONYXKEYS . TEST_KEY , {
345- // @ts -expect-error bypass
346- selector : ( entry : OnyxEntry < { id : string ; name : string } > ) => ( { id : entry ?. id } ) ,
378+ selector : ( ( entry : OnyxEntry < { id : string ; name : string } > ) => ( { id : entry ?. id } ) ) as UseOnyxSelector < OnyxKey , { id ?: string } > ,
347379 } ) ,
348380 ) ;
349381
350382 // array
351383 const { result : arrayResult } = renderHook ( ( ) =>
352384 useOnyx ( ONYXKEYS . TEST_KEY , {
353- // @ts -expect-error bypass
354- selector : ( entry : OnyxEntry < { id : string ; name : string } > ) => [ { id : entry ?. id } ] ,
385+ selector : ( ( entry : OnyxEntry < { id : string ; name : string } > ) => [ { id : entry ?. id } ] ) as UseOnyxSelector < OnyxKey , Array < { id ?: string } > > ,
355386 } ) ,
356387 ) ;
357388
@@ -378,8 +409,7 @@ describe('useOnyx', () => {
378409
379410 const { result} = renderHook ( ( ) =>
380411 useOnyx ( ONYXKEYS . COLLECTION . TEST_KEY , {
381- // @ts -expect-error bypass
382- selector : ( entry : OnyxEntry < { id : string ; name : string } > ) => ( { id : entry ?. id } ) ,
412+ selector : ( ( entry : OnyxEntry < { id : string ; name : string } > ) => ( { id : entry ?. id } ) ) as UseOnyxSelector < OnyxKey , { id ?: string } > ,
383413 } ) ,
384414 ) ;
385415
@@ -396,19 +426,18 @@ describe('useOnyx', () => {
396426 it ( 'should always use the current selector reference to return new data' , async ( ) => {
397427 Onyx . set ( ONYXKEYS . TEST_KEY , { id : 'test_id' , name : 'test_name' } ) ;
398428
399- let selector = ( entry : OnyxEntry < { id : string ; name : string } > ) => `id - ${ entry ?. id } , name - ${ entry ?. name } ` ;
429+ let selector = ( ( entry : OnyxEntry < { id : string ; name : string } > ) => `id - ${ entry ?. id } , name - ${ entry ?. name } ` ) as UseOnyxSelector < OnyxKey , string > ;
400430
401431 const { result, rerender} = renderHook ( ( ) =>
402432 useOnyx ( ONYXKEYS . TEST_KEY , {
403- // @ts -expect-error bypass
404433 selector,
405434 } ) ,
406435 ) ;
407436
408437 expect ( result . current [ 0 ] ) . toEqual ( 'id - test_id, name - test_name' ) ;
409438 expect ( result . current [ 1 ] . status ) . toEqual ( 'loaded' ) ;
410439
411- selector = ( entry : OnyxEntry < { id : string ; name : string } > ) => `id - ${ entry ?. id } , name - ${ entry ?. name } - selector changed` ;
440+ selector = ( ( entry : OnyxEntry < { id : string ; name : string } > ) => `id - ${ entry ?. id } , name - ${ entry ?. name } - selector changed` ) as UseOnyxSelector < OnyxKey , string > ;
412441 rerender ( undefined ) ;
413442
414443 expect ( result . current [ 0 ] ) . toEqual ( 'id - test_id, name - test_name - selector changed' ) ;
@@ -420,11 +449,10 @@ describe('useOnyx', () => {
420449
421450 const { result} = renderHook ( ( ) =>
422451 useOnyx ( ONYXKEYS . TEST_KEY , {
423- // @ts -expect-error bypass
424- selector : ( entry : OnyxEntry < { id : string ; name : string ; count : number } > ) => ( {
452+ selector : ( ( entry : OnyxEntry < { id : string ; name : string ; count : number } > ) => ( {
425453 id : entry ?. id ,
426454 name : entry ?. name ,
427- } ) ,
455+ } ) ) as UseOnyxSelector < OnyxKey , { id ?: string ; name ?: string } > ,
428456 } ) ,
429457 ) ;
430458
@@ -444,11 +472,10 @@ describe('useOnyx', () => {
444472
445473 const { result} = renderHook ( ( ) =>
446474 useOnyx ( ONYXKEYS . TEST_KEY , {
447- // @ts -expect-error bypass
448- selector : ( entry : OnyxEntry < { id : string ; name : string } > ) => ( {
475+ selector : ( ( entry : OnyxEntry < { id : string ; name : string } > ) => ( {
449476 id : entry ?. id ,
450477 name : entry ?. name ,
451- } ) ,
478+ } ) ) as UseOnyxSelector < OnyxKey , { id ?: string ; name ?: string } > ,
452479 } ) ,
453480 ) ;
454481
@@ -471,11 +498,10 @@ describe('useOnyx', () => {
471498
472499 const { result} = renderHook ( ( ) =>
473500 useOnyx ( ONYXKEYS . TEST_KEY , {
474- // @ts -expect-error bypass
475- selector : ( entry : OnyxEntry < { id : string ; name : string } > ) => {
501+ selector : ( ( entry : OnyxEntry < { id : string ; name : string } > ) => {
476502 selectorCallCount ++ ;
477503 return { id : entry ?. id , name : entry ?. name } ;
478- } ,
504+ } ) as UseOnyxSelector < OnyxKey , { id ?: string ; name ?: string } > ,
479505 } ) ,
480506 ) ;
481507
@@ -498,8 +524,7 @@ describe('useOnyx', () => {
498524
499525 const { result} = renderHook ( ( ) =>
500526 useOnyx ( ONYXKEYS . TEST_KEY , {
501- // @ts -expect-error bypass
502- selector : ( entry : OnyxEntry < { count : number ; name : string } > ) => entry ?. count || 0 ,
527+ selector : ( ( entry : OnyxEntry < { count : number ; name : string } > ) => entry ?. count || 0 ) as UseOnyxSelector < OnyxKey , number > ,
503528 } ) ,
504529 ) ;
505530
@@ -721,8 +746,7 @@ describe('useOnyx', () => {
721746
722747 const { result} = renderHook ( ( ) =>
723748 useOnyx ( ONYXKEYS . TEST_KEY , {
724- // @ts -expect-error bypass
725- selector : ( entry : OnyxEntry < string > ) => `${ entry } _changed` ,
749+ selector : ( ( entry : OnyxEntry < string > ) => `${ entry } _changed` ) as UseOnyxSelector < OnyxKey , string > ,
726750 } ) ,
727751 ) ;
728752
@@ -777,8 +801,7 @@ describe('useOnyx', () => {
777801 const { result} = renderHook ( ( ) =>
778802 useOnyx ( ONYXKEYS . TEST_KEY , {
779803 initWithStoredValues : false ,
780- // @ts -expect-error bypass
781- selector : ( value : OnyxEntry < string > ) => `${ value } _selected` ,
804+ selector : ( ( value : OnyxEntry < string > ) => `${ value } _selected` ) as UseOnyxSelector < OnyxKey , string > ,
782805 } ) ,
783806 ) ;
784807
@@ -912,12 +935,11 @@ describe('useOnyx', () => {
912935 useOnyx (
913936 ONYXKEYS . COLLECTION . TEST_KEY ,
914937 {
915- // @ts -expect-error bypass
916- selector : ( entries : OnyxCollection < { id : string ; name : string } > ) =>
938+ selector : ( ( entries : OnyxCollection < { id : string ; name : string } > ) =>
917939 Object . entries ( entries ?? { } ) . reduce < NonNullable < OnyxCollection < string > > > ( ( acc , [ key , value ] ) => {
918940 acc [ key ] = `${ value ?. id } _${ externalValue } ` ;
919941 return acc ;
920- } , { } ) ,
942+ } , { } ) ) as UseOnyxSelector < OnyxKey , NonNullable < OnyxCollection < string > > > ,
921943 } ,
922944 [ externalValue ] ,
923945 ) ,
@@ -981,8 +1003,7 @@ describe('useOnyx', () => {
9811003 } ) ;
9821004
9831005 it ( 'should always return undefined when subscribing to a skippable collection member id' , async ( ) => {
984- // @ts -expect-error bypass
985- await StorageMock . setItem ( `${ ONYXKEYS . COLLECTION . TEST_KEY } skippable-id` , 'skippable-id_value' ) ;
1006+ await StorageMock . setItem < string > ( `${ ONYXKEYS . COLLECTION . TEST_KEY } skippable-id` , 'skippable-id_value' ) ;
9861007
9871008 const { result} = renderHook ( ( ) => useOnyx ( `${ ONYXKEYS . COLLECTION . TEST_KEY } skippable-id` ) ) ;
9881009
@@ -1070,8 +1091,7 @@ describe('useOnyx', () => {
10701091 it ( 'should log an alert if Onyx doesn\'t return selected data in loaded state and "canBeMissing" property is false' , async ( ) => {
10711092 const { result : result1 } = renderHook ( ( ) =>
10721093 useOnyx ( ONYXKEYS . TEST_KEY , {
1073- // @ts -expect-error bypass
1074- selector : ( entry : OnyxEntry < string > ) => ( entry ? `${ entry } _changed` : undefined ) ,
1094+ selector : ( ( entry : OnyxEntry < string > ) => ( entry ? `${ entry } _changed` : undefined ) ) as UseOnyxSelector < OnyxKey , string | undefined > ,
10751095 canBeMissing : false ,
10761096 } ) ,
10771097 ) ;
@@ -1101,9 +1121,8 @@ describe('useOnyx', () => {
11011121 it ( 'should log an alert if Onyx doesn\'t return data but there is a selector that always return something and "canBeMissing" property is false' , async ( ) => {
11021122 const { result : result1 } = renderHook ( ( ) =>
11031123 useOnyx ( ONYXKEYS . TEST_KEY , {
1104- // @ts -expect-error bypass
11051124 // This selector will always return a value, even if the Onyx data is missing.
1106- selector : ( entry : OnyxEntry < string > ) => `${ entry } _changed` ,
1125+ selector : ( ( entry : OnyxEntry < string > ) => `${ entry } _changed` ) as UseOnyxSelector < OnyxKey , string > ,
11071126 canBeMissing : false ,
11081127 } ) ,
11091128 ) ;
0 commit comments