2023-11-03 23:21:52 +01:00
package gotify
import (
"encoding/json"
"fmt"
"testing"
"github.com/TwiN/gatus/v5/alerting/alert"
2024-05-10 04:56:16 +02:00
"github.com/TwiN/gatus/v5/config/endpoint"
2023-11-03 23:21:52 +01:00
)
2024-12-17 02:32:13 +01:00
func TestAlertProvider_Validate ( t * testing . T ) {
2023-11-03 23:21:52 +01:00
scenarios := [ ] struct {
name string
provider AlertProvider
expected bool
} {
{
name : "valid" ,
2024-12-17 02:32:13 +01:00
provider : AlertProvider { DefaultConfig : Config { ServerURL : "https://gotify.example.com" , Token : "faketoken" } } ,
2023-11-03 23:21:52 +01:00
expected : true ,
} ,
{
name : "invalid-server-url" ,
2024-12-17 02:32:13 +01:00
provider : AlertProvider { DefaultConfig : Config { ServerURL : "" , Token : "faketoken" } } ,
2023-11-03 23:21:52 +01:00
expected : false ,
} ,
{
name : "invalid-app-token" ,
2024-12-17 02:32:13 +01:00
provider : AlertProvider { DefaultConfig : Config { ServerURL : "https://gotify.example.com" , Token : "" } } ,
2023-11-03 23:21:52 +01:00
expected : false ,
} ,
{
name : "no-priority-should-use-default-value" ,
2024-12-17 02:32:13 +01:00
provider : AlertProvider { DefaultConfig : Config { ServerURL : "https://gotify.example.com" , Token : "faketoken" } } ,
2023-11-03 23:21:52 +01:00
expected : true ,
} ,
}
for _ , scenario := range scenarios {
t . Run ( scenario . name , func ( t * testing . T ) {
2024-12-17 02:32:13 +01:00
if err := scenario . provider . Validate ( ) ; ( err == nil ) != scenario . expected {
t . Errorf ( "expected: %t, got: %t" , scenario . expected , err == nil )
2023-11-03 23:21:52 +01:00
}
} )
}
}
func TestAlertProvider_buildRequestBody ( t * testing . T ) {
var (
description = "custom-description"
//title = "custom-title"
2024-05-10 04:56:16 +02:00
endpointName = "custom-endpoint"
2023-11-03 23:21:52 +01:00
)
scenarios := [ ] struct {
Name string
Provider AlertProvider
Alert alert . Alert
Resolved bool
ExpectedBody string
} {
{
Name : "triggered" ,
2024-12-17 02:32:13 +01:00
Provider : AlertProvider { DefaultConfig : Config { ServerURL : "https://gotify.example.com" , Token : "faketoken" } } ,
2023-11-03 23:21:52 +01:00
Alert : alert . Alert { Description : & description , SuccessThreshold : 5 , FailureThreshold : 3 } ,
Resolved : false ,
2024-05-10 04:56:16 +02:00
ExpectedBody : fmt . Sprintf ( "{\"message\":\"An alert for `%s` has been triggered due to having failed 3 time(s) in a row with the following description: %s\\n✕ - [CONNECTED] == true\\n✕ - [STATUS] == 200\",\"title\":\"Gatus: custom-endpoint\",\"priority\":0}" , endpointName , description ) ,
2023-11-03 23:21:52 +01:00
} ,
{
Name : "resolved" ,
2024-12-17 02:32:13 +01:00
Provider : AlertProvider { DefaultConfig : Config { ServerURL : "https://gotify.example.com" , Token : "faketoken" } } ,
2023-11-03 23:21:52 +01:00
Alert : alert . Alert { Description : & description , SuccessThreshold : 5 , FailureThreshold : 3 } ,
Resolved : true ,
2024-05-10 04:56:16 +02:00
ExpectedBody : fmt . Sprintf ( "{\"message\":\"An alert for `%s` has been resolved after passing successfully 5 time(s) in a row with the following description: %s\\n✓ - [CONNECTED] == true\\n✓ - [STATUS] == 200\",\"title\":\"Gatus: custom-endpoint\",\"priority\":0}" , endpointName , description ) ,
2023-11-03 23:21:52 +01:00
} ,
{
Name : "custom-title" ,
2024-12-17 02:32:13 +01:00
Provider : AlertProvider { DefaultConfig : Config { ServerURL : "https://gotify.example.com" , Token : "faketoken" , Title : "custom-title" } } ,
2023-11-03 23:21:52 +01:00
Alert : alert . Alert { Description : & description , SuccessThreshold : 5 , FailureThreshold : 3 } ,
Resolved : false ,
2024-05-10 04:56:16 +02:00
ExpectedBody : fmt . Sprintf ( "{\"message\":\"An alert for `%s` has been triggered due to having failed 3 time(s) in a row with the following description: %s\\n✕ - [CONNECTED] == true\\n✕ - [STATUS] == 200\",\"title\":\"custom-title\",\"priority\":0}" , endpointName , description ) ,
2023-11-03 23:21:52 +01:00
} ,
}
for _ , scenario := range scenarios {
t . Run ( scenario . Name , func ( t * testing . T ) {
body := scenario . Provider . buildRequestBody (
2024-12-17 02:32:13 +01:00
& scenario . Provider . DefaultConfig ,
2024-05-10 04:56:16 +02:00
& endpoint . Endpoint { Name : endpointName } ,
2023-11-03 23:21:52 +01:00
& scenario . Alert ,
2024-05-10 04:56:16 +02:00
& endpoint . Result {
ConditionResults : [ ] * endpoint . ConditionResult {
2023-11-03 23:21:52 +01:00
{ Condition : "[CONNECTED] == true" , Success : scenario . Resolved } ,
{ Condition : "[STATUS] == 200" , Success : scenario . Resolved } ,
} ,
} ,
scenario . Resolved ,
)
if string ( body ) != scenario . ExpectedBody {
t . Errorf ( "expected:\n%s\ngot:\n%s" , scenario . ExpectedBody , body )
}
out := make ( map [ string ] interface { } )
if err := json . Unmarshal ( body , & out ) ; err != nil {
t . Error ( "expected body to be valid JSON, got error:" , err . Error ( ) )
}
} )
}
}
2024-12-17 02:32:13 +01:00
func TestAlertProvider_GetDefaultAlert ( t * testing . T ) {
provider := AlertProvider { DefaultAlert : & alert . Alert { } }
if provider . GetDefaultAlert ( ) != provider . DefaultAlert {
t . Error ( "expected default alert to be returned" )
}
}
func TestAlertProvider_GetConfig ( t * testing . T ) {
scenarios := [ ] struct {
Name string
Provider AlertProvider
InputAlert alert . Alert
ExpectedOutput Config
} {
{
Name : "provider-no-override-should-default" ,
Provider : AlertProvider {
DefaultConfig : Config { ServerURL : "https://gotify.example.com" , Token : "12345" } ,
} ,
InputAlert : alert . Alert { } ,
ExpectedOutput : Config { ServerURL : "https://gotify.example.com" , Token : "12345" , Priority : DefaultPriority } ,
} ,
{
Name : "provider-with-alert-override" ,
Provider : AlertProvider {
DefaultConfig : Config { ServerURL : "https://gotify.example.com" , Token : "12345" } ,
} ,
InputAlert : alert . Alert { ProviderOverride : map [ string ] any { "server-url" : "https://gotify.group-example.com" , "token" : "54321" , "title" : "alert-title" , "priority" : 3 } } ,
ExpectedOutput : Config { ServerURL : "https://gotify.group-example.com" , Token : "54321" , Title : "alert-title" , Priority : 3 } ,
} ,
}
for _ , scenario := range scenarios {
t . Run ( scenario . Name , func ( t * testing . T ) {
got , err := scenario . Provider . GetConfig ( "" , & scenario . InputAlert )
if err != nil {
t . Error ( "expected no error, got:" , err . Error ( ) )
}
if got . ServerURL != scenario . ExpectedOutput . ServerURL {
t . Errorf ( "expected server URL to be %s, got %s" , scenario . ExpectedOutput . ServerURL , got . ServerURL )
}
if got . Token != scenario . ExpectedOutput . Token {
t . Errorf ( "expected token to be %s, got %s" , scenario . ExpectedOutput . Token , got . Token )
}
if got . Title != scenario . ExpectedOutput . Title {
t . Errorf ( "expected title to be %s, got %s" , scenario . ExpectedOutput . Title , got . Title )
}
if got . Priority != scenario . ExpectedOutput . Priority {
t . Errorf ( "expected priority to be %d, got %d" , scenario . ExpectedOutput . Priority , got . Priority )
}
// Test ValidateOverrides as well, since it really just calls GetConfig
if err = scenario . Provider . ValidateOverrides ( "" , & scenario . InputAlert ) ; err != nil {
t . Errorf ( "unexpected error: %s" , err )
}
} )
}
}