86 lines
3.6 KiB
Swift
86 lines
3.6 KiB
Swift
import Testing
|
|
@testable import Clawdis
|
|
|
|
@Suite(.serialized) 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)
|
|
}
|
|
|
|
@Test func commandPrefersCliInstallPaths() {
|
|
let command = VoiceWakeForwarder.commandWithCliPath("clawdis-mac status", target: "user@host")
|
|
#expect(command.contains("PATH=\(cliHelperSearchPaths.joined(separator: ":"))"))
|
|
#expect(command.contains("for c in clawdis-mac /usr/local/bin/clawdis-mac /opt/homebrew/bin/clawdis-mac"))
|
|
#expect(command.contains("\"$CLI\" status"))
|
|
}
|
|
|
|
@Test func commandUsesCachedCliForSameTarget() {
|
|
VoiceWakeForwarder.clearCliCache(); defer { VoiceWakeForwarder.clearCliCache() }
|
|
VoiceWakeForwarder._testSetCliCache(target: "t1", path: "/tmp/custom-cli")
|
|
|
|
let command = VoiceWakeForwarder.commandWithCliPath("clawdis-mac status", target: "t1")
|
|
|
|
#expect(command.contains("CLI=\"/tmp/custom-cli\""))
|
|
}
|
|
|
|
@Test func commandIgnoresCacheForDifferentTarget() {
|
|
VoiceWakeForwarder.clearCliCache(); defer { VoiceWakeForwarder.clearCliCache() }
|
|
VoiceWakeForwarder._testSetCliCache(target: "t1", path: "/tmp/custom-cli")
|
|
|
|
let command = VoiceWakeForwarder.commandWithCliPath("clawdis-mac status", target: "t2")
|
|
|
|
#expect(!command.contains("/tmp/custom-cli"))
|
|
}
|
|
|
|
@Test func clearCliCacheRemovesCachedCli() {
|
|
VoiceWakeForwarder._testSetCliCache(target: "t1", path: "/tmp/custom-cli")
|
|
VoiceWakeForwarder.clearCliCache(); defer { VoiceWakeForwarder.clearCliCache() }
|
|
|
|
let command = VoiceWakeForwarder.commandWithCliPath("clawdis-mac status", target: "t1")
|
|
|
|
#expect(!command.contains("/tmp/custom-cli"))
|
|
}
|
|
|
|
@Test func shellEscapeHandlesQuotesAndParens() {
|
|
let text = "Debug test works (and a funny pun)"
|
|
let escaped = VoiceWakeForwarder.shellEscape(text)
|
|
#expect(escaped == "'Debug test works (and a funny pun)'")
|
|
|
|
let textWithQuote = "Debug test works (and a funny pun)'"
|
|
let escapedQuote = VoiceWakeForwarder.shellEscape(textWithQuote)
|
|
#expect(escapedQuote == "'Debug test works (and a funny pun)'\\'''")
|
|
}
|
|
|
|
@Test func prefixedTranscriptUsesMachineName() {
|
|
let transcript = "hello world"
|
|
let prefixed = VoiceWakeForwarder.prefixedTranscript(transcript, machineName: "My-Mac")
|
|
|
|
#expect(prefixed.starts(with: "User talked via voice recognition on"))
|
|
#expect(prefixed.contains("My-Mac"))
|
|
#expect(prefixed.hasSuffix("\n\nhello world"))
|
|
}
|
|
}
|