test: Add dispatchAlert tests (55.6%→77.8%)
Add TestDispatchAlert with 8 test cases covering: - Returns false when onAlert callback is nil - Returns false when alert is nil - Returns false when activation state is pending - Returns false when activation state is snoozed - Returns false for monitor-only alerts - Dispatches synchronously when async is false - Dispatches asynchronously when async is true - Clones alert before dispatch Alerts package coverage: 83.4%→83.5%
This commit is contained in:
parent
b3bf63d3c7
commit
47d0fb5a44
1 changed files with 225 additions and 0 deletions
|
|
@ -14051,3 +14051,228 @@ func TestCheckStorageComprehensive(t *testing.T) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDispatchAlert(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
t.Run("returns false when onAlert is nil", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
m := newTestManager(t)
|
||||||
|
|
||||||
|
alert := &Alert{
|
||||||
|
ID: "test-alert",
|
||||||
|
Type: "cpu",
|
||||||
|
}
|
||||||
|
|
||||||
|
result := m.dispatchAlert(alert, false)
|
||||||
|
|
||||||
|
if result {
|
||||||
|
t.Error("expected false when onAlert callback is nil")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("returns false when alert is nil", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
m := newTestManager(t)
|
||||||
|
|
||||||
|
called := false
|
||||||
|
m.SetAlertCallback(func(a *Alert) {
|
||||||
|
called = true
|
||||||
|
})
|
||||||
|
|
||||||
|
result := m.dispatchAlert(nil, false)
|
||||||
|
|
||||||
|
if result {
|
||||||
|
t.Error("expected false when alert is nil")
|
||||||
|
}
|
||||||
|
if called {
|
||||||
|
t.Error("callback should not be called for nil alert")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("returns false when activation state is pending", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
m := newTestManager(t)
|
||||||
|
|
||||||
|
called := false
|
||||||
|
m.SetAlertCallback(func(a *Alert) {
|
||||||
|
called = true
|
||||||
|
})
|
||||||
|
|
||||||
|
m.mu.Lock()
|
||||||
|
m.config.ActivationState = ActivationPending
|
||||||
|
m.mu.Unlock()
|
||||||
|
|
||||||
|
alert := &Alert{
|
||||||
|
ID: "test-alert",
|
||||||
|
Type: "cpu",
|
||||||
|
}
|
||||||
|
|
||||||
|
result := m.dispatchAlert(alert, false)
|
||||||
|
|
||||||
|
if result {
|
||||||
|
t.Error("expected false when activation is pending")
|
||||||
|
}
|
||||||
|
if called {
|
||||||
|
t.Error("callback should not be called when pending")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("returns false when activation state is snoozed", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
m := newTestManager(t)
|
||||||
|
|
||||||
|
called := false
|
||||||
|
m.SetAlertCallback(func(a *Alert) {
|
||||||
|
called = true
|
||||||
|
})
|
||||||
|
|
||||||
|
m.mu.Lock()
|
||||||
|
m.config.ActivationState = ActivationSnoozed
|
||||||
|
m.mu.Unlock()
|
||||||
|
|
||||||
|
alert := &Alert{
|
||||||
|
ID: "test-alert",
|
||||||
|
Type: "cpu",
|
||||||
|
}
|
||||||
|
|
||||||
|
result := m.dispatchAlert(alert, false)
|
||||||
|
|
||||||
|
if result {
|
||||||
|
t.Error("expected false when activation is snoozed")
|
||||||
|
}
|
||||||
|
if called {
|
||||||
|
t.Error("callback should not be called when snoozed")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("returns false for monitor-only alert", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
m := newTestManager(t)
|
||||||
|
|
||||||
|
called := false
|
||||||
|
m.SetAlertCallback(func(a *Alert) {
|
||||||
|
called = true
|
||||||
|
})
|
||||||
|
|
||||||
|
m.mu.Lock()
|
||||||
|
m.config.ActivationState = ActivationActive
|
||||||
|
m.mu.Unlock()
|
||||||
|
|
||||||
|
alert := &Alert{
|
||||||
|
ID: "test-alert",
|
||||||
|
Type: "cpu",
|
||||||
|
Metadata: map[string]interface{}{"monitorOnly": true},
|
||||||
|
}
|
||||||
|
|
||||||
|
result := m.dispatchAlert(alert, false)
|
||||||
|
|
||||||
|
if result {
|
||||||
|
t.Error("expected false for monitor-only alert")
|
||||||
|
}
|
||||||
|
if called {
|
||||||
|
t.Error("callback should not be called for monitor-only alert")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("dispatches synchronously when async is false", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
m := newTestManager(t)
|
||||||
|
|
||||||
|
var receivedAlert *Alert
|
||||||
|
m.SetAlertCallback(func(a *Alert) {
|
||||||
|
receivedAlert = a
|
||||||
|
})
|
||||||
|
|
||||||
|
m.mu.Lock()
|
||||||
|
m.config.ActivationState = ActivationActive
|
||||||
|
m.mu.Unlock()
|
||||||
|
|
||||||
|
alert := &Alert{
|
||||||
|
ID: "test-alert",
|
||||||
|
Type: "cpu",
|
||||||
|
ResourceName: "testvm",
|
||||||
|
}
|
||||||
|
|
||||||
|
result := m.dispatchAlert(alert, false)
|
||||||
|
|
||||||
|
if !result {
|
||||||
|
t.Error("expected true for successful dispatch")
|
||||||
|
}
|
||||||
|
if receivedAlert == nil {
|
||||||
|
t.Fatal("callback should have been called")
|
||||||
|
}
|
||||||
|
if receivedAlert.ID != alert.ID {
|
||||||
|
t.Error("alert ID should match")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("dispatches asynchronously when async is true", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
m := newTestManager(t)
|
||||||
|
|
||||||
|
var receivedAlert *Alert
|
||||||
|
done := make(chan struct{})
|
||||||
|
m.SetAlertCallback(func(a *Alert) {
|
||||||
|
receivedAlert = a
|
||||||
|
close(done)
|
||||||
|
})
|
||||||
|
|
||||||
|
m.mu.Lock()
|
||||||
|
m.config.ActivationState = ActivationActive
|
||||||
|
m.mu.Unlock()
|
||||||
|
|
||||||
|
alert := &Alert{
|
||||||
|
ID: "test-alert",
|
||||||
|
Type: "cpu",
|
||||||
|
ResourceName: "testvm",
|
||||||
|
}
|
||||||
|
|
||||||
|
result := m.dispatchAlert(alert, true)
|
||||||
|
|
||||||
|
if !result {
|
||||||
|
t.Error("expected true for successful dispatch")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for async callback
|
||||||
|
select {
|
||||||
|
case <-done:
|
||||||
|
// Success
|
||||||
|
case <-time.After(time.Second):
|
||||||
|
t.Fatal("async callback not called within timeout")
|
||||||
|
}
|
||||||
|
|
||||||
|
if receivedAlert == nil {
|
||||||
|
t.Fatal("callback should have been called")
|
||||||
|
}
|
||||||
|
if receivedAlert.ID != alert.ID {
|
||||||
|
t.Error("alert ID should match")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("clones alert before dispatch", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
m := newTestManager(t)
|
||||||
|
|
||||||
|
var receivedAlert *Alert
|
||||||
|
m.SetAlertCallback(func(a *Alert) {
|
||||||
|
receivedAlert = a
|
||||||
|
})
|
||||||
|
|
||||||
|
m.mu.Lock()
|
||||||
|
m.config.ActivationState = ActivationActive
|
||||||
|
m.mu.Unlock()
|
||||||
|
|
||||||
|
alert := &Alert{
|
||||||
|
ID: "test-alert",
|
||||||
|
Type: "cpu",
|
||||||
|
ResourceName: "testvm",
|
||||||
|
}
|
||||||
|
|
||||||
|
m.dispatchAlert(alert, false)
|
||||||
|
|
||||||
|
if receivedAlert == alert {
|
||||||
|
t.Error("alert should be cloned, not passed directly")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue