package agentapi import "testing" func ip(v int) *int { return &v } // Verdict table (Part 2). Red-proof: change the PercentageUsed boundary from `>= 90` to `> 90` in // DiskVerdictFor → the "NVMe percentage_used exactly 90 → Figyelmeztetés" case fails. func TestDiskVerdictFor(t *testing.T) { cases := []struct { name string in *SmartSummary want DiskVerdict }{ {"nil → unknown", nil, DiskVerdictUnknown}, {"empty health → unknown", &SmartSummary{Health: ""}, DiskVerdictUnknown}, {"UNKNOWN → unknown", &SmartSummary{Health: SmartUnknown}, DiskVerdictUnknown}, {"FAILING → fail", &SmartSummary{Health: SmartFailing}, DiskVerdictFail}, {"FAILING beats counters", &SmartSummary{Health: SmartFailing, ReallocatedSectors: ip(0)}, DiskVerdictFail}, {"PASSED clean → ok", &SmartSummary{Health: SmartPassed, ReallocatedSectors: ip(0), PendingSectors: ip(0), TemperatureC: ip(30)}, DiskVerdictOK}, {"PASSED nil counters → ok", &SmartSummary{Health: SmartPassed}, DiskVerdictOK}, {"reallocated>0 → warn", &SmartSummary{Health: SmartPassed, ReallocatedSectors: ip(1)}, DiskVerdictWarn}, {"pending>0 → warn", &SmartSummary{Health: SmartPassed, PendingSectors: ip(5)}, DiskVerdictWarn}, {"offline_unc>0 → warn", &SmartSummary{Health: SmartPassed, OfflineUncorrectable: ip(2)}, DiskVerdictWarn}, {"critical_warning>0 → warn", &SmartSummary{Health: SmartPassed, CriticalWarning: ip(1)}, DiskVerdictWarn}, {"media_errors>0 → warn", &SmartSummary{Health: SmartPassed, MediaErrors: ip(3)}, DiskVerdictWarn}, {"percentage_used 89 → ok", &SmartSummary{Health: SmartPassed, PercentageUsed: ip(89)}, DiskVerdictOK}, {"percentage_used exactly 90 → warn", &SmartSummary{Health: SmartPassed, PercentageUsed: ip(90)}, DiskVerdictWarn}, {"percentage_used 95 → warn", &SmartSummary{Health: SmartPassed, PercentageUsed: ip(95)}, DiskVerdictWarn}, } for _, c := range cases { if got := DiskVerdictFor(c.in); got != c.want { t.Errorf("%s: DiskVerdictFor = %d, want %d", c.name, got, c.want) } } } func TestDiskVerdict_Label(t *testing.T) { want := map[DiskVerdict]string{ DiskVerdictUnknown: "Nincs adat", DiskVerdictOK: "Rendben", DiskVerdictWarn: "Figyelmeztetés", DiskVerdictFail: "Hiba", } for v, w := range want { if got := v.Label(); got != w { t.Errorf("verdict %d Label = %q, want %q", v, got, w) } } } // A warn lists every triggering attribute at once (Scenario "multiple attributes degrade" → ONE event). func TestDegradedAttributes_ListsAll(t *testing.T) { s := &SmartSummary{Health: SmartPassed, PendingSectors: ip(5), ReallocatedSectors: ip(2), PercentageUsed: ip(91)} got := DegradedAttributes(s) if len(got) != 3 { t.Fatalf("want 3 attributes, got %d: %v", len(got), got) } // clean disk → none if a := DegradedAttributes(&SmartSummary{Health: SmartPassed}); len(a) != 0 { t.Errorf("clean disk should list no attributes, got %v", a) } }