Files
openclaw/apps/ios/Tests/ChatMessageSpeechClientTests.swift
Peter Steinberger 60ce506712 feat(ios): add Listen action speaking assistant messages via gateway TTS (#100771)
* test(gateway): shift advertised-method window for tts.speak

* feat(ios): add Listen action speaking assistant messages via gateway TTS

* docs(ios): document the chat Listen action

* style(ios): keep outbox label doc comment attached and give speech chip its own

* fix(ios): harden chat Listen playback

* docs(changelog): note iOS chat Listen

* fix(ios): unwrap speech MIME before classification

* docs(changelog): keep Listen note app-scoped
2026-07-06 19:32:54 +01:00

42 lines
1.4 KiB
Swift

import Foundation
import OpenClawChatUI
import OpenClawProtocol
import Testing
@testable import OpenClaw
@Suite("Chat message speech client")
struct ChatMessageSpeechClientTests {
@Test func `requests tts speak and preserves playback metadata`() async throws {
let expectedAudio = Data([1, 2, 3])
var requestedMethod: String?
var requestedParams: TtsSpeakParams?
var requestedTimeout: Int?
let clip = try await ChatMessageSpeechClient.synthesize(text: "Read this") {
method,
paramsJSON,
timeoutSeconds in
requestedMethod = method
requestedTimeout = timeoutSeconds
requestedParams = try JSONDecoder().decode(
TtsSpeakParams.self,
from: Data((paramsJSON ?? "").utf8))
return try JSONEncoder().encode(TtsSpeakResult(
audiobase64: expectedAudio.base64EncodedString(),
provider: "openai",
outputformat: "mp3",
mimetype: "audio/mpeg",
fileextension: ".mp3"))
}
#expect(requestedMethod == "tts.speak")
#expect(requestedParams?.text == "Read this")
#expect(requestedTimeout == 60)
#expect(clip == OpenClawChatSpeechClip(
data: expectedAudio,
outputFormat: "mp3",
mimeType: "audio/mpeg",
fileExtension: ".mp3"))
}
}