Skip to content

Commit 0683058

Browse files
committed
Add unit tests
1 parent e589915 commit 0683058

File tree

4 files changed

+134
-6
lines changed

4 files changed

+134
-6
lines changed
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"branches": 93.48,
3-
"functions": 97.38,
4-
"lines": 98.34,
5-
"statements": 98.08
2+
"branches": 93.57,
3+
"functions": 97.41,
4+
"lines": 98.36,
5+
"statements": 98.1
66
}

packages/snaps-controllers/src/snaps/SnapController.test.tsx

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11061,4 +11061,108 @@ describe('SnapController', () => {
1106111061
snapController.destroy();
1106211062
});
1106311063
});
11064+
11065+
describe('SnapController:trackEvent', () => {
11066+
it('should track event for allowed handler', async () => {
11067+
const mockTrackEvent = jest.fn();
11068+
const rootMessenger = getControllerMessenger();
11069+
const executionEnvironmentStub = new ExecutionEnvironmentStub(
11070+
getNodeEESMessenger(rootMessenger),
11071+
) as unknown as NodeThreadExecutionService;
11072+
11073+
const [snapController] = getSnapControllerWithEES(
11074+
getSnapControllerWithEESOptions({
11075+
rootMessenger,
11076+
trackEvent: mockTrackEvent,
11077+
state: {
11078+
snaps: getPersistedSnapsState(),
11079+
},
11080+
}),
11081+
executionEnvironmentStub,
11082+
);
11083+
11084+
const snap = snapController.getExpect(MOCK_SNAP_ID);
11085+
await snapController.startSnap(snap.id);
11086+
11087+
await snapController.handleRequest({
11088+
snapId: snap.id,
11089+
origin: MOCK_ORIGIN,
11090+
handler: HandlerType.OnRpcRequest,
11091+
request: {
11092+
jsonrpc: '2.0',
11093+
method: 'test',
11094+
params: {},
11095+
id: 1,
11096+
},
11097+
});
11098+
11099+
expect(mockTrackEvent).toHaveBeenCalledTimes(1);
11100+
expect(mockTrackEvent).toHaveBeenCalledWith({
11101+
category: 'Snaps',
11102+
event: 'SnapExportUsed',
11103+
properties: {
11104+
export: 'onRpcRequest',
11105+
origin: 'https://example.com',
11106+
// eslint-disable-next-line @typescript-eslint/naming-convention
11107+
snap_category: null,
11108+
// eslint-disable-next-line @typescript-eslint/naming-convention
11109+
snap_id: 'npm:@metamask/example-snap',
11110+
success: true,
11111+
},
11112+
});
11113+
snapController.destroy();
11114+
});
11115+
11116+
it('should not track event for disallowed handler', async () => {
11117+
const mockTrackEvent = jest.fn();
11118+
const rootMessenger = getControllerMessenger();
11119+
11120+
rootMessenger.registerActionHandler(
11121+
'PermissionController:getPermissions',
11122+
() => ({
11123+
[SnapEndowments.Cronjob]: {
11124+
caveats: [{ type: SnapCaveatType.SnapCronjob, value: '* * * * *' }],
11125+
date: 1664187844588,
11126+
id: 'izn0WGUO8cvq_jqvLQuQP',
11127+
invoker: MOCK_SNAP_ID,
11128+
parentCapability: SnapEndowments.Cronjob,
11129+
},
11130+
}),
11131+
);
11132+
11133+
const executionEnvironmentStub = new ExecutionEnvironmentStub(
11134+
getNodeEESMessenger(rootMessenger),
11135+
) as unknown as NodeThreadExecutionService;
11136+
11137+
const [snapController] = getSnapControllerWithEES(
11138+
getSnapControllerWithEESOptions({
11139+
environmentEndowmentPermissions: ['endowment:cronjob'],
11140+
rootMessenger,
11141+
trackEvent: mockTrackEvent,
11142+
state: {
11143+
snaps: getPersistedSnapsState(),
11144+
},
11145+
}),
11146+
executionEnvironmentStub,
11147+
);
11148+
11149+
const snap = snapController.getExpect(MOCK_SNAP_ID);
11150+
await snapController.startSnap(snap.id);
11151+
11152+
await snapController.handleRequest({
11153+
snapId: snap.id,
11154+
origin: MOCK_ORIGIN,
11155+
handler: HandlerType.OnCronjob,
11156+
request: {
11157+
jsonrpc: '2.0',
11158+
method: 'test',
11159+
params: {},
11160+
id: 1,
11161+
},
11162+
});
11163+
11164+
expect(mockTrackEvent).not.toHaveBeenCalled();
11165+
snapController.destroy();
11166+
});
11167+
});
1106411168
});

packages/snaps-controllers/src/utils.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
permissionsDiff,
2222
setDiff,
2323
throttleTracking,
24+
TRACKABLE_HANDLERS,
2425
} from './utils';
2526
import { SnapEndowments } from '../../snaps-rpc-methods/src/endowments';
2627

@@ -223,6 +224,29 @@ describe('debouncePersistState', () => {
223224
});
224225
});
225226

227+
describe('TRACKABLE_HANDLERS', () => {
228+
it('should contain the expected handler types', () => {
229+
expect(TRACKABLE_HANDLERS).toStrictEqual([
230+
HandlerType.OnHomePage,
231+
HandlerType.OnInstall,
232+
HandlerType.OnNameLookup,
233+
HandlerType.OnRpcRequest,
234+
HandlerType.OnSignature,
235+
HandlerType.OnTransaction,
236+
HandlerType.OnUpdate,
237+
]);
238+
});
239+
240+
it('should be a readonly array', () => {
241+
expect(Object.isFrozen(TRACKABLE_HANDLERS)).toBe(true);
242+
});
243+
244+
it('should contain unique values', () => {
245+
const uniqueValues = new Set(TRACKABLE_HANDLERS);
246+
expect(uniqueValues.size).toBe(TRACKABLE_HANDLERS.length);
247+
});
248+
});
249+
226250
describe('throttleTracking', () => {
227251
beforeAll(() => {
228252
jest.useFakeTimers();

packages/snaps-controllers/src/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,15 +380,15 @@ export function debouncePersistState(
380380
/**
381381
* Handlers allowed for tracking.
382382
*/
383-
export const TRACKABLE_HANDLERS = [
383+
export const TRACKABLE_HANDLERS = Object.freeze([
384384
HandlerType.OnHomePage,
385385
HandlerType.OnInstall,
386386
HandlerType.OnNameLookup,
387387
HandlerType.OnRpcRequest,
388388
HandlerType.OnSignature,
389389
HandlerType.OnTransaction,
390390
HandlerType.OnUpdate,
391-
] as const;
391+
] as const);
392392

393393
/**
394394
* A union type representing all possible trackable handler types.

0 commit comments

Comments
 (0)