chronograf/kapacitor/alerts_test.go

330 lines
6.5 KiB
Go

package kapacitor
import (
"testing"
"github.com/influxdata/chronograf"
)
func TestAlertServices(t *testing.T) {
tests := []struct {
name string
skip string
rule chronograf.AlertRule
want chronograf.TICKScript
wantErr bool
}{
{
name: "Test several valid services",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
Slack: []*chronograf.Slack{{}},
VictorOps: []*chronograf.VictorOps{{}},
Email: []*chronograf.Email{{}},
},
},
want: `alert()
.email()
.victorOps()
.slack()
`,
},
{
name: "Test single valid service",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
Slack: []*chronograf.Slack{{}},
},
},
want: `alert()
.slack()
`,
},
{
name: "Test pushoverservice",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
Pushover: []*chronograf.Pushover{
{
Device: "asdf",
Title: "asdf",
Sound: "asdf",
URL: "http://moo.org",
URLTitle: "influxdata",
},
},
},
},
want: `alert()
.pushover()
.device('asdf')
.title('asdf')
.uRL('http://moo.org')
.uRLTitle('influxdata')
.sound('asdf')
`,
},
{
name: "Test single valid service and property",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
Slack: []*chronograf.Slack{
{
Channel: "#general",
},
},
},
},
want: `alert()
.slack()
.channel('#general')
`,
},
{
name: "Test tcp",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
TCPs: []*chronograf.TCP{
{
Address: "myaddress:22",
},
},
},
},
want: `alert()
.tcp('myaddress:22')
`,
},
{
name: "Test log",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
Log: []*chronograf.Log{
{
FilePath: "/tmp/alerts.log",
},
},
},
},
want: `alert()
.log('/tmp/alerts.log')
`,
},
{
name: "Test http as post",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
Posts: []*chronograf.Post{
{
URL: "http://myaddress",
},
},
},
},
want: `alert()
.post('http://myaddress')
`,
},
{
name: "Test post with headers",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
Posts: []*chronograf.Post{
{
URL: "http://myaddress",
Headers: map[string]string{"key": "value"},
},
},
},
},
want: `alert()
.post('http://myaddress')
.header('key', 'value')
`,
},
{
name: "Test serviceNow",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
ServiceNow: []*chronograf.ServiceNow{{
Source: "a",
Type: "b",
Node: "c",
Resource: "d",
MetricName: "e",
MessageKey: "f",
}},
},
},
want: `alert()
.serviceNow()
.source('a')
.node('c')
.type('b')
.resource('d')
.metricName('e')
.messageKey('f')
`,
},
{
name: "Test BigPanda",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
BigPanda: []*chronograf.BigPanda{{
AppKey: "a",
PrimaryProperty: "b",
SecondaryProperty: "c",
}},
},
},
want: `alert()
.bigPanda()
.appKey('a')
.primaryProperty('b')
.secondaryProperty('c')
`,
},
{
name: "Test Teams without ChannelURL",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
Teams: []*chronograf.Teams{{}},
},
},
want: `alert()
.teams()
`,
},
{
name: "Test Teams with ChannelURL",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
Teams: []*chronograf.Teams{{
ChannelURL: "https://outlook.office.com/webhook/...",
}},
},
},
want: `alert()
.teams()
.channelURL('https://outlook.office.com/webhook/...')
`,
},
{
name: "Test Zenoss",
rule: chronograf.AlertRule{
AlertNodes: chronograf.AlertNodes{
Zenoss: []*chronograf.Zenoss{{
Action: "a",
Method: "b",
Type: "c",
TID: 4,
Device: "e",
Component: "f",
EventClassKey: "g",
EventClass: "h",
}},
},
},
want: `alert()
.zenoss()
.action('a')
.method('b')
.type('c')
.tid(4)
.device('e')
.component('f')
.eventClassKey('g')
.eventClass('h')
`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.skip != "" {
t.Skip(tt.skip)
}
got, err := AlertServices(tt.rule)
if (err != nil) != tt.wantErr {
t.Errorf("%q. AlertServices() error = %v, wantErr %v", tt.name, err, tt.wantErr)
return
}
if tt.wantErr {
return
}
formatted, err := formatTick("alert()" + got)
if err != nil {
t.Errorf("%q. formatTick() error = %v", tt.name, err)
return
}
if formatted != tt.want {
t.Errorf("%q. AlertServices() = %v, want %v", tt.name, formatted, tt.want)
}
})
}
}
func Test_addAlertNodes(t *testing.T) {
tests := []struct {
name string
handlers chronograf.AlertNodes
want string
wantErr bool
}{
{
name: "test email alerts",
handlers: chronograf.AlertNodes{
IsStateChangesOnly: true,
Email: []*chronograf.Email{
{
To: []string{
"me@me.com", "you@you.com",
},
},
},
},
want: `
.stateChangesOnly()
.email()
.to('me@me.com')
.to('you@you.com')
`,
},
{
name: "test pushover alerts",
handlers: chronograf.AlertNodes{
IsStateChangesOnly: true,
Pushover: []*chronograf.Pushover{
{
Device: "asdf",
Title: "asdf",
Sound: "asdf",
URL: "http://moo.org",
URLTitle: "influxdata",
},
},
},
want: `
.stateChangesOnly()
.pushover()
.device('asdf')
.title('asdf')
.uRL('http://moo.org')
.uRLTitle('influxdata')
.sound('asdf')
`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := addAlertNodes(tt.handlers)
if (err != nil) != tt.wantErr {
t.Errorf("addAlertNodes() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("addAlertNodes() =\n%v\n, want\n%v", got, tt.want)
}
})
}
}