|
1 | 1 | import { accounts, chain, wait } from '@wagmi/test'
|
| 2 | +import { |
| 3 | + type EIP1193Provider, |
| 4 | + type EIP6963ProviderDetail, |
| 5 | + announceProvider, |
| 6 | +} from 'mipd' |
2 | 7 | import { http } from 'viem'
|
3 | 8 | import { expect, test, vi } from 'vitest'
|
4 | 9 |
|
5 | 10 | import { connect } from './actions/connect.js'
|
6 | 11 | import { disconnect } from './actions/disconnect.js'
|
7 | 12 | import { switchChain } from './actions/switchChain.js'
|
| 13 | +import { createConnector } from './connectors/createConnector.js' |
8 | 14 | import { mock } from './connectors/mock.js'
|
9 | 15 | import { createConfig } from './createConfig.js'
|
10 | 16 | import { createStorage } from './createStorage.js'
|
@@ -346,10 +352,86 @@ test('behavior: setup connector', async () => {
|
346 | 352 |
|
347 | 353 | await connect(config, {
|
348 | 354 | chainId: mainnet.id,
|
349 |
| - connector: config.connectors[0]!, |
| 355 | + connector: config.connectors.find((x) => x.uid === connector.uid)!, |
350 | 356 | })
|
351 | 357 |
|
352 | 358 | expect(config.state.current).toBe(connector.uid)
|
353 | 359 |
|
354 | 360 | await disconnect(config)
|
355 | 361 | })
|
| 362 | + |
| 363 | +test('behavior: eip 6963 providers', async () => { |
| 364 | + const detail_1 = getProviderDetail({ name: 'Foo Wallet', rdns: 'com.foo' }) |
| 365 | + const detail_2 = getProviderDetail({ name: 'Bar Wallet', rdns: 'com.bar' }) |
| 366 | + const detail_3 = getProviderDetail({ name: 'Mock', rdns: 'com.mock' }) |
| 367 | + |
| 368 | + const config = createConfig({ |
| 369 | + chains: [mainnet], |
| 370 | + connectors: [ |
| 371 | + createConnector((c) => { |
| 372 | + return { |
| 373 | + ...mock({ accounts })(c), |
| 374 | + rdns: 'com.mock', |
| 375 | + } |
| 376 | + }), |
| 377 | + ], |
| 378 | + transports: { |
| 379 | + [mainnet.id]: http(), |
| 380 | + }, |
| 381 | + }) |
| 382 | + |
| 383 | + await wait(100) |
| 384 | + announceProvider(detail_1)() |
| 385 | + await wait(100) |
| 386 | + announceProvider(detail_1)() |
| 387 | + await wait(100) |
| 388 | + announceProvider(detail_2)() |
| 389 | + await wait(100) |
| 390 | + announceProvider(detail_3)() |
| 391 | + await wait(100) |
| 392 | + |
| 393 | + expect(config.connectors.map((x) => x.rdns ?? x.id)).toMatchInlineSnapshot(` |
| 394 | + [ |
| 395 | + "com.mock", |
| 396 | + "com.example", |
| 397 | + "com.foo", |
| 398 | + "com.bar", |
| 399 | + ] |
| 400 | + `) |
| 401 | +}) |
| 402 | + |
| 403 | +function getProviderDetail( |
| 404 | + info: Pick<EIP6963ProviderDetail['info'], 'name' | 'rdns'>, |
| 405 | +): EIP6963ProviderDetail { |
| 406 | + return { |
| 407 | + info: { |
| 408 | + icon: 'data:image/svg+xml,<svg width="32px" height="32px" viewBox="0 0 32 32"/>', |
| 409 | + uuid: crypto.randomUUID(), |
| 410 | + ...info, |
| 411 | + }, |
| 412 | + provider: `<EIP1193Provider_${info.rdns}>` as unknown as EIP1193Provider, |
| 413 | + } |
| 414 | +} |
| 415 | + |
| 416 | +vi.mock(import('mipd'), async (importOriginal) => { |
| 417 | + const mod = await importOriginal() |
| 418 | + |
| 419 | + let _cache: typeof mod | undefined |
| 420 | + if (!_cache) |
| 421 | + _cache = { |
| 422 | + ...mod, |
| 423 | + createStore() { |
| 424 | + const store = mod.createStore() |
| 425 | + return { |
| 426 | + ...store, |
| 427 | + getProviders() { |
| 428 | + return [ |
| 429 | + getProviderDetail({ name: 'Example', rdns: 'com.example' }), |
| 430 | + getProviderDetail({ name: 'Mock', rdns: 'com.mock' }), |
| 431 | + ] |
| 432 | + }, |
| 433 | + } |
| 434 | + }, |
| 435 | + } |
| 436 | + return _cache |
| 437 | +}) |
0 commit comments