notification-controller/internal/notifier/pagerduty_test.go

229 lines
5.7 KiB
Go

package notifier
import (
"context"
"encoding/json"
"io"
"net/http"
"net/http/httptest"
"reflect"
"testing"
"time"
"github.com/PagerDuty/go-pagerduty"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1"
"github.com/fluxcd/pkg/apis/meta"
)
const (
routingKey = "notARealRoutingKey"
pagerdutyEUv2EventsAPIURL = "https://events.eu.pagerduty.com"
)
func TestNewPagerDuty(t *testing.T) {
t.Run("US endpoint", func(t *testing.T) {
p, err := NewPagerDuty("https://events.pagerduty.com/v2/enqueue", "", nil, routingKey)
assert.NoError(t, err)
assert.Equal(t, routingKey, p.RoutingKey)
assert.NotEqual(t, pagerdutyEUv2EventsAPIURL, p.Endpoint)
})
t.Run("EU endpoint", func(t *testing.T) {
p, err := NewPagerDuty("https://events.eu.pagerduty.com/v2/enqueue", "", nil, routingKey)
assert.NoError(t, err)
assert.Equal(t, routingKey, p.RoutingKey)
assert.Equal(t, pagerdutyEUv2EventsAPIURL, p.Endpoint)
})
t.Run("invalid URL", func(t *testing.T) {
_, err := NewPagerDuty("not a url", "", nil, routingKey)
assert.Errorf(t, err, "invalid PagerDuty endpoint URL not a url: 'parse \"https://not a url/\": invalid character \" \" in host name'")
})
}
func TestPagerDutyPost(t *testing.T) {
mux := http.NewServeMux()
mux.HandleFunc("/v2/enqueue", func(w http.ResponseWriter, r *http.Request) {
b, err := io.ReadAll(r.Body)
require.NoError(t, err)
var payload pagerduty.V2Event
err = json.Unmarshal(b, &payload)
require.NoError(t, err)
})
mux.HandleFunc("/v2/change/enqueue", func(w http.ResponseWriter, r *http.Request) {
b, err := io.ReadAll(r.Body)
require.NoError(t, err)
var payload pagerduty.ChangeEvent
err = json.Unmarshal(b, &payload)
require.NoError(t, err)
})
ts := httptest.NewServer(mux)
defer ts.Close()
pd, err := NewPagerDuty(ts.URL, "", nil, "token")
require.NoError(t, err)
err = pd.Post(context.TODO(), testEvent())
require.NoError(t, err)
}
func TestToPagerDutyV2Event(t *testing.T) {
// Construct test event
tests := []struct {
name string
e eventv1.Event
want pagerduty.V2Event
}{
{
name: "basic",
e: eventv1.Event{
InvolvedObject: corev1.ObjectReference{
Kind: "GitRepository",
Namespace: "flux-system",
Name: "test-app",
UID: "1234",
},
Severity: "info",
Timestamp: metav1.Date(2020, 01, 01, 0, 0, 0, 0, time.UTC),
Message: "message",
Reason: meta.SucceededReason,
Metadata: map[string]string{
"key1": "val1",
"key2": "val2",
},
ReportingController: "source-controller",
},
want: pagerduty.V2Event{
RoutingKey: routingKey,
Action: "resolve",
DedupKey: "1234",
},
},
{
name: "error",
e: eventv1.Event{
InvolvedObject: corev1.ObjectReference{
Kind: "GitRepository",
Namespace: "flux-system",
Name: "test-app",
UID: "1234",
},
Severity: "error",
Timestamp: metav1.Date(2020, 01, 01, 0, 0, 0, 0, time.UTC),
Message: "message",
Reason: meta.FailedReason,
Metadata: map[string]string{
"key1": "val1",
"key2": "val2",
},
ReportingController: "source-controller",
},
want: pagerduty.V2Event{
RoutingKey: routingKey,
Action: "trigger",
DedupKey: "1234",
Payload: &pagerduty.V2Payload{
Summary: "failed: gitrepository/test-app",
Severity: "error",
Source: "Flux source-controller",
Timestamp: "2020-01-01T00:00:00Z",
Component: "test-app",
Group: "GitRepository",
Details: map[string]interface{}{
"message": "message",
"metadata": map[string]string{
"key1": "val1",
"key2": "val2",
},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := toPagerDutyV2Event(tt.e, routingKey)
if !reflect.DeepEqual(got, tt.want) {
t.Logf("got Payload: %+v", got.Payload)
t.Errorf("toPagerDutyV2Event() = %+v, want %+v", got, tt.want)
}
})
}
}
func TestToPagerDutyChangeEvent(t *testing.T) {
e := eventv1.Event{
InvolvedObject: corev1.ObjectReference{
Kind: "GitRepository",
Namespace: "flux-system",
Name: "test-app",
UID: "1234",
},
Severity: "info",
Timestamp: metav1.Date(2020, 01, 01, 0, 0, 0, 0, time.UTC),
Message: "message",
Reason: meta.SucceededReason,
Metadata: map[string]string{
"key1": "val1",
"key2": "val2",
},
ReportingController: "source-controller",
}
want := pagerduty.ChangeEvent{
RoutingKey: routingKey,
Payload: pagerduty.ChangeEventPayload{
Summary: "succeeded: gitrepository/test-app",
Source: "Flux source-controller",
Timestamp: "2020-01-01T00:00:00Z",
CustomDetails: map[string]interface{}{
"message": "message",
"metadata": map[string]string{
"key1": "val1",
"key2": "val2",
},
},
},
}
got := toPagerDutyChangeEvent(e, routingKey)
if !reflect.DeepEqual(got, want) {
t.Errorf("toPagerDutyChangeEvent() = %q, want %q", got, want)
}
}
func TestToPagerDutySeverity(t *testing.T) {
tests := []struct {
name string
severity string
want string
}{
{
name: "info",
severity: eventv1.EventSeverityInfo,
want: "info",
},
{
name: "error",
severity: eventv1.EventSeverityError,
want: "error",
},
{
name: "trace",
severity: eventv1.EventSeverityTrace,
want: "info",
},
{
name: "invalid",
severity: "invalid",
want: "error",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert.Equal(t, tt.want, toPagerDutySeverity(tt.severity))
})
}
}