package protocol import ( "testing" "time" "github.com/stretchr/testify/require" ) func TestHubSnapshotPreservesDiagnosticsAndExpiry(t *testing.T) { now := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC) lifetime, err := HubStatusLifetime(time.Minute) require.NoError(t, err) require.Equal(t, 170*time.Second, lifetime) deadline := now.Add(lifetime) count := 3 temperature := 24.5 payload := HubStatusPayload{ ID: deviceID, Address: "example.com", Alias: "hub", Status: "ready", EventStream: true, UpdatedAt: &now, ConfiguredDevices: 3, PairedDevices: &count, Pairing: &HubPairing{ Status: "accepted", DurationSeconds: 60, RequestedAt: now, Deadline: now.Add(time.Minute), }, Diagnostics: &HubDiagnostics{ ObservedAt: now, Stale: true, TemperatureCelsius: &temperature, }, } publication, err := BuildHubStatus(deviceID, Metadata{ MessageID: messageID, ExpiresAt: &deadline, }, payload) require.NoError(t, err) parsed, err := ParseHubStatus(publication.Topic, publication.Data, false) require.NoError(t, err) require.Equal(t, payload, parsed.Payload) require.Equal(t, &deadline, publication.ExpiresAt) payload.Status = "unavailable" _, err = BuildHubStatus(deviceID, Metadata{ MessageID: messageID, ExpiresAt: &deadline, }, payload) require.NoError(t, err) nonUTC := now.In(time.FixedZone("test", 3600)) payload.UpdatedAt = &nonUTC _, err = BuildHubStatus(deviceID, Metadata{ MessageID: messageID, ExpiresAt: &deadline, }, payload) require.Error(t, err) for _, interval := range []time.Duration{0, -1, 1<<63 - 1} { _, err = HubStatusLifetime(interval) require.Error(t, err) } }