@@ -2,13 +2,30 @@ import React from 'react';
22import { render , screen , fireEvent , waitFor } from '@testing-library/react' ;
33import { WalletProvider , useWallet } from '@/context/WalletContext' ;
44
5+ jest . mock ( '@/auth/session' , ( ) => {
6+ const store : Record < string , string > = { } ;
7+ return {
8+ setSessionItem : jest . fn ( async ( key : string , value : string ) => {
9+ store [ key ] = value ;
10+ try { localStorage . setItem ( key , value ) ; } catch { }
11+ } ) ,
12+ getSessionItem : jest . fn ( async ( key : string ) => store [ key ] ?? null ) ,
13+ sessionManager : {
14+ subscribe : jest . fn ( ( ) => jest . fn ( ) ) ,
15+ startMonitoring : jest . fn ( ) ,
16+ stopMonitoring : jest . fn ( ) ,
17+ } ,
18+ } ;
19+ } ) ;
20+
521jest . mock ( '@stellar/freighter-api' , ( ) => ( {
622 isConnected : jest . fn ( ) . mockResolvedValue ( { isConnected : false } ) ,
723 getAddress : jest . fn ( ) ,
824 requestAccess : jest . fn ( ) ,
9- WatchWalletChanges : jest . fn ( ) ,
25+ WatchWalletChanges : jest . fn ( ( ) => ( { watch : jest . fn ( ( ) => ( { } ) ) , stop : jest . fn ( ) } ) ) ,
1026 getPublicKey : jest . fn ( ) ,
1127} ) ) ;
28+
1229jest . mock ( '@/lib/stellar-interact' , ( ) => ( {
1330 getReputation : jest . fn ( async ( ) => 0 ) ,
1431} ) ) ;
@@ -26,76 +43,51 @@ const STORAGE_KEY = 'vero_wallet_publicKey';
2643const PROVIDER_STORAGE_KEY = 'vero_wallet_provider' ;
2744
2845type TestWindow = {
29- freighter ?: unknown ;
3046 rabet ?: { connect : jest . Mock } ;
3147} ;
32- const testWindow = window as unknown as TestWindow ;
33-
34- function Consumer ( ) {
35- const { publicKey, activeProvider, availableProviders, error, isLoading, connect } = useWallet ( ) ;
36- return (
37- < div >
38- < div data-testid = "pk" > { publicKey || 'none' } </ div >
39- < div data-testid = "provider" > { activeProvider || 'none' } </ div >
40- < div data-testid = "available" >
41- { availableProviders . map ( ( provider ) => `${ provider . id } :${ provider . isAvailable } ` ) . join ( ',' ) }
42- </ div >
43- < div data-testid = "error" > { error || 'none' } </ div >
44- < div data-testid = "loading" > { isLoading ? 'loading' : 'ready' } </ div >
45- < button data-testid = "connect-rabet" onClick = { ( ) => connect ( 'rabet' ) } >
46- rabet
47- </ button >
48- </ div >
49- ) ;
50- }
51-
52- function renderConsumer ( ) {
53- return render (
54- < WalletProvider >
55- < Consumer />
56- </ WalletProvider >
57- ) ;
58- }
5948
6049describe ( 'WalletContext multi-provider support' , ( ) => {
50+ const testWindow = window as unknown as TestWindow ;
51+
6152 beforeEach ( ( ) => {
6253 localStorage . clear ( ) ;
63- testWindow . freighter = undefined ;
64- testWindow . rabet = undefined ;
6554 } ) ;
6655
67- it ( 'lists detected providers and their availability' , async ( ) => {
68- testWindow . rabet = { connect : jest . fn ( ) } ;
69- renderConsumer ( ) ;
70-
71- await waitFor ( ( ) => expect ( screen . getByTestId ( 'loading' ) ) . toHaveTextContent ( 'ready' ) ) ;
72- expect ( screen . getByTestId ( 'available' ) ) . toHaveTextContent ( 'freighter:false,rabet:true' ) ;
56+ afterEach ( ( ) => {
57+ delete testWindow . rabet ;
7358 } ) ;
7459
60+ function TestComponent ( ) {
61+ const { publicKey, isConnected, activeProvider, connect, isLoading } = useWallet ( ) ;
62+ return (
63+ < div >
64+ < div data-testid = "pk" > { publicKey } </ div >
65+ < div data-testid = "connected" > { isConnected ? 'Connected' : 'Disconnected' } </ div >
66+ < div data-testid = "provider" > { activeProvider ?? 'none' } </ div >
67+ < div data-testid = "loading" > { isLoading ? 'loading' : 'ready' } </ div >
68+ < button data-testid = "connect-btn" onClick = { ( ) => connect ( 'rabet' ) } >
69+ Connect Rabet
70+ </ button >
71+ </ div >
72+ ) ;
73+ }
74+
7575 it ( 'connects through Rabet and persists the active provider' , async ( ) => {
7676 testWindow . rabet = { connect : jest . fn ( ) . mockResolvedValue ( { publicKey : RABET_KEY } ) } ;
77- renderConsumer ( ) ;
77+
78+ render (
79+ < WalletProvider >
80+ < TestComponent />
81+ </ WalletProvider >
82+ ) ;
7883
7984 await waitFor ( ( ) => expect ( screen . getByTestId ( 'loading' ) ) . toHaveTextContent ( 'ready' ) ) ;
80- fireEvent . click ( screen . getByTestId ( 'connect-rabet' ) ) ;
85+
86+ fireEvent . click ( screen . getByTestId ( 'connect-btn' ) ) ;
8187
8288 await waitFor ( ( ) => expect ( screen . getByTestId ( 'pk' ) ) . toHaveTextContent ( RABET_KEY ) ) ;
8389 expect ( screen . getByTestId ( 'provider' ) ) . toHaveTextContent ( 'rabet' ) ;
8490 expect ( localStorage . getItem ( STORAGE_KEY ) ) . toBe ( RABET_KEY ) ;
8591 expect ( localStorage . getItem ( PROVIDER_STORAGE_KEY ) ) . toBe ( 'rabet' ) ;
8692 } ) ;
87-
88- it ( 'surfaces an error when the selected wallet is not installed' , async ( ) => {
89- const consoleSpy = jest . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } ) ;
90- renderConsumer ( ) ;
91-
92- await waitFor ( ( ) => expect ( screen . getByTestId ( 'loading' ) ) . toHaveTextContent ( 'ready' ) ) ;
93- fireEvent . click ( screen . getByTestId ( 'connect-rabet' ) ) ;
94-
95- await waitFor ( ( ) =>
96- expect ( screen . getByTestId ( 'error' ) ) . toHaveTextContent ( 'Rabet wallet is not installed' )
97- ) ;
98- expect ( screen . getByTestId ( 'provider' ) ) . toHaveTextContent ( 'none' ) ;
99- consoleSpy . mockRestore ( ) ;
100- } ) ;
10193} ) ;
0 commit comments