Skip to content

Commit 20d4c06

Browse files
committed
[core] Added new WalletAdapter tests
1 parent d56b79c commit 20d4c06

File tree

2 files changed

+191
-2
lines changed

2 files changed

+191
-2
lines changed

packages/wallet-adapter-core/src/new/WalletAdapter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ export class WalletAdapter {
113113

114114
// region Accounts
115115

116-
readonly onAccountConnectedListeners = new Set<(account: AccountInfo) => void>();
117-
readonly onAccountDisconnectedListeners = new Set<() => void>();
116+
private readonly onAccountConnectedListeners = new Set<(account: AccountInfo) => void>();
117+
private readonly onAccountDisconnectedListeners = new Set<() => void>();
118118

119119
async getConnectedAccounts(): Promise<AccountInfo[]> {
120120
// TODO: add explicit `getConnectedAccounts` feature
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
import {
2+
AccountInfo,
3+
AptosConnectMethod,
4+
AptosDisconnectMethod,
5+
AptosFeatures,
6+
AptosGetAccountMethod,
7+
AptosGetNetworkMethod,
8+
AptosOnAccountChangeMethod,
9+
AptosOnNetworkChangeMethod,
10+
} from '@aptos-labs/wallet-standard';
11+
import { AptosStandardWallet } from '../AptosStandardWallet';
12+
import { StandardNetwork } from '../network';
13+
import { makeUserApproval, makeUserRejection } from '../utils';
14+
import { WalletAdapter } from '../WalletAdapter';
15+
16+
function makeTestAdapterFromFields({ chains = [], ...rest }: Partial<AptosStandardWallet>) {
17+
return new WalletAdapter({ chains, ...rest } as AptosStandardWallet);
18+
}
19+
20+
function makeTestAdapter(features: Partial<AptosFeatures>) {
21+
return makeTestAdapterFromFields({ features: features as AptosFeatures });
22+
}
23+
24+
describe('WalletAdapter', () => {
25+
test('fields', () => {
26+
const adapter = makeTestAdapterFromFields({
27+
name: 'Test wallet',
28+
icon: 'data:image/svg+xml;base64,deadbeef',
29+
url: 'https://test-wallet.com',
30+
});
31+
32+
expect(adapter.name).toBe('Test wallet');
33+
expect(adapter.icon).toBe('data:image/svg+xml;base64,deadbeef');
34+
expect(adapter.url).toBe('https://test-wallet.com');
35+
});
36+
37+
test('connect', async () => {
38+
const connect: jest.MockedFn<AptosConnectMethod> = jest.fn();
39+
const adapter = makeTestAdapter({
40+
'aptos:connect': {
41+
version: '1.0.0',
42+
connect,
43+
},
44+
});
45+
46+
const onAccountConnected = jest.fn();
47+
const unsubscribe = adapter.on('accountConnected', onAccountConnected);
48+
expect(adapter['onAccountConnectedListeners'].size).toBe(1);
49+
50+
const mockRejection = makeUserRejection();
51+
connect.mockResolvedValueOnce(mockRejection);
52+
await expect(adapter.connect()).resolves.toBe(mockRejection);
53+
expect(onAccountConnected).not.toHaveBeenCalled();
54+
55+
const mockApproval = makeUserApproval({} as any);
56+
connect.mockResolvedValueOnce(mockApproval);
57+
await expect(adapter.connect()).resolves.toBe(mockApproval);
58+
expect(onAccountConnected).toHaveBeenCalledWith(mockApproval.args);
59+
60+
unsubscribe();
61+
expect(adapter['onAccountConnectedListeners'].size).toBe(0);
62+
});
63+
64+
test('disconnect', async () => {
65+
const disconnect: jest.MockedFn<AptosDisconnectMethod> = jest.fn();
66+
const adapter = makeTestAdapter({
67+
'aptos:disconnect': {
68+
version: '1.0.0',
69+
disconnect,
70+
},
71+
});
72+
73+
const onAccountDisconnected = jest.fn();
74+
const unsubscribe = adapter.on('accountDisconnected', onAccountDisconnected);
75+
expect(adapter['onAccountDisconnectedListeners'].size).toBe(1);
76+
77+
await adapter.disconnect();
78+
expect(disconnect).toHaveBeenCalledTimes(1);
79+
expect(onAccountDisconnected).toHaveBeenCalledTimes(1);
80+
81+
unsubscribe();
82+
expect(adapter['onAccountDisconnectedListeners'].size).toBe(0);
83+
});
84+
85+
test('getActiveAccount', async () => {
86+
const getActiveAccount: jest.MockedFn<AptosGetAccountMethod> = jest.fn();
87+
const adapter = makeTestAdapter({
88+
'aptos:account': {
89+
version: '1.0.0',
90+
account: getActiveAccount,
91+
},
92+
});
93+
94+
const mockAccount: AccountInfo = {} as any;
95+
getActiveAccount.mockResolvedValueOnce(mockAccount);
96+
await expect(adapter.getActiveAccount()).resolves.toBe(mockAccount);
97+
expect(getActiveAccount).toHaveBeenCalledTimes(1);
98+
99+
getActiveAccount.mockRejectedValueOnce(new Error('Not connected'));
100+
await expect(adapter.getActiveAccount()).resolves.toBe(undefined);
101+
expect(getActiveAccount).toHaveBeenCalledTimes(2);
102+
103+
getActiveAccount.mockResolvedValueOnce(mockAccount);
104+
await expect(adapter.getConnectedAccounts()).resolves.toEqual([mockAccount]);
105+
});
106+
107+
test('getActiveNetwork', async () => {
108+
const getActiveNetwork: jest.MockedFn<AptosGetNetworkMethod> = jest.fn();
109+
const adapter = makeTestAdapter({
110+
'aptos:network': {
111+
version: '1.0.0',
112+
network: getActiveNetwork,
113+
},
114+
});
115+
116+
getActiveNetwork.mockResolvedValueOnce({
117+
name: StandardNetwork.TESTNET,
118+
chainId: 2,
119+
});
120+
await expect(adapter.getActiveNetwork()).resolves.toBe(StandardNetwork.TESTNET);
121+
expect(getActiveNetwork).toHaveBeenCalledTimes(1);
122+
123+
getActiveNetwork.mockRejectedValueOnce(new Error('Not connected'));
124+
await expect(adapter.getActiveNetwork()).resolves.toBe(StandardNetwork.MAINNET);
125+
expect(getActiveNetwork).toHaveBeenCalledTimes(2);
126+
});
127+
128+
test('getAvailableNetworks', async () => {
129+
const adapter = makeTestAdapterFromFields({
130+
chains: ['aptos:mainnet', 'aptos:testnet'],
131+
});
132+
await expect(adapter.getAvailableNetworks()).resolves.toEqual([
133+
StandardNetwork.MAINNET,
134+
StandardNetwork.TESTNET,
135+
]);
136+
});
137+
138+
test('onActiveAccountChanged', () => {
139+
const onActiveAccountChange: jest.MockedFn<AptosOnAccountChangeMethod> = jest.fn();
140+
const adapter = makeTestAdapter({
141+
'aptos:onAccountChange': {
142+
version: '1.0.0',
143+
onAccountChange: onActiveAccountChange,
144+
},
145+
});
146+
147+
const callback = jest.fn();
148+
const unsubscribe = adapter.on('activeAccountChanged', callback);
149+
expect(onActiveAccountChange).toHaveBeenCalledTimes(1);
150+
const [internalCallback] = onActiveAccountChange.mock.lastCall!;
151+
152+
const mockAccount: AccountInfo = {} as any;
153+
internalCallback(mockAccount);
154+
expect(callback).toHaveBeenCalledWith(mockAccount);
155+
156+
unsubscribe();
157+
expect(onActiveAccountChange).toHaveBeenCalledTimes(2);
158+
expect(onActiveAccountChange).toHaveBeenLastCalledWith(
159+
expect.objectContaining({ '_isNull': true }),
160+
);
161+
});
162+
163+
test('onActiveNetworkChanged', () => {
164+
const onActiveNetworkChange: jest.MockedFn<AptosOnNetworkChangeMethod> = jest.fn();
165+
const adapter = makeTestAdapter({
166+
'aptos:onNetworkChange': {
167+
version: '1.0.0',
168+
onNetworkChange: onActiveNetworkChange,
169+
},
170+
});
171+
172+
const callback = jest.fn();
173+
const unsubscribe = adapter.on('activeNetworkChanged', callback);
174+
expect(onActiveNetworkChange).toHaveBeenCalledTimes(1);
175+
const [internalCallback] = onActiveNetworkChange.mock.lastCall!;
176+
177+
internalCallback({
178+
name: StandardNetwork.TESTNET,
179+
chainId: 2,
180+
});
181+
expect(callback).toHaveBeenCalledWith(StandardNetwork.TESTNET);
182+
183+
unsubscribe();
184+
expect(onActiveNetworkChange).toHaveBeenCalledTimes(2);
185+
expect(onActiveNetworkChange).toHaveBeenLastCalledWith(
186+
expect.objectContaining({ '_isNull': true }),
187+
);
188+
});
189+
});

0 commit comments

Comments
 (0)