1
1
import { renderHook , act } from "@tests/test-renderer" ;
2
2
import { useModularDrawerState } from "../useModularDrawerState" ;
3
- import { ModularDrawerStep } from "../../types" ;
4
3
import {
5
4
mockBtcCryptoCurrency ,
6
5
mockCurrenciesByProvider ,
7
6
mockCurrencyIds ,
8
- mockEthCryptoCurrency ,
9
7
} from "@ledgerhq/live-common/modularDrawer/__mocks__/currencies.mock" ;
8
+ import { NavigationProp } from "@react-navigation/native" ;
10
9
11
10
const mockNavigate = jest . fn ( ) ;
12
- const mockNavigation = {
11
+ const mockNavigation : Partial < NavigationProp < Record < string , never > > > = {
13
12
navigate : mockNavigate ,
14
- goBack : jest . fn ( ) ,
15
- addListener : jest . fn ( ) ,
16
- removeListener : jest . fn ( ) ,
17
- setParams : jest . fn ( ) ,
18
- dispatch : jest . fn ( ) ,
19
- canGoBack : jest . fn ( ) ,
20
- isFocused : jest . fn ( ) ,
21
- getParent : jest . fn ( ) ,
22
- replace : jest . fn ( ) ,
23
- push : jest . fn ( ) ,
24
- pop : jest . fn ( ) ,
25
- popToTop : jest . fn ( ) ,
26
- reset : jest . fn ( ) ,
27
- getId : jest . fn ( ) ,
28
- getState : jest . fn ( ) ,
29
- setOptions : jest . fn ( ) ,
30
13
} ;
31
14
32
15
jest . mock ( "@react-navigation/native" , ( ) => ( {
@@ -37,13 +20,14 @@ jest.mock("@react-navigation/native", () => ({
37
20
// Mock the useProviders hook
38
21
const mockSetProviders = jest . fn ( ) ;
39
22
const mockGetNetworksFromProvider = jest . fn ( ) ;
23
+ const mockGetProvider : jest . Mock = jest . fn ( ( ) => null ) ;
40
24
jest . mock ( "../useProviders" , ( ) => ( {
41
25
useProviders : ( ) => ( {
42
26
providers : null ,
43
27
setProviders : mockSetProviders ,
44
28
getNetworksFromProvider : mockGetNetworksFromProvider ,
45
29
} ) ,
46
- getProvider : jest . fn ( ( ) => null ) ,
30
+ getProvider : ( currency : unknown , providers : unknown ) => mockGetProvider ( currency , providers ) ,
47
31
} ) ) ;
48
32
49
33
// Mock the modularDrawer utils
@@ -54,11 +38,13 @@ jest.mock("@ledgerhq/live-common/modularDrawer/utils/index", () => ({
54
38
} ) ) ;
55
39
56
40
// Mock the useModularDrawerFlowStepManager to prevent infinite loops
41
+ const mockGoToStep = jest . fn ( ) ;
42
+ const mockResetStepManager = jest . fn ( ) ;
57
43
jest . mock ( "../useModularDrawerFlowStepManager" , ( ) => ( {
58
44
useModularDrawerFlowStepManager : ( ) => ( {
59
45
currentStep : "asset" ,
60
- goToStep : jest . fn ( ) ,
61
- reset : jest . fn ( ) ,
46
+ goToStep : mockGoToStep ,
47
+ reset : mockResetStepManager ,
62
48
} ) ,
63
49
} ) ) ;
64
50
@@ -67,6 +53,7 @@ jest.mock("../../analytics/useModularDrawerAnalytics", () => ({
67
53
useModularDrawerAnalytics : ( ) => ( {
68
54
trackModularDrawerEvent : jest . fn ( ) ,
69
55
} ) ,
56
+ getCurrentPageName : ( ) => "page" ,
70
57
} ) ) ;
71
58
72
59
describe ( "useModularDrawerState" , ( ) => {
@@ -89,56 +76,31 @@ describe("useModularDrawerState", () => {
89
76
expect ( result . current . availableNetworks ) . toEqual ( [ ] ) ;
90
77
} ) ;
91
78
92
- it ( "should select an asset and go to correct step" , ( ) => {
93
- const { result } = renderHook ( ( ) =>
94
- useModularDrawerState ( {
95
- currencyIds : mockCurrencyIds ,
96
- currenciesByProvider : mockCurrenciesByProvider ,
97
- flow : "test" ,
98
- } ) ,
99
- ) ;
100
- act ( ( ) => {
101
- result . current . selectAsset ( mockCurrency , [ mockEthCryptoCurrency , mockBtcCryptoCurrency ] ) ;
79
+ it ( "should handle asset selection and populate networks when multiple networks exist" , ( ) => {
80
+ mockGetProvider . mockReturnValue ( {
81
+ providerId : "provider1" ,
82
+ currenciesByNetwork : [ ] ,
102
83
} ) ;
103
- expect ( result . current . asset ) . toEqual ( mockCurrency ) ;
104
- expect ( result . current . availableNetworks . length ) . toBeGreaterThan ( 0 ) ;
105
- } ) ;
84
+ mockGetNetworksFromProvider . mockReturnValue ( [ "ethereum" , "bitcoin" ] ) ;
106
85
107
- it ( "should reset state" , ( ) => {
108
86
const { result } = renderHook ( ( ) =>
109
87
useModularDrawerState ( {
110
- currencyIds : mockCurrencyIds ,
88
+ currencyIds : [ "ethereum" , "bitcoin" ] ,
111
89
currenciesByProvider : mockCurrenciesByProvider ,
112
90
flow : "test" ,
113
91
} ) ,
114
92
) ;
115
- act ( ( ) => {
116
- result . current . selectAsset ( mockCurrency , [ mockEthCryptoCurrency ] ) ;
117
- result . current . selectNetwork ( mockCurrency , mockEthCryptoCurrency ) ;
118
- result . current . reset ( ) ;
119
- } ) ;
120
- expect ( result . current . asset ) . toBeUndefined ( ) ;
121
- expect ( result . current . network ) . toBeUndefined ( ) ;
122
- expect ( result . current . availableNetworks ) . toEqual ( [ ] ) ;
123
- } ) ;
124
93
125
- it ( "should go back to asset step" , ( ) => {
126
- const { result } = renderHook ( ( ) =>
127
- useModularDrawerState ( {
128
- currencyIds : mockCurrencyIds ,
129
- currenciesByProvider : mockCurrenciesByProvider ,
130
- flow : "test" ,
131
- } ) ,
132
- ) ;
133
94
act ( ( ) => {
134
- result . current . backToAsset ( ) ;
95
+ result . current . handleAsset ( mockCurrency ) ;
135
96
} ) ;
136
- // Test that the state is reset
137
- expect ( result . current . asset ) . toBeUndefined ( ) ;
138
- expect ( result . current . network ) . toBeUndefined ( ) ;
97
+
98
+ expect ( mockSetProviders ) . toHaveBeenCalled ( ) ;
99
+ expect ( result . current . asset ) . toEqual ( mockCurrency ) ;
100
+ expect ( result . current . availableNetworks . length ) . toBeGreaterThan ( 1 ) ;
139
101
} ) ;
140
102
141
- it ( "should go back to network step " , ( ) => {
103
+ it ( "should reset state on close " , ( ) => {
142
104
const { result } = renderHook ( ( ) =>
143
105
useModularDrawerState ( {
144
106
currencyIds : mockCurrencyIds ,
@@ -147,57 +109,38 @@ describe("useModularDrawerState", () => {
147
109
} ) ,
148
110
) ;
149
111
act ( ( ) => {
150
- result . current . backToNetwork ( ) ;
112
+ result . current . handleAsset ( mockCurrency ) ;
151
113
} ) ;
152
- // Test that network is cleared
153
- expect ( result . current . network ) . toBeUndefined ( ) ;
154
- } ) ;
155
-
156
- it ( "should handle back from Network step" , ( ) => {
157
- const { result } = renderHook ( ( ) =>
158
- useModularDrawerState ( {
159
- currencyIds : mockCurrencyIds ,
160
- currenciesByProvider : mockCurrenciesByProvider ,
161
- flow : "test" ,
162
- } ) ,
163
- ) ;
114
+ expect ( result . current . asset ) . toEqual ( mockCurrency ) ;
164
115
act ( ( ) => {
165
- result . current . handleBack ( ModularDrawerStep . Network ) ;
116
+ result . current . handleCloseButton ( ) ;
166
117
} ) ;
167
- // Test that the state is reset when going back from network
168
118
expect ( result . current . asset ) . toBeUndefined ( ) ;
119
+ expect ( result . current . network ) . toBeUndefined ( ) ;
120
+ expect ( result . current . availableNetworks ) . toEqual ( [ ] ) ;
169
121
} ) ;
170
122
171
- it ( "should handle back from Account step with multiple networks " , ( ) => {
123
+ it ( "should expose back/close handlers " , ( ) => {
172
124
const { result } = renderHook ( ( ) =>
173
125
useModularDrawerState ( {
174
126
currencyIds : mockCurrencyIds ,
175
127
currenciesByProvider : mockCurrenciesByProvider ,
176
128
flow : "test" ,
177
129
} ) ,
178
130
) ;
179
- act ( ( ) => {
180
- result . current . selectAsset ( mockCurrency , [ mockEthCryptoCurrency , mockBtcCryptoCurrency ] ) ;
181
- result . current . handleBack ( ModularDrawerStep . Account ) ;
182
- } ) ;
183
- // Test that we go back to network step when multiple networks are available
184
- expect ( result . current . network ) . toBeUndefined ( ) ;
131
+ expect ( typeof result . current . handleBackButton ) . toBe ( "function" ) ;
132
+ expect ( typeof result . current . handleCloseButton ) . toBe ( "function" ) ;
185
133
} ) ;
186
134
187
- it ( "should handle back from Account step with one network " , ( ) => {
135
+ it ( "should compute hasOneCurrency as false with provided mocks " , ( ) => {
188
136
const { result } = renderHook ( ( ) =>
189
137
useModularDrawerState ( {
190
- currencyIds : mockCurrencyIds ,
138
+ currencyIds : [ "bitcoin" , "ethereum" ] ,
191
139
currenciesByProvider : mockCurrenciesByProvider ,
192
140
flow : "test" ,
193
141
} ) ,
194
142
) ;
195
- act ( ( ) => {
196
- result . current . selectAsset ( mockCurrency , [ mockEthCryptoCurrency ] ) ;
197
- result . current . handleBack ( ModularDrawerStep . Account ) ;
198
- } ) ;
199
- // Test that we go back to asset step when only one network is available
200
- expect ( result . current . asset ) . toBeUndefined ( ) ;
143
+ expect ( result . current . hasOneCurrency ) . toBe ( false ) ;
201
144
} ) ;
202
145
203
146
it ( "should handle single currency flow" , ( ) => {
0 commit comments