Подія відповідності несла шкалу critical/high/medium, а поріг тригера
порівнювався шкалою алертів, де SeverityRank("critical") = 0. Тригер із
порогом «warning» пропускав середнє й відкидав найважче — тихо.
Подія тепер народжується в шкалі алертів; умова тригера приймає обидві.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
53 lines
2.5 KiB
Go
53 lines
2.5 KiB
Go
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)
|
||
}
|
||
}
|
||
}
|