


























@@ -6,7 +6,10 @@ import Testing
6677private final class FakeWebSocketTask: WebSocketTasking, @unchecked Sendable {
88var state: URLSessionTask.State = .running
9+var autoRespond = false
910private(set) var sentMessages: [URLSessionWebSocketTask.Message] = []
11+private var sentChallenge = false
12+private var respondedRequestIds = Set<String>()
10131114func resume() {}
1215@@ -19,12 +22,55 @@ private final class FakeWebSocketTask: WebSocketTasking, @unchecked Sendable {
1922}
20232124func receive() async throws -> URLSessionWebSocketTask.Message {
25+if self.autoRespond {
26+if !self.sentChallenge {
27+self.sentChallenge = true
28+return .string("""
29+ {"type":"event","event":"connect.challenge","payload":{"nonce":"test-nonce"}}
30+ """)
31+}
32+if let request = self.latestUnrespondedRequest() {
33+self.respondedRequestIds.insert(request.id)
34+if request.method == "connect" {
35+return .string("""
36+ {"type":"res","id":"\(request.id)","ok":true,"payload":{"type":"hello","protocol":3,"server":{},"features":{},"snapshot":{"presence":[],"health":{},"stateVersion":{"presence":0,"health":0},"uptimeMs":0},"policy":{}}}
37+ """)
38+}
39+return .string("""
40+ {"type":"res","id":"\(request.id)","ok":true,"payload":{}}
41+ """)
42+}
43+}
2244throw URLError(.cannotConnectToHost)
2345}
24462547func receive(completionHandler: @escaping @Sendable (Result<URLSessionWebSocketTask.Message, Error>) -> Void) {
2648completionHandler(.failure(URLError(.cannotConnectToHost)))
2749}
50+51+private func latestUnrespondedRequest() -> (id: String, method: String)? {
52+for message in self.sentMessages.reversed() {
53+let data: Data?
54+switch message {
55+case .string(let text):
56+ data = Data(text.utf8)
57+case .data(let raw):
58+ data = raw
59+@unknown default:
60+ data = nil
61+}
62+guard let data,
63+let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
64+let id = json["id"] as? String,
65+let method = json["method"] as? String,
66+ !self.respondedRequestIds.contains(id)
67+else {
68+continue
69+}
70+return (id, method)
71+}
72+return nil
73+}
2874}
29753076private final class FakeWebSocketSession: WebSocketSessioning, @unchecked Sendable {
@@ -66,6 +112,7 @@ private func makeTestGatewayConnection() -> (GatewayConnection, FakeWebSocketSes
6611267113@Test func `send agent keeps empty voice wake trigger field`() async throws {
68114let (connection, session) = makeTestGatewayConnection()
115+ session.task.autoRespond = true
69116 _ = await connection.sendAgent(GatewayAgentInvocation(
70117 message: "test",
71118 sessionKey: "main",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。