VoiceWake: add SSH forwarder tests

This commit is contained in:
Peter Steinberger
2025-12-07 01:55:30 +01:00
parent cf0f44823a
commit 141d2b5626
3 changed files with 41 additions and 14 deletions

View File

@@ -24,8 +24,7 @@ let package = Package(
dependencies: [], dependencies: [],
swiftSettings: [ swiftSettings: [
.enableUpcomingFeature("StrictConcurrency"), .enableUpcomingFeature("StrictConcurrency"),
] ]),
),
.executableTarget( .executableTarget(
name: "Clawdis", name: "Clawdis",
dependencies: [ dependencies: [
@@ -40,8 +39,7 @@ let package = Package(
], ],
swiftSettings: [ swiftSettings: [
.enableUpcomingFeature("StrictConcurrency"), .enableUpcomingFeature("StrictConcurrency"),
] ]),
),
.executableTarget( .executableTarget(
name: "ClawdisCLI", name: "ClawdisCLI",
dependencies: [ dependencies: [
@@ -50,15 +48,12 @@ let package = Package(
], ],
swiftSettings: [ swiftSettings: [
.enableUpcomingFeature("StrictConcurrency"), .enableUpcomingFeature("StrictConcurrency"),
] ]),
),
.testTarget( .testTarget(
name: "ClawdisIPCTests", name: "ClawdisIPCTests",
dependencies: ["ClawdisIPC"], dependencies: ["ClawdisIPC", "Clawdis"],
swiftSettings: [ swiftSettings: [
.enableUpcomingFeature("StrictConcurrency"), .enableUpcomingFeature("StrictConcurrency"),
.enableExperimentalFeature("SwiftTesting"), .enableExperimentalFeature("SwiftTesting"),
] ]),
), ])
]
)

View File

@@ -60,7 +60,7 @@ enum VoiceWakeForwarder {
await self.wait(process, timeout: config.timeout) await self.wait(process, timeout: config.timeout)
} }
private static func renderedCommand(template: String, transcript: String) -> String { static func renderedCommand(template: String, transcript: String) -> String {
let escaped = Self.shellEscape(transcript) let escaped = Self.shellEscape(transcript)
if template.contains("${text}") { if template.contains("${text}") {
return template.replacingOccurrences(of: "${text}", with: escaped) return template.replacingOccurrences(of: "${text}", with: escaped)
@@ -68,7 +68,7 @@ enum VoiceWakeForwarder {
return template return template
} }
private static func shellEscape(_ text: String) -> String { static func shellEscape(_ text: String) -> String {
// Single-quote based shell escaping. // Single-quote based shell escaping.
let replaced = text.replacingOccurrences(of: "'", with: "'\\''") let replaced = text.replacingOccurrences(of: "'", with: "'\\''")
return "'\(replaced)'" return "'\(replaced)'"
@@ -95,7 +95,7 @@ enum VoiceWakeForwarder {
} }
} }
private static func parse(target: String) -> (user: String?, host: String, port: Int)? { static func parse(target: String) -> (user: String?, host: String, port: Int)? {
guard !target.isEmpty else { return nil } guard !target.isEmpty else { return nil }
var remainder = target var remainder = target
var user: String? var user: String?

View File

@@ -0,0 +1,32 @@
import Testing
@testable import Clawdis
@Suite struct VoiceWakeForwarderTests {
@Test func parsesUserHostPort() {
let parsed = VoiceWakeForwarder.parse(target: "user@example.local:2222")
#expect(parsed?.user == "user")
#expect(parsed?.host == "example.local")
#expect(parsed?.port == 2222)
}
@Test func parsesHostOnlyDefaultsPort() {
let parsed = VoiceWakeForwarder.parse(target: "primary.local")
#expect(parsed?.user == nil)
#expect(parsed?.host == "primary.local")
#expect(parsed?.port == defaultVoiceWakeForwardPort)
}
@Test func renderedCommandReplacesPlaceholderAndEscapes() {
let template = "clawdis-mac agent --message \"${text}\""
let command = VoiceWakeForwarder.renderedCommand(template: template, transcript: "hi i'm here")
#expect(command.contains("clawdis-mac agent"))
#expect(command.contains("'hi i'\\''m here'"))
#expect(!command.contains("${text}"))
}
@Test func renderedCommandPassthroughWhenNoPlaceholder() {
let template = "echo noop"
let command = VoiceWakeForwarder.renderedCommand(template: template, transcript: "ignored")
#expect(command == template)
}
}