7 "github.com/stretchr/testify/require"
11 deviceID = "01ARZ3NDEKTSV4RRFFQ69G5FAV"
12 messageID = "01ARZ3NDEKTSV4RRFFQ69G5FAW"
13 commandID = "01ARZ3NDEKTSV4RRFFQ69G5FAX"
16 func TestAddressRoundTrip(t *testing.T) {
17 testCases := []struct {
24 name: "routes metadata",
29 name: "routes reachability",
31 suffix: "availability",
34 name: "routes retained values",
37 suffix: "reported/relay.1",
40 name: "routes samples",
43 suffix: "telemetry/power",
46 name: "routes occurrences",
49 suffix: "events/press",
52 name: "routes requests",
55 suffix: "commands/relay",
58 name: "routes ordered requests",
60 suffix: "commands/$batch",
63 name: "routes outcomes",
66 suffix: "results/" + commandID,
69 name: "routes hub diagnostics",
75 for _, tc := range testCases {
76 t.Run(tc.name, func(t *testing.T) {
82 topic, err := address.Topic()
83 require.NoError(t, err)
85 expected := Root + "/devices/" + deviceID + "/" + tc.suffix
86 if tc.kind == HubStatus {
87 expected = Root + "/zigbee/hubs/" + deviceID + "/status"
90 require.Equal(t, expected, topic)
92 parsed, err := ParseTopic(topic)
93 require.NoError(t, err)
94 require.Equal(t, address, parsed)
99 func TestParseTopicRejectsMalformedAddresses(t *testing.T) {
100 testCases := []string{
101 "", "onehouse/v2/devices/" + deviceID + "/descriptor",
102 Root + "/devices/" + strings.ToLower(deviceID) + "/descriptor",
103 Root + "/devices/" + deviceID + "/descriptor/extra",
104 Root + "/devices/" + deviceID + "/reported",
105 Root + "/devices/" + deviceID + "/reported/",
106 Root + "/devices/" + deviceID + "/reported/+",
107 Root + "/devices/" + deviceID + "/events/door--open",
108 Root + "/devices/" + deviceID + "/commands/$other",
109 Root + "/devices/" + deviceID + "/results/not-an-id",
110 Root + "/devices/" + deviceID + "/status",
111 Root + "/zigbee/hubs/" + deviceID + "/status/extra",
112 Root + "/devices/" + deviceID + "/unknown",
115 for _, tc := range testCases {
116 _, err := ParseTopic(tc)
117 require.Error(t, err, tc)
121 func TestSubscriptionsSelectOnlyTheirDirection(t *testing.T) {
122 filters := CoreSubscriptions()
123 require.Len(t, filters, 6)
124 require.Equal(t, Subscription{
125 Filter: Root + "/devices/+/telemetry/+",
129 for index, filter := range filters {
130 require.NotContains(t, filter.Filter, "commands")
133 require.Equal(t, byte(1), filter.QoS)
137 subscription, err := CommandSubscription(deviceID)
138 require.NoError(t, err)
139 require.Equal(t, Root+"/devices/"+deviceID+"/commands/+", subscription.Filter)
140 require.Equal(t, byte(1), subscription.QoS)
142 _, err = CommandSubscription("+")
143 require.Error(t, err)
144 require.Equal(t, Root+"/zigbee/hubs/+/status", HubStatusSubscription().Filter)