mirror of
https://github.com/TwiN/gatus.git
synced 2024-11-21 23:43:27 +01:00
f2c5f5911c
* feat(alerting): Persist triggered alerts across application restart Fixes #679 * test(alerting): Add numerous tests related to alerts
193 lines
5.8 KiB
Go
193 lines
5.8 KiB
Go
package alert
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
func TestAlert_ValidateAndSetDefaults(t *testing.T) {
|
|
invalidDescription := "\""
|
|
scenarios := []struct {
|
|
name string
|
|
alert Alert
|
|
expectedError error
|
|
expectedSuccessThreshold int
|
|
expectedFailureThreshold int
|
|
}{
|
|
{
|
|
name: "valid-empty",
|
|
alert: Alert{
|
|
Description: nil,
|
|
FailureThreshold: 0,
|
|
SuccessThreshold: 0,
|
|
},
|
|
expectedError: nil,
|
|
expectedFailureThreshold: 3,
|
|
expectedSuccessThreshold: 2,
|
|
},
|
|
{
|
|
name: "invalid-description",
|
|
alert: Alert{
|
|
Description: &invalidDescription,
|
|
FailureThreshold: 10,
|
|
SuccessThreshold: 5,
|
|
},
|
|
expectedError: ErrAlertWithInvalidDescription,
|
|
expectedFailureThreshold: 10,
|
|
expectedSuccessThreshold: 5,
|
|
},
|
|
}
|
|
for _, scenario := range scenarios {
|
|
t.Run(scenario.name, func(t *testing.T) {
|
|
if err := scenario.alert.ValidateAndSetDefaults(); !errors.Is(err, scenario.expectedError) {
|
|
t.Errorf("expected error %v, got %v", scenario.expectedError, err)
|
|
}
|
|
if scenario.alert.SuccessThreshold != scenario.expectedSuccessThreshold {
|
|
t.Errorf("expected success threshold %v, got %v", scenario.expectedSuccessThreshold, scenario.alert.SuccessThreshold)
|
|
}
|
|
if scenario.alert.FailureThreshold != scenario.expectedFailureThreshold {
|
|
t.Errorf("expected failure threshold %v, got %v", scenario.expectedFailureThreshold, scenario.alert.FailureThreshold)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestAlert_IsEnabled(t *testing.T) {
|
|
if !(&Alert{Enabled: nil}).IsEnabled() {
|
|
t.Error("alert.IsEnabled() should've returned true, because Enabled was set to nil")
|
|
}
|
|
if value := false; (&Alert{Enabled: &value}).IsEnabled() {
|
|
t.Error("alert.IsEnabled() should've returned false, because Enabled was set to false")
|
|
}
|
|
if value := true; !(&Alert{Enabled: &value}).IsEnabled() {
|
|
t.Error("alert.IsEnabled() should've returned true, because Enabled was set to true")
|
|
}
|
|
}
|
|
|
|
func TestAlert_GetDescription(t *testing.T) {
|
|
if (&Alert{Description: nil}).GetDescription() != "" {
|
|
t.Error("alert.GetDescription() should've returned an empty string, because Description was set to nil")
|
|
}
|
|
if value := "description"; (&Alert{Description: &value}).GetDescription() != value {
|
|
t.Error("alert.GetDescription() should've returned false, because Description was set to 'description'")
|
|
}
|
|
}
|
|
|
|
func TestAlert_IsSendingOnResolved(t *testing.T) {
|
|
if (&Alert{SendOnResolved: nil}).IsSendingOnResolved() {
|
|
t.Error("alert.IsSendingOnResolved() should've returned false, because SendOnResolved was set to nil")
|
|
}
|
|
if value := false; (&Alert{SendOnResolved: &value}).IsSendingOnResolved() {
|
|
t.Error("alert.IsSendingOnResolved() should've returned false, because SendOnResolved was set to false")
|
|
}
|
|
if value := true; !(&Alert{SendOnResolved: &value}).IsSendingOnResolved() {
|
|
t.Error("alert.IsSendingOnResolved() should've returned true, because SendOnResolved was set to true")
|
|
}
|
|
}
|
|
|
|
func TestAlert_Checksum(t *testing.T) {
|
|
description1, description2 := "a", "b"
|
|
yes, no := true, false
|
|
scenarios := []struct {
|
|
name string
|
|
alert Alert
|
|
expected string
|
|
}{
|
|
{
|
|
name: "barebone",
|
|
alert: Alert{
|
|
Type: TypeDiscord,
|
|
},
|
|
expected: "fed0580e44ed5701dbba73afa1f14b2c53ca5a7b8067a860441c212916057fe3",
|
|
},
|
|
{
|
|
name: "with-description-1",
|
|
alert: Alert{
|
|
Type: TypeDiscord,
|
|
Description: &description1,
|
|
},
|
|
expected: "005f407ebe506e74a4aeb46f74c28b376debead7011e1b085da3840f72ba9707",
|
|
},
|
|
{
|
|
name: "with-description-2",
|
|
alert: Alert{
|
|
Type: TypeDiscord,
|
|
Description: &description2,
|
|
},
|
|
expected: "3c2c4a9570cdc614006993c21f79a860a7f5afea10cf70d1a79d3c49342ef2c8",
|
|
},
|
|
{
|
|
name: "with-description-2-and-enabled-false",
|
|
alert: Alert{
|
|
Type: TypeDiscord,
|
|
Enabled: &no,
|
|
Description: &description2,
|
|
},
|
|
expected: "837945c2b4cd5e961db3e63e10c348d4f1c3446ba68cf5a48e35a1ae22cf0c22",
|
|
},
|
|
{
|
|
name: "with-description-2-and-enabled-true",
|
|
alert: Alert{
|
|
Type: TypeDiscord,
|
|
Enabled: &yes, // it defaults to true if not set, but just to make sure
|
|
Description: &description2,
|
|
},
|
|
expected: "3c2c4a9570cdc614006993c21f79a860a7f5afea10cf70d1a79d3c49342ef2c8",
|
|
},
|
|
{
|
|
name: "with-description-2-and-enabled-true-and-send-on-resolved-true",
|
|
alert: Alert{
|
|
Type: TypeDiscord,
|
|
Enabled: &yes,
|
|
SendOnResolved: &yes,
|
|
Description: &description2,
|
|
},
|
|
expected: "bf1436995a880eb4a352c74c5dfee1f1b5ff6b9fc55aef9bf411b3631adfd80c",
|
|
},
|
|
{
|
|
name: "with-description-2-and-failure-threshold-7",
|
|
alert: Alert{
|
|
Type: TypeSlack,
|
|
FailureThreshold: 7,
|
|
Description: &description2,
|
|
},
|
|
expected: "8bd479e18bda393d4c924f5a0d962e825002168dedaa88b445e435db7bacffd3",
|
|
},
|
|
{
|
|
name: "with-description-2-and-failure-threshold-9",
|
|
alert: Alert{
|
|
Type: TypeSlack,
|
|
FailureThreshold: 9,
|
|
Description: &description2,
|
|
},
|
|
expected: "5abdfce5236e344996d264d526e769c07cb0d3d329a999769a1ff84b157ca6f1",
|
|
},
|
|
{
|
|
name: "with-description-2-and-success-threshold-5",
|
|
alert: Alert{
|
|
Type: TypeSlack,
|
|
SuccessThreshold: 7,
|
|
Description: &description2,
|
|
},
|
|
expected: "c0000e73626b80e212cfc24830de7094568f648e37f3e16f9e68c7f8ef75c34c",
|
|
},
|
|
{
|
|
name: "with-description-2-and-success-threshold-1",
|
|
alert: Alert{
|
|
Type: TypeSlack,
|
|
SuccessThreshold: 1,
|
|
Description: &description2,
|
|
},
|
|
expected: "5c28963b3a76104cfa4a0d79c89dd29ec596c8cfa4b1af210ec83d6d41587b5f",
|
|
},
|
|
}
|
|
for _, scenario := range scenarios {
|
|
t.Run(scenario.name, func(t *testing.T) {
|
|
scenario.alert.ValidateAndSetDefaults()
|
|
if checksum := scenario.alert.Checksum(); checksum != scenario.expected {
|
|
t.Errorf("expected checksum %v, got %v", scenario.expected, checksum)
|
|
}
|
|
})
|
|
}
|
|
}
|