Skip to content

Commit 1962d8b

Browse files
committed
add support for onSettingsPage in snaps-simulation and snaps-jest
1 parent dc58f2e commit 1962d8b

File tree

9 files changed

+110
-61
lines changed

9 files changed

+110
-61
lines changed

packages/examples/packages/settings-page/snap.manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"url": "https://github.com/MetaMask/snaps.git"
88
},
99
"source": {
10-
"shasum": "yWcDv7XuV/FGRxKdOMkelR4qB0Ivel7oP9fEuNz0EE8=",
10+
"shasum": "Ha9z5pHnxqQOH7GQoWBcj99quZy5eqRMzjxOKCEIIQI=",
1111
"location": {
1212
"npm": {
1313
"filePath": "dist/bundle.js",

packages/examples/packages/settings-page/src/index.test.tsx

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
import { describe, it } from '@jest/globals';
22
import { installSnap } from '@metamask/snaps-jest';
3-
import { Box, Text } from '@metamask/snaps-sdk/jsx';
3+
import { Box, Heading, Text } from '@metamask/snaps-sdk/jsx';
44

5-
describe('onHomePage', () => {
5+
describe('onSettingsPage', () => {
66
it('returns custom UI', async () => {
7-
const { onHomePage } = await installSnap();
7+
const { onSettingsPage } = await installSnap();
88

9-
const response = await onHomePage();
9+
const response = await onSettingsPage();
1010

1111
const screen = response.getInterface();
1212

13-
await screen.clickElement('footer_button');
14-
15-
const newUi = response.getInterface();
16-
17-
expect(newUi).toRender(
13+
expect(screen).toRender(
1814
<Box>
19-
<Text>Footer button was pressed</Text>
15+
<Heading>Hello world!</Heading>
16+
<Text>Welcome to my Snap settings page!</Text>
2017
</Box>,
2118
);
2219
});
Lines changed: 5 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,5 @@
11
import type { OnSettingsPageHandler } from '@metamask/snaps-sdk';
2-
import {
3-
assert,
4-
UserInputEventType,
5-
type OnUserInputHandler,
6-
} from '@metamask/snaps-sdk';
7-
import {
8-
Box,
9-
Container,
10-
Footer,
11-
Heading,
12-
Text,
13-
Button,
14-
} from '@metamask/snaps-sdk/jsx';
2+
import { Box, Heading, Text } from '@metamask/snaps-sdk/jsx';
153

164
/**
175
* Handle incoming settings page requests from the MetaMask clients.
@@ -22,43 +10,10 @@ import {
2210
export const onSettingsPage: OnSettingsPageHandler = async () => {
2311
return {
2412
content: (
25-
<Container>
26-
<Box>
27-
<Heading>Hello world!</Heading>
28-
<Text>Welcome to my Snap settings page!</Text>
29-
</Box>
30-
<Footer>
31-
<Button name="footer_button">Footer button</Button>
32-
</Footer>
33-
</Container>
13+
<Box>
14+
<Heading>Hello world!</Heading>
15+
<Text>Welcome to my Snap settings page!</Text>
16+
</Box>
3417
),
3518
};
3619
};
37-
38-
/**
39-
* Handle incoming user events coming from the Snap interface.
40-
*
41-
* @param params - The event parameters.
42-
* @param params.id - The Snap interface ID where the event was fired.
43-
* @param params.event - The event object containing the event type, name and
44-
* value.
45-
* @see https://docs.metamask.io/snaps/reference/exports/#onuserinput
46-
*/
47-
export const onUserInput: OnUserInputHandler = async ({ event, id }) => {
48-
// Since this Snap only has one event, we can assert the event type and name
49-
// directly.
50-
assert(event.type === UserInputEventType.ButtonClickEvent);
51-
assert(event.name === 'footer_button');
52-
53-
await snap.request({
54-
method: 'snap_updateInterface',
55-
params: {
56-
id,
57-
ui: (
58-
<Box>
59-
<Text>Footer button was pressed</Text>
60-
</Box>
61-
),
62-
},
63-
});
64-
};

packages/snaps-jest/src/helpers.test.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,32 @@ describe('installSnap', () => {
774774
});
775775
});
776776

777+
describe('getSettingsPage', () => {
778+
it('sends a OnSettingsPage request and returns the result', async () => {
779+
jest.spyOn(console, 'log').mockImplementation();
780+
781+
const { snapId, close: closeServer } = await getMockServer({
782+
sourceCode: `
783+
module.exports.onSettingsPage = async () => {
784+
return { content: { type: 'text', value: 'Hello, world!' } };
785+
};
786+
`,
787+
});
788+
789+
const { onSettingsPage, close } = await installSnap(snapId);
790+
const response = await onSettingsPage();
791+
792+
expect(response).toStrictEqual(
793+
expect.objectContaining({
794+
getInterface: expect.any(Function),
795+
}),
796+
);
797+
798+
await close();
799+
await closeServer();
800+
});
801+
});
802+
777803
describe('onKeyringRequest', () => {
778804
it('sends a keyring request and returns the result', async () => {
779805
jest.spyOn(console, 'log').mockImplementation();

packages/snaps-jest/src/helpers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ export async function installSnap<
178178
onCronjob,
179179
runCronjob,
180180
onHomePage,
181+
onSettingsPage,
181182
onKeyringRequest,
182183
onInstall,
183184
onUpdate,
@@ -194,6 +195,7 @@ export async function installSnap<
194195
onCronjob,
195196
runCronjob,
196197
onHomePage,
198+
onSettingsPage,
197199
onKeyringRequest,
198200
onInstall,
199201
onUpdate,

packages/snaps-simulation/src/helpers.test.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,32 @@ describe('helpers', () => {
548548
});
549549
});
550550

551+
describe('getSettingsPage', () => {
552+
it('sends a OnSettingsPage request and returns the result', async () => {
553+
jest.spyOn(console, 'log').mockImplementation();
554+
555+
const { snapId, close: closeServer } = await getMockServer({
556+
sourceCode: `
557+
module.exports.onSettingsPage = async () => {
558+
return { content: { type: 'text', value: 'Hello, world!' } };
559+
};
560+
`,
561+
});
562+
563+
const { onSettingsPage, close } = await installSnap(snapId);
564+
const response = await onSettingsPage();
565+
566+
expect(response).toStrictEqual(
567+
expect.objectContaining({
568+
getInterface: expect.any(Function),
569+
}),
570+
);
571+
572+
await close();
573+
await closeServer();
574+
});
575+
});
576+
551577
describe('onKeyringRequest', () => {
552578
it('sends a keyring request and returns the result', async () => {
553579
jest.spyOn(console, 'log').mockImplementation();

packages/snaps-simulation/src/helpers.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ export type SnapHelpers = {
118118
*/
119119
onHomePage(): Promise<SnapResponseWithInterface>;
120120

121+
/**
122+
* Get the response from the snap's `onSettingsPage` method.
123+
*
124+
* @returns The response.
125+
*/
126+
onSettingsPage(): Promise<SnapResponseWithInterface>;
127+
121128
/**
122129
* Send a keyring request to the Snap.
123130
*
@@ -402,6 +409,26 @@ export function getHelpers({
402409
return response;
403410
},
404411

412+
onSettingsPage: async (): Promise<SnapResponseWithInterface> => {
413+
log('Rendering settings page.');
414+
415+
const response = await handleRequest({
416+
snapId,
417+
store,
418+
executionService,
419+
controllerMessenger,
420+
runSaga,
421+
handler: HandlerType.OnSettingsPage,
422+
request: {
423+
method: '',
424+
},
425+
});
426+
427+
assertIsResponseWithInterface(response);
428+
429+
return response;
430+
},
431+
405432
mockJsonRpc(mock: JsonRpcMockOptions) {
406433
log('Mocking JSON-RPC request %o.', mock);
407434

packages/snaps-simulation/src/methods/specifications.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,15 @@ describe('getPermissionSpecifications', () => {
123123
],
124124
"targetName": "endowment:page-home",
125125
},
126+
"endowment:page-settings": {
127+
"allowedCaveats": null,
128+
"endowmentGetter": [Function],
129+
"permissionType": "Endowment",
130+
"subjectTypes": [
131+
"snap",
132+
],
133+
"targetName": "endowment:page-settings",
134+
},
126135
"endowment:rpc": {
127136
"allowedCaveats": [
128137
"rpcOrigin",

packages/snaps-simulation/src/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,13 @@ export type Snap = {
420420
*/
421421
onHomePage(): Promise<SnapResponseWithInterface>;
422422

423+
/**
424+
* Get the response from the snap's `onSettingsPage` method.
425+
*
426+
* @returns The response.
427+
*/
428+
onSettingsPage(): Promise<SnapResponseWithInterface>;
429+
423430
/**
424431
* Send a keyring to the Snap.
425432
*

0 commit comments

Comments
 (0)