Files

104 lines
3.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { SessionApproval } from "#src/session-approval";
describe("SessionApproval", () => {
describe("single", () => {
it("stores surface and one pattern", () => {
const approval = SessionApproval.single("bash", "git *");
expect(approval.surface).toBe("bash");
expect(approval.patterns).toEqual(["git *"]);
});
it("representativePattern returns the pattern", () => {
const approval = SessionApproval.single("bash", "git *");
expect(approval.representativePattern).toBe("git *");
});
it("toGateApproval returns { surface, pattern }", () => {
const approval = SessionApproval.single("bash", "git *");
expect(approval.toGateApproval()).toEqual({
surface: "bash",
pattern: "git *",
});
});
});
describe("multiple", () => {
it("stores surface and all patterns", () => {
const approval = SessionApproval.multiple("external_directory", [
"/outside/a/*",
"/outside/b/*",
]);
expect(approval.surface).toBe("external_directory");
expect(approval.patterns).toEqual(["/outside/a/*", "/outside/b/*"]);
});
it("representativePattern returns the first pattern", () => {
const approval = SessionApproval.multiple("external_directory", [
"/outside/a/*",
"/outside/b/*",
]);
expect(approval.representativePattern).toBe("/outside/a/*");
});
it("toGateApproval returns { surface, pattern } using the first pattern", () => {
const approval = SessionApproval.multiple("external_directory", [
"/outside/a/*",
"/outside/b/*",
]);
expect(approval.toGateApproval()).toEqual({
surface: "external_directory",
pattern: "/outside/a/*",
});
});
it("defensive copy — mutating the source array does not affect patterns", () => {
const source = ["/outside/a/*", "/outside/b/*"];
const approval = SessionApproval.multiple("external_directory", source);
source.push("/outside/c/*");
expect(approval.patterns).toEqual(["/outside/a/*", "/outside/b/*"]);
});
});
describe("empty patterns (degenerate case)", () => {
it("representativePattern returns undefined", () => {
const approval = SessionApproval.multiple("external_directory", []);
expect(approval.representativePattern).toBeUndefined();
});
it("toGateApproval returns undefined", () => {
const approval = SessionApproval.multiple("external_directory", []);
expect(approval.toGateApproval()).toBeUndefined();
});
});
describe("toForwardedData", () => {
it("returns surface and all patterns for a single approval", () => {
const approval = SessionApproval.single("bash", "git *");
expect(approval.toForwardedData()).toEqual({
surface: "bash",
patterns: ["git *"],
});
});
it("returns surface and all patterns for a multiple approval", () => {
const approval = SessionApproval.multiple("external_directory", [
"/outside/a/*",
"/outside/b/*",
]);
expect(approval.toForwardedData()).toEqual({
surface: "external_directory",
patterns: ["/outside/a/*", "/outside/b/*"],
});
});
it("defensive copy — mutating the result patterns does not affect the approval", () => {
const approval = SessionApproval.single("bash", "git *");
const data = approval.toForwardedData();
(data.patterns as string[]).push("rm *");
expect(approval.patterns).toEqual(["git *"]);
});
});
});