@@ -60,6 +60,7 @@ import {
60
60
AssertionError ,
61
61
base64ToBytes ,
62
62
stringToBytes ,
63
+ createDeferredPromise ,
63
64
} from '@metamask/utils' ;
64
65
import { File } from 'buffer' ;
65
66
import { webcrypto } from 'crypto' ;
@@ -78,6 +79,7 @@ import {
78
79
getNodeEESMessenger ,
79
80
getPersistedSnapsState ,
80
81
getSnapController ,
82
+ getSnapControllerEncryptor ,
81
83
getSnapControllerMessenger ,
82
84
getSnapControllerOptions ,
83
85
getSnapControllerWithEES ,
@@ -9164,6 +9166,40 @@ describe('SnapController', () => {
9164
9166
9165
9167
snapController . destroy ( ) ;
9166
9168
} ) ;
9169
+
9170
+ it ( 'logs an error message if the state fails to persist' , async ( ) => {
9171
+ const messenger = getSnapControllerMessenger ( ) ;
9172
+
9173
+ const errorValue = new Error ( 'Failed to persist state.' ) ;
9174
+ const snapController = getSnapController (
9175
+ getSnapControllerOptions ( {
9176
+ messenger,
9177
+ state : {
9178
+ snaps : getPersistedSnapsState ( ) ,
9179
+ } ,
9180
+ // @ts -expect-error - Missing required properties.
9181
+ encryptor : {
9182
+ ...getSnapControllerEncryptor ( ) ,
9183
+ encryptWithKey : jest . fn ( ) . mockRejectedValue ( errorValue ) ,
9184
+ } ,
9185
+ } ) ,
9186
+ ) ;
9187
+
9188
+ const { promise, resolve } = createDeferredPromise ( ) ;
9189
+ const error = jest . spyOn ( console , 'error' ) . mockImplementation ( resolve ) ;
9190
+
9191
+ await messenger . call (
9192
+ 'SnapController:updateSnapState' ,
9193
+ MOCK_SNAP_ID ,
9194
+ { foo : 'bar' } ,
9195
+ true ,
9196
+ ) ;
9197
+
9198
+ await promise ;
9199
+ expect ( error ) . toHaveBeenCalledWith ( errorValue ) ;
9200
+
9201
+ snapController . destroy ( ) ;
9202
+ } ) ;
9167
9203
} ) ;
9168
9204
9169
9205
describe ( 'SnapController:clearSnapState' , ( ) => {
@@ -9222,6 +9258,41 @@ describe('SnapController', () => {
9222
9258
9223
9259
snapController . destroy ( ) ;
9224
9260
} ) ;
9261
+
9262
+ it ( 'logs an error message if the state fails to persist' , async ( ) => {
9263
+ const messenger = getSnapControllerMessenger ( ) ;
9264
+
9265
+ const errorValue = new Error ( 'Failed to persist state.' ) ;
9266
+ const snapController = getSnapController (
9267
+ getSnapControllerOptions ( {
9268
+ messenger,
9269
+ state : {
9270
+ snaps : getPersistedSnapsState ( ) ,
9271
+ } ,
9272
+ // @ts -expect-error - Missing required properties.
9273
+ encryptor : {
9274
+ ...getSnapControllerEncryptor ( ) ,
9275
+ encryptWithKey : jest . fn ( ) . mockRejectedValue ( errorValue ) ,
9276
+ } ,
9277
+ } ) ,
9278
+ ) ;
9279
+
9280
+ const { promise, resolve } = createDeferredPromise ( ) ;
9281
+ const error = jest . spyOn ( console , 'error' ) . mockImplementation ( resolve ) ;
9282
+
9283
+ // @ts -expect-error - Property `update` is protected.
9284
+ // eslint-disable-next-line jest/prefer-spy-on
9285
+ snapController . update = jest . fn ( ) . mockImplementation ( ( ) => {
9286
+ throw errorValue ;
9287
+ } ) ;
9288
+
9289
+ await messenger . call ( 'SnapController:clearSnapState' , MOCK_SNAP_ID , true ) ;
9290
+
9291
+ await promise ;
9292
+ expect ( error ) . toHaveBeenCalledWith ( errorValue ) ;
9293
+
9294
+ snapController . destroy ( ) ;
9295
+ } ) ;
9225
9296
} ) ;
9226
9297
9227
9298
describe ( 'SnapController:updateBlockedSnaps' , ( ) => {
0 commit comments