| import Testing |
| @testable import OpenClaw |
|
|
| @MainActor |
| struct ExecApprovalsGatewayPrompterTests { |
| @Test func `session match prefers active session`() { |
| let matches = ExecApprovalsGatewayPrompter._testShouldPresent( |
| mode: .remote, |
| activeSession: " main ", |
| requestSession: "main", |
| lastInputSeconds: nil) |
| #expect(matches) |
|
|
| let mismatched = ExecApprovalsGatewayPrompter._testShouldPresent( |
| mode: .remote, |
| activeSession: "other", |
| requestSession: "main", |
| lastInputSeconds: 0) |
| #expect(!mismatched) |
| } |
|
|
| @Test func `session fallback uses recent activity`() { |
| let recent = ExecApprovalsGatewayPrompter._testShouldPresent( |
| mode: .remote, |
| activeSession: nil, |
| requestSession: "main", |
| lastInputSeconds: 10, |
| thresholdSeconds: 120) |
| #expect(recent) |
|
|
| let stale = ExecApprovalsGatewayPrompter._testShouldPresent( |
| mode: .remote, |
| activeSession: nil, |
| requestSession: "main", |
| lastInputSeconds: 200, |
| thresholdSeconds: 120) |
| #expect(!stale) |
| } |
|
|
| @Test func `default behavior matches mode`() { |
| let local = ExecApprovalsGatewayPrompter._testShouldPresent( |
| mode: .local, |
| activeSession: nil, |
| requestSession: nil, |
| lastInputSeconds: 400) |
| #expect(local) |
|
|
| let remote = ExecApprovalsGatewayPrompter._testShouldPresent( |
| mode: .remote, |
| activeSession: nil, |
| requestSession: nil, |
| lastInputSeconds: 400) |
| #expect(!remote) |
| } |
|
|
| |
|
|
| @Test func askAlwaysPromptsRegardlessOfSecurity() { |
| #expect(ExecApprovalsGatewayPrompter._testShouldAsk(security: .deny, ask: .always)) |
| #expect(ExecApprovalsGatewayPrompter._testShouldAsk(security: .allowlist, ask: .always)) |
| #expect(ExecApprovalsGatewayPrompter._testShouldAsk(security: .full, ask: .always)) |
| } |
|
|
| @Test func askOnMissPromptsOnlyForAllowlist() { |
| #expect(ExecApprovalsGatewayPrompter._testShouldAsk(security: .allowlist, ask: .onMiss)) |
| #expect(!ExecApprovalsGatewayPrompter._testShouldAsk(security: .deny, ask: .onMiss)) |
| #expect(!ExecApprovalsGatewayPrompter._testShouldAsk(security: .full, ask: .onMiss)) |
| } |
|
|
| @Test func askOffNeverPrompts() { |
| #expect(!ExecApprovalsGatewayPrompter._testShouldAsk(security: .deny, ask: .off)) |
| #expect(!ExecApprovalsGatewayPrompter._testShouldAsk(security: .allowlist, ask: .off)) |
| #expect(!ExecApprovalsGatewayPrompter._testShouldAsk(security: .full, ask: .off)) |
| } |
|
|
| @Test func fallbackAllowlistAllowsMatchingResolvedPath() { |
| let decision = ExecApprovalsGatewayPrompter._testFallbackDecision( |
| command: "git status", |
| resolvedPath: "/usr/bin/git", |
| askFallback: .allowlist, |
| allowlistPatterns: ["/usr/bin/git"]) |
| #expect(decision == .allowOnce) |
| } |
|
|
| @Test func fallbackAllowlistDeniesAllowlistMiss() { |
| let decision = ExecApprovalsGatewayPrompter._testFallbackDecision( |
| command: "git status", |
| resolvedPath: "/usr/bin/git", |
| askFallback: .allowlist, |
| allowlistPatterns: ["/usr/bin/rg"]) |
| #expect(decision == .deny) |
| } |
|
|
| @Test func fallbackFullAllowsWhenPromptCannotBeShown() { |
| let decision = ExecApprovalsGatewayPrompter._testFallbackDecision( |
| command: "git status", |
| resolvedPath: "/usr/bin/git", |
| askFallback: .full, |
| allowlistPatterns: []) |
| #expect(decision == .allowOnce) |
| } |
| } |
|
|