influxdb/http/notification_rule_test.go

320 lines
8.6 KiB
Go

package http
import (
"context"
"encoding/json"
"testing"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/kit/platform"
"github.com/influxdata/influxdb/v2/mock"
"github.com/influxdata/influxdb/v2/notification"
"github.com/influxdata/influxdb/v2/notification/rule"
"github.com/influxdata/influxdb/v2/task/taskmodel"
influxTesting "github.com/influxdata/influxdb/v2/testing"
"go.uber.org/zap/zaptest"
)
func NewMockNotificationRuleBackend(t *testing.T) *NotificationRuleBackend {
return &NotificationRuleBackend{
log: zaptest.NewLogger(t),
AlgoWProxy: &NoopProxyHandler{},
UserResourceMappingService: mock.NewUserResourceMappingService(),
LabelService: mock.NewLabelService(),
UserService: mock.NewUserService(),
OrganizationService: mock.NewOrganizationService(),
TaskService: &mock.TaskService{
FindTaskByIDFn: func(ctx context.Context, id platform.ID) (*taskmodel.Task, error) {
return &taskmodel.Task{Status: "active"}, nil
},
},
}
}
func Test_newNotificationRuleResponses(t *testing.T) {
type args struct {
opt influxdb.FindOptions
filter influxdb.NotificationRuleFilter
nrs []influxdb.NotificationRule
}
tests := []struct {
name string
args args
want string
}{
{
args: args{
opt: influxdb.FindOptions{
Limit: 50,
Offset: 0,
Descending: true,
},
filter: influxdb.NotificationRuleFilter{
OrgID: influxTesting.IDPtr(platform.ID(2)),
},
nrs: []influxdb.NotificationRule{
&rule.Slack{
Channel: "ch1",
MessageTemplate: "message 1{var1}",
Base: rule.Base{
ID: platform.ID(1),
OrgID: platform.ID(2),
OwnerID: platform.ID(3),
EndpointID: 4,
Name: "name1",
Description: "desc1",
Every: mustDuration("5m"),
Offset: mustDuration("15s"),
TagRules: []notification.TagRule{
{
Tag: influxdb.Tag{Key: "k1", Value: "v1"},
Operator: influxdb.Equal,
},
{
Tag: influxdb.Tag{Key: "k2", Value: "v2"},
Operator: influxdb.NotRegexEqual,
},
},
StatusRules: []notification.StatusRule{
{
CurrentLevel: notification.Critical,
},
{
CurrentLevel: notification.Warn,
},
},
},
},
&rule.PagerDuty{
MessageTemplate: "body 2{var2}",
Base: rule.Base{
ID: platform.ID(11),
OrgID: platform.ID(2),
OwnerID: platform.ID(33),
EndpointID: 44,
Name: "name2",
Description: "desc2",
},
},
},
},
want: `{
"links": {
"self": "/api/v2/notificationRules?descending=true&limit=50&offset=0&orgID=0000000000000002"
},
"notificationRules": [
{
"channel": "ch1",
"createdAt": "0001-01-01T00:00:00Z",
"description": "desc1",
"endpointID": "0000000000000004",
"every": "5m",
"id": "0000000000000001",
"labels": [
],
"links": {
"labels": "/api/v2/notificationRules/0000000000000001/labels",
"members": "/api/v2/notificationRules/0000000000000001/members",
"owners": "/api/v2/notificationRules/0000000000000001/owners",
"query": "/api/v2/notificationRules/0000000000000001/query",
"self": "/api/v2/notificationRules/0000000000000001"
},
"messageTemplate": "message 1{var1}",
"name": "name1",
"offset": "15s",
"orgID": "0000000000000002",
"ownerID": "0000000000000003",
"runbookLink": "",
"statusRules": [
{
"currentLevel": "CRIT",
"previousLevel": null
},
{
"currentLevel": "WARN",
"previousLevel": null
}
],
"tagRules": [
{
"key": "k1",
"operator": "equal",
"value": "v1"
},
{
"key": "k2",
"operator": "notequalregex",
"value": "v2"
}
],
"type": "slack",
"updatedAt": "0001-01-01T00:00:00Z",
"status": "active",
"latestCompleted": "0001-01-01T00:00:00Z",
"latestScheduled": "0001-01-01T00:00:00Z"
},
{
"createdAt": "0001-01-01T00:00:00Z",
"description": "desc2",
"endpointID": "000000000000002c",
"id": "000000000000000b",
"labels": [
],
"links": {
"labels": "/api/v2/notificationRules/000000000000000b/labels",
"members": "/api/v2/notificationRules/000000000000000b/members",
"owners": "/api/v2/notificationRules/000000000000000b/owners",
"query": "/api/v2/notificationRules/000000000000000b/query",
"self": "/api/v2/notificationRules/000000000000000b"
},
"messageTemplate": "body 2{var2}",
"name": "name2",
"orgID": "0000000000000002",
"ownerID": "0000000000000021",
"runbookLink": "",
"type": "pagerduty",
"updatedAt": "0001-01-01T00:00:00Z",
"status": "active",
"latestCompleted": "0001-01-01T00:00:00Z",
"latestScheduled": "0001-01-01T00:00:00Z"
}
]
}`,
},
}
handler := NewNotificationRuleHandler(zaptest.NewLogger(t), NewMockNotificationRuleBackend(t))
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
res, err := handler.newNotificationRulesResponse(ctx, tt.args.nrs, mock.NewLabelService(), tt.args.filter, tt.args.opt)
if err != nil {
t.Fatalf("newNotificationRulesResponse() build response %v", err)
}
got, err := json.Marshal(res)
if err != nil {
t.Fatalf("newNotificationRulesResponse() JSON marshal %v", err)
}
if eq, diff, _ := jsonEqual(string(got), tt.want); tt.want != "" && !eq {
t.Errorf("%q. newNotificationRulesResponse() = ***%s***", tt.name, diff)
}
})
}
}
func Test_newNotificationRuleResponse(t *testing.T) {
type args struct {
nr influxdb.NotificationRule
}
tests := []struct {
name string
args args
want string
}{
{
args: args{
nr: &rule.Slack{
Channel: "ch1",
MessageTemplate: "message 1{var1}",
Base: rule.Base{
ID: platform.ID(1),
OrgID: platform.ID(2),
OwnerID: platform.ID(3),
EndpointID: 4,
Name: "name1",
Description: "desc1",
Every: mustDuration("5m"),
Offset: mustDuration("15s"),
TagRules: []notification.TagRule{
{
Tag: influxdb.Tag{Key: "k1", Value: "v1"},
Operator: influxdb.Equal,
},
{
Tag: influxdb.Tag{Key: "k2", Value: "v2"},
Operator: influxdb.NotRegexEqual,
},
},
StatusRules: []notification.StatusRule{
{
CurrentLevel: notification.Critical,
},
{
CurrentLevel: notification.Warn,
},
},
},
},
},
want: `{
"channel": "ch1",
"createdAt": "0001-01-01T00:00:00Z",
"description": "desc1",
"endpointID": "0000000000000004",
"every": "5m",
"id": "0000000000000001",
"labels": [
],
"links": {
"labels": "/api/v2/notificationRules/0000000000000001/labels",
"members": "/api/v2/notificationRules/0000000000000001/members",
"owners": "/api/v2/notificationRules/0000000000000001/owners",
"query": "/api/v2/notificationRules/0000000000000001/query",
"self": "/api/v2/notificationRules/0000000000000001"
},
"messageTemplate": "message 1{var1}",
"name": "name1",
"offset": "15s",
"orgID": "0000000000000002",
"ownerID": "0000000000000003",
"runbookLink": "",
"status": "active",
"statusRules": [
{
"currentLevel": "CRIT",
"previousLevel": null
},
{
"currentLevel": "WARN",
"previousLevel": null
}
],
"tagRules": [
{
"key": "k1",
"operator": "equal",
"value": "v1"
},
{
"key": "k2",
"operator": "notequalregex",
"value": "v2"
}
],
"type": "slack",
"updatedAt": "0001-01-01T00:00:00Z",
"latestCompleted": "0001-01-01T00:00:00Z",
"latestScheduled": "0001-01-01T00:00:00Z"
}`,
},
}
handler := NewNotificationRuleHandler(zaptest.NewLogger(t), NewMockNotificationRuleBackend(t))
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
res, err := handler.newNotificationRuleResponse(context.Background(), tt.args.nr, []*influxdb.Label{})
if err != nil {
t.Fatalf("newNotificationRuleResponse() building response %v", err)
}
got, err := json.Marshal(res)
if err != nil {
t.Fatalf("newNotificationRuleResponse() JSON marshal %v", err)
}
if eq, diff, _ := jsonEqual(string(got), tt.want); tt.want != "" && !eq {
t.Errorf("%q. newNotificationRuleResponse() = ***%s***", tt.name, diff)
}
})
}
}