-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathapi.test.ts
More file actions
114 lines (99 loc) · 2.93 KB
/
Copy pathapi.test.ts
File metadata and controls
114 lines (99 loc) · 2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { describe, it, jest } from '@jest/globals';
import type { MetaMaskInpageProvider } from '@metamask/providers';
import type { BaseQueryApi } from '@reduxjs/toolkit/query';
import { when } from 'jest-when';
import { request } from './api';
type RequestFunction = (args: unknown) => Promise<unknown>;
type Methods = Record<string, unknown>;
/**
* Get a mock MetaMask provider.
*
* @param requestFn - The request function.
* @returns The mock provider.
*/
function getMockProvider(requestFn: RequestFunction): MetaMaskInpageProvider {
return {
request: requestFn,
} as MetaMaskInpageProvider;
}
/**
* Get a mock request method.
*
* @param methods - A key-value map of method names to results.
* @returns The mocked Ethereum provider.
*/
function getRequestMethodMock(methods: Methods) {
const fn = jest.fn<RequestFunction>();
for (const [method, result] of Object.entries(methods)) {
if (result instanceof Error) {
when<Promise<unknown>, unknown[]>(fn)
.calledWith({ method })
.mockRejectedValue(result);
continue;
}
when<Promise<unknown>, unknown[]>(fn)
.calledWith({ method })
.mockResolvedValue(result);
}
return getMockProvider(fn);
}
describe('request', () => {
it('calls the Snaps provider with the given method and params', async () => {
const provider = getRequestMethodMock({
// eslint-disable-next-line @typescript-eslint/naming-convention
wallet_getAllSnaps: {},
foo: 'bar',
});
Object.defineProperty(globalThis, 'window', {
writable: true,
value: {
ethereum: provider,
addEventListener: jest.fn(),
dispatchEvent: jest.fn(),
removeEventListener: jest.fn(),
},
});
expect(
await request({ method: 'foo' }, {} as BaseQueryApi, {}),
).toStrictEqual({
data: 'bar',
});
});
it('returns an error if the provider throws', async () => {
const provider = getRequestMethodMock({
// eslint-disable-next-line @typescript-eslint/naming-convention
wallet_getAllSnaps: {},
foo: new Error('Unsupported method.'),
});
Object.defineProperty(globalThis, 'window', {
writable: true,
value: {
ethereum: provider,
addEventListener: jest.fn(),
dispatchEvent: jest.fn(),
removeEventListener: jest.fn(),
},
});
expect(
await request({ method: 'foo' }, {} as BaseQueryApi, {}),
).toStrictEqual({
error: new Error('Unsupported method.'),
});
});
it('returns `null` if the provider is not available', async () => {
Object.defineProperty(globalThis, 'window', {
writable: true,
value: {
ethereum: undefined,
addEventListener: jest.fn(),
dispatchEvent: jest.fn(),
removeEventListener: jest.fn(),
},
});
expect(
await request({ method: 'foo' }, {} as BaseQueryApi, {}),
).toStrictEqual({
data: null,
});
});
});