@metamask/profile-sync-controller 2.0.0 → 3.0.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.
Files changed (86) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/dist/controllers/user-storage/UserStorageController.cjs +55 -22
  3. package/dist/controllers/user-storage/UserStorageController.cjs.map +1 -1
  4. package/dist/controllers/user-storage/UserStorageController.d.cts +32 -15
  5. package/dist/controllers/user-storage/UserStorageController.d.cts.map +1 -1
  6. package/dist/controllers/user-storage/UserStorageController.d.mts +32 -15
  7. package/dist/controllers/user-storage/UserStorageController.d.mts.map +1 -1
  8. package/dist/controllers/user-storage/UserStorageController.mjs +56 -23
  9. package/dist/controllers/user-storage/UserStorageController.mjs.map +1 -1
  10. package/dist/controllers/user-storage/__fixtures__/mockMessenger.cjs +171 -0
  11. package/dist/controllers/user-storage/__fixtures__/mockMessenger.cjs.map +1 -0
  12. package/dist/controllers/user-storage/__fixtures__/mockMessenger.d.cts +102 -0
  13. package/dist/controllers/user-storage/__fixtures__/mockMessenger.d.cts.map +1 -0
  14. package/dist/controllers/user-storage/__fixtures__/mockMessenger.d.mts +102 -0
  15. package/dist/controllers/user-storage/__fixtures__/mockMessenger.d.mts.map +1 -0
  16. package/dist/controllers/user-storage/__fixtures__/mockMessenger.mjs +166 -0
  17. package/dist/controllers/user-storage/__fixtures__/mockMessenger.mjs.map +1 -0
  18. package/dist/controllers/user-storage/network-syncing/__fixtures__/mockNetwork.cjs +20 -2
  19. package/dist/controllers/user-storage/network-syncing/__fixtures__/mockNetwork.cjs.map +1 -1
  20. package/dist/controllers/user-storage/network-syncing/__fixtures__/mockNetwork.d.cts +8 -1
  21. package/dist/controllers/user-storage/network-syncing/__fixtures__/mockNetwork.d.cts.map +1 -1
  22. package/dist/controllers/user-storage/network-syncing/__fixtures__/mockNetwork.d.mts +8 -1
  23. package/dist/controllers/user-storage/network-syncing/__fixtures__/mockNetwork.d.mts.map +1 -1
  24. package/dist/controllers/user-storage/network-syncing/__fixtures__/mockNetwork.mjs +17 -1
  25. package/dist/controllers/user-storage/network-syncing/__fixtures__/mockNetwork.mjs.map +1 -1
  26. package/dist/controllers/user-storage/network-syncing/add-network-utils.cjs +35 -0
  27. package/dist/controllers/user-storage/network-syncing/add-network-utils.cjs.map +1 -0
  28. package/dist/controllers/user-storage/network-syncing/add-network-utils.d.cts +21 -0
  29. package/dist/controllers/user-storage/network-syncing/add-network-utils.d.cts.map +1 -0
  30. package/dist/controllers/user-storage/network-syncing/add-network-utils.d.mts +21 -0
  31. package/dist/controllers/user-storage/network-syncing/add-network-utils.d.mts.map +1 -0
  32. package/dist/controllers/user-storage/network-syncing/add-network-utils.mjs +30 -0
  33. package/dist/controllers/user-storage/network-syncing/add-network-utils.mjs.map +1 -0
  34. package/dist/controllers/user-storage/network-syncing/controller-integration.cjs +157 -29
  35. package/dist/controllers/user-storage/network-syncing/controller-integration.cjs.map +1 -1
  36. package/dist/controllers/user-storage/network-syncing/controller-integration.d.cts +45 -3
  37. package/dist/controllers/user-storage/network-syncing/controller-integration.d.cts.map +1 -1
  38. package/dist/controllers/user-storage/network-syncing/controller-integration.d.mts +45 -3
  39. package/dist/controllers/user-storage/network-syncing/controller-integration.d.mts.map +1 -1
  40. package/dist/controllers/user-storage/network-syncing/controller-integration.mjs +154 -28
  41. package/dist/controllers/user-storage/network-syncing/controller-integration.mjs.map +1 -1
  42. package/dist/controllers/user-storage/network-syncing/services.cjs +9 -4
  43. package/dist/controllers/user-storage/network-syncing/services.cjs.map +1 -1
  44. package/dist/controllers/user-storage/network-syncing/services.d.cts.map +1 -1
  45. package/dist/controllers/user-storage/network-syncing/services.d.mts.map +1 -1
  46. package/dist/controllers/user-storage/network-syncing/services.mjs +10 -5
  47. package/dist/controllers/user-storage/network-syncing/services.mjs.map +1 -1
  48. package/dist/controllers/user-storage/network-syncing/sync-all.cjs +10 -28
  49. package/dist/controllers/user-storage/network-syncing/sync-all.cjs.map +1 -1
  50. package/dist/controllers/user-storage/network-syncing/sync-all.d.cts +5 -8
  51. package/dist/controllers/user-storage/network-syncing/sync-all.d.cts.map +1 -1
  52. package/dist/controllers/user-storage/network-syncing/sync-all.d.mts +5 -8
  53. package/dist/controllers/user-storage/network-syncing/sync-all.d.mts.map +1 -1
  54. package/dist/controllers/user-storage/network-syncing/sync-all.mjs +9 -26
  55. package/dist/controllers/user-storage/network-syncing/sync-all.mjs.map +1 -1
  56. package/dist/controllers/user-storage/network-syncing/sync-mutations.cjs +1 -1
  57. package/dist/controllers/user-storage/network-syncing/sync-mutations.cjs.map +1 -1
  58. package/dist/controllers/user-storage/network-syncing/sync-mutations.d.cts +1 -1
  59. package/dist/controllers/user-storage/network-syncing/sync-mutations.d.cts.map +1 -1
  60. package/dist/controllers/user-storage/network-syncing/sync-mutations.d.mts +1 -1
  61. package/dist/controllers/user-storage/network-syncing/sync-mutations.d.mts.map +1 -1
  62. package/dist/controllers/user-storage/network-syncing/sync-mutations.mjs +1 -1
  63. package/dist/controllers/user-storage/network-syncing/sync-mutations.mjs.map +1 -1
  64. package/dist/controllers/user-storage/network-syncing/types.cjs.map +1 -1
  65. package/dist/controllers/user-storage/network-syncing/types.d.cts +1 -4
  66. package/dist/controllers/user-storage/network-syncing/types.d.cts.map +1 -1
  67. package/dist/controllers/user-storage/network-syncing/types.d.mts +1 -4
  68. package/dist/controllers/user-storage/network-syncing/types.d.mts.map +1 -1
  69. package/dist/controllers/user-storage/network-syncing/types.mjs.map +1 -1
  70. package/dist/controllers/user-storage/network-syncing/update-network-utils.cjs +126 -0
  71. package/dist/controllers/user-storage/network-syncing/update-network-utils.cjs.map +1 -0
  72. package/dist/controllers/user-storage/network-syncing/update-network-utils.d.cts +56 -0
  73. package/dist/controllers/user-storage/network-syncing/update-network-utils.d.cts.map +1 -0
  74. package/dist/controllers/user-storage/network-syncing/update-network-utils.d.mts +56 -0
  75. package/dist/controllers/user-storage/network-syncing/update-network-utils.d.mts.map +1 -0
  76. package/dist/controllers/user-storage/network-syncing/update-network-utils.mjs +119 -0
  77. package/dist/controllers/user-storage/network-syncing/update-network-utils.mjs.map +1 -0
  78. package/dist/controllers/user-storage/services.cjs +2 -0
  79. package/dist/controllers/user-storage/services.cjs.map +1 -1
  80. package/dist/controllers/user-storage/services.d.cts.map +1 -1
  81. package/dist/controllers/user-storage/services.d.mts.map +1 -1
  82. package/dist/controllers/user-storage/services.mjs +2 -0
  83. package/dist/controllers/user-storage/services.mjs.map +1 -1
  84. package/dist/sdk/authentication-jwt-bearer/flow-siwe.mjs +1 -2
  85. package/dist/sdk/authentication-jwt-bearer/flow-siwe.mjs.map +1 -1
  86. package/package.json +11 -6
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mockUserStorageMessenger = exports.createCustomUserStorageMessenger = void 0;
4
+ const base_controller_1 = require("@metamask/base-controller");
5
+ const _1 = require("./index.cjs");
6
+ const typedMockFn = (_type) => jest.fn();
7
+ /**
8
+ * creates a custom user storage messenger, in case tests need different permissions
9
+ * @param props - overrides
10
+ * @param props.overrideEvents - override events
11
+ * @returns base messenger, and messenger. You can pass this into the mocks below to mock messenger calls
12
+ */
13
+ function createCustomUserStorageMessenger(props) {
14
+ const baseMessenger = new base_controller_1.ControllerMessenger();
15
+ const messenger = baseMessenger.getRestricted({
16
+ name: 'UserStorageController',
17
+ allowedActions: [
18
+ 'KeyringController:getState',
19
+ 'KeyringController:addNewAccount',
20
+ 'SnapController:handleRequest',
21
+ 'AuthenticationController:getBearerToken',
22
+ 'AuthenticationController:getSessionProfile',
23
+ 'AuthenticationController:isSignedIn',
24
+ 'AuthenticationController:performSignOut',
25
+ 'AuthenticationController:performSignIn',
26
+ 'NotificationServicesController:disableNotificationServices',
27
+ 'NotificationServicesController:selectIsNotificationServicesEnabled',
28
+ 'AccountsController:listAccounts',
29
+ 'AccountsController:updateAccountMetadata',
30
+ 'NetworkController:getState',
31
+ 'NetworkController:addNetwork',
32
+ 'NetworkController:updateNetwork',
33
+ 'NetworkController:removeNetwork',
34
+ ],
35
+ allowedEvents: props?.overrideEvents ?? [
36
+ 'KeyringController:lock',
37
+ 'KeyringController:unlock',
38
+ 'AccountsController:accountAdded',
39
+ 'AccountsController:accountRenamed',
40
+ 'NetworkController:networkRemoved',
41
+ ],
42
+ });
43
+ return {
44
+ baseMessenger,
45
+ messenger,
46
+ };
47
+ }
48
+ exports.createCustomUserStorageMessenger = createCustomUserStorageMessenger;
49
+ /**
50
+ * Jest Mock Utility to generate a mock User Storage Messenger
51
+ * @param overrideMessengers - override messengers if need to modify the underlying permissions
52
+ * @returns series of mocks to actions that can be called
53
+ */
54
+ function mockUserStorageMessenger(overrideMessengers) {
55
+ const { baseMessenger, messenger } = overrideMessengers ?? createCustomUserStorageMessenger();
56
+ const mockSnapGetPublicKey = jest.fn().mockResolvedValue('MOCK_PUBLIC_KEY');
57
+ const mockSnapSignMessage = jest
58
+ .fn()
59
+ .mockResolvedValue(_1.MOCK_STORAGE_KEY_SIGNATURE);
60
+ const mockAuthGetBearerToken = typedMockFn('AuthenticationController:getBearerToken').mockResolvedValue('MOCK_BEARER_TOKEN');
61
+ const mockAuthGetSessionProfile = typedMockFn('AuthenticationController:getSessionProfile').mockResolvedValue({
62
+ identifierId: '',
63
+ profileId: 'MOCK_PROFILE_ID',
64
+ });
65
+ const mockAuthPerformSignIn = typedMockFn('AuthenticationController:performSignIn').mockResolvedValue('New Access Token');
66
+ const mockAuthIsSignedIn = typedMockFn('AuthenticationController:isSignedIn').mockReturnValue(true);
67
+ const mockAuthPerformSignOut = typedMockFn('AuthenticationController:performSignOut');
68
+ const mockNotificationServicesIsEnabled = typedMockFn('NotificationServicesController:selectIsNotificationServicesEnabled').mockReturnValue(true);
69
+ const mockNotificationServicesDisableNotifications = typedMockFn('NotificationServicesController:disableNotificationServices').mockResolvedValue();
70
+ const mockKeyringAddNewAccount = typedMockFn('KeyringController:addNewAccount');
71
+ // Untyped mock as there is a TS(2742) issue.
72
+ // This will return `InternalAccount[]`
73
+ const mockAccountsListAccounts = jest.fn();
74
+ const mockAccountsUpdateAccountMetadata = typedMockFn('AccountsController:updateAccountMetadata').mockResolvedValue(true);
75
+ const mockNetworkControllerGetState = typedMockFn('NetworkController:getState').mockReturnValue({
76
+ selectedNetworkClientId: '',
77
+ networksMetadata: {},
78
+ networkConfigurationsByChainId: {},
79
+ });
80
+ const mockNetworkControllerAddNetwork = typedMockFn('NetworkController:addNetwork');
81
+ const mockNetworkControllerRemoveNetwork = typedMockFn('NetworkController:removeNetwork');
82
+ const mockNetworkControllerUpdateNetwork = typedMockFn('NetworkController:updateNetwork');
83
+ jest.spyOn(messenger, 'call').mockImplementation((...args) => {
84
+ const typedArgs = args;
85
+ const [actionType] = typedArgs;
86
+ if (actionType === 'SnapController:handleRequest') {
87
+ const [, params] = typedArgs;
88
+ if (params.request.method === 'getPublicKey') {
89
+ return mockSnapGetPublicKey();
90
+ }
91
+ if (params.request.method === 'signMessage') {
92
+ return mockSnapSignMessage();
93
+ }
94
+ throw new Error(`MOCK_FAIL - unsupported SnapController:handleRequest call: ${params.request.method}`);
95
+ }
96
+ if (actionType === 'AuthenticationController:getBearerToken') {
97
+ return mockAuthGetBearerToken();
98
+ }
99
+ if (actionType === 'AuthenticationController:getSessionProfile') {
100
+ return mockAuthGetSessionProfile();
101
+ }
102
+ if (actionType === 'AuthenticationController:performSignIn') {
103
+ return mockAuthPerformSignIn();
104
+ }
105
+ if (actionType === 'AuthenticationController:isSignedIn') {
106
+ return mockAuthIsSignedIn();
107
+ }
108
+ if (actionType ===
109
+ 'NotificationServicesController:selectIsNotificationServicesEnabled') {
110
+ return mockNotificationServicesIsEnabled();
111
+ }
112
+ if (actionType ===
113
+ 'NotificationServicesController:disableNotificationServices') {
114
+ return mockNotificationServicesDisableNotifications();
115
+ }
116
+ if (actionType === 'AuthenticationController:performSignOut') {
117
+ return mockAuthPerformSignOut();
118
+ }
119
+ if (actionType === 'KeyringController:getState') {
120
+ return { isUnlocked: true };
121
+ }
122
+ if (actionType === 'KeyringController:addNewAccount') {
123
+ return mockKeyringAddNewAccount();
124
+ }
125
+ if (actionType === 'AccountsController:listAccounts') {
126
+ return mockAccountsListAccounts();
127
+ }
128
+ if (typedArgs[0] === 'AccountsController:updateAccountMetadata') {
129
+ const [, ...params] = typedArgs;
130
+ return mockAccountsUpdateAccountMetadata(...params);
131
+ }
132
+ if (actionType === 'NetworkController:getState') {
133
+ return mockNetworkControllerGetState();
134
+ }
135
+ if (actionType === 'NetworkController:addNetwork') {
136
+ const [, ...params] = typedArgs;
137
+ return mockNetworkControllerAddNetwork(...params);
138
+ }
139
+ if (actionType === 'NetworkController:removeNetwork') {
140
+ const [, ...params] = typedArgs;
141
+ return mockNetworkControllerRemoveNetwork(...params);
142
+ }
143
+ if (actionType === 'NetworkController:updateNetwork') {
144
+ const [, ...params] = typedArgs;
145
+ return mockNetworkControllerUpdateNetwork(...params);
146
+ }
147
+ throw new Error(`MOCK_FAIL - unsupported messenger call: ${actionType}`);
148
+ });
149
+ return {
150
+ baseMessenger,
151
+ messenger,
152
+ mockSnapGetPublicKey,
153
+ mockSnapSignMessage,
154
+ mockAuthGetBearerToken,
155
+ mockAuthGetSessionProfile,
156
+ mockAuthPerformSignIn,
157
+ mockAuthIsSignedIn,
158
+ mockNotificationServicesIsEnabled,
159
+ mockNotificationServicesDisableNotifications,
160
+ mockAuthPerformSignOut,
161
+ mockKeyringAddNewAccount,
162
+ mockAccountsUpdateAccountMetadata,
163
+ mockAccountsListAccounts,
164
+ mockNetworkControllerGetState,
165
+ mockNetworkControllerAddNetwork,
166
+ mockNetworkControllerRemoveNetwork,
167
+ mockNetworkControllerUpdateNetwork,
168
+ };
169
+ }
170
+ exports.mockUserStorageMessenger = mockUserStorageMessenger;
171
+ //# sourceMappingURL=mockMessenger.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockMessenger.cjs","sourceRoot":"","sources":["../../../../src/controllers/user-storage/__fixtures__/mockMessenger.ts"],"names":[],"mappings":";;;AACA,+DAAgE;AAEhE,kCAA+C;AAmB/C,MAAM,WAAW,GAAG,CAQlB,KAAiB,EACjB,EAAE,CAAC,IAAI,CAAC,EAAE,EAAsC,CAAC;AAOnD;;;;;GAKG;AACH,SAAgB,gCAAgC,CAAC,KAEhD;IACC,MAAM,aAAa,GAAG,IAAI,qCAAmB,EAG1C,CAAC;IACJ,MAAM,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC;QAC5C,IAAI,EAAE,uBAAuB;QAC7B,cAAc,EAAE;YACd,4BAA4B;YAC5B,iCAAiC;YACjC,8BAA8B;YAC9B,yCAAyC;YACzC,4CAA4C;YAC5C,qCAAqC;YACrC,yCAAyC;YACzC,wCAAwC;YACxC,4DAA4D;YAC5D,oEAAoE;YACpE,iCAAiC;YACjC,0CAA0C;YAC1C,4BAA4B;YAC5B,8BAA8B;YAC9B,iCAAiC;YACjC,iCAAiC;SAClC;QACD,aAAa,EAAE,KAAK,EAAE,cAAc,IAAI;YACtC,wBAAwB;YACxB,0BAA0B;YAC1B,iCAAiC;YACjC,mCAAmC;YACnC,kCAAkC;SACnC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,aAAa;QACb,SAAS;KACV,CAAC;AACJ,CAAC;AAxCD,4EAwCC;AAOD;;;;GAIG;AACH,SAAgB,wBAAwB,CACtC,kBAAuC;IAEvC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAChC,kBAAkB,IAAI,gCAAgC,EAAE,CAAC;IAE3D,MAAM,oBAAoB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC5E,MAAM,mBAAmB,GAAG,IAAI;SAC7B,EAAE,EAAE;SACJ,iBAAiB,CAAC,6BAA0B,CAAC,CAAC;IAEjD,MAAM,sBAAsB,GAAG,WAAW,CACxC,yCAAyC,CAC1C,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;IAEzC,MAAM,yBAAyB,GAAG,WAAW,CAC3C,4CAA4C,CAC7C,CAAC,iBAAiB,CAAC;QAClB,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,iBAAiB;KAC7B,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,WAAW,CACvC,wCAAwC,CACzC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IAExC,MAAM,kBAAkB,GAAG,WAAW,CACpC,qCAAqC,CACtC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAExB,MAAM,sBAAsB,GAAG,WAAW,CACxC,yCAAyC,CAC1C,CAAC;IAEF,MAAM,iCAAiC,GAAG,WAAW,CACnD,oEAAoE,CACrE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAExB,MAAM,4CAA4C,GAAG,WAAW,CAC9D,4DAA4D,CAC7D,CAAC,iBAAiB,EAAE,CAAC;IAEtB,MAAM,wBAAwB,GAAG,WAAW,CAC1C,iCAAiC,CAClC,CAAC;IAEF,6CAA6C;IAC7C,uCAAuC;IACvC,MAAM,wBAAwB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAE3C,MAAM,iCAAiC,GAAG,WAAW,CACnD,0CAA0C,CAC3C,CAAC,iBAAiB,CAAC,IAAa,CAAC,CAAC;IAEnC,MAAM,6BAA6B,GAAG,WAAW,CAC/C,4BAA4B,CAC7B,CAAC,eAAe,CAAC;QAChB,uBAAuB,EAAE,EAAE;QAC3B,gBAAgB,EAAE,EAAE;QACpB,8BAA8B,EAAE,EAAE;KACnC,CAAC,CAAC;IAEH,MAAM,+BAA+B,GAAG,WAAW,CACjD,8BAA8B,CAC/B,CAAC;IAEF,MAAM,kCAAkC,GAAG,WAAW,CACpD,iCAAiC,CAClC,CAAC;IAEF,MAAM,kCAAkC,GAAG,WAAW,CACpD,iCAAiC,CAClC,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE;QAC3D,MAAM,SAAS,GAAG,IAA6B,CAAC;QAChD,MAAM,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;QAE/B,IAAI,UAAU,KAAK,8BAA8B,EAAE;YACjD,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;YAC7B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,cAAc,EAAE;gBAC5C,OAAO,oBAAoB,EAAE,CAAC;aAC/B;YAED,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,aAAa,EAAE;gBAC3C,OAAO,mBAAmB,EAAE,CAAC;aAC9B;YAED,MAAM,IAAI,KAAK,CACb,8DACE,MAAM,CAAC,OAAO,CAAC,MACjB,EAAE,CACH,CAAC;SACH;QAED,IAAI,UAAU,KAAK,yCAAyC,EAAE;YAC5D,OAAO,sBAAsB,EAAE,CAAC;SACjC;QAED,IAAI,UAAU,KAAK,4CAA4C,EAAE;YAC/D,OAAO,yBAAyB,EAAE,CAAC;SACpC;QAED,IAAI,UAAU,KAAK,wCAAwC,EAAE;YAC3D,OAAO,qBAAqB,EAAE,CAAC;SAChC;QAED,IAAI,UAAU,KAAK,qCAAqC,EAAE;YACxD,OAAO,kBAAkB,EAAE,CAAC;SAC7B;QAED,IACE,UAAU;YACV,oEAAoE,EACpE;YACA,OAAO,iCAAiC,EAAE,CAAC;SAC5C;QAED,IACE,UAAU;YACV,4DAA4D,EAC5D;YACA,OAAO,4CAA4C,EAAE,CAAC;SACvD;QAED,IAAI,UAAU,KAAK,yCAAyC,EAAE;YAC5D,OAAO,sBAAsB,EAAE,CAAC;SACjC;QAED,IAAI,UAAU,KAAK,4BAA4B,EAAE;YAC/C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SAC7B;QAED,IAAI,UAAU,KAAK,iCAAiC,EAAE;YACpD,OAAO,wBAAwB,EAAE,CAAC;SACnC;QAED,IAAI,UAAU,KAAK,iCAAiC,EAAE;YACpD,OAAO,wBAAwB,EAAE,CAAC;SACnC;QAED,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,0CAA0C,EAAE;YAC/D,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,SAAS,CAAC;YAChC,OAAO,iCAAiC,CAAC,GAAG,MAAM,CAAC,CAAC;SACrD;QAED,IAAI,UAAU,KAAK,4BAA4B,EAAE;YAC/C,OAAO,6BAA6B,EAAE,CAAC;SACxC;QAED,IAAI,UAAU,KAAK,8BAA8B,EAAE;YACjD,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,SAAS,CAAC;YAChC,OAAO,+BAA+B,CAAC,GAAG,MAAM,CAAC,CAAC;SACnD;QAED,IAAI,UAAU,KAAK,iCAAiC,EAAE;YACpD,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,SAAS,CAAC;YAChC,OAAO,kCAAkC,CAAC,GAAG,MAAM,CAAC,CAAC;SACtD;QAED,IAAI,UAAU,KAAK,iCAAiC,EAAE;YACpD,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,SAAS,CAAC;YAChC,OAAO,kCAAkC,CAAC,GAAG,MAAM,CAAC,CAAC;SACtD;QAED,MAAM,IAAI,KAAK,CACb,2CAA2C,UAAoB,EAAE,CAClE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,aAAa;QACb,SAAS;QACT,oBAAoB;QACpB,mBAAmB;QACnB,sBAAsB;QACtB,yBAAyB;QACzB,qBAAqB;QACrB,kBAAkB;QAClB,iCAAiC;QACjC,4CAA4C;QAC5C,sBAAsB;QACtB,wBAAwB;QACxB,iCAAiC;QACjC,wBAAwB;QACxB,6BAA6B;QAC7B,+BAA+B;QAC/B,kCAAkC;QAClC,kCAAkC;KACnC,CAAC;AACJ,CAAC;AA9LD,4DA8LC","sourcesContent":["import type { NotNamespacedBy } from '@metamask/base-controller';\nimport { ControllerMessenger } from '@metamask/base-controller';\n\nimport { MOCK_STORAGE_KEY_SIGNATURE } from '.';\nimport type {\n AllowedActions,\n AllowedEvents,\n UserStorageControllerMessenger,\n} from '..';\n\ntype GetHandler<ActionType extends AllowedActions['type']> = Extract<\n AllowedActions,\n { type: ActionType }\n>['handler'];\n\ntype CallParams = {\n [K in AllowedActions['type']]: [\n K,\n ...Parameters<Extract<AllowedActions, { type: K }>['handler']>,\n ];\n}[AllowedActions['type']];\n\nconst typedMockFn = <\n ActionType extends AllowedActions['type'],\n Handler = GetHandler<ActionType>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Func extends (...args: any) => any = Handler extends (...args: any[]) => any\n ? Handler\n : never,\n>(\n _type: ActionType,\n) => jest.fn<ReturnType<Func>, Parameters<Func>>();\n\ntype ExternalEvents = NotNamespacedBy<\n 'UserStorageController',\n AllowedEvents['type']\n>;\n\n/**\n * creates a custom user storage messenger, in case tests need different permissions\n * @param props - overrides\n * @param props.overrideEvents - override events\n * @returns base messenger, and messenger. You can pass this into the mocks below to mock messenger calls\n */\nexport function createCustomUserStorageMessenger(props?: {\n overrideEvents?: ExternalEvents[];\n}) {\n const baseMessenger = new ControllerMessenger<\n AllowedActions,\n AllowedEvents\n >();\n const messenger = baseMessenger.getRestricted({\n name: 'UserStorageController',\n allowedActions: [\n 'KeyringController:getState',\n 'KeyringController:addNewAccount',\n 'SnapController:handleRequest',\n 'AuthenticationController:getBearerToken',\n 'AuthenticationController:getSessionProfile',\n 'AuthenticationController:isSignedIn',\n 'AuthenticationController:performSignOut',\n 'AuthenticationController:performSignIn',\n 'NotificationServicesController:disableNotificationServices',\n 'NotificationServicesController:selectIsNotificationServicesEnabled',\n 'AccountsController:listAccounts',\n 'AccountsController:updateAccountMetadata',\n 'NetworkController:getState',\n 'NetworkController:addNetwork',\n 'NetworkController:updateNetwork',\n 'NetworkController:removeNetwork',\n ],\n allowedEvents: props?.overrideEvents ?? [\n 'KeyringController:lock',\n 'KeyringController:unlock',\n 'AccountsController:accountAdded',\n 'AccountsController:accountRenamed',\n 'NetworkController:networkRemoved',\n ],\n });\n\n return {\n baseMessenger,\n messenger,\n };\n}\n\ntype OverrideMessengers = {\n baseMessenger: ControllerMessenger<AllowedActions, AllowedEvents>;\n messenger: UserStorageControllerMessenger;\n};\n\n/**\n * Jest Mock Utility to generate a mock User Storage Messenger\n * @param overrideMessengers - override messengers if need to modify the underlying permissions\n * @returns series of mocks to actions that can be called\n */\nexport function mockUserStorageMessenger(\n overrideMessengers?: OverrideMessengers,\n) {\n const { baseMessenger, messenger } =\n overrideMessengers ?? createCustomUserStorageMessenger();\n\n const mockSnapGetPublicKey = jest.fn().mockResolvedValue('MOCK_PUBLIC_KEY');\n const mockSnapSignMessage = jest\n .fn()\n .mockResolvedValue(MOCK_STORAGE_KEY_SIGNATURE);\n\n const mockAuthGetBearerToken = typedMockFn(\n 'AuthenticationController:getBearerToken',\n ).mockResolvedValue('MOCK_BEARER_TOKEN');\n\n const mockAuthGetSessionProfile = typedMockFn(\n 'AuthenticationController:getSessionProfile',\n ).mockResolvedValue({\n identifierId: '',\n profileId: 'MOCK_PROFILE_ID',\n });\n\n const mockAuthPerformSignIn = typedMockFn(\n 'AuthenticationController:performSignIn',\n ).mockResolvedValue('New Access Token');\n\n const mockAuthIsSignedIn = typedMockFn(\n 'AuthenticationController:isSignedIn',\n ).mockReturnValue(true);\n\n const mockAuthPerformSignOut = typedMockFn(\n 'AuthenticationController:performSignOut',\n );\n\n const mockNotificationServicesIsEnabled = typedMockFn(\n 'NotificationServicesController:selectIsNotificationServicesEnabled',\n ).mockReturnValue(true);\n\n const mockNotificationServicesDisableNotifications = typedMockFn(\n 'NotificationServicesController:disableNotificationServices',\n ).mockResolvedValue();\n\n const mockKeyringAddNewAccount = typedMockFn(\n 'KeyringController:addNewAccount',\n );\n\n // Untyped mock as there is a TS(2742) issue.\n // This will return `InternalAccount[]`\n const mockAccountsListAccounts = jest.fn();\n\n const mockAccountsUpdateAccountMetadata = typedMockFn(\n 'AccountsController:updateAccountMetadata',\n ).mockResolvedValue(true as never);\n\n const mockNetworkControllerGetState = typedMockFn(\n 'NetworkController:getState',\n ).mockReturnValue({\n selectedNetworkClientId: '',\n networksMetadata: {},\n networkConfigurationsByChainId: {},\n });\n\n const mockNetworkControllerAddNetwork = typedMockFn(\n 'NetworkController:addNetwork',\n );\n\n const mockNetworkControllerRemoveNetwork = typedMockFn(\n 'NetworkController:removeNetwork',\n );\n\n const mockNetworkControllerUpdateNetwork = typedMockFn(\n 'NetworkController:updateNetwork',\n );\n\n jest.spyOn(messenger, 'call').mockImplementation((...args) => {\n const typedArgs = args as unknown as CallParams;\n const [actionType] = typedArgs;\n\n if (actionType === 'SnapController:handleRequest') {\n const [, params] = typedArgs;\n if (params.request.method === 'getPublicKey') {\n return mockSnapGetPublicKey();\n }\n\n if (params.request.method === 'signMessage') {\n return mockSnapSignMessage();\n }\n\n throw new Error(\n `MOCK_FAIL - unsupported SnapController:handleRequest call: ${\n params.request.method as string\n }`,\n );\n }\n\n if (actionType === 'AuthenticationController:getBearerToken') {\n return mockAuthGetBearerToken();\n }\n\n if (actionType === 'AuthenticationController:getSessionProfile') {\n return mockAuthGetSessionProfile();\n }\n\n if (actionType === 'AuthenticationController:performSignIn') {\n return mockAuthPerformSignIn();\n }\n\n if (actionType === 'AuthenticationController:isSignedIn') {\n return mockAuthIsSignedIn();\n }\n\n if (\n actionType ===\n 'NotificationServicesController:selectIsNotificationServicesEnabled'\n ) {\n return mockNotificationServicesIsEnabled();\n }\n\n if (\n actionType ===\n 'NotificationServicesController:disableNotificationServices'\n ) {\n return mockNotificationServicesDisableNotifications();\n }\n\n if (actionType === 'AuthenticationController:performSignOut') {\n return mockAuthPerformSignOut();\n }\n\n if (actionType === 'KeyringController:getState') {\n return { isUnlocked: true };\n }\n\n if (actionType === 'KeyringController:addNewAccount') {\n return mockKeyringAddNewAccount();\n }\n\n if (actionType === 'AccountsController:listAccounts') {\n return mockAccountsListAccounts();\n }\n\n if (typedArgs[0] === 'AccountsController:updateAccountMetadata') {\n const [, ...params] = typedArgs;\n return mockAccountsUpdateAccountMetadata(...params);\n }\n\n if (actionType === 'NetworkController:getState') {\n return mockNetworkControllerGetState();\n }\n\n if (actionType === 'NetworkController:addNetwork') {\n const [, ...params] = typedArgs;\n return mockNetworkControllerAddNetwork(...params);\n }\n\n if (actionType === 'NetworkController:removeNetwork') {\n const [, ...params] = typedArgs;\n return mockNetworkControllerRemoveNetwork(...params);\n }\n\n if (actionType === 'NetworkController:updateNetwork') {\n const [, ...params] = typedArgs;\n return mockNetworkControllerUpdateNetwork(...params);\n }\n\n throw new Error(\n `MOCK_FAIL - unsupported messenger call: ${actionType as string}`,\n );\n });\n\n return {\n baseMessenger,\n messenger,\n mockSnapGetPublicKey,\n mockSnapSignMessage,\n mockAuthGetBearerToken,\n mockAuthGetSessionProfile,\n mockAuthPerformSignIn,\n mockAuthIsSignedIn,\n mockNotificationServicesIsEnabled,\n mockNotificationServicesDisableNotifications,\n mockAuthPerformSignOut,\n mockKeyringAddNewAccount,\n mockAccountsUpdateAccountMetadata,\n mockAccountsListAccounts,\n mockNetworkControllerGetState,\n mockNetworkControllerAddNetwork,\n mockNetworkControllerRemoveNetwork,\n mockNetworkControllerUpdateNetwork,\n };\n}\n"]}
@@ -0,0 +1,102 @@
1
+ /// <reference types="jest" />
2
+ import type { NotNamespacedBy } from "@metamask/base-controller";
3
+ import { ControllerMessenger } from "@metamask/base-controller";
4
+ import type { AllowedActions, AllowedEvents, UserStorageControllerMessenger } from "../index.cjs";
5
+ type ExternalEvents = NotNamespacedBy<'UserStorageController', AllowedEvents['type']>;
6
+ /**
7
+ * creates a custom user storage messenger, in case tests need different permissions
8
+ * @param props - overrides
9
+ * @param props.overrideEvents - override events
10
+ * @returns base messenger, and messenger. You can pass this into the mocks below to mock messenger calls
11
+ */
12
+ export declare function createCustomUserStorageMessenger(props?: {
13
+ overrideEvents?: ExternalEvents[];
14
+ }): {
15
+ baseMessenger: ControllerMessenger<AllowedActions, AllowedEvents>;
16
+ messenger: import("@metamask/base-controller").RestrictedControllerMessenger<"UserStorageController", import("@metamask/snaps-controllers").HandleSnapRequest | {
17
+ type: "AuthenticationController:isSignedIn";
18
+ handler: () => boolean;
19
+ } | {
20
+ type: "AuthenticationController:performSignIn";
21
+ handler: () => Promise<string>;
22
+ } | {
23
+ type: "AuthenticationController:performSignOut";
24
+ handler: () => void;
25
+ } | {
26
+ type: "AuthenticationController:getBearerToken";
27
+ handler: () => Promise<string>;
28
+ } | {
29
+ type: "AuthenticationController:getSessionProfile";
30
+ handler: () => Promise<{
31
+ identifierId: string;
32
+ profileId: string;
33
+ }>;
34
+ } | import("@metamask/keyring-controller").KeyringControllerGetStateAction | import("../index.cjs").NotificationServicesControllerDisableNotificationServices | import("../index.cjs").NotificationServicesControllerSelectIsNotificationServicesEnabled | import("@metamask/accounts-controller").AccountsControllerListAccountsAction | import("@metamask/accounts-controller").AccountsControllerUpdateAccountMetadataAction | import("@metamask/keyring-controller").KeyringControllerAddNewAccountAction | import("@metamask/network-controller").NetworkControllerGetStateAction | import("@metamask/network-controller").NetworkControllerAddNetworkAction | import("@metamask/network-controller").NetworkControllerRemoveNetworkAction | import("@metamask/network-controller").NetworkControllerUpdateNetworkAction, import("@metamask/keyring-controller").KeyringControllerLockEvent | import("@metamask/keyring-controller").KeyringControllerUnlockEvent | import("../index.cjs").UserStorageControllerStateChangeEvent | import("../index.cjs").UserStorageControllerAccountSyncingInProgress | import("../index.cjs").UserStorageControllerAccountSyncingComplete | import("@metamask/accounts-controller").AccountsControllerAccountAddedEvent | import("@metamask/accounts-controller").AccountsControllerAccountRenamedEvent | import("@metamask/network-controller").NetworkControllerNetworkRemovedEvent, "SnapController:handleRequest" | "KeyringController:getState" | "AuthenticationController:isSignedIn" | "AuthenticationController:performSignIn" | "AuthenticationController:performSignOut" | "AuthenticationController:getBearerToken" | "AuthenticationController:getSessionProfile" | "NotificationServicesController:disableNotificationServices" | "NotificationServicesController:selectIsNotificationServicesEnabled" | "AccountsController:listAccounts" | "AccountsController:updateAccountMetadata" | "KeyringController:addNewAccount" | "NetworkController:getState" | "NetworkController:addNetwork" | "NetworkController:removeNetwork" | "NetworkController:updateNetwork", "KeyringController:lock" | "KeyringController:unlock" | "AccountsController:accountAdded" | "AccountsController:accountRenamed" | "NetworkController:networkRemoved">;
35
+ };
36
+ type OverrideMessengers = {
37
+ baseMessenger: ControllerMessenger<AllowedActions, AllowedEvents>;
38
+ messenger: UserStorageControllerMessenger;
39
+ };
40
+ /**
41
+ * Jest Mock Utility to generate a mock User Storage Messenger
42
+ * @param overrideMessengers - override messengers if need to modify the underlying permissions
43
+ * @returns series of mocks to actions that can be called
44
+ */
45
+ export declare function mockUserStorageMessenger(overrideMessengers?: OverrideMessengers): {
46
+ baseMessenger: ControllerMessenger<AllowedActions, AllowedEvents>;
47
+ messenger: import("@metamask/base-controller").RestrictedControllerMessenger<"UserStorageController", import("@metamask/snaps-controllers").HandleSnapRequest | {
48
+ type: "AuthenticationController:isSignedIn";
49
+ handler: () => boolean;
50
+ } | {
51
+ type: "AuthenticationController:performSignIn";
52
+ handler: () => Promise<string>;
53
+ } | {
54
+ type: "AuthenticationController:performSignOut";
55
+ handler: () => void;
56
+ } | {
57
+ type: "AuthenticationController:getBearerToken";
58
+ handler: () => Promise<string>;
59
+ } | {
60
+ type: "AuthenticationController:getSessionProfile";
61
+ handler: () => Promise<{
62
+ identifierId: string;
63
+ profileId: string;
64
+ }>;
65
+ } | import("@metamask/keyring-controller").KeyringControllerGetStateAction | import("../index.cjs").NotificationServicesControllerDisableNotificationServices | import("../index.cjs").NotificationServicesControllerSelectIsNotificationServicesEnabled | import("@metamask/accounts-controller").AccountsControllerListAccountsAction | import("@metamask/accounts-controller").AccountsControllerUpdateAccountMetadataAction | import("@metamask/keyring-controller").KeyringControllerAddNewAccountAction | import("@metamask/network-controller").NetworkControllerGetStateAction | import("@metamask/network-controller").NetworkControllerAddNetworkAction | import("@metamask/network-controller").NetworkControllerRemoveNetworkAction | import("@metamask/network-controller").NetworkControllerUpdateNetworkAction, import("@metamask/keyring-controller").KeyringControllerLockEvent | import("@metamask/keyring-controller").KeyringControllerUnlockEvent | import("../index.cjs").UserStorageControllerStateChangeEvent | import("../index.cjs").UserStorageControllerAccountSyncingInProgress | import("../index.cjs").UserStorageControllerAccountSyncingComplete | import("@metamask/accounts-controller").AccountsControllerAccountAddedEvent | import("@metamask/accounts-controller").AccountsControllerAccountRenamedEvent | import("@metamask/network-controller").NetworkControllerNetworkRemovedEvent, "SnapController:handleRequest" | "KeyringController:getState" | "AuthenticationController:isSignedIn" | "AuthenticationController:performSignIn" | "AuthenticationController:performSignOut" | "AuthenticationController:getBearerToken" | "AuthenticationController:getSessionProfile" | "NotificationServicesController:disableNotificationServices" | "NotificationServicesController:selectIsNotificationServicesEnabled" | "AccountsController:listAccounts" | "AccountsController:updateAccountMetadata" | "KeyringController:addNewAccount" | "NetworkController:getState" | "NetworkController:addNetwork" | "NetworkController:removeNetwork" | "NetworkController:updateNetwork", "KeyringController:lock" | "KeyringController:unlock" | "AccountsController:accountAdded" | "AccountsController:accountRenamed" | "NetworkController:networkRemoved">;
66
+ mockSnapGetPublicKey: jest.Mock<any, any>;
67
+ mockSnapSignMessage: jest.Mock<any, any>;
68
+ mockAuthGetBearerToken: jest.Mock<Promise<string>, []>;
69
+ mockAuthGetSessionProfile: jest.Mock<Promise<{
70
+ identifierId: string;
71
+ profileId: string;
72
+ }>, []>;
73
+ mockAuthPerformSignIn: jest.Mock<Promise<string>, []>;
74
+ mockAuthIsSignedIn: jest.Mock<boolean, []>;
75
+ mockNotificationServicesIsEnabled: jest.Mock<boolean, []>;
76
+ mockNotificationServicesDisableNotifications: jest.Mock<Promise<void>, []>;
77
+ mockAuthPerformSignOut: jest.Mock<void, []>;
78
+ mockKeyringAddNewAccount: jest.Mock<Promise<string>, [accountCount?: number | undefined]>;
79
+ mockAccountsUpdateAccountMetadata: jest.Mock<void, [accountId: string, metadata: Partial<{
80
+ name: string;
81
+ importTime: number;
82
+ keyring: {
83
+ type: string;
84
+ };
85
+ nameLastUpdatedAt?: number | undefined;
86
+ snap?: {
87
+ id: string;
88
+ name: string;
89
+ enabled: boolean;
90
+ } | undefined;
91
+ lastSelected?: number | undefined;
92
+ }>]>;
93
+ mockAccountsListAccounts: jest.Mock<any, any>;
94
+ mockNetworkControllerGetState: jest.Mock<import("@metamask/network-controller").NetworkState, []>;
95
+ mockNetworkControllerAddNetwork: jest.Mock<import("@metamask/network-controller").NetworkConfiguration, [fields: import("@metamask/network-controller").AddNetworkFields]>;
96
+ mockNetworkControllerRemoveNetwork: jest.Mock<void, [chainId: `0x${string}`]>;
97
+ mockNetworkControllerUpdateNetwork: jest.Mock<Promise<import("@metamask/network-controller").NetworkConfiguration>, [`0x${string}`, import("@metamask/network-controller").UpdateNetworkFields, ({
98
+ replacementSelectedRpcEndpointIndex?: number | undefined;
99
+ } | undefined)?]>;
100
+ };
101
+ export {};
102
+ //# sourceMappingURL=mockMessenger.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockMessenger.d.cts","sourceRoot":"","sources":["../../../../src/controllers/user-storage/__fixtures__/mockMessenger.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kCAAkC;AACjE,OAAO,EAAE,mBAAmB,EAAE,kCAAkC;AAGhE,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,8BAA8B,EAC/B,qBAAW;AAyBZ,KAAK,cAAc,GAAG,eAAe,CACnC,uBAAuB,EACvB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,CAAC,EAAE;IACvD,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;CACnC;;;;;;;;;;;;;;;;;;;;;EAsCA;AAED,KAAK,kBAAkB,GAAG;IACxB,aAAa,EAAE,mBAAmB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAClE,SAAS,EAAE,8BAA8B,CAAC;CAC3C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,kBAAkB,CAAC,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6LxC"}
@@ -0,0 +1,102 @@
1
+ /// <reference types="jest" />
2
+ import type { NotNamespacedBy } from "@metamask/base-controller";
3
+ import { ControllerMessenger } from "@metamask/base-controller";
4
+ import type { AllowedActions, AllowedEvents, UserStorageControllerMessenger } from "../index.mjs";
5
+ type ExternalEvents = NotNamespacedBy<'UserStorageController', AllowedEvents['type']>;
6
+ /**
7
+ * creates a custom user storage messenger, in case tests need different permissions
8
+ * @param props - overrides
9
+ * @param props.overrideEvents - override events
10
+ * @returns base messenger, and messenger. You can pass this into the mocks below to mock messenger calls
11
+ */
12
+ export declare function createCustomUserStorageMessenger(props?: {
13
+ overrideEvents?: ExternalEvents[];
14
+ }): {
15
+ baseMessenger: ControllerMessenger<AllowedActions, AllowedEvents>;
16
+ messenger: import("@metamask/base-controller").RestrictedControllerMessenger<"UserStorageController", import("@metamask/snaps-controllers").HandleSnapRequest | {
17
+ type: "AuthenticationController:isSignedIn";
18
+ handler: () => boolean;
19
+ } | {
20
+ type: "AuthenticationController:performSignIn";
21
+ handler: () => Promise<string>;
22
+ } | {
23
+ type: "AuthenticationController:performSignOut";
24
+ handler: () => void;
25
+ } | {
26
+ type: "AuthenticationController:getBearerToken";
27
+ handler: () => Promise<string>;
28
+ } | {
29
+ type: "AuthenticationController:getSessionProfile";
30
+ handler: () => Promise<{
31
+ identifierId: string;
32
+ profileId: string;
33
+ }>;
34
+ } | import("@metamask/keyring-controller").KeyringControllerGetStateAction | import("../index.mjs").NotificationServicesControllerDisableNotificationServices | import("../index.mjs").NotificationServicesControllerSelectIsNotificationServicesEnabled | import("@metamask/accounts-controller").AccountsControllerListAccountsAction | import("@metamask/accounts-controller").AccountsControllerUpdateAccountMetadataAction | import("@metamask/keyring-controller").KeyringControllerAddNewAccountAction | import("@metamask/network-controller").NetworkControllerGetStateAction | import("@metamask/network-controller").NetworkControllerAddNetworkAction | import("@metamask/network-controller").NetworkControllerRemoveNetworkAction | import("@metamask/network-controller").NetworkControllerUpdateNetworkAction, import("@metamask/keyring-controller").KeyringControllerLockEvent | import("@metamask/keyring-controller").KeyringControllerUnlockEvent | import("../index.mjs").UserStorageControllerStateChangeEvent | import("../index.mjs").UserStorageControllerAccountSyncingInProgress | import("../index.mjs").UserStorageControllerAccountSyncingComplete | import("@metamask/accounts-controller").AccountsControllerAccountAddedEvent | import("@metamask/accounts-controller").AccountsControllerAccountRenamedEvent | import("@metamask/network-controller").NetworkControllerNetworkRemovedEvent, "SnapController:handleRequest" | "KeyringController:getState" | "AuthenticationController:isSignedIn" | "AuthenticationController:performSignIn" | "AuthenticationController:performSignOut" | "AuthenticationController:getBearerToken" | "AuthenticationController:getSessionProfile" | "NotificationServicesController:disableNotificationServices" | "NotificationServicesController:selectIsNotificationServicesEnabled" | "AccountsController:listAccounts" | "AccountsController:updateAccountMetadata" | "KeyringController:addNewAccount" | "NetworkController:getState" | "NetworkController:addNetwork" | "NetworkController:removeNetwork" | "NetworkController:updateNetwork", "KeyringController:lock" | "KeyringController:unlock" | "AccountsController:accountAdded" | "AccountsController:accountRenamed" | "NetworkController:networkRemoved">;
35
+ };
36
+ type OverrideMessengers = {
37
+ baseMessenger: ControllerMessenger<AllowedActions, AllowedEvents>;
38
+ messenger: UserStorageControllerMessenger;
39
+ };
40
+ /**
41
+ * Jest Mock Utility to generate a mock User Storage Messenger
42
+ * @param overrideMessengers - override messengers if need to modify the underlying permissions
43
+ * @returns series of mocks to actions that can be called
44
+ */
45
+ export declare function mockUserStorageMessenger(overrideMessengers?: OverrideMessengers): {
46
+ baseMessenger: ControllerMessenger<AllowedActions, AllowedEvents>;
47
+ messenger: import("@metamask/base-controller").RestrictedControllerMessenger<"UserStorageController", import("@metamask/snaps-controllers").HandleSnapRequest | {
48
+ type: "AuthenticationController:isSignedIn";
49
+ handler: () => boolean;
50
+ } | {
51
+ type: "AuthenticationController:performSignIn";
52
+ handler: () => Promise<string>;
53
+ } | {
54
+ type: "AuthenticationController:performSignOut";
55
+ handler: () => void;
56
+ } | {
57
+ type: "AuthenticationController:getBearerToken";
58
+ handler: () => Promise<string>;
59
+ } | {
60
+ type: "AuthenticationController:getSessionProfile";
61
+ handler: () => Promise<{
62
+ identifierId: string;
63
+ profileId: string;
64
+ }>;
65
+ } | import("@metamask/keyring-controller").KeyringControllerGetStateAction | import("../index.mjs").NotificationServicesControllerDisableNotificationServices | import("../index.mjs").NotificationServicesControllerSelectIsNotificationServicesEnabled | import("@metamask/accounts-controller").AccountsControllerListAccountsAction | import("@metamask/accounts-controller").AccountsControllerUpdateAccountMetadataAction | import("@metamask/keyring-controller").KeyringControllerAddNewAccountAction | import("@metamask/network-controller").NetworkControllerGetStateAction | import("@metamask/network-controller").NetworkControllerAddNetworkAction | import("@metamask/network-controller").NetworkControllerRemoveNetworkAction | import("@metamask/network-controller").NetworkControllerUpdateNetworkAction, import("@metamask/keyring-controller").KeyringControllerLockEvent | import("@metamask/keyring-controller").KeyringControllerUnlockEvent | import("../index.mjs").UserStorageControllerStateChangeEvent | import("../index.mjs").UserStorageControllerAccountSyncingInProgress | import("../index.mjs").UserStorageControllerAccountSyncingComplete | import("@metamask/accounts-controller").AccountsControllerAccountAddedEvent | import("@metamask/accounts-controller").AccountsControllerAccountRenamedEvent | import("@metamask/network-controller").NetworkControllerNetworkRemovedEvent, "SnapController:handleRequest" | "KeyringController:getState" | "AuthenticationController:isSignedIn" | "AuthenticationController:performSignIn" | "AuthenticationController:performSignOut" | "AuthenticationController:getBearerToken" | "AuthenticationController:getSessionProfile" | "NotificationServicesController:disableNotificationServices" | "NotificationServicesController:selectIsNotificationServicesEnabled" | "AccountsController:listAccounts" | "AccountsController:updateAccountMetadata" | "KeyringController:addNewAccount" | "NetworkController:getState" | "NetworkController:addNetwork" | "NetworkController:removeNetwork" | "NetworkController:updateNetwork", "KeyringController:lock" | "KeyringController:unlock" | "AccountsController:accountAdded" | "AccountsController:accountRenamed" | "NetworkController:networkRemoved">;
66
+ mockSnapGetPublicKey: jest.Mock<any, any>;
67
+ mockSnapSignMessage: jest.Mock<any, any>;
68
+ mockAuthGetBearerToken: jest.Mock<Promise<string>, []>;
69
+ mockAuthGetSessionProfile: jest.Mock<Promise<{
70
+ identifierId: string;
71
+ profileId: string;
72
+ }>, []>;
73
+ mockAuthPerformSignIn: jest.Mock<Promise<string>, []>;
74
+ mockAuthIsSignedIn: jest.Mock<boolean, []>;
75
+ mockNotificationServicesIsEnabled: jest.Mock<boolean, []>;
76
+ mockNotificationServicesDisableNotifications: jest.Mock<Promise<void>, []>;
77
+ mockAuthPerformSignOut: jest.Mock<void, []>;
78
+ mockKeyringAddNewAccount: jest.Mock<Promise<string>, [accountCount?: number | undefined]>;
79
+ mockAccountsUpdateAccountMetadata: jest.Mock<void, [accountId: string, metadata: Partial<{
80
+ name: string;
81
+ importTime: number;
82
+ keyring: {
83
+ type: string;
84
+ };
85
+ nameLastUpdatedAt?: number | undefined;
86
+ snap?: {
87
+ id: string;
88
+ name: string;
89
+ enabled: boolean;
90
+ } | undefined;
91
+ lastSelected?: number | undefined;
92
+ }>]>;
93
+ mockAccountsListAccounts: jest.Mock<any, any>;
94
+ mockNetworkControllerGetState: jest.Mock<import("@metamask/network-controller").NetworkState, []>;
95
+ mockNetworkControllerAddNetwork: jest.Mock<import("@metamask/network-controller").NetworkConfiguration, [fields: import("@metamask/network-controller").AddNetworkFields]>;
96
+ mockNetworkControllerRemoveNetwork: jest.Mock<void, [chainId: `0x${string}`]>;
97
+ mockNetworkControllerUpdateNetwork: jest.Mock<Promise<import("@metamask/network-controller").NetworkConfiguration>, [`0x${string}`, import("@metamask/network-controller").UpdateNetworkFields, ({
98
+ replacementSelectedRpcEndpointIndex?: number | undefined;
99
+ } | undefined)?]>;
100
+ };
101
+ export {};
102
+ //# sourceMappingURL=mockMessenger.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockMessenger.d.mts","sourceRoot":"","sources":["../../../../src/controllers/user-storage/__fixtures__/mockMessenger.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kCAAkC;AACjE,OAAO,EAAE,mBAAmB,EAAE,kCAAkC;AAGhE,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,8BAA8B,EAC/B,qBAAW;AAyBZ,KAAK,cAAc,GAAG,eAAe,CACnC,uBAAuB,EACvB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,CAAC,EAAE;IACvD,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;CACnC;;;;;;;;;;;;;;;;;;;;;EAsCA;AAED,KAAK,kBAAkB,GAAG;IACxB,aAAa,EAAE,mBAAmB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAClE,SAAS,EAAE,8BAA8B,CAAC;CAC3C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,kBAAkB,CAAC,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6LxC"}
@@ -0,0 +1,166 @@
1
+ import { ControllerMessenger } from "@metamask/base-controller";
2
+ import { MOCK_STORAGE_KEY_SIGNATURE } from "./index.mjs";
3
+ const typedMockFn = (_type) => jest.fn();
4
+ /**
5
+ * creates a custom user storage messenger, in case tests need different permissions
6
+ * @param props - overrides
7
+ * @param props.overrideEvents - override events
8
+ * @returns base messenger, and messenger. You can pass this into the mocks below to mock messenger calls
9
+ */
10
+ export function createCustomUserStorageMessenger(props) {
11
+ const baseMessenger = new ControllerMessenger();
12
+ const messenger = baseMessenger.getRestricted({
13
+ name: 'UserStorageController',
14
+ allowedActions: [
15
+ 'KeyringController:getState',
16
+ 'KeyringController:addNewAccount',
17
+ 'SnapController:handleRequest',
18
+ 'AuthenticationController:getBearerToken',
19
+ 'AuthenticationController:getSessionProfile',
20
+ 'AuthenticationController:isSignedIn',
21
+ 'AuthenticationController:performSignOut',
22
+ 'AuthenticationController:performSignIn',
23
+ 'NotificationServicesController:disableNotificationServices',
24
+ 'NotificationServicesController:selectIsNotificationServicesEnabled',
25
+ 'AccountsController:listAccounts',
26
+ 'AccountsController:updateAccountMetadata',
27
+ 'NetworkController:getState',
28
+ 'NetworkController:addNetwork',
29
+ 'NetworkController:updateNetwork',
30
+ 'NetworkController:removeNetwork',
31
+ ],
32
+ allowedEvents: props?.overrideEvents ?? [
33
+ 'KeyringController:lock',
34
+ 'KeyringController:unlock',
35
+ 'AccountsController:accountAdded',
36
+ 'AccountsController:accountRenamed',
37
+ 'NetworkController:networkRemoved',
38
+ ],
39
+ });
40
+ return {
41
+ baseMessenger,
42
+ messenger,
43
+ };
44
+ }
45
+ /**
46
+ * Jest Mock Utility to generate a mock User Storage Messenger
47
+ * @param overrideMessengers - override messengers if need to modify the underlying permissions
48
+ * @returns series of mocks to actions that can be called
49
+ */
50
+ export function mockUserStorageMessenger(overrideMessengers) {
51
+ const { baseMessenger, messenger } = overrideMessengers ?? createCustomUserStorageMessenger();
52
+ const mockSnapGetPublicKey = jest.fn().mockResolvedValue('MOCK_PUBLIC_KEY');
53
+ const mockSnapSignMessage = jest
54
+ .fn()
55
+ .mockResolvedValue(MOCK_STORAGE_KEY_SIGNATURE);
56
+ const mockAuthGetBearerToken = typedMockFn('AuthenticationController:getBearerToken').mockResolvedValue('MOCK_BEARER_TOKEN');
57
+ const mockAuthGetSessionProfile = typedMockFn('AuthenticationController:getSessionProfile').mockResolvedValue({
58
+ identifierId: '',
59
+ profileId: 'MOCK_PROFILE_ID',
60
+ });
61
+ const mockAuthPerformSignIn = typedMockFn('AuthenticationController:performSignIn').mockResolvedValue('New Access Token');
62
+ const mockAuthIsSignedIn = typedMockFn('AuthenticationController:isSignedIn').mockReturnValue(true);
63
+ const mockAuthPerformSignOut = typedMockFn('AuthenticationController:performSignOut');
64
+ const mockNotificationServicesIsEnabled = typedMockFn('NotificationServicesController:selectIsNotificationServicesEnabled').mockReturnValue(true);
65
+ const mockNotificationServicesDisableNotifications = typedMockFn('NotificationServicesController:disableNotificationServices').mockResolvedValue();
66
+ const mockKeyringAddNewAccount = typedMockFn('KeyringController:addNewAccount');
67
+ // Untyped mock as there is a TS(2742) issue.
68
+ // This will return `InternalAccount[]`
69
+ const mockAccountsListAccounts = jest.fn();
70
+ const mockAccountsUpdateAccountMetadata = typedMockFn('AccountsController:updateAccountMetadata').mockResolvedValue(true);
71
+ const mockNetworkControllerGetState = typedMockFn('NetworkController:getState').mockReturnValue({
72
+ selectedNetworkClientId: '',
73
+ networksMetadata: {},
74
+ networkConfigurationsByChainId: {},
75
+ });
76
+ const mockNetworkControllerAddNetwork = typedMockFn('NetworkController:addNetwork');
77
+ const mockNetworkControllerRemoveNetwork = typedMockFn('NetworkController:removeNetwork');
78
+ const mockNetworkControllerUpdateNetwork = typedMockFn('NetworkController:updateNetwork');
79
+ jest.spyOn(messenger, 'call').mockImplementation((...args) => {
80
+ const typedArgs = args;
81
+ const [actionType] = typedArgs;
82
+ if (actionType === 'SnapController:handleRequest') {
83
+ const [, params] = typedArgs;
84
+ if (params.request.method === 'getPublicKey') {
85
+ return mockSnapGetPublicKey();
86
+ }
87
+ if (params.request.method === 'signMessage') {
88
+ return mockSnapSignMessage();
89
+ }
90
+ throw new Error(`MOCK_FAIL - unsupported SnapController:handleRequest call: ${params.request.method}`);
91
+ }
92
+ if (actionType === 'AuthenticationController:getBearerToken') {
93
+ return mockAuthGetBearerToken();
94
+ }
95
+ if (actionType === 'AuthenticationController:getSessionProfile') {
96
+ return mockAuthGetSessionProfile();
97
+ }
98
+ if (actionType === 'AuthenticationController:performSignIn') {
99
+ return mockAuthPerformSignIn();
100
+ }
101
+ if (actionType === 'AuthenticationController:isSignedIn') {
102
+ return mockAuthIsSignedIn();
103
+ }
104
+ if (actionType ===
105
+ 'NotificationServicesController:selectIsNotificationServicesEnabled') {
106
+ return mockNotificationServicesIsEnabled();
107
+ }
108
+ if (actionType ===
109
+ 'NotificationServicesController:disableNotificationServices') {
110
+ return mockNotificationServicesDisableNotifications();
111
+ }
112
+ if (actionType === 'AuthenticationController:performSignOut') {
113
+ return mockAuthPerformSignOut();
114
+ }
115
+ if (actionType === 'KeyringController:getState') {
116
+ return { isUnlocked: true };
117
+ }
118
+ if (actionType === 'KeyringController:addNewAccount') {
119
+ return mockKeyringAddNewAccount();
120
+ }
121
+ if (actionType === 'AccountsController:listAccounts') {
122
+ return mockAccountsListAccounts();
123
+ }
124
+ if (typedArgs[0] === 'AccountsController:updateAccountMetadata') {
125
+ const [, ...params] = typedArgs;
126
+ return mockAccountsUpdateAccountMetadata(...params);
127
+ }
128
+ if (actionType === 'NetworkController:getState') {
129
+ return mockNetworkControllerGetState();
130
+ }
131
+ if (actionType === 'NetworkController:addNetwork') {
132
+ const [, ...params] = typedArgs;
133
+ return mockNetworkControllerAddNetwork(...params);
134
+ }
135
+ if (actionType === 'NetworkController:removeNetwork') {
136
+ const [, ...params] = typedArgs;
137
+ return mockNetworkControllerRemoveNetwork(...params);
138
+ }
139
+ if (actionType === 'NetworkController:updateNetwork') {
140
+ const [, ...params] = typedArgs;
141
+ return mockNetworkControllerUpdateNetwork(...params);
142
+ }
143
+ throw new Error(`MOCK_FAIL - unsupported messenger call: ${actionType}`);
144
+ });
145
+ return {
146
+ baseMessenger,
147
+ messenger,
148
+ mockSnapGetPublicKey,
149
+ mockSnapSignMessage,
150
+ mockAuthGetBearerToken,
151
+ mockAuthGetSessionProfile,
152
+ mockAuthPerformSignIn,
153
+ mockAuthIsSignedIn,
154
+ mockNotificationServicesIsEnabled,
155
+ mockNotificationServicesDisableNotifications,
156
+ mockAuthPerformSignOut,
157
+ mockKeyringAddNewAccount,
158
+ mockAccountsUpdateAccountMetadata,
159
+ mockAccountsListAccounts,
160
+ mockNetworkControllerGetState,
161
+ mockNetworkControllerAddNetwork,
162
+ mockNetworkControllerRemoveNetwork,
163
+ mockNetworkControllerUpdateNetwork,
164
+ };
165
+ }
166
+ //# sourceMappingURL=mockMessenger.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockMessenger.mjs","sourceRoot":"","sources":["../../../../src/controllers/user-storage/__fixtures__/mockMessenger.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NotNamespacedBy } from '@metamask/base-controller';\nimport { ControllerMessenger } from '@metamask/base-controller';\n\nimport { MOCK_STORAGE_KEY_SIGNATURE } from '.';\nimport type {\n AllowedActions,\n AllowedEvents,\n UserStorageControllerMessenger,\n} from '..';\n\ntype GetHandler<ActionType extends AllowedActions['type']> = Extract<\n AllowedActions,\n { type: ActionType }\n>['handler'];\n\ntype CallParams = {\n [K in AllowedActions['type']]: [\n K,\n ...Parameters<Extract<AllowedActions, { type: K }>['handler']>,\n ];\n}[AllowedActions['type']];\n\nconst typedMockFn = <\n ActionType extends AllowedActions['type'],\n Handler = GetHandler<ActionType>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Func extends (...args: any) => any = Handler extends (...args: any[]) => any\n ? Handler\n : never,\n>(\n _type: ActionType,\n) => jest.fn<ReturnType<Func>, Parameters<Func>>();\n\ntype ExternalEvents = NotNamespacedBy<\n 'UserStorageController',\n AllowedEvents['type']\n>;\n\n/**\n * creates a custom user storage messenger, in case tests need different permissions\n * @param props - overrides\n * @param props.overrideEvents - override events\n * @returns base messenger, and messenger. You can pass this into the mocks below to mock messenger calls\n */\nexport function createCustomUserStorageMessenger(props?: {\n overrideEvents?: ExternalEvents[];\n}) {\n const baseMessenger = new ControllerMessenger<\n AllowedActions,\n AllowedEvents\n >();\n const messenger = baseMessenger.getRestricted({\n name: 'UserStorageController',\n allowedActions: [\n 'KeyringController:getState',\n 'KeyringController:addNewAccount',\n 'SnapController:handleRequest',\n 'AuthenticationController:getBearerToken',\n 'AuthenticationController:getSessionProfile',\n 'AuthenticationController:isSignedIn',\n 'AuthenticationController:performSignOut',\n 'AuthenticationController:performSignIn',\n 'NotificationServicesController:disableNotificationServices',\n 'NotificationServicesController:selectIsNotificationServicesEnabled',\n 'AccountsController:listAccounts',\n 'AccountsController:updateAccountMetadata',\n 'NetworkController:getState',\n 'NetworkController:addNetwork',\n 'NetworkController:updateNetwork',\n 'NetworkController:removeNetwork',\n ],\n allowedEvents: props?.overrideEvents ?? [\n 'KeyringController:lock',\n 'KeyringController:unlock',\n 'AccountsController:accountAdded',\n 'AccountsController:accountRenamed',\n 'NetworkController:networkRemoved',\n ],\n });\n\n return {\n baseMessenger,\n messenger,\n };\n}\n\ntype OverrideMessengers = {\n baseMessenger: ControllerMessenger<AllowedActions, AllowedEvents>;\n messenger: UserStorageControllerMessenger;\n};\n\n/**\n * Jest Mock Utility to generate a mock User Storage Messenger\n * @param overrideMessengers - override messengers if need to modify the underlying permissions\n * @returns series of mocks to actions that can be called\n */\nexport function mockUserStorageMessenger(\n overrideMessengers?: OverrideMessengers,\n) {\n const { baseMessenger, messenger } =\n overrideMessengers ?? createCustomUserStorageMessenger();\n\n const mockSnapGetPublicKey = jest.fn().mockResolvedValue('MOCK_PUBLIC_KEY');\n const mockSnapSignMessage = jest\n .fn()\n .mockResolvedValue(MOCK_STORAGE_KEY_SIGNATURE);\n\n const mockAuthGetBearerToken = typedMockFn(\n 'AuthenticationController:getBearerToken',\n ).mockResolvedValue('MOCK_BEARER_TOKEN');\n\n const mockAuthGetSessionProfile = typedMockFn(\n 'AuthenticationController:getSessionProfile',\n ).mockResolvedValue({\n identifierId: '',\n profileId: 'MOCK_PROFILE_ID',\n });\n\n const mockAuthPerformSignIn = typedMockFn(\n 'AuthenticationController:performSignIn',\n ).mockResolvedValue('New Access Token');\n\n const mockAuthIsSignedIn = typedMockFn(\n 'AuthenticationController:isSignedIn',\n ).mockReturnValue(true);\n\n const mockAuthPerformSignOut = typedMockFn(\n 'AuthenticationController:performSignOut',\n );\n\n const mockNotificationServicesIsEnabled = typedMockFn(\n 'NotificationServicesController:selectIsNotificationServicesEnabled',\n ).mockReturnValue(true);\n\n const mockNotificationServicesDisableNotifications = typedMockFn(\n 'NotificationServicesController:disableNotificationServices',\n ).mockResolvedValue();\n\n const mockKeyringAddNewAccount = typedMockFn(\n 'KeyringController:addNewAccount',\n );\n\n // Untyped mock as there is a TS(2742) issue.\n // This will return `InternalAccount[]`\n const mockAccountsListAccounts = jest.fn();\n\n const mockAccountsUpdateAccountMetadata = typedMockFn(\n 'AccountsController:updateAccountMetadata',\n ).mockResolvedValue(true as never);\n\n const mockNetworkControllerGetState = typedMockFn(\n 'NetworkController:getState',\n ).mockReturnValue({\n selectedNetworkClientId: '',\n networksMetadata: {},\n networkConfigurationsByChainId: {},\n });\n\n const mockNetworkControllerAddNetwork = typedMockFn(\n 'NetworkController:addNetwork',\n );\n\n const mockNetworkControllerRemoveNetwork = typedMockFn(\n 'NetworkController:removeNetwork',\n );\n\n const mockNetworkControllerUpdateNetwork = typedMockFn(\n 'NetworkController:updateNetwork',\n );\n\n jest.spyOn(messenger, 'call').mockImplementation((...args) => {\n const typedArgs = args as unknown as CallParams;\n const [actionType] = typedArgs;\n\n if (actionType === 'SnapController:handleRequest') {\n const [, params] = typedArgs;\n if (params.request.method === 'getPublicKey') {\n return mockSnapGetPublicKey();\n }\n\n if (params.request.method === 'signMessage') {\n return mockSnapSignMessage();\n }\n\n throw new Error(\n `MOCK_FAIL - unsupported SnapController:handleRequest call: ${\n params.request.method as string\n }`,\n );\n }\n\n if (actionType === 'AuthenticationController:getBearerToken') {\n return mockAuthGetBearerToken();\n }\n\n if (actionType === 'AuthenticationController:getSessionProfile') {\n return mockAuthGetSessionProfile();\n }\n\n if (actionType === 'AuthenticationController:performSignIn') {\n return mockAuthPerformSignIn();\n }\n\n if (actionType === 'AuthenticationController:isSignedIn') {\n return mockAuthIsSignedIn();\n }\n\n if (\n actionType ===\n 'NotificationServicesController:selectIsNotificationServicesEnabled'\n ) {\n return mockNotificationServicesIsEnabled();\n }\n\n if (\n actionType ===\n 'NotificationServicesController:disableNotificationServices'\n ) {\n return mockNotificationServicesDisableNotifications();\n }\n\n if (actionType === 'AuthenticationController:performSignOut') {\n return mockAuthPerformSignOut();\n }\n\n if (actionType === 'KeyringController:getState') {\n return { isUnlocked: true };\n }\n\n if (actionType === 'KeyringController:addNewAccount') {\n return mockKeyringAddNewAccount();\n }\n\n if (actionType === 'AccountsController:listAccounts') {\n return mockAccountsListAccounts();\n }\n\n if (typedArgs[0] === 'AccountsController:updateAccountMetadata') {\n const [, ...params] = typedArgs;\n return mockAccountsUpdateAccountMetadata(...params);\n }\n\n if (actionType === 'NetworkController:getState') {\n return mockNetworkControllerGetState();\n }\n\n if (actionType === 'NetworkController:addNetwork') {\n const [, ...params] = typedArgs;\n return mockNetworkControllerAddNetwork(...params);\n }\n\n if (actionType === 'NetworkController:removeNetwork') {\n const [, ...params] = typedArgs;\n return mockNetworkControllerRemoveNetwork(...params);\n }\n\n if (actionType === 'NetworkController:updateNetwork') {\n const [, ...params] = typedArgs;\n return mockNetworkControllerUpdateNetwork(...params);\n }\n\n throw new Error(\n `MOCK_FAIL - unsupported messenger call: ${actionType as string}`,\n );\n });\n\n return {\n baseMessenger,\n messenger,\n mockSnapGetPublicKey,\n mockSnapSignMessage,\n mockAuthGetBearerToken,\n mockAuthGetSessionProfile,\n mockAuthPerformSignIn,\n mockAuthIsSignedIn,\n mockNotificationServicesIsEnabled,\n mockNotificationServicesDisableNotifications,\n mockAuthPerformSignOut,\n mockKeyringAddNewAccount,\n mockAccountsUpdateAccountMetadata,\n mockAccountsListAccounts,\n mockNetworkControllerGetState,\n mockNetworkControllerAddNetwork,\n mockNetworkControllerRemoveNetwork,\n mockNetworkControllerUpdateNetwork,\n };\n}\n"]}