grafana/pkg/services/ngalert/notifier/templates_test.go
2023-04-28 15:56:59 +01:00

175 lines
6.0 KiB
Go

package notifier
import (
"context"
"fmt"
"testing"
"github.com/go-openapi/strfmt"
alertingModels "github.com/grafana/alerting/models"
alertingNotify "github.com/grafana/alerting/notify"
amv2 "github.com/prometheus/alertmanager/api/v2/models"
prometheusModel "github.com/prometheus/common/model"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
)
var (
simpleAlert = amv2.PostableAlert{
Alert: amv2.Alert{
Labels: amv2.LabelSet{"__alert_rule_uid__": "rule uid", "alertname": "alert1", "lbl1": "val1"},
},
Annotations: amv2.LabelSet{"ann1": "annv1", "__dashboardUid__": "abcd", "__panelId__": "efgh", "__alertImageToken__": "test-image-1"},
StartsAt: strfmt.DateTime{},
EndsAt: strfmt.DateTime{},
}
)
func TestTemplateDefaultData(t *testing.T) {
am := setupAMTest(t)
tests := []struct {
name string
input apimodels.TestTemplatesConfigBodyParams
expected TestTemplatesResults
}{{
name: "check various extended data",
input: apimodels.TestTemplatesConfigBodyParams{
Alerts: []*amv2.PostableAlert{&simpleAlert},
Name: "slack.title",
Template: `{{ define "slack.title" }}
Receiver: {{ .Receiver }}
Status: {{ .Status }}
ExternalURL: {{ .ExternalURL }}
Alerts: {{ len .Alerts }}
Firing Alerts: {{ len .Alerts.Firing }}
Resolved Alerts: {{ len .Alerts.Resolved }}
GroupLabels: {{ range .GroupLabels.SortedPairs }}{{ .Name }}={{ .Value }} {{ end }}
CommonLabels: {{ range .CommonLabels.SortedPairs }}{{ .Name }}={{ .Value }} {{ end }}
CommonAnnotations: {{ range .CommonAnnotations.SortedPairs }}{{ .Name }}={{ .Value }} {{ end }}
{{ end }}`,
},
expected: TestTemplatesResults{
Results: []alertingNotify.TestTemplatesResult{{
Name: "slack.title",
Text: "\nReceiver: TestReceiver\nStatus: firing\nExternalURL: http://localhost:9093\nAlerts: 1\nFiring Alerts: 1\nResolved Alerts: 0\nGroupLabels: group_label=group_label_value \nCommonLabels: alertname=alert1 grafana_folder=folder title lbl1=val1 \nCommonAnnotations: ann1=annv1 \n",
}},
Errors: nil,
},
}, {
name: "AlertNameLabel",
input: apimodels.TestTemplatesConfigBodyParams{
Alerts: []*amv2.PostableAlert{{}},
Name: "slack.title",
Template: fmt.Sprintf(`{{ define "slack.title" }}{{ index (index .Alerts 0 ).Labels "%s" }}{{ end }}`, prometheusModel.AlertNameLabel),
},
expected: TestTemplatesResults{
Results: []alertingNotify.TestTemplatesResult{{
Name: "slack.title",
Text: DefaultLabels[prometheusModel.AlertNameLabel],
}},
Errors: nil,
},
}, {
name: "FolderTitleLabel",
input: apimodels.TestTemplatesConfigBodyParams{
Alerts: []*amv2.PostableAlert{{}},
Name: "slack.title",
Template: fmt.Sprintf(`{{ define "slack.title" }}{{ index (index .Alerts 0 ).Labels "%s" }}{{ end }}`, alertingModels.FolderTitleLabel),
},
expected: TestTemplatesResults{
Results: []alertingNotify.TestTemplatesResult{{
Name: "slack.title",
Text: DefaultLabels[alertingModels.FolderTitleLabel],
}},
Errors: nil,
},
}, {
name: "ValuesAnnotation",
input: apimodels.TestTemplatesConfigBodyParams{
Alerts: []*amv2.PostableAlert{{}},
Name: "slack.title",
Template: `{{ define "slack.title" }}{{ range $key, $value := (index .Alerts 0 ).Values }}{{ $key }}={{ $value }} {{ end }}{{ end }}`,
},
expected: TestTemplatesResults{
Results: []alertingNotify.TestTemplatesResult{{
Name: "slack.title",
Text: "B=22 C=1 ",
}},
Errors: nil,
},
}, {
name: "ValueStringAnnotation",
input: apimodels.TestTemplatesConfigBodyParams{
Alerts: []*amv2.PostableAlert{{}},
Name: "slack.title",
Template: `{{ define "slack.title" }}{{ (index .Alerts 0 ).ValueString }}{{ end }}`,
},
expected: TestTemplatesResults{
Results: []alertingNotify.TestTemplatesResult{{
Name: "slack.title",
Text: DefaultAnnotations[alertingModels.ValueStringAnnotation],
}},
Errors: nil,
},
}, {
name: "DashboardURL generation contains DashboardUIDAnnotation and OrgIDAnnotation ",
input: apimodels.TestTemplatesConfigBodyParams{
Alerts: []*amv2.PostableAlert{{}},
Name: "slack.title",
Template: `{{ define "slack.title" }}{{ (index .Alerts 0 ).DashboardURL }}{{ end }}`,
},
expected: TestTemplatesResults{
Results: []alertingNotify.TestTemplatesResult{{
Name: "slack.title",
Text: fmt.Sprintf("http://localhost:9093/d/%s?orgId=%s",
DefaultAnnotations[alertingModels.DashboardUIDAnnotation],
DefaultAnnotations[alertingModels.OrgIDAnnotation]),
}},
Errors: nil,
},
}, {
name: "PanelURL generation contains DashboardUIDAnnotation, PanelIDAnnotation, and OrgIDAnnotation ",
input: apimodels.TestTemplatesConfigBodyParams{
Alerts: []*amv2.PostableAlert{{}},
Name: "slack.title",
Template: `{{ define "slack.title" }}{{ (index .Alerts 0 ).PanelURL }}{{ end }}`,
},
expected: TestTemplatesResults{
Results: []alertingNotify.TestTemplatesResult{{
Name: "slack.title",
Text: fmt.Sprintf("http://localhost:9093/d/%s?orgId=%s&viewPanel=%s",
DefaultAnnotations[alertingModels.DashboardUIDAnnotation],
DefaultAnnotations[alertingModels.OrgIDAnnotation],
DefaultAnnotations[alertingModels.PanelIDAnnotation]),
}},
Errors: nil,
},
}, {
name: "GeneratorURL generation ",
input: apimodels.TestTemplatesConfigBodyParams{
Alerts: []*amv2.PostableAlert{{Alert: amv2.Alert{GeneratorURL: "http://localhost:3000"}}},
Name: "slack.title",
Template: `{{ define "slack.title" }}{{ (index .Alerts 0 ).GeneratorURL }}{{ end }}`,
},
expected: TestTemplatesResults{
Results: []alertingNotify.TestTemplatesResult{{
Name: "slack.title",
Text: fmt.Sprintf("http://localhost:3000?orgId=%s", DefaultAnnotations[alertingModels.OrgIDAnnotation]),
}},
Errors: nil,
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
res, err := am.TestTemplate(context.Background(), test.input)
require.NoError(t, err)
assert.Equal(t, test.expected, *res)
})
}
}