import { setKeybindings } from "@earendil-works/pi-tui"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { KeybindingsManager } from "../src/core/keybindings.ts"; import { TrustSelectorComponent } from "../src/modes/interactive/components/trust-selector.ts"; import { initTheme } from "../src/modes/interactive/theme/theme.ts"; import { stripAnsi } from "../src/utils/ansi.ts"; describe("TrustSelectorComponent", () => { beforeAll(() => { initTheme("dark"); }); beforeEach(() => { setKeybindings(new KeybindingsManager()); }); it("marks the saved trusted decision", () => { const selector = new TrustSelectorComponent({ cwd: "/project", savedDecision: { path: "/project", decision: true }, projectTrusted: true, onSelect: () => {}, onCancel: () => {}, }); const output = stripAnsi(selector.render(120).join("\n")); expect(output).toContain("Saved decision: trusted (/project)"); expect(output).toContain("Current session: trusted"); expect(output).toContain("Trust ✓"); expect(output).not.toContain("Do not trust ✓"); }); it("selects a trust decision", () => { const onSelect = vi.fn(); const selector = new TrustSelectorComponent({ cwd: "/project", savedDecision: null, projectTrusted: false, onSelect, onCancel: () => {}, }); selector.handleInput("\n"); expect(onSelect).toHaveBeenCalledWith({ trusted: true, updates: [{ path: "/project", decision: true }] }); }); it("labels saved ancestor decisions as inherited", () => { const selector = new TrustSelectorComponent({ cwd: "/parent/project/nested", savedDecision: { path: "/parent", decision: true }, projectTrusted: true, onSelect: () => {}, onCancel: () => {}, }); const output = stripAnsi(selector.render(120).join("\n")); expect(output).toContain("Saved decision: trusted (inherited from /parent)"); }); it("adds a trust parent option", () => { const onSelect = vi.fn(); const selector = new TrustSelectorComponent({ cwd: "/parent/project", savedDecision: { path: "/parent", decision: true }, projectTrusted: true, onSelect, onCancel: () => {}, }); const output = stripAnsi(selector.render(120).join("\n")); expect(output).toContain("Saved decision: trusted (inherited from /parent)"); expect(output).toContain("Trust parent folder (/parent) ✓"); selector.handleInput("\n"); expect(onSelect).toHaveBeenCalledWith({ trusted: true, updates: [ { path: "/parent", decision: true }, { path: "/parent/project", decision: null }, ], }); }); });