1
1
import { errorCodes } from 'eth-rpc-errors' ;
2
2
import sinon from 'sinon' ;
3
- import { ApprovalController } from './ApprovalController' ;
3
+ import { ControllerMessenger } from '../ControllerMessenger' ;
4
+ import {
5
+ ApprovalController ,
6
+ ApprovalControllerActions ,
7
+ ApprovalControllerEvents ,
8
+ ApprovalControllerMessenger ,
9
+ } from './ApprovalController' ;
4
10
5
11
const STORE_KEY = 'pendingApprovals' ;
6
12
7
13
const TYPE = 'TYPE' ;
8
14
9
- const defaultConfig = {
10
- showApprovalRequest : ( ) => undefined ,
11
- } ;
15
+ const controllerName = 'ApprovalController' ;
16
+
17
+ function getRestrictedMessenger ( ) {
18
+ const controllerMessenger = new ControllerMessenger <
19
+ ApprovalControllerActions ,
20
+ ApprovalControllerEvents
21
+ > ( ) ;
22
+ const messenger = controllerMessenger . getRestricted <
23
+ typeof controllerName ,
24
+ never ,
25
+ never
26
+ > ( {
27
+ name : 'ApprovalController' ,
28
+ } ) ;
29
+ return messenger ;
30
+ }
12
31
13
32
describe ( 'approval controller' , ( ) => {
14
33
const clock = sinon . useFakeTimers ( 1 ) ;
15
34
afterAll ( ( ) => clock . restore ( ) ) ;
16
35
17
36
describe ( 'add' , ( ) => {
18
37
let approvalController : ApprovalController ;
38
+ let showApprovalRequest : sinon . SinonSpy ;
19
39
20
40
beforeEach ( ( ) => {
21
- approvalController = new ApprovalController ( { ...defaultConfig } ) ;
41
+ showApprovalRequest = sinon . spy ( ) ;
42
+ approvalController = new ApprovalController ( {
43
+ messenger : getRestrictedMessenger ( ) ,
44
+ showApprovalRequest,
45
+ } ) ;
22
46
} ) ;
23
47
24
48
it ( 'adds correctly specified entry' , ( ) => {
@@ -31,7 +55,13 @@ describe('approval controller', () => {
31
55
approvalController . has ( { origin : 'bar.baz' , type : TYPE } ) ,
32
56
) . toStrictEqual ( true ) ;
33
57
expect ( approvalController . state [ STORE_KEY ] ) . toStrictEqual ( {
34
- foo : { id : 'foo' , origin : 'bar.baz' , time : 1 , type : TYPE } ,
58
+ foo : {
59
+ id : 'foo' ,
60
+ origin : 'bar.baz' ,
61
+ requestData : null ,
62
+ time : 1 ,
63
+ type : TYPE ,
64
+ } ,
35
65
} ) ;
36
66
} ) ;
37
67
@@ -121,7 +151,7 @@ describe('approval controller', () => {
121
151
it ( 'addAndShowApprovalRequest' , ( ) => {
122
152
const showApprovalSpy = sinon . spy ( ) ;
123
153
const approvalController = new ApprovalController ( {
124
- ... defaultConfig ,
154
+ messenger : getRestrictedMessenger ( ) ,
125
155
showApprovalRequest : showApprovalSpy ,
126
156
} ) ;
127
157
@@ -138,11 +168,15 @@ describe('approval controller', () => {
138
168
139
169
describe ( 'get' , ( ) => {
140
170
it ( 'gets entry' , ( ) => {
141
- const approvalController = new ApprovalController ( { ...defaultConfig } ) ;
171
+ const approvalController = new ApprovalController ( {
172
+ messenger : getRestrictedMessenger ( ) ,
173
+ showApprovalRequest : sinon . spy ( ) ,
174
+ } ) ;
142
175
approvalController . add ( { id : 'foo' , origin : 'bar.baz' , type : 'myType' } ) ;
143
176
expect ( approvalController . get ( 'foo' ) ) . toStrictEqual ( {
144
177
id : 'foo' ,
145
178
origin : 'bar.baz' ,
179
+ requestData : null ,
146
180
type : 'myType' ,
147
181
time : 1 ,
148
182
} ) ;
@@ -154,7 +188,10 @@ describe('approval controller', () => {
154
188
let addWithCatch : ( args : any ) => void ;
155
189
156
190
beforeEach ( ( ) => {
157
- approvalController = new ApprovalController ( { ...defaultConfig } ) ;
191
+ approvalController = new ApprovalController ( {
192
+ messenger : getRestrictedMessenger ( ) ,
193
+ showApprovalRequest : sinon . spy ( ) ,
194
+ } ) ;
158
195
addWithCatch = ( args : any ) =>
159
196
approvalController . add ( args ) . catch ( ( ) => undefined ) ;
160
197
} ) ;
@@ -252,7 +289,10 @@ describe('approval controller', () => {
252
289
253
290
describe ( 'getTotalApprovalCount' , ( ) => {
254
291
it ( 'gets the total approval count' , ( ) => {
255
- const approvalController = new ApprovalController ( { ...defaultConfig } ) ;
292
+ const approvalController = new ApprovalController ( {
293
+ messenger : getRestrictedMessenger ( ) ,
294
+ showApprovalRequest : sinon . spy ( ) ,
295
+ } ) ;
256
296
expect ( approvalController . getTotalApprovalCount ( ) ) . toStrictEqual ( 0 ) ;
257
297
258
298
const addWithCatch = ( args : any ) =>
@@ -279,7 +319,10 @@ describe('approval controller', () => {
279
319
let approvalController : ApprovalController ;
280
320
281
321
beforeEach ( ( ) => {
282
- approvalController = new ApprovalController ( { ...defaultConfig } ) ;
322
+ approvalController = new ApprovalController ( {
323
+ messenger : getRestrictedMessenger ( ) ,
324
+ showApprovalRequest : sinon . spy ( ) ,
325
+ } ) ;
283
326
} ) ;
284
327
285
328
it ( 'returns true for existing entry by id' , ( ) => {
@@ -351,7 +394,10 @@ describe('approval controller', () => {
351
394
let deleteSpy : sinon . SinonSpy ;
352
395
353
396
beforeEach ( ( ) => {
354
- approvalController = new ApprovalController ( { ...defaultConfig } ) ;
397
+ approvalController = new ApprovalController ( {
398
+ messenger : getRestrictedMessenger ( ) ,
399
+ showApprovalRequest : sinon . spy ( ) ,
400
+ } ) ;
355
401
// TODO: Stop using private methods in tests
356
402
deleteSpy = sinon . spy ( approvalController as any , '_delete' ) ;
357
403
numDeletions = 0 ;
@@ -365,7 +411,7 @@ describe('approval controller', () => {
365
411
origin : 'bar.baz' ,
366
412
type : 'myType' ,
367
413
} ) ;
368
- approvalController . resolve ( 'foo' , 'success' ) ;
414
+ approvalController . accept ( 'foo' , 'success' ) ;
369
415
370
416
const result = await approvalPromise ;
371
417
expect ( result ) . toStrictEqual ( 'success' ) ;
@@ -386,20 +432,20 @@ describe('approval controller', () => {
386
432
type : 'myType2' ,
387
433
} ) ;
388
434
389
- approvalController . resolve ( 'foo2' , 'success2' ) ;
435
+ approvalController . accept ( 'foo2' , 'success2' ) ;
390
436
391
437
let result = await approvalPromise2 ;
392
438
expect ( result ) . toStrictEqual ( 'success2' ) ;
393
439
394
- approvalController . resolve ( 'foo1' , 'success1' ) ;
440
+ approvalController . accept ( 'foo1' , 'success1' ) ;
395
441
396
442
result = await approvalPromise1 ;
397
443
expect ( result ) . toStrictEqual ( 'success1' ) ;
398
444
expect ( deleteSpy . callCount ) . toStrictEqual ( numDeletions ) ;
399
445
} ) ;
400
446
401
447
it ( 'throws on unknown id' , ( ) => {
402
- expect ( ( ) => approvalController . resolve ( 'foo' ) ) . toThrow (
448
+ expect ( ( ) => approvalController . accept ( 'foo' ) ) . toThrow (
403
449
getIdNotFoundError ( 'foo' ) ,
404
450
) ;
405
451
expect ( deleteSpy . callCount ) . toStrictEqual ( numDeletions ) ;
@@ -412,7 +458,10 @@ describe('approval controller', () => {
412
458
let deleteSpy : sinon . SinonSpy ;
413
459
414
460
beforeEach ( ( ) => {
415
- approvalController = new ApprovalController ( { ...defaultConfig } ) ;
461
+ approvalController = new ApprovalController ( {
462
+ messenger : getRestrictedMessenger ( ) ,
463
+ showApprovalRequest : sinon . spy ( ) ,
464
+ } ) ;
416
465
// TODO: Stop using private methods in tests
417
466
deleteSpy = sinon . spy ( approvalController as any , '_delete' ) ;
418
467
numDeletions = 0 ;
@@ -459,9 +508,12 @@ describe('approval controller', () => {
459
508
} ) ;
460
509
} ) ;
461
510
462
- describe ( 'resolve and reject' , ( ) => {
463
- it ( 'resolves and rejects multiple approval promises out of order' , async ( ) => {
464
- const approvalController = new ApprovalController ( { ...defaultConfig } ) ;
511
+ describe ( 'accept and reject' , ( ) => {
512
+ it ( 'accepts and rejects multiple approval promises out of order' , async ( ) => {
513
+ const approvalController = new ApprovalController ( {
514
+ messenger : getRestrictedMessenger ( ) ,
515
+ showApprovalRequest : sinon . spy ( ) ,
516
+ } ) ;
465
517
466
518
const promise1 = approvalController . add ( {
467
519
id : 'foo1' ,
@@ -484,7 +536,7 @@ describe('approval controller', () => {
484
536
type : 'myType4' ,
485
537
} ) ;
486
538
487
- approvalController . resolve ( 'foo2' , 'success2' ) ;
539
+ approvalController . accept ( 'foo2' , 'success2' ) ;
488
540
489
541
let result = await promise2 ;
490
542
expect ( result ) . toStrictEqual ( 'success2' ) ;
@@ -500,7 +552,7 @@ describe('approval controller', () => {
500
552
) ;
501
553
expect ( approvalController . has ( { origin : 'bar.baz' } ) ) . toStrictEqual ( true ) ;
502
554
503
- approvalController . resolve ( 'foo1' , 'success1' ) ;
555
+ approvalController . accept ( 'foo1' , 'success1' ) ;
504
556
505
557
result = await promise1 ;
506
558
expect ( result ) . toStrictEqual ( 'success1' ) ;
@@ -515,7 +567,10 @@ describe('approval controller', () => {
515
567
let approvalController : ApprovalController ;
516
568
517
569
beforeEach ( ( ) => {
518
- approvalController = new ApprovalController ( { ...defaultConfig } ) ;
570
+ approvalController = new ApprovalController ( {
571
+ messenger : getRestrictedMessenger ( ) ,
572
+ showApprovalRequest : sinon . spy ( ) ,
573
+ } ) ;
519
574
} ) ;
520
575
521
576
it ( 'does nothing if state is already empty' , ( ) => {
@@ -538,13 +593,61 @@ describe('approval controller', () => {
538
593
expect ( rejectSpy . callCount ) . toStrictEqual ( 2 ) ;
539
594
} ) ;
540
595
} ) ;
596
+
597
+ describe ( 'actions' , ( ) => {
598
+ it ( 'addApprovalRequest: shouldShowRequest = true' , async ( ) => {
599
+ const messenger = new ControllerMessenger <
600
+ ApprovalControllerActions ,
601
+ ApprovalControllerEvents
602
+ > ( ) ;
603
+ const showApprovalSpy = sinon . spy ( ) ;
604
+
605
+ const approvalController = new ApprovalController ( {
606
+ messenger : messenger . getRestricted ( {
607
+ name : controllerName ,
608
+ } ) as ApprovalControllerMessenger ,
609
+ showApprovalRequest : showApprovalSpy ,
610
+ } ) ;
611
+
612
+ messenger . call (
613
+ 'ApprovalController:addRequest' ,
614
+ { id : 'foo' , origin : 'bar.baz' , type : TYPE } ,
615
+ true ,
616
+ ) ;
617
+ expect ( showApprovalSpy . calledOnce ) . toStrictEqual ( true ) ;
618
+ expect ( approvalController . has ( { id : 'foo' } ) ) . toStrictEqual ( true ) ;
619
+ } ) ;
620
+
621
+ it ( 'addApprovalRequest: shouldShowRequest = false' , async ( ) => {
622
+ const messenger = new ControllerMessenger <
623
+ ApprovalControllerActions ,
624
+ ApprovalControllerEvents
625
+ > ( ) ;
626
+ const showApprovalSpy = sinon . spy ( ) ;
627
+
628
+ const approvalController = new ApprovalController ( {
629
+ messenger : messenger . getRestricted ( {
630
+ name : controllerName ,
631
+ } ) as ApprovalControllerMessenger ,
632
+ showApprovalRequest : showApprovalSpy ,
633
+ } ) ;
634
+
635
+ messenger . call (
636
+ 'ApprovalController:addRequest' ,
637
+ { id : 'foo' , origin : 'bar.baz' , type : TYPE } ,
638
+ false ,
639
+ ) ;
640
+ expect ( showApprovalSpy . notCalled ) . toStrictEqual ( true ) ;
641
+ expect ( approvalController . has ( { id : 'foo' } ) ) . toStrictEqual ( true ) ;
642
+ } ) ;
643
+ } ) ;
541
644
} ) ;
542
645
543
646
// helpers
544
647
545
648
function getIdCollisionError ( id : string ) {
546
649
return getError (
547
- `Approval with id '${ id } ' already exists.` ,
650
+ `Approval request with id '${ id } ' already exists.` ,
548
651
errorCodes . rpc . internal ,
549
652
) ;
550
653
}
@@ -555,7 +658,7 @@ function getOriginTypeCollisionError(origin: string, type = TYPE) {
555
658
}
556
659
557
660
function getIdNotFoundError ( id : string ) {
558
- return getError ( `Approval with id '${ id } ' not found.` ) ;
661
+ return getError ( `Approval request with id '${ id } ' not found.` ) ;
559
662
}
560
663
561
664
function getError ( message : string , code ?: number ) {
0 commit comments