chronograf/kapacitor/vars_test.go

184 lines
3.8 KiB
Go

package kapacitor
import (
"fmt"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/influxdata/chronograf"
)
func TestVarsCritStringEqual(t *testing.T) {
alert := chronograf.AlertRule{
Name: "name",
Trigger: "threshold",
TriggerValues: chronograf.TriggerValues{
Operator: "equal to",
Value: "DOWN",
},
Every: "30s",
Query: &chronograf.QueryConfig{
Database: "telegraf",
Measurement: "haproxy",
RetentionPolicy: "autogen",
Fields: []chronograf.Field{
{
Value: "status",
Type: "field",
},
},
GroupBy: chronograf.GroupBy{
Time: "10m",
Tags: []string{"pxname"},
},
AreTagsAccepted: true,
},
}
raw, err := Vars(alert)
if err != nil {
fmt.Printf("%s", raw)
t.Fatalf("Error generating alert: %v %s", err, raw)
}
tick, err := formatTick(raw)
if err != nil {
t.Errorf("Error formatting alert: %v %s", err, raw)
}
if err := validateTick(tick); err != nil {
t.Errorf("Error validating alert: %v %s", err, tick)
}
}
func Test_formatValue(t *testing.T) {
tests := []struct {
name string
value string
want string
}{
{
name: "parses floats",
value: "3.14",
want: "3.14",
},
{
name: "parses booleans",
value: "TRUE",
want: "TRUE",
},
{
name: "single quotes for strings",
value: "up",
want: "'up'",
},
{
name: "handles escaping of single quotes",
value: "down's",
want: "'down\\'s'",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := formatValue(tt.value); got != tt.want {
t.Errorf("formatValue() = %v, want %v", got, tt.want)
}
})
}
}
func TestVarsWhereFilter(t *testing.T) {
tests := []struct {
name string
queryConfig chronograf.QueryConfig
whereValue string
}{
{
name: "simple",
queryConfig: chronograf.QueryConfig{
Database: "telegraf",
Measurement: "haproxy",
RetentionPolicy: "autogen",
Fields: []chronograf.Field{
{
Value: "status",
Type: "field",
},
},
GroupBy: chronograf.GroupBy{
Time: "10m",
Tags: []string{"pxname"},
},
AreTagsAccepted: true,
},
whereValue: `lambda: isPresent("status")`,
},
{
name: "accepted tags",
queryConfig: chronograf.QueryConfig{
Database: "telegraf",
Measurement: "haproxy",
RetentionPolicy: "autogen",
Fields: []chronograf.Field{
{
Value: "status",
Type: "field",
},
},
GroupBy: chronograf.GroupBy{
Time: "10m",
Tags: []string{"pxname"},
},
Tags: map[string][]string{
"cpu": {
"cpu_total",
},
"host": {
"acc-0eabc309-eu-west-1-data-3",
"prod",
},
},
AreTagsAccepted: true,
},
whereValue: `lambda: ("cpu" == 'cpu_total') AND ("host" == 'acc-0eabc309-eu-west-1-data-3' OR "host" == 'prod') AND isPresent("status")`,
},
{
name: "rejected tags",
queryConfig: chronograf.QueryConfig{
Database: "telegraf",
Measurement: "haproxy",
RetentionPolicy: "autogen",
Fields: []chronograf.Field{
{
Value: "status",
Type: "field",
},
},
GroupBy: chronograf.GroupBy{
Time: "10m",
Tags: []string{"pxname"},
},
Tags: map[string][]string{
"cpu": {
"cpu_total",
},
"host": {
"acc-0eabc309-eu-west-1-data-3",
"prod",
},
},
AreTagsAccepted: false,
},
whereValue: `lambda: ("cpu" != 'cpu_total') AND ("host" != 'acc-0eabc309-eu-west-1-data-3' AND "host" != 'prod') AND isPresent("status")`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := whereFilter(&tt.queryConfig)
if !cmp.Equal(result, tt.whereValue) {
t.Errorf("Reverse() = QueryConfig not equal %s", cmp.Diff(result, tt.whereValue))
}
})
}
}