1package expr
2
3import (
4	"strings"
5	"testing"
6
7	"github.com/prometheus/prometheus/promql"
8)
9
10type promQueryTemplateTest struct {
11	title string
12	promQueryTemplateData
13	expect string
14}
15
16var promQueryTemplateTests = []promQueryTemplateTest{
17	{
18		"minimal query",
19		promQueryTemplateData{
20			Metric: "up",
21			AgFunc: "sum",
22		},
23		"sum( up) by (  )",
24	},
25	{
26		"query with tags",
27		promQueryTemplateData{
28			Metric: "up",
29			AgFunc: "sum",
30			Tags:   "namespace,pod",
31		},
32		"sum( up) by ( namespace,pod )",
33	},
34	{
35		"query with tags and filter",
36		promQueryTemplateData{
37			Metric: "up",
38			AgFunc: "sum",
39			Tags:   "namespace,pod",
40			Filter: `service !~ "kubl.*"`,
41		},
42		`sum( up {service !~ "kubl.*"} ) by ( namespace,pod )`,
43	},
44	{
45		"minimal rate query",
46		promQueryTemplateData{
47			Metric:       "up",
48			AgFunc:       "sum",
49			RateDuration: "5m",
50		},
51		`sum(rate( up [5m] )) by (  )`,
52	},
53	{
54		"rate query with tags and filter",
55		promQueryTemplateData{
56			Metric:       "up",
57			AgFunc:       "sum",
58			Tags:         "namespace,pod",
59			Filter:       ` service !~ "kubl.*" `,
60			RateDuration: "5m",
61		},
62		`sum(rate( up { service !~ "kubl.*" }  [5m] )) by ( namespace,pod )`,
63	},
64}
65
66func TestPromQueryTemplate(t *testing.T) {
67	for _, qTest := range promQueryTemplateTests {
68		out, err := qTest.RenderString()
69		if err != nil {
70			t.Errorf("error rendering template for test query %v: %v", qTest.title, err)
71			continue
72		}
73		trimmedOut := strings.TrimSpace(out)
74		if trimmedOut != qTest.expect {
75			t.Errorf("unexpected output for test query %v: got ```%v``` want ```%v```", qTest.title, trimmedOut, qTest.expect)
76		}
77		_, err = promql.ParseExpr(trimmedOut)
78		if err != nil {
79			t.Errorf("failed to parse output of for test query %v as valid promql: %v", qTest, err)
80		}
81	}
82}
83