File size: 2,871 Bytes
4fc4790
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import OpenClawProtocol
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)
    }
}