github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/querier/astmapper/astmapper_test.go (about) 1 package astmapper 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/prometheus/common/model" 8 "github.com/prometheus/prometheus/pkg/labels" 9 "github.com/prometheus/prometheus/promql/parser" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestCloneNode(t *testing.T) { 14 var testExpr = []struct { 15 input parser.Expr 16 expected parser.Expr 17 }{ 18 // simple unmodified case 19 { 20 &parser.BinaryExpr{ 21 Op: parser.ADD, 22 LHS: &parser.NumberLiteral{Val: 1}, 23 RHS: &parser.NumberLiteral{Val: 1}, 24 }, 25 &parser.BinaryExpr{ 26 Op: parser.ADD, 27 LHS: &parser.NumberLiteral{Val: 1, PosRange: parser.PositionRange{Start: 0, End: 1}}, 28 RHS: &parser.NumberLiteral{Val: 1, PosRange: parser.PositionRange{Start: 4, End: 5}}, 29 }, 30 }, 31 { 32 &parser.AggregateExpr{ 33 Op: parser.SUM, 34 Without: true, 35 Expr: &parser.VectorSelector{ 36 Name: "some_metric", 37 LabelMatchers: []*labels.Matcher{ 38 mustLabelMatcher(labels.MatchEqual, string(model.MetricNameLabel), "some_metric"), 39 }, 40 }, 41 Grouping: []string{"foo"}, 42 }, 43 &parser.AggregateExpr{ 44 Op: parser.SUM, 45 Without: true, 46 Expr: &parser.VectorSelector{ 47 Name: "some_metric", 48 LabelMatchers: []*labels.Matcher{ 49 mustLabelMatcher(labels.MatchEqual, string(model.MetricNameLabel), "some_metric"), 50 }, 51 PosRange: parser.PositionRange{ 52 Start: 18, 53 End: 29, 54 }, 55 }, 56 Grouping: []string{"foo"}, 57 PosRange: parser.PositionRange{ 58 Start: 0, 59 End: 30, 60 }, 61 }, 62 }, 63 } 64 65 for i, c := range testExpr { 66 t.Run(fmt.Sprintf("[%d]", i), func(t *testing.T) { 67 res, err := CloneNode(c.input) 68 require.NoError(t, err) 69 require.Equal(t, c.expected, res) 70 }) 71 } 72 } 73 74 func TestCloneNode_String(t *testing.T) { 75 var testExpr = []struct { 76 input string 77 expected string 78 }{ 79 { 80 input: `rate(http_requests_total{cluster="us-central1"}[1m])`, 81 expected: `rate(http_requests_total{cluster="us-central1"}[1m])`, 82 }, 83 { 84 input: `sum( 85 sum(rate(http_requests_total{cluster="us-central1"}[1m])) 86 / 87 sum(rate(http_requests_total{cluster="ops-tools1"}[1m])) 88 )`, 89 expected: `sum(sum(rate(http_requests_total{cluster="us-central1"}[1m])) / sum(rate(http_requests_total{cluster="ops-tools1"}[1m])))`, 90 }, 91 } 92 93 for i, c := range testExpr { 94 t.Run(fmt.Sprintf("[%d]", i), func(t *testing.T) { 95 expr, err := parser.ParseExpr(c.input) 96 require.Nil(t, err) 97 res, err := CloneNode(expr) 98 require.Nil(t, err) 99 require.Equal(t, c.expected, res.String()) 100 }) 101 } 102 } 103 104 func mustLabelMatcher(mt labels.MatchType, name, val string) *labels.Matcher { 105 m, err := labels.NewMatcher(mt, name, val) 106 if err != nil { 107 panic(err) 108 } 109 return m 110 }