99 lines
2.8 KiB
Swift
99 lines
2.8 KiB
Swift
import ClawdbotProtocol
|
|
import Foundation
|
|
import Testing
|
|
|
|
@Suite struct GatewayFrameDecodeTests {
|
|
@Test func decodesEventFrameWithAnyCodablePayload() throws {
|
|
let json = """
|
|
{
|
|
"type": "event",
|
|
"event": "presence",
|
|
"payload": { "foo": "bar", "count": 1 },
|
|
"seq": 7
|
|
}
|
|
"""
|
|
|
|
let frame = try JSONDecoder().decode(GatewayFrame.self, from: Data(json.utf8))
|
|
|
|
#expect({
|
|
if case .event = frame { true } else { false }
|
|
}(), "expected .event frame")
|
|
|
|
guard case let .event(evt) = frame else {
|
|
return
|
|
}
|
|
|
|
let payload = evt.payload?.value as? [String: AnyCodable]
|
|
#expect(payload?["foo"]?.value as? String == "bar")
|
|
#expect(payload?["count"]?.value as? Int == 1)
|
|
#expect(evt.seq == 7)
|
|
}
|
|
|
|
@Test func decodesRequestFrameWithNestedParams() throws {
|
|
let json = """
|
|
{
|
|
"type": "req",
|
|
"id": "1",
|
|
"method": "agent.send",
|
|
"params": {
|
|
"text": "hi",
|
|
"items": [1, null, {"ok": true}],
|
|
"meta": { "count": 2 }
|
|
}
|
|
}
|
|
"""
|
|
|
|
let frame = try JSONDecoder().decode(GatewayFrame.self, from: Data(json.utf8))
|
|
|
|
#expect({
|
|
if case .req = frame { true } else { false }
|
|
}(), "expected .req frame")
|
|
|
|
guard case let .req(req) = frame else {
|
|
return
|
|
}
|
|
|
|
let params = req.params?.value as? [String: AnyCodable]
|
|
#expect(params?["text"]?.value as? String == "hi")
|
|
|
|
let items = params?["items"]?.value as? [AnyCodable]
|
|
#expect(items?.count == 3)
|
|
#expect(items?[0].value as? Int == 1)
|
|
#expect(items?[1].value is NSNull)
|
|
|
|
let item2 = items?[2].value as? [String: AnyCodable]
|
|
#expect(item2?["ok"]?.value as? Bool == true)
|
|
|
|
let meta = params?["meta"]?.value as? [String: AnyCodable]
|
|
#expect(meta?["count"]?.value as? Int == 2)
|
|
}
|
|
|
|
@Test func decodesUnknownFrameAndPreservesRaw() throws {
|
|
let json = """
|
|
{
|
|
"type": "made-up",
|
|
"foo": "bar",
|
|
"count": 1,
|
|
"nested": { "ok": true }
|
|
}
|
|
"""
|
|
|
|
let frame = try JSONDecoder().decode(GatewayFrame.self, from: Data(json.utf8))
|
|
|
|
#expect({
|
|
if case .unknown = frame { true } else { false }
|
|
}(), "expected .unknown frame")
|
|
|
|
guard case let .unknown(type, raw) = frame else {
|
|
return
|
|
}
|
|
|
|
#expect(type == "made-up")
|
|
#expect(raw["type"]?.value as? String == "made-up")
|
|
#expect(raw["foo"]?.value as? String == "bar")
|
|
#expect(raw["count"]?.value as? Int == 1)
|
|
let nested = raw["nested"]?.value as? [String: AnyCodable]
|
|
#expect(nested?["ok"]?.value as? Bool == true)
|
|
}
|
|
}
|