package unraid import ( "context" "net/http" "net/http/httptest" "testing" "time" ) func TestArrayAndDiskSourcesMapDocumentedStorageFields(t *testing.T) { server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte(`{"data":{"array":{"state":"STARTED","parities":[{"id":"parity-1","name":"parity","type":"PARITY","size":"100","status":"DISK_OK"}],"disks":[{"id":"disk-1","name":"disk1","type":"DATA","size":"100","status":"DISK_OK","fsSize":"90","fsUsed":"45","fsFree":"45","fsType":"xfs","temp":31,"isSpinning":true}],"caches":[{"id":"cache-1","name":"cache","type":"CACHE","size":"50","status":"DISK_OK","fsSize":"50","fsUsed":"5","fsFree":"45","fsType":"btrfs","temp":29,"isSpinning":false}]}}}`)) })) defer server.Close() client, err := New(server.URL, "test-token", server.Client()) if err != nil { t.Fatal(err) } now := time.Date(2026, 8, 10, 4, 0, 0, 0, time.UTC) arraySnapshot, err := (ArraySource{Client: client, Now: func() time.Time { return now }}).Snapshot(context.Background()) if err != nil { t.Fatal(err) } if arraySnapshot.State != "operational" || len(arraySnapshot.Members) != 2 || arraySnapshot.Members[0].CapacityBytes != 100*1024 || arraySnapshot.Members[0].State != "online" { t.Fatalf("array snapshot = %+v", arraySnapshot) } diskSnapshot, err := (DiskSource{Client: client, Now: func() time.Time { return now }}).Snapshot(context.Background()) if err != nil { t.Fatal(err) } if len(diskSnapshot.Disks) != 3 { t.Fatalf("disks = %+v", diskSnapshot.Disks) } var found bool for _, item := range diskSnapshot.Disks { if item.ID == "disk-1" { found = item.SizeBytes == 90*1024 && item.UsedBytes == 45*1024 && item.Temperature != nil && item.Spin != nil } } if !found { t.Fatalf("data disk lost usage, temperature, or spin state: %+v", diskSnapshot.Disks) } } func TestArraySourceRejectsOversizedOrInvalidPayload(t *testing.T) { server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte(`{"data":{"array":{"state":"STARTED","disks":[{"id":"disk-1","name":"disk1","type":"DATA","size":"not-a-number","status":"DISK_OK"}]}}}`)) })) defer server.Close() client, err := New(server.URL, "test-token", server.Client()) if err != nil { t.Fatal(err) } if _, err := (ArraySource{Client: client}).Snapshot(context.Background()); err == nil { t.Fatal("invalid capacity must not produce a partial snapshot") } }