]> git.giacomolli.uk - onehouse/blob - protocol/hub_status_payload_test.go
Define independent M31 module address ranges
[onehouse] / protocol / hub_status_payload_test.go
1 package protocol
2
3 import (
4 "testing"
5 "time"
6
7 "github.com/stretchr/testify/require"
8 )
9
10 func TestHubSnapshotPreservesDiagnosticsAndExpiry(t *testing.T) {
11 now := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)
12 lifetime, err := HubStatusLifetime(time.Minute)
13 require.NoError(t, err)
14 require.Equal(t, 170*time.Second, lifetime)
15
16 deadline := now.Add(lifetime)
17 count := 3
18 temperature := 24.5
19 payload := HubStatusPayload{
20 ID: deviceID,
21 Address: "example.com",
22 Alias: "hub",
23 Status: "ready",
24 EventStream: true,
25 UpdatedAt: &now,
26 ConfiguredDevices: 3,
27 PairedDevices: &count,
28
29 Pairing: &HubPairing{
30 Status: "accepted",
31 DurationSeconds: 60,
32 RequestedAt: now,
33 Deadline: now.Add(time.Minute),
34 },
35
36 Diagnostics: &HubDiagnostics{
37 ObservedAt: now,
38 Stale: true,
39 TemperatureCelsius: &temperature,
40 },
41 }
42 publication, err := BuildHubStatus(deviceID, Metadata{
43 MessageID: messageID,
44 ExpiresAt: &deadline,
45 }, payload)
46 require.NoError(t, err)
47
48 parsed, err := ParseHubStatus(publication.Topic, publication.Data, false)
49 require.NoError(t, err)
50 require.Equal(t, payload, parsed.Payload)
51 require.Equal(t, &deadline, publication.ExpiresAt)
52
53 payload.Status = "unavailable"
54 _, err = BuildHubStatus(deviceID, Metadata{
55 MessageID: messageID,
56 ExpiresAt: &deadline,
57 }, payload)
58 require.NoError(t, err)
59
60 nonUTC := now.In(time.FixedZone("test", 3600))
61 payload.UpdatedAt = &nonUTC
62 _, err = BuildHubStatus(deviceID, Metadata{
63 MessageID: messageID,
64 ExpiresAt: &deadline,
65 }, payload)
66 require.Error(t, err)
67
68 for _, interval := range []time.Duration{0, -1, 1<<63 - 1} {
69 _, err = HubStatusLifetime(interval)
70 require.Error(t, err)
71 }
72 }