diff --git a/config/config.go b/config/config.go index 33831891..420ec8e2 100644 --- a/config/config.go +++ b/config/config.go @@ -86,6 +86,12 @@ func Get() *Config { return config } +// Set sets the configuration +// Used only for testing +func Set(cfg *Config) { + config = cfg +} + // Load loads a custom configuration file // Note that the misconfiguration of some fields may lead to panics. This is on purpose. func Load(configFile string) error { diff --git a/config/config_test.go b/config/config_test.go index b10a07f0..9a9d0f0c 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -17,6 +17,16 @@ func TestGetBeforeConfigIsLoaded(t *testing.T) { t.Fatal("Should've panicked because the configuration hasn't been loaded yet") } +func TestSet(t *testing.T) { + if config != nil { + t.Fatal("config should've been nil") + } + Set(&Config{}) + if config == nil { + t.Fatal("config shouldn't have been nil") + } +} + func TestLoadFileThatDoesNotExist(t *testing.T) { err := Load("file-that-does-not-exist.yaml") if err == nil { diff --git a/watchdog/alerting_test.go b/watchdog/alerting_test.go new file mode 100644 index 00000000..21af2b1a --- /dev/null +++ b/watchdog/alerting_test.go @@ -0,0 +1,122 @@ +package watchdog + +import ( + "testing" + + "github.com/TwinProduction/gatus/alerting" + "github.com/TwinProduction/gatus/alerting/provider/custom" + "github.com/TwinProduction/gatus/config" + "github.com/TwinProduction/gatus/core" +) + +func TestHandleAlerting(t *testing.T) { + cfg := &config.Config{ + Alerting: &alerting.Config{ + Custom: &custom.AlertProvider{ + URL: "https://twinnation.org/health", + Method: "GET", + }, + }, + } + config.Set(cfg) + service := &core.Service{ + URL: "http://example.com", + Alerts: []*core.Alert{ + { + Type: core.CustomAlert, + Enabled: true, + FailureThreshold: 2, + SuccessThreshold: 3, + SendOnResolved: true, + Triggered: false, + }, + }, + } + + if service.NumberOfFailuresInARow != 0 { + t.Fatal("service.NumberOfFailuresInARow should've started at 0, got", service.NumberOfFailuresInARow) + } + if service.NumberOfSuccessesInARow != 0 { + t.Fatal("service.NumberOfSuccessesInARow should've started at 0, got", service.NumberOfSuccessesInARow) + } + if service.Alerts[0].Triggered { + t.Fatal("The alert shouldn't start triggered") + } + + HandleAlerting(service, &core.Result{Success: false}) + if service.NumberOfFailuresInARow != 1 { + t.Fatal("service.NumberOfFailuresInARow should've increased from 0 to 1, got", service.NumberOfFailuresInARow) + } + if service.NumberOfSuccessesInARow != 0 { + t.Fatal("service.NumberOfSuccessesInARow should've stayed at 0, got", service.NumberOfSuccessesInARow) + } + if service.Alerts[0].Triggered { + t.Fatal("The alert shouldn't have triggered") + } + + HandleAlerting(service, &core.Result{Success: false}) + if service.NumberOfFailuresInARow != 2 { + t.Fatal("service.NumberOfFailuresInARow should've increased from 1 to 2, got", service.NumberOfFailuresInARow) + } + if service.NumberOfSuccessesInARow != 0 { + t.Fatal("service.NumberOfSuccessesInARow should've stayed at 0, got", service.NumberOfSuccessesInARow) + } + if !service.Alerts[0].Triggered { + t.Fatal("The alert should've triggered") + } + + HandleAlerting(service, &core.Result{Success: false}) + if service.NumberOfFailuresInARow != 3 { + t.Fatal("service.NumberOfFailuresInARow should've increased from 2 to 3, got", service.NumberOfFailuresInARow) + } + if service.NumberOfSuccessesInARow != 0 { + t.Fatal("service.NumberOfSuccessesInARow should've stayed at 0, got", service.NumberOfSuccessesInARow) + } + if !service.Alerts[0].Triggered { + t.Fatal("The alert should still show as triggered") + } + + HandleAlerting(service, &core.Result{Success: true}) + if service.NumberOfFailuresInARow != 0 { + t.Fatal("service.NumberOfFailuresInARow should've reset to 0, got", service.NumberOfFailuresInARow) + } + if service.NumberOfSuccessesInARow != 1 { + t.Fatal("service.NumberOfSuccessesInARow should've increased from 0 to 1, got", service.NumberOfSuccessesInARow) + } + if !service.Alerts[0].Triggered { + t.Fatal("The alert should still be triggered") + } + + HandleAlerting(service, &core.Result{Success: true}) + if service.NumberOfFailuresInARow != 0 { + t.Fatal("service.NumberOfFailuresInARow should've stayed at 0, got", service.NumberOfFailuresInARow) + } + if service.NumberOfSuccessesInARow != 2 { + t.Fatal("service.NumberOfSuccessesInARow should've increased from 1 to 2, got", service.NumberOfSuccessesInARow) + } + if !service.Alerts[0].Triggered { + t.Fatal("The alert should still be triggered") + } + + HandleAlerting(service, &core.Result{Success: true}) + if service.NumberOfFailuresInARow != 0 { + t.Fatal("service.NumberOfFailuresInARow should've stayed at 0, got", service.NumberOfFailuresInARow) + } + if service.NumberOfSuccessesInARow != 3 { + t.Fatal("service.NumberOfSuccessesInARow should've increased from 2 to 3, got", service.NumberOfSuccessesInARow) + } + if service.Alerts[0].Triggered { + t.Fatal("The alert should not be triggered") + } + + HandleAlerting(service, &core.Result{Success: true}) + if service.NumberOfFailuresInARow != 0 { + t.Fatal("service.NumberOfFailuresInARow should've stayed at 0, got", service.NumberOfFailuresInARow) + } + if service.NumberOfSuccessesInARow != 4 { + t.Fatal("service.NumberOfSuccessesInARow should've increased from 3 to 4, got", service.NumberOfSuccessesInARow) + } + if service.Alerts[0].Triggered { + t.Fatal("The alert should no longer be triggered") + } +}