@@ -3,78 +3,39 @@ import { renderHook, act } from "tests/testSetup";
33import { useActivityIndicator } from "../useActivityIndicator" ;
44import { BTC_ACCOUNT } from "LLD/features/__mocks__/accounts.mock" ;
55
6- const mockBridgeSync = jest . fn ( ) ;
7- const mockCvPoll = jest . fn ( ) ;
8- const mockOnUserRefresh = jest . fn ( ) ;
6+ const mockTriggerRefresh = jest . fn ( ) ;
7+
8+ const defaultPortfolioBalanceSync = {
9+ isBalanceLoading : false ,
10+ stableSyncPending : false ,
11+ hasCvOrBridgeError : false ,
12+ hasWalletSyncError : false ,
13+ triggerRefresh : mockTriggerRefresh ,
14+ } ;
15+
16+ jest . mock ( "LLD/hooks/usePortfolioBalanceSync" , ( ) => ( {
17+ usePortfolioBalanceSync : jest . fn ( ( ) => defaultPortfolioBalanceSync ) ,
18+ } ) ) ;
19+
20+ const mockUsePortfolioBalanceSync = jest . requireMock (
21+ "LLD/hooks/usePortfolioBalanceSync" ,
22+ ) . usePortfolioBalanceSync ;
923
1024// Bridge: useActivityIndicator + useAccountsSyncStatus both use this package
1125jest . mock ( "@ledgerhq/live-common/bridge/react/index" , ( ) => ( {
12- useBridgeSync : jest . fn ( ( ) => mockBridgeSync ) ,
26+ useBridgeSync : jest . fn ( ) ,
1327 useGlobalSyncState : jest . fn ( ( ) => ( { pending : false , error : null } ) ) ,
1428 useBatchAccountsSyncState : jest . fn ( ( { accounts } : { accounts : { id : string } [ ] } ) =>
1529 accounts . map ( account => ( { syncState : { pending : false , error : null } , account } ) ) ,
1630 ) ,
1731} ) ) ;
1832
19- jest . mock ( "@ledgerhq/live-countervalues-react" , ( ) => ( {
20- ...jest . requireActual < typeof import ( "@ledgerhq/live-countervalues-react" ) > (
21- "@ledgerhq/live-countervalues-react" ,
22- ) ,
23- useCountervaluesPolling : jest . fn ( ( ) => ( {
24- pending : false ,
25- error : null ,
26- poll : mockCvPoll ,
27- start : jest . fn ( ) ,
28- stop : jest . fn ( ) ,
29- wipe : jest . fn ( ) ,
30- } ) ) ,
31- } ) ) ;
32-
33- jest . mock ( "LLD/features/WalletSync/components/WalletSyncContext" , ( ) => ( {
34- useWalletSyncUserState : jest . fn ( ( ) => ( {
35- visualPending : false ,
36- walletSyncError : null ,
37- onUserRefresh : mockOnUserRefresh ,
38- } ) ) ,
39- } ) ) ;
40-
41- jest . mock ( "LLD/hooks/usePortfolioSyncStatus" , ( ) => ( {
42- usePortfolioSyncStatus : jest . fn ( ( ) => ( { isColdStart : false } ) ) ,
43- } ) ) ;
44-
45- const mockUseGlobalSyncState = jest . requireMock (
46- "@ledgerhq/live-common/bridge/react/index" ,
47- ) . useGlobalSyncState ;
48- const mockUseCountervaluesPolling = jest . requireMock (
49- "@ledgerhq/live-countervalues-react" ,
50- ) . useCountervaluesPolling ;
51- const mockUseWalletSyncUserState = jest . requireMock (
52- "LLD/features/WalletSync/components/WalletSyncContext" ,
53- ) . useWalletSyncUserState ;
54- const mockUsePortfolioSyncStatus = jest . requireMock (
55- "LLD/hooks/usePortfolioSyncStatus" ,
56- ) . usePortfolioSyncStatus ;
57-
5833const defaultInitialState : { accounts : unknown [ ] } = { accounts : [ ] } ;
5934
6035describe ( "useActivityIndicator" , ( ) => {
6136 beforeEach ( ( ) => {
6237 jest . clearAllMocks ( ) ;
63- mockUseGlobalSyncState . mockReturnValue ( { pending : false , error : null } ) ;
64- mockUseCountervaluesPolling . mockReturnValue ( {
65- pending : false ,
66- error : null ,
67- poll : mockCvPoll ,
68- start : jest . fn ( ) ,
69- stop : jest . fn ( ) ,
70- wipe : jest . fn ( ) ,
71- } ) ;
72- mockUseWalletSyncUserState . mockReturnValue ( {
73- visualPending : false ,
74- walletSyncError : null ,
75- onUserRefresh : mockOnUserRefresh ,
76- } ) ;
77- mockUsePortfolioSyncStatus . mockReturnValue ( { isColdStart : false } ) ;
38+ mockUsePortfolioBalanceSync . mockReturnValue ( defaultPortfolioBalanceSync ) ;
7839 } ) ;
7940
8041 it ( "returns hasAccounts, handleSync, isError, isRotating, tooltip, icon" , ( ) => {
@@ -86,32 +47,33 @@ describe("useActivityIndicator", () => {
8647 hasAccounts : true ,
8748 isError : false ,
8849 isRotating : false ,
50+ isDisabled : false ,
8951 } ) ;
9052 expect ( result . current . tooltip ) . toBeDefined ( ) ;
9153 expect ( typeof result . current . tooltip ) . toBe ( "string" ) ;
9254 expect ( result . current . handleSync ) . toBeDefined ( ) ;
9355 expect ( result . current . icon ) . toBe ( Refresh ) ;
9456 } ) ;
9557
96- it ( "returns isRotating false when only countervalues polling is pending (no user click)" , ( ) => {
97- mockUseCountervaluesPolling . mockReturnValue ( {
98- pending : true ,
99- error : null ,
100- poll : mockCvPoll ,
101- start : jest . fn ( ) ,
102- stop : jest . fn ( ) ,
103- wipe : jest . fn ( ) ,
58+ it ( "returns isRotating and isDisabled true when balance is loading (e.g. countervalues polling)" , ( ) => {
59+ mockUsePortfolioBalanceSync . mockReturnValue ( {
60+ ...defaultPortfolioBalanceSync ,
61+ isBalanceLoading : true ,
10462 } ) ;
10563
10664 const { result } = renderHook ( ( ) => useActivityIndicator ( ) , {
10765 initialState : { ...defaultInitialState , accounts : [ BTC_ACCOUNT ] } ,
10866 } ) ;
10967
110- expect ( result . current . isRotating ) . toBe ( false ) ;
68+ expect ( result . current . isRotating ) . toBe ( true ) ;
69+ expect ( result . current . isDisabled ) . toBe ( true ) ;
11170 } ) ;
11271
11372 it ( "returns isRotating true on cold start when portfolio balance is not available" , ( ) => {
114- mockUsePortfolioSyncStatus . mockReturnValue ( { isColdStart : true } ) ;
73+ mockUsePortfolioBalanceSync . mockReturnValue ( {
74+ ...defaultPortfolioBalanceSync ,
75+ isBalanceLoading : true ,
76+ } ) ;
11577
11678 const { result } = renderHook ( ( ) => useActivityIndicator ( ) , {
11779 initialState : { ...defaultInitialState , accounts : [ BTC_ACCOUNT ] } ,
@@ -121,45 +83,42 @@ describe("useActivityIndicator", () => {
12183 expect ( result . current . tooltip ) . toBeNull ( ) ;
12284 } ) ;
12385
124- it ( "returns isRotating false when only global sync state is pending (no user click)" , ( ) => {
125- mockUseGlobalSyncState . mockReturnValue ( { pending : true , error : null } ) ;
86+ it ( "returns isRotating true when sync is pending" , ( ) => {
87+ mockUsePortfolioBalanceSync . mockReturnValue ( {
88+ ...defaultPortfolioBalanceSync ,
89+ stableSyncPending : true ,
90+ isBalanceLoading : true ,
91+ } ) ;
12692
12793 const { result } = renderHook ( ( ) => useActivityIndicator ( ) , {
12894 initialState : { ...defaultInitialState , accounts : [ BTC_ACCOUNT ] } ,
12995 } ) ;
13096
131- expect ( result . current . isRotating ) . toBe ( false ) ;
97+ expect ( result . current . isRotating ) . toBe ( true ) ;
13298 } ) ;
13399
134- it ( "returns isRotating false when only wallet sync visualPending is true (no user click)" , ( ) => {
135- mockUseWalletSyncUserState . mockReturnValue ( {
136- visualPending : true ,
137- walletSyncError : null ,
138- onUserRefresh : mockOnUserRefresh ,
139- } ) ;
140-
141- const { result } = renderHook ( ( ) => useActivityIndicator ( ) , {
142- initialState : { ...defaultInitialState , accounts : [ BTC_ACCOUNT ] } ,
100+ it ( "returns isRotating true after user click when sync is pending" , ( ) => {
101+ mockUsePortfolioBalanceSync . mockReturnValue ( {
102+ ...defaultPortfolioBalanceSync ,
103+ stableSyncPending : true ,
104+ isBalanceLoading : true ,
143105 } ) ;
144106
145- expect ( result . current . isRotating ) . toBe ( false ) ;
146- } ) ;
147-
148- it ( "returns isRotating false after user click when sync is not pending" , ( ) => {
149107 const { result } = renderHook ( ( ) => useActivityIndicator ( ) , {
150108 initialState : { ...defaultInitialState , accounts : [ BTC_ACCOUNT ] } ,
151109 } ) ;
152110
153- expect ( result . current . isRotating ) . toBe ( false ) ;
111+ expect ( result . current . isRotating ) . toBe ( true ) ;
154112
155113 act ( ( ) => {
156114 result . current . handleSync ( ) ;
157115 } ) ;
158116
159- expect ( result . current . isRotating ) . toBe ( false ) ;
117+ expect ( result . current . isRotating ) . toBe ( true ) ;
118+ expect ( result . current . isDisabled ) . toBe ( true ) ;
160119 } ) ;
161120
162- it ( "handleSync calls onUserRefresh, cvPolling.poll, bridgeSync and track" , ( ) => {
121+ it ( "handleSync calls triggerRefresh and track" , ( ) => {
163122 const { result } = renderHook ( ( ) => useActivityIndicator ( ) , {
164123 initialState : { ...defaultInitialState , accounts : [ BTC_ACCOUNT ] } ,
165124 } ) ;
@@ -169,13 +128,7 @@ describe("useActivityIndicator", () => {
169128 result . current . handleSync ( ) ;
170129 } ) ;
171130
172- expect ( mockOnUserRefresh ) . toHaveBeenCalledTimes ( 1 ) ;
173- expect ( mockCvPoll ) . toHaveBeenCalledTimes ( 1 ) ;
174- expect ( mockBridgeSync ) . toHaveBeenCalledWith ( {
175- type : "SYNC_ALL_ACCOUNTS" ,
176- priority : 5 ,
177- reason : "user-click" ,
178- } ) ;
131+ expect ( mockTriggerRefresh ) . toHaveBeenCalledTimes ( 1 ) ;
179132 expect ( track ) . toHaveBeenCalledWith ( "SyncRefreshClick" ) ;
180133 } ) ;
181134} ) ;
0 commit comments