mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-13 11:00:50 +00:00
79 lines
3.0 KiB
Swift
79 lines
3.0 KiB
Swift
import Foundation
|
|
import Testing
|
|
@testable import OpenClaw
|
|
|
|
struct ExecApprovalHelpersTests {
|
|
@Test func `parse decision trims and rejects invalid`() {
|
|
#expect(ExecApprovalHelpers.parseDecision("allow-once") == .allowOnce)
|
|
#expect(ExecApprovalHelpers.parseDecision(" allow-always ") == .allowAlways)
|
|
#expect(ExecApprovalHelpers.parseDecision("deny") == .deny)
|
|
#expect(ExecApprovalHelpers.parseDecision("") == nil)
|
|
#expect(ExecApprovalHelpers.parseDecision("nope") == nil)
|
|
}
|
|
|
|
@Test func `allowlist pattern prefers resolution`() {
|
|
let resolved = ExecCommandResolution(
|
|
rawExecutable: "rg",
|
|
resolvedPath: "/opt/homebrew/bin/rg",
|
|
executableName: "rg",
|
|
cwd: nil)
|
|
#expect(ExecApprovalHelpers.allowlistPattern(command: ["rg"], resolution: resolved) == resolved.resolvedPath)
|
|
|
|
let rawOnly = ExecCommandResolution(
|
|
rawExecutable: "rg",
|
|
resolvedPath: nil,
|
|
executableName: "rg",
|
|
cwd: nil)
|
|
#expect(ExecApprovalHelpers.allowlistPattern(command: ["rg"], resolution: rawOnly) == "rg")
|
|
#expect(ExecApprovalHelpers.allowlistPattern(command: ["rg"], resolution: nil) == "rg")
|
|
#expect(ExecApprovalHelpers.allowlistPattern(command: [], resolution: nil) == nil)
|
|
}
|
|
|
|
@Test func `validate allowlist pattern returns reasons`() {
|
|
#expect(ExecApprovalHelpers.isPathPattern("/usr/bin/rg"))
|
|
#expect(ExecApprovalHelpers.isPathPattern(" ~/bin/rg "))
|
|
#expect(!ExecApprovalHelpers.isPathPattern("rg"))
|
|
|
|
if case let .invalid(reason) = ExecApprovalHelpers.validateAllowlistPattern(" ") {
|
|
#expect(reason == .empty)
|
|
} else {
|
|
Issue.record("Expected empty pattern rejection")
|
|
}
|
|
|
|
if case let .invalid(reason) = ExecApprovalHelpers.validateAllowlistPattern("echo") {
|
|
#expect(reason == .missingPathComponent)
|
|
} else {
|
|
Issue.record("Expected basename pattern rejection")
|
|
}
|
|
}
|
|
|
|
@Test func `requires ask matches policy`() {
|
|
let entry = ExecAllowlistEntry(pattern: "/bin/ls", lastUsedAt: nil, lastUsedCommand: nil, lastResolvedPath: nil)
|
|
#expect(ExecApprovalHelpers.requiresAsk(
|
|
ask: .always,
|
|
security: .deny,
|
|
allowlistMatch: nil,
|
|
skillAllow: false))
|
|
#expect(ExecApprovalHelpers.requiresAsk(
|
|
ask: .onMiss,
|
|
security: .allowlist,
|
|
allowlistMatch: nil,
|
|
skillAllow: false))
|
|
#expect(!ExecApprovalHelpers.requiresAsk(
|
|
ask: .onMiss,
|
|
security: .allowlist,
|
|
allowlistMatch: entry,
|
|
skillAllow: false))
|
|
#expect(!ExecApprovalHelpers.requiresAsk(
|
|
ask: .onMiss,
|
|
security: .allowlist,
|
|
allowlistMatch: nil,
|
|
skillAllow: true))
|
|
#expect(!ExecApprovalHelpers.requiresAsk(
|
|
ask: .off,
|
|
security: .allowlist,
|
|
allowlistMatch: nil,
|
|
skillAllow: false))
|
|
}
|
|
}
|