package hub import ( "encoding/json" "strings" "testing" ) func TestHostReport_FieldNamesAndEmptyCollections(t *testing.T) { r := &HostReport{ HostID: "demo-host-01", ReportedAt: "2026-06-08T12:00:00Z", AgentVersion: "0.3.0", Host: HostMetrics{ Node: "demo-felhom", CPUPercent: 3.2, MemoryTotalBytes: 16777216000, MemoryUsedBytes: 4194304000, MemoryPercent: 25.0, DiskTotalBytes: 152000000000, DiskUsedBytes: 30000000000, DiskPercent: 19.7, LoadAvg: []string{"0.10", "0.20", "0.15"}, UptimeSeconds: 86400, }, Guests: []Guest{{ VMID: 100, Name: "felhom-cust-acme", Status: "running", ControllerVersion: "", Spec: &GuestSpec{Cores: 2, MemoryBytes: 2147483648, DiskBytes: 21474836480}, }}, StorageTargets: []StorageTarget{}, Backups: []Backup{}, RestoreTests: []RestoreTest{}, PBSSnapshots: []PBSSnapshot{}, AuditTail: []AuditEntry{}, Cloudflared: Cloudflared{Status: "active"}, } b, err := json.Marshal(r) if err != nil { t.Fatal(err) } got := string(b) for _, field := range []string{ `"host_id":"demo-host-01"`, `"reported_at":`, `"agent_version":"0.3.0"`, `"cpu_percent":3.2`, `"memory_total_bytes":16777216000`, `"loadavg":["0.10","0.20","0.15"]`, `"disk_percent":19.7`, `"uptime_seconds":86400`, `"vmid":100`, `"controller_version":""`, `"memory_bytes":2147483648`, `"cloudflared":{"status":"active"}`, // empty collections must be [] not null `"storage_targets":[]`, `"backups":[]`, `"restore_tests":[]`, `"pbs_snapshots":[]`, `"audit_tail":[]`, } { if !strings.Contains(got, field) { t.Errorf("report JSON missing %s\n got: %s", field, got) } } if strings.Contains(got, "null") { t.Errorf("report JSON must not contain null (empty collections should be []): %s", got) } } func TestGuest_SpecOmittedWhenUnknown(t *testing.T) { b, _ := json.Marshal(Guest{VMID: 9, Name: "g", Status: "unknown"}) if strings.Contains(string(b), "spec") { t.Errorf("unknown guest should omit spec, got %s", b) } }