1
- import { useEffect , useState } from 'react' ;
1
+ import { useCallback , useEffect , useState } from 'react' ;
2
2
import { useProvider } from '@ant-design/web3' ;
3
3
import { WalletReadyState } from '@solana/wallet-adapter-base' ;
4
4
import type { ConnectionContextState } from '@solana/wallet-adapter-react' ;
@@ -66,7 +66,7 @@ vi.mock('@solana/wallet-adapter-react', async () => {
66
66
connectedRef . value = true ;
67
67
setConnected ( ( p ) => p + 1 ) ;
68
68
}
69
- } , [ currentWallet ] ) ;
69
+ } , [ currentWallet ?. adapter ?. name ] ) ;
70
70
71
71
useEffect ( ( ) => {
72
72
if ( connecting ) {
@@ -76,22 +76,34 @@ vi.mock('@solana/wallet-adapter-react', async () => {
76
76
}
77
77
} , [ connecting ] ) ;
78
78
79
+ const selectCallback = useCallback ( ( walletName : string | null ) => {
80
+ mockSelectWalletFnNotWalletName ( walletName ) ;
81
+ const mockWalletAdapter = {
82
+ adapter : { name : walletName , readyState : WalletReadyState . Installed } ,
83
+ } ;
84
+ currentWalletRef . value = mockWalletAdapter ;
85
+ setCurrentWallet ( mockWalletAdapter ) ;
86
+ mockSelectWalletFn ( ) ;
87
+ } , [ ] ) ;
88
+
89
+ const connectCallback = useCallback ( async ( ) => {
90
+ setConnected ( 0 ) ;
91
+ setConnecting ( true ) ;
92
+ await new Promise ( ( resolve ) => {
93
+ setTimeout ( ( ) => {
94
+ resolve ( 0 ) ;
95
+ } , 100 ) ;
96
+ } ) ;
97
+ setConnecting ( false ) ;
98
+ setConnected ( ( p ) => p + 1 ) ;
99
+ } , [ ] ) ;
100
+
79
101
return {
80
102
publicKey,
81
103
connecting,
82
- connected : connected ,
83
- connect : async ( ) => {
84
- setConnecting ( true ) ;
85
- } ,
86
- select : ( walletName : string | null ) => {
87
- mockSelectWalletFnNotWalletName ( walletName ) ;
88
- const mockWalletAdapter = {
89
- adapter : { name : walletName , readyState : WalletReadyState . Installed } ,
90
- } ;
91
- currentWalletRef . value = mockWalletAdapter ;
92
- setCurrentWallet ( mockWalletAdapter ) ;
93
- mockSelectWalletFn ( ) ;
94
- } ,
104
+ connected : ! ! connected ,
105
+ connect : connectCallback ,
106
+ select : selectCallback ,
95
107
disconnect : ( ) => { } ,
96
108
wallet : currentWalletRef . value ,
97
109
wallets : [
@@ -161,6 +173,7 @@ describe('Solana Connect', () => {
161
173
< div className = "custom-connectbtn" >
162
174
< button
163
175
className = "btn-switchwallet"
176
+ type = "button"
164
177
onClick = { ( ) => {
165
178
switchWalletRunned ( ) ;
166
179
} }
@@ -169,6 +182,7 @@ describe('Solana Connect', () => {
169
182
</ button >
170
183
< button
171
184
className = "btn-connect"
185
+ type = "button"
172
186
onClick = { async ( ) => {
173
187
await connectWallet ( ) ;
174
188
// mock connect twice
@@ -226,20 +240,16 @@ describe('Solana Connect', () => {
226
240
expect ( mockSelectWalletFn ) . toBeCalledTimes ( 3 ) ;
227
241
} ) ;
228
242
229
- await vi . waitFor (
230
- ( ) => {
231
- expect ( connectRunned ) . toBeCalled ( ) ;
232
- expect ( shownConnectRunDone . textContent ) . toBe ( 'true' ) ;
233
- expect ( gotAddressAfterConnect ) . toBeCalledWith ( mockedData . address . value ) ;
234
- } ,
235
- {
236
- timeout : 5000 ,
237
- } ,
238
- ) ;
243
+ await vi . waitFor ( ( ) => {
244
+ expect ( connectRunned ) . toBeCalled ( ) ;
245
+ expect ( shownConnectRunDone . textContent ) . toBe ( 'true' ) ;
246
+ expect ( gotAddressAfterConnect ) . toBeCalledWith ( mockedData . address . value ) ;
247
+ } ) ;
239
248
} ) ;
240
249
241
250
it ( 'call connect but not provide wallet' , async ( ) => {
242
251
const { useWallet } = await import ( '@solana/wallet-adapter-react' ) ;
252
+ const prepareConnectRunned = vi . fn ( ) ;
243
253
const connectRunned = vi . fn ( ) ;
244
254
245
255
const CustomConnectBtn : React . FC = ( ) => {
@@ -250,13 +260,15 @@ describe('Solana Connect', () => {
250
260
< div className = "custom-connectbtn" >
251
261
< button
252
262
className = "btn-connect"
263
+ type = "button"
253
264
onClick = { async ( ) => {
265
+ prepareConnectRunned ( ) ;
254
266
await connectWallet ( ) ;
255
267
connect ?.( ) ;
256
268
connectRunned ( ) ;
257
269
} }
258
270
>
259
- Connect
271
+ Connect1
260
272
</ button >
261
273
</ div >
262
274
) ;
@@ -281,7 +293,11 @@ describe('Solana Connect', () => {
281
293
282
294
fireEvent . click ( connectBtn ) ;
283
295
await vi . waitFor ( ( ) => {
284
- expect ( connectRunned ) . toBeCalled ( ) ;
296
+ expect ( prepareConnectRunned ) . toBeCalled ( ) ;
297
+ expect ( connectRunned ) . not . toBeCalled ( ) ;
298
+ } ) ;
299
+
300
+ await vi . waitFor ( ( ) => {
285
301
expect ( mockSelectWalletFnNotWalletName ) . toBeCalledWith ( null ) ;
286
302
} ) ;
287
303
} ) ;
0 commit comments