gomcp/internal/domain/alert/alert_test.go
DmitrL-dev 694e32be26 refactor: rename identity to syntrex, add root orchestration and CI/CD
- Rename Go module: sentinel-community/gomcp -> syntrex/gomcp (50+ files)
- Rename npm package: sentinel-dashboard -> syntrex-dashboard
- Update Cargo.toml repository URL to syntrex/syntrex
- Update all doc references from DmitrL-dev/AISecurity to syntrex
- Add root Makefile (build-all, test-all, lint-all, clean-all)
- Add MIT LICENSE
- Add .editorconfig (Go/Rust/TS/C cross-language)
- Add .github/workflows/ci.yml (Go + Rust + Dashboard)
- Add dashboard next.config.ts and .env.example
- Clean ARCHITECTURE.md: remove brain/immune/strike/micro-swarm, fix 61->67 engines
2026-03-11 15:30:49 +10:00

93 lines
2.8 KiB
Go

package alert_test
import (
"testing"
"time"
"github.com/syntrex/gomcp/internal/domain/alert"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestAlert_New(t *testing.T) {
a := alert.New(alert.SourceEntropy, alert.SeverityWarning, "entropy spike", 5)
assert.Contains(t, a.ID, "alert-")
assert.Equal(t, alert.SourceEntropy, a.Source)
assert.Equal(t, alert.SeverityWarning, a.Severity)
assert.Equal(t, "entropy spike", a.Message)
assert.Equal(t, 5, a.Cycle)
assert.False(t, a.Resolved)
assert.WithinDuration(t, time.Now(), a.Timestamp, time.Second)
}
func TestAlert_WithValue(t *testing.T) {
a := alert.New(alert.SourceEntropy, alert.SeverityCritical, "high", 1).WithValue(0.95)
assert.Equal(t, 0.95, a.Value)
}
func TestSeverity_String(t *testing.T) {
assert.Equal(t, "INFO", alert.SeverityInfo.String())
assert.Equal(t, "WARNING", alert.SeverityWarning.String())
assert.Equal(t, "CRITICAL", alert.SeverityCritical.String())
}
func TestSeverity_Icon(t *testing.T) {
assert.Equal(t, "🟢", alert.SeverityInfo.Icon())
assert.Equal(t, "⚠️", alert.SeverityWarning.Icon())
assert.Equal(t, "🔴", alert.SeverityCritical.Icon())
}
func TestBus_EmitAndRecent(t *testing.T) {
bus := alert.NewBus(10)
bus.Emit(alert.New(alert.SourceSystem, alert.SeverityInfo, "msg1", 1))
bus.Emit(alert.New(alert.SourceSystem, alert.SeverityWarning, "msg2", 2))
bus.Emit(alert.New(alert.SourceSystem, alert.SeverityCritical, "msg3", 3))
recent := bus.Recent(2)
require.Len(t, recent, 2)
assert.Equal(t, "msg3", recent[0].Message, "newest first")
assert.Equal(t, "msg2", recent[1].Message)
}
func TestBus_RecentOverflow(t *testing.T) {
bus := alert.NewBus(3)
for i := 0; i < 5; i++ {
bus.Emit(alert.New(alert.SourceSystem, alert.SeverityInfo, "m", i))
}
assert.Equal(t, 3, bus.Count(), "count capped at capacity")
recent := bus.Recent(10) // request more than capacity
assert.Len(t, recent, 3, "returns at most capacity")
}
func TestBus_Subscribe(t *testing.T) {
bus := alert.NewBus(10)
ch := bus.Subscribe(5)
bus.Emit(alert.New(alert.SourceGenome, alert.SeverityCritical, "genome drift", 1))
select {
case a := <-ch:
assert.Equal(t, "genome drift", a.Message)
case <-time.After(time.Second):
t.Fatal("subscriber did not receive alert")
}
}
func TestBus_MaxSeverity(t *testing.T) {
bus := alert.NewBus(10)
bus.Emit(alert.New(alert.SourceSystem, alert.SeverityInfo, "ok", 1))
bus.Emit(alert.New(alert.SourceEntropy, alert.SeverityWarning, "spike", 2))
bus.Emit(alert.New(alert.SourceSystem, alert.SeverityInfo, "ok2", 3))
assert.Equal(t, alert.SeverityWarning, bus.MaxSeverity(5))
}
func TestBus_Empty(t *testing.T) {
bus := alert.NewBus(10)
assert.Empty(t, bus.Recent(5))
assert.Equal(t, 0, bus.Count())
assert.Equal(t, alert.SeverityInfo, bus.MaxSeverity(5))
}