@@ -526,6 +526,60 @@ describe("wireGates", () => {
526526 } ) ;
527527 } ) ;
528528
529+ test ( "sequential permission.gate Accept once on B allows B" , async ( ) => {
530+ await withTestRenderer ( async ( h ) => {
531+ const shell = createAppShell ( h . renderer , {
532+ terminal : { columns : 80 , rows : 24 } ,
533+ run : "idle" ,
534+ } ) ;
535+ const emitter = new EventEmitter ( ) ;
536+ let resolvedA : unknown ;
537+ let resolvedB : unknown ;
538+ try {
539+ const dispose = wireGates ( emitter , shell ) ;
540+ emitter . emit ( "permission.gate" , {
541+ request : baseRequest ( {
542+ id : "req-a" ,
543+ subject : "git status" ,
544+ scopes : [ { id : "scope-a" , label : "Allow git A" , pattern : "git A*" } ] ,
545+ } ) ,
546+ resolve : ( outcome : unknown ) => {
547+ resolvedA = outcome ;
548+ } ,
549+ } ) ;
550+ closeInsetOverlay ( shell ) ;
551+ expect ( resolvedA ) . toEqual ( { allow : false } ) ;
552+ expect ( shell . overlayList ) . toBeNull ( ) ;
553+
554+ emitter . emit ( "permission.gate" , {
555+ request : baseRequest ( {
556+ id : "req-b" ,
557+ subject : "git push" ,
558+ scopes : [ { id : "scope-b" , label : "Allow git B" , pattern : "git B*" } ] ,
559+ } ) ,
560+ resolve : ( outcome : unknown ) => {
561+ resolvedB = outcome ;
562+ } ,
563+ } ) ;
564+ expect ( shell . overlayKind ) . toBe ( "permissions" ) ;
565+ expect ( shell . overlayList ?. select . options . map ( ( option ) => option . value ) ) . toEqual ( [
566+ `req-b:${ PERMISSION_DENY_ID } ` ,
567+ `req-b:${ PERMISSION_ONCE_ID } ` ,
568+ "req-b:scope-b" ,
569+ ] ) ;
570+
571+ moveOverlaySelection ( shell , 1 ) ;
572+ acceptOverlaySelection ( shell ) ;
573+ expect ( resolvedB ) . toEqual ( { allow : true } ) ;
574+ expect ( resolvedB ) . not . toEqual ( { allow : false } ) ;
575+
576+ dispose ( ) ;
577+ } finally {
578+ shell . dispose ( ) ;
579+ }
580+ } ) ;
581+ } ) ;
582+
529583 test ( "operator.gate without id cancels without opening" , async ( ) => {
530584 await withTestRenderer ( async ( h ) => {
531585 const shell = createAppShell ( h . renderer , {
0 commit comments