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  }