@reown/appkit-controllers 1.8.21 → 1.8.22-headless-js-wcuri.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,184 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { ApiController } from '../../src/controllers/ApiController.js';
3
+ import { ChainController } from '../../src/controllers/ChainController.js';
4
+ import { ConnectionController } from '../../src/controllers/ConnectionController.js';
5
+ import { ConnectorController } from '../../src/controllers/ConnectorController.js';
6
+ import { OptionsController } from '../../src/controllers/OptionsController.js';
7
+ import { PublicStateController } from '../../src/controllers/PublicStateController.js';
8
+ import { ConnectUtil } from '../../src/utils/ConnectUtil.js';
9
+ import { ConnectionControllerUtil } from '../../src/utils/ConnectionControllerUtil.js';
10
+ import { ConnectorControllerUtil } from '../../src/utils/ConnectorControllerUtil.js';
11
+ import { CoreHelperUtil } from '../../src/utils/CoreHelperUtil.js';
12
+ import { HeadlessWalletUtil } from '../../src/utils/HeadlessWalletUtil.js';
13
+ import { MobileWalletUtil } from '../../src/utils/MobileWallet.js';
14
+ const injectedWallet = {
15
+ id: 'mm',
16
+ name: 'MetaMask',
17
+ imageUrl: 'icon',
18
+ connectors: [{ id: 'io.metamask', chain: 'eip155' }],
19
+ walletInfo: {},
20
+ isInjected: true,
21
+ isRecent: false
22
+ };
23
+ const apiWallet = {
24
+ id: 'wc_wallet',
25
+ name: 'Some Wallet',
26
+ imageUrl: 'icon',
27
+ connectors: [],
28
+ walletInfo: {},
29
+ isInjected: false,
30
+ isRecent: false
31
+ };
32
+ beforeEach(() => {
33
+ vi.restoreAllMocks();
34
+ vi.spyOn(ChainController, 'state', 'get').mockReturnValue({
35
+ activeChain: 'eip155'
36
+ });
37
+ vi.spyOn(PublicStateController, 'set').mockImplementation(vi.fn());
38
+ });
39
+ describe('HeadlessWalletUtil.fetchWallets', () => {
40
+ it('searches when a search term is given', async () => {
41
+ const searchWallet = vi
42
+ .spyOn(ApiController, 'searchWallet')
43
+ .mockResolvedValue(undefined);
44
+ const fetchByPage = vi.spyOn(ApiController, 'fetchWalletsByPage');
45
+ await HeadlessWalletUtil.fetchWallets({ search: 'rainbow', includePayOnly: true });
46
+ expect(searchWallet).toHaveBeenCalledWith({ includePayOnly: true, search: 'rainbow' });
47
+ expect(fetchByPage).not.toHaveBeenCalled();
48
+ });
49
+ it('maps the deprecated `query` to `search`', async () => {
50
+ const searchWallet = vi
51
+ .spyOn(ApiController, 'searchWallet')
52
+ .mockResolvedValue(undefined);
53
+ await HeadlessWalletUtil.fetchWallets({ query: 'rbw' });
54
+ expect(searchWallet).toHaveBeenCalledWith({ search: 'rbw' });
55
+ });
56
+ it('lists from page 1 and clears prior search when no search term', async () => {
57
+ const fetchByPage = vi
58
+ .spyOn(ApiController, 'fetchWalletsByPage')
59
+ .mockResolvedValue(undefined);
60
+ ApiController.state.search = [{ id: 'stale' }];
61
+ await HeadlessWalletUtil.fetchWallets({ sort: 'wcpay' });
62
+ expect(ApiController.state.search).toEqual([]);
63
+ expect(fetchByPage).toHaveBeenCalledWith({ page: 1, sort: 'wcpay' });
64
+ });
65
+ });
66
+ describe('HeadlessWalletUtil.getWalletList', () => {
67
+ it('projects the initial + WalletConnect lists with pagination', () => {
68
+ vi.spyOn(ConnectUtil, 'getInitialWallets').mockReturnValue([injectedWallet]);
69
+ vi.spyOn(ConnectUtil, 'getWalletConnectWallets').mockReturnValue([apiWallet]);
70
+ ApiController.state.page = 2;
71
+ ApiController.state.count = 99;
72
+ expect(HeadlessWalletUtil.getWalletList()).toEqual({
73
+ wallets: [injectedWallet],
74
+ wcWallets: [apiWallet],
75
+ page: 2,
76
+ count: 99
77
+ });
78
+ });
79
+ });
80
+ describe('HeadlessWalletUtil.connect', () => {
81
+ it('connects an injected wallet via its connector', async () => {
82
+ const connector = { id: 'io.metamask' };
83
+ vi.spyOn(ConnectorController, 'getConnector').mockReturnValue(connector);
84
+ const connectExternal = vi
85
+ .spyOn(ConnectorControllerUtil, 'connectExternal')
86
+ .mockResolvedValue(undefined);
87
+ await HeadlessWalletUtil.connect(injectedWallet, 'eip155');
88
+ expect(PublicStateController.set).toHaveBeenCalledWith({ connectingWallet: injectedWallet });
89
+ expect(connectExternal).toHaveBeenCalledWith(connector);
90
+ });
91
+ it('falls back to a connector found by wallet id (API wallet)', async () => {
92
+ const fallback = { id: 'baseAccount', explorerId: 'wc_wallet' };
93
+ // apiWallet has no connectors, so the first (guarded) lookup is skipped — only the
94
+ // fallback lookup by wallet id runs, and it resolves the Base Account connector.
95
+ const getConnector = vi
96
+ .spyOn(ConnectorController, 'getConnector')
97
+ .mockReturnValue(fallback);
98
+ const connectExternal = vi
99
+ .spyOn(ConnectorControllerUtil, 'connectExternal')
100
+ .mockResolvedValue(undefined);
101
+ await HeadlessWalletUtil.connect(apiWallet, 'eip155');
102
+ expect(getConnector).toHaveBeenCalledTimes(1);
103
+ expect(getConnector).toHaveBeenCalledWith({ id: 'wc_wallet', namespace: 'eip155' });
104
+ expect(connectExternal).toHaveBeenCalledWith(fallback);
105
+ });
106
+ it('deeplinks on mobile when the wallet declares a mobile link', async () => {
107
+ vi.spyOn(ConnectorController, 'getConnector').mockReturnValue(undefined);
108
+ vi.spyOn(CoreHelperUtil, 'isMobile').mockReturnValue(true);
109
+ vi.spyOn(ConnectUtil, 'mapWalletItemToWcWallet').mockReturnValue({
110
+ id: 'wc_wallet',
111
+ name: 'Some Wallet',
112
+ mobile_link: 'somewallet://'
113
+ });
114
+ const onConnectMobile = vi
115
+ .spyOn(ConnectionControllerUtil, 'onConnectMobile')
116
+ .mockImplementation(vi.fn());
117
+ await HeadlessWalletUtil.connect(apiWallet, 'eip155', { wcPayUrl: 'https://pay/x' });
118
+ expect(onConnectMobile).toHaveBeenCalledWith(expect.objectContaining({ mobile_link: 'somewallet://' }), 'https://pay/x');
119
+ });
120
+ it('redirects via MobileWalletUtil on mobile when there is no mobile link', async () => {
121
+ vi.spyOn(ConnectorController, 'getConnector').mockReturnValue(undefined);
122
+ vi.spyOn(CoreHelperUtil, 'isMobile').mockReturnValue(true);
123
+ vi.spyOn(ConnectUtil, 'mapWalletItemToWcWallet').mockReturnValue({
124
+ id: 'wc_wallet',
125
+ name: 'Some Wallet'
126
+ });
127
+ vi.spyOn(OptionsController, 'state', 'get').mockReturnValue({ enableCoinbase: true });
128
+ const redirect = vi
129
+ .spyOn(MobileWalletUtil, 'handleMobileDeeplinkRedirect')
130
+ .mockImplementation(vi.fn());
131
+ await HeadlessWalletUtil.connect(apiWallet, 'eip155');
132
+ expect(redirect).toHaveBeenCalledWith('wc_wallet', 'eip155', { isCoinbaseDisabled: false });
133
+ });
134
+ it('falls back to WalletConnect on desktop', async () => {
135
+ vi.spyOn(ConnectorController, 'getConnector').mockReturnValue(undefined);
136
+ vi.spyOn(CoreHelperUtil, 'isMobile').mockReturnValue(false);
137
+ const connectWc = vi
138
+ .spyOn(ConnectionController, 'connectWalletConnect')
139
+ .mockResolvedValue(undefined);
140
+ await HeadlessWalletUtil.connect(apiWallet, 'eip155');
141
+ expect(connectWc).toHaveBeenCalledWith({ cache: 'never' });
142
+ });
143
+ it('clears connectingWallet and rethrows on failure', async () => {
144
+ vi.spyOn(ConnectorController, 'getConnector').mockReturnValue({ id: 'io.metamask' });
145
+ vi.spyOn(ConnectorControllerUtil, 'connectExternal').mockRejectedValue(new Error('boom'));
146
+ await expect(HeadlessWalletUtil.connect(injectedWallet, 'eip155')).rejects.toThrow('boom');
147
+ expect(PublicStateController.set).toHaveBeenLastCalledWith({ connectingWallet: undefined });
148
+ });
149
+ it('falls back to the active chain when no namespace is given', async () => {
150
+ const getConnector = vi
151
+ .spyOn(ConnectorController, 'getConnector')
152
+ .mockReturnValue({ id: 'io.metamask' });
153
+ vi.spyOn(ConnectorControllerUtil, 'connectExternal').mockResolvedValue(undefined);
154
+ await HeadlessWalletUtil.connect(injectedWallet);
155
+ expect(getConnector).toHaveBeenCalledWith(expect.objectContaining({ namespace: 'eip155' }));
156
+ });
157
+ });
158
+ describe('HeadlessWalletUtil.getWalletConnectUri', () => {
159
+ it('resets then fetches the URI with auto cache', async () => {
160
+ const resetUri = vi.spyOn(ConnectionController, 'resetUri').mockImplementation(vi.fn());
161
+ const setWcLinking = vi.spyOn(ConnectionController, 'setWcLinking').mockImplementation(vi.fn());
162
+ const connectWc = vi
163
+ .spyOn(ConnectionController, 'connectWalletConnect')
164
+ .mockResolvedValue(undefined);
165
+ await HeadlessWalletUtil.getWalletConnectUri();
166
+ expect(resetUri).toHaveBeenCalled();
167
+ expect(setWcLinking).toHaveBeenCalledWith(undefined);
168
+ expect(connectWc).toHaveBeenCalledWith({ cache: 'auto' });
169
+ });
170
+ });
171
+ describe('HeadlessWalletUtil resets', () => {
172
+ it('resetWcUri resets the URI + linking', () => {
173
+ const resetUri = vi.spyOn(ConnectionController, 'resetUri').mockImplementation(vi.fn());
174
+ const setWcLinking = vi.spyOn(ConnectionController, 'setWcLinking').mockImplementation(vi.fn());
175
+ HeadlessWalletUtil.resetWcUri();
176
+ expect(resetUri).toHaveBeenCalled();
177
+ expect(setWcLinking).toHaveBeenCalledWith(undefined);
178
+ });
179
+ it('resetConnectingWallet clears the connecting wallet', () => {
180
+ HeadlessWalletUtil.resetConnectingWallet();
181
+ expect(PublicStateController.set).toHaveBeenCalledWith({ connectingWallet: undefined });
182
+ });
183
+ });
184
+ //# sourceMappingURL=HeadlessWalletUtil.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeadlessWalletUtil.test.js","sourceRoot":"","sources":["../../../../tests/utils/HeadlessWalletUtil.test.ts"],"names":[],"mappings":"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"}