2021-03-31 01:38:34 +02:00
package telegram
import (
"encoding/json"
2021-12-03 05:10:21 +01:00
"net/http"
2021-03-31 01:38:34 +02:00
"testing"
2022-12-06 07:41:09 +01:00
"github.com/TwiN/gatus/v5/alerting/alert"
"github.com/TwiN/gatus/v5/client"
"github.com/TwiN/gatus/v5/core"
"github.com/TwiN/gatus/v5/test"
2021-03-31 01:38:34 +02:00
)
func TestAlertProvider_IsValid ( t * testing . T ) {
2022-09-08 01:02:30 +02:00
t . Run ( "invalid-provider" , func ( t * testing . T ) {
invalidProvider := AlertProvider { Token : "" , ID : "" }
if invalidProvider . IsValid ( ) {
t . Error ( "provider shouldn't have been valid" )
}
} )
t . Run ( "valid-provider" , func ( t * testing . T ) {
validProvider := AlertProvider { Token : "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11" , ID : "12345678" }
if validProvider . ClientConfig != nil {
t . Error ( "provider client config should have been nil prior to IsValid() being executed" )
}
if ! validProvider . IsValid ( ) {
t . Error ( "provider should've been valid" )
}
if validProvider . ClientConfig == nil {
t . Error ( "provider client config should have been set after IsValid() was executed" )
}
} )
2021-03-31 01:38:34 +02:00
}
2021-12-03 05:10:21 +01:00
func TestAlertProvider_Send ( t * testing . T ) {
defer client . InjectHTTPClient ( nil )
firstDescription := "description-1"
secondDescription := "description-2"
scenarios := [ ] struct {
Name string
Provider AlertProvider
Alert alert . Alert
Resolved bool
MockRoundTripper test . MockRoundTripper
ExpectedError bool
} {
{
Name : "triggered" ,
Provider : AlertProvider { } ,
Alert : alert . Alert { Description : & firstDescription , SuccessThreshold : 5 , FailureThreshold : 3 } ,
Resolved : false ,
MockRoundTripper : test . MockRoundTripper ( func ( r * http . Request ) * http . Response {
return & http . Response { StatusCode : http . StatusOK , Body : http . NoBody }
} ) ,
ExpectedError : false ,
} ,
{
Name : "triggered-error" ,
Provider : AlertProvider { } ,
Alert : alert . Alert { Description : & firstDescription , SuccessThreshold : 5 , FailureThreshold : 3 } ,
Resolved : false ,
MockRoundTripper : test . MockRoundTripper ( func ( r * http . Request ) * http . Response {
return & http . Response { StatusCode : http . StatusInternalServerError , Body : http . NoBody }
} ) ,
ExpectedError : true ,
} ,
{
Name : "resolved" ,
Provider : AlertProvider { } ,
Alert : alert . Alert { Description : & secondDescription , SuccessThreshold : 5 , FailureThreshold : 3 } ,
Resolved : true ,
MockRoundTripper : test . MockRoundTripper ( func ( r * http . Request ) * http . Response {
return & http . Response { StatusCode : http . StatusOK , Body : http . NoBody }
} ) ,
ExpectedError : false ,
} ,
{
Name : "resolved-error" ,
Provider : AlertProvider { } ,
Alert : alert . Alert { Description : & secondDescription , SuccessThreshold : 5 , FailureThreshold : 3 } ,
Resolved : true ,
MockRoundTripper : test . MockRoundTripper ( func ( r * http . Request ) * http . Response {
return & http . Response { StatusCode : http . StatusInternalServerError , Body : http . NoBody }
} ) ,
ExpectedError : true ,
} ,
}
for _ , scenario := range scenarios {
t . Run ( scenario . Name , func ( t * testing . T ) {
client . InjectHTTPClient ( & http . Client { Transport : scenario . MockRoundTripper } )
err := scenario . Provider . Send (
& core . Endpoint { Name : "endpoint-name" } ,
& scenario . Alert ,
& core . Result {
ConditionResults : [ ] * core . ConditionResult {
{ Condition : "[CONNECTED] == true" , Success : scenario . Resolved } ,
{ Condition : "[STATUS] == 200" , Success : scenario . Resolved } ,
} ,
} ,
scenario . Resolved ,
)
if scenario . ExpectedError && err == nil {
t . Error ( "expected error, got none" )
}
if ! scenario . ExpectedError && err != nil {
t . Error ( "expected no error, got" , err . Error ( ) )
}
} )
}
}
2021-12-03 03:05:17 +01:00
func TestAlertProvider_buildRequestBody ( t * testing . T ) {
firstDescription := "description-1"
secondDescription := "description-2"
scenarios := [ ] struct {
Name string
Provider AlertProvider
Alert alert . Alert
2024-04-11 02:46:17 +02:00
NoConditions bool
2021-12-03 03:05:17 +01:00
Resolved bool
ExpectedBody string
} {
{
Name : "triggered" ,
Provider : AlertProvider { ID : "123" } ,
Alert : alert . Alert { Description : & firstDescription , SuccessThreshold : 5 , FailureThreshold : 3 } ,
Resolved : false ,
2022-10-20 21:22:27 +02:00
ExpectedBody : "{\"chat_id\":\"123\",\"text\":\"⛑ *Gatus* \\nAn alert for *endpoint-name* has been triggered:\\n—\\n _healthcheck failed 3 time(s) in a row_\\n— \\n*Description* \\n_description-1_ \\n\\n*Condition results*\\n❌ - `[CONNECTED] == true`\\n❌ - `[STATUS] == 200`\\n\",\"parse_mode\":\"MARKDOWN\"}" ,
2021-12-03 03:05:17 +01:00
} ,
{
Name : "resolved" ,
Provider : AlertProvider { ID : "123" } ,
Alert : alert . Alert { Description : & secondDescription , SuccessThreshold : 5 , FailureThreshold : 3 } ,
Resolved : true ,
2023-08-17 03:15:32 +02:00
ExpectedBody : "{\"chat_id\":\"123\",\"text\":\"⛑ *Gatus* \\nAn alert for *endpoint-name* has been resolved:\\n—\\n _healthcheck passing successfully 5 time(s) in a row_\\n— \\n*Description* \\n_description-2_ \\n\\n*Condition results*\\n✅ - `[CONNECTED] == true`\\n✅ - `[STATUS] == 200`\\n\",\"parse_mode\":\"MARKDOWN\"}" ,
2021-12-03 03:05:17 +01:00
} ,
2024-04-11 02:46:17 +02:00
{
Name : "resolved-with-no-conditions" ,
NoConditions : true ,
Provider : AlertProvider { ID : "123" } ,
Alert : alert . Alert { Description : & secondDescription , SuccessThreshold : 5 , FailureThreshold : 3 } ,
Resolved : true ,
ExpectedBody : "{\"chat_id\":\"123\",\"text\":\"⛑ *Gatus* \\nAn alert for *endpoint-name* has been resolved:\\n—\\n _healthcheck passing successfully 5 time(s) in a row_\\n— \\n*Description* \\n_description-2_ \\n\",\"parse_mode\":\"MARKDOWN\"}" ,
} ,
2021-12-03 03:05:17 +01:00
}
for _ , scenario := range scenarios {
t . Run ( scenario . Name , func ( t * testing . T ) {
2024-04-11 02:46:17 +02:00
var conditionResults [ ] * core . ConditionResult
if ! scenario . NoConditions {
conditionResults = [ ] * core . ConditionResult {
{ Condition : "[CONNECTED] == true" , Success : scenario . Resolved } ,
{ Condition : "[STATUS] == 200" , Success : scenario . Resolved } ,
}
}
2021-12-03 03:05:17 +01:00
body := scenario . Provider . buildRequestBody (
& core . Endpoint { Name : "endpoint-name" } ,
& scenario . Alert ,
2024-04-11 02:46:17 +02:00
& core . Result { ConditionResults : conditionResults } ,
2021-12-03 03:05:17 +01:00
scenario . Resolved ,
)
2022-10-20 21:22:27 +02:00
if string ( body ) != scenario . ExpectedBody {
t . Errorf ( "expected:\n%s\ngot:\n%s" , scenario . ExpectedBody , body )
2021-12-03 03:05:17 +01:00
}
out := make ( map [ string ] interface { } )
2022-10-20 21:22:27 +02:00
if err := json . Unmarshal ( body , & out ) ; err != nil {
2021-12-03 03:05:17 +01:00
t . Error ( "expected body to be valid JSON, got error:" , err . Error ( ) )
}
} )
2021-03-31 01:38:34 +02:00
}
}
2021-12-03 04:15:51 +01:00
func TestAlertProvider_GetDefaultAlert ( t * testing . T ) {
2024-02-08 02:09:45 +01:00
if ( & AlertProvider { DefaultAlert : & alert . Alert { } } ) . GetDefaultAlert ( ) == nil {
2021-12-03 04:15:51 +01:00
t . Error ( "expected default alert to be not nil" )
}
2024-02-08 02:09:45 +01:00
if ( & AlertProvider { DefaultAlert : nil } ) . GetDefaultAlert ( ) != nil {
2021-12-03 04:15:51 +01:00
t . Error ( "expected default alert to be nil" )
}
}