Netpulse_SasS/server/internal/store/alerts_events_severity_test.go
byrsapty 3b9217de3c
All checks were successful
CI / hygiene (push) Successful in 9s
CI / web (push) Successful in 1m5s
CI / server (push) Successful in 2m17s
CI / agent (push) Successful in 2m53s
Дві шкали серйозності: тригер відповідності фільтрував навпаки
Подія відповідності несла шкалу critical/high/medium, а поріг тригера
порівнювався шкалою алертів, де SeverityRank("critical") = 0. Тригер із
порогом «warning» пропускав середнє й відкидав найважче — тихо.

Подія тепер народжується в шкалі алертів; умова тригера приймає обидві.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 14:10:49 +03:00

53 lines
2.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package store
import "testing"
// Дві шкали в одному продукті — і поріг тригера порівнював їх однією
// лінійкою. Тест тримає саме той бік, який ламався: НАЙВАЖЧЕ порушення
// відповідності не має відкидатись порогом, який пропускає легші.
//
// До виправлення SeverityRank("critical") давав нуль, тож правило з
// порогом «warning» пропускало high і мовчки викидало critical — тобто
// фільтр працював навпаки, і саме на тих шести знахідках, через які
// механізм і вмикають.
func TestComplianceSeverityDoesNotInvertThreshold(t *testing.T) {
pass := func(ev, min string) bool {
return SeverityRank(NormalizeEventSeverity(ev)) >=
SeverityRank(NormalizeEventSeverity(min))
}
for _, c := range []struct {
ev, min string
want bool
why string
}{
{"critical", "warning", true, "найважче не може не пройти найлегший поріг"},
{"critical", "high", true, "критичне важче за high"},
{"high", "warning", true, ""},
{"medium", "warning", true, "medium — це average, воно вище за warning"},
{"medium", "high", false, "середнє не має будити за порогом high"},
{"critical", "disaster", true, "critical і є disaster"},
{"high", "disaster", false, ""},
// Поріг теж міг бути написаний шкалою відповідності.
{"disaster", "critical", true, ""},
{"average", "medium", true, ""},
} {
if got := pass(c.ev, c.min); got != c.want {
t.Errorf("подія %q проти порогу %q: маємо %v, очікували %v %s",
c.ev, c.min, got, c.want, c.why)
}
}
}
// Порядок має зберігатись: переклад не може переставити місцями те, що
// в початковій шкалі стояло по-різному.
func TestComplianceSeverityKeepsOrder(t *testing.T) {
order := []string{"low", "medium", "high", "critical"}
for i := 1; i < len(order); i++ {
lo := SeverityRank(ComplianceSeverityToAlert(order[i-1]))
hi := SeverityRank(ComplianceSeverityToAlert(order[i]))
if lo >= hi {
t.Fatalf("%s (%d) не нижче за %s (%d)", order[i-1], lo, order[i], hi)
}
}
}