1- import { renderHook , waitFor } from '@testing-library/react-native' ;
1+ import { renderHook , waitFor , act } from '@testing-library/react-native' ;
22import { useRiveFile } from '../useRiveFile' ;
33import type { RiveFile } from '../../specs/RiveFile.nitro' ;
44
@@ -8,6 +8,48 @@ jest.mock('react-native/Libraries/Image/Image', () => ({
88 } ) ) ,
99} ) ) ;
1010
11+ describe ( 'useRiveFile - input stability' , ( ) => {
12+ const mockRiveFile : RiveFile = {
13+ dispose : jest . fn ( ) ,
14+ updateReferencedAssets : jest . fn ( ) ,
15+ viewModelCount : 0 ,
16+ viewModelByIndex : jest . fn ( ) ,
17+ viewModelByName : jest . fn ( ) ,
18+ defaultArtboardViewModel : jest . fn ( ) ,
19+ } as any ;
20+
21+ beforeEach ( ( ) => {
22+ jest . clearAllMocks ( ) ;
23+ ( global as any ) . mockRiveFileFactory . fromSource . mockResolvedValue (
24+ mockRiveFile
25+ ) ;
26+ } ) ;
27+
28+ it ( 'should not reload file when input object reference changes but uri is the same' , async ( ) => {
29+ const { result, rerender } = renderHook (
30+ ( props : { input : { uri : string } } ) => useRiveFile ( props . input ) ,
31+ { initialProps : { input : { uri : 'https://example.com/animation.riv' } } }
32+ ) ;
33+
34+ await waitFor ( ( ) => {
35+ expect ( ( result . current as any ) . isLoading ) . toBe ( false ) ;
36+ } ) ;
37+
38+ const callCountBefore = ( global as any ) . mockRiveFileFactory . fromSource . mock
39+ . calls . length ;
40+
41+ await act ( async ( ) => {
42+ rerender ( { input : { uri : 'https://example.com/animation.riv' } } ) ;
43+ // Give async effect time to run
44+ await new Promise ( ( resolve ) => setTimeout ( resolve , 50 ) ) ;
45+ } ) ;
46+
47+ const callCountAfter = ( global as any ) . mockRiveFileFactory . fromSource . mock
48+ . calls . length ;
49+ expect ( callCountAfter ) . toBe ( callCountBefore ) ;
50+ } ) ;
51+ } ) ;
52+
1153describe ( 'useRiveFile - updateReferencedAssets' , ( ) => {
1254 const mockRiveFile : RiveFile = {
1355 dispose : jest . fn ( ) ,
0 commit comments