From 141d2b56267c0c5356e11de357facd58918bbe7c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 7 Dec 2025 01:55:30 +0100 Subject: [PATCH] VoiceWake: add SSH forwarder tests --- apps/macos/Package.swift | 17 ++++------ .../Sources/Clawdis/VoiceWakeForwarder.swift | 6 ++-- .../VoiceWakeForwarderTests.swift | 32 +++++++++++++++++++ 3 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 apps/macos/Tests/ClawdisIPCTests/VoiceWakeForwarderTests.swift diff --git a/apps/macos/Package.swift b/apps/macos/Package.swift index 2fda3cbf0..ebea2f45f 100644 --- a/apps/macos/Package.swift +++ b/apps/macos/Package.swift @@ -24,8 +24,7 @@ let package = Package( dependencies: [], swiftSettings: [ .enableUpcomingFeature("StrictConcurrency"), - ] - ), + ]), .executableTarget( name: "Clawdis", dependencies: [ @@ -40,8 +39,7 @@ let package = Package( ], swiftSettings: [ .enableUpcomingFeature("StrictConcurrency"), - ] - ), + ]), .executableTarget( name: "ClawdisCLI", dependencies: [ @@ -50,15 +48,12 @@ let package = Package( ], swiftSettings: [ .enableUpcomingFeature("StrictConcurrency"), - ] - ), + ]), .testTarget( name: "ClawdisIPCTests", - dependencies: ["ClawdisIPC"], + dependencies: ["ClawdisIPC", "Clawdis"], swiftSettings: [ .enableUpcomingFeature("StrictConcurrency"), .enableExperimentalFeature("SwiftTesting"), - ] - ), - ] -) + ]), + ]) diff --git a/apps/macos/Sources/Clawdis/VoiceWakeForwarder.swift b/apps/macos/Sources/Clawdis/VoiceWakeForwarder.swift index 3826c6d1f..1e9119c62 100644 --- a/apps/macos/Sources/Clawdis/VoiceWakeForwarder.swift +++ b/apps/macos/Sources/Clawdis/VoiceWakeForwarder.swift @@ -60,7 +60,7 @@ enum VoiceWakeForwarder { 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) if template.contains("${text}") { return template.replacingOccurrences(of: "${text}", with: escaped) @@ -68,7 +68,7 @@ enum VoiceWakeForwarder { return template } - private static func shellEscape(_ text: String) -> String { + static func shellEscape(_ text: String) -> String { // Single-quote based shell escaping. let replaced = text.replacingOccurrences(of: "'", with: "'\\''") 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 } var remainder = target var user: String? diff --git a/apps/macos/Tests/ClawdisIPCTests/VoiceWakeForwarderTests.swift b/apps/macos/Tests/ClawdisIPCTests/VoiceWakeForwarderTests.swift new file mode 100644 index 000000000..c343dbaaa --- /dev/null +++ b/apps/macos/Tests/ClawdisIPCTests/VoiceWakeForwarderTests.swift @@ -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) + } +}