Skip to content

Commit 951d142

Browse files
committed
Lock sequential permission accept once on the live ask
1 parent 693c488 commit 951d142

1 file changed

Lines changed: 54 additions & 0 deletions

File tree

‎src/tui/gate-wire.test.ts‎

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)