VoiceWake: add SSH forwarder tests
This commit is contained in:
@@ -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"),
|
||||||
]
|
]),
|
||||||
),
|
])
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user