github.com/go-graphite/carbonapi@v0.17.0/expr/functions/aliasByRedis/function_test.go (about)

     1  package aliasByRedis
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"runtime"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/alicebob/miniredis/v2"
    11  
    12  	"github.com/go-graphite/carbonapi/expr/interfaces"
    13  	"github.com/go-graphite/carbonapi/expr/metadata"
    14  	"github.com/go-graphite/carbonapi/expr/types"
    15  	"github.com/go-graphite/carbonapi/pkg/parser"
    16  	th "github.com/go-graphite/carbonapi/tests"
    17  )
    18  
    19  var (
    20  	md []interfaces.FunctionMetadata
    21  	r  *miniredis.Miniredis
    22  )
    23  
    24  func init() {
    25  	var err error
    26  	r, err = miniredis.Run()
    27  	if err != nil {
    28  		panic(err)
    29  	}
    30  	runtime.SetFinalizer(r, func(r *miniredis.Miniredis) {
    31  		r.Close()
    32  	})
    33  	r.HSet("alias", "metric1", "new1")
    34  	r.HSet("alias", "metric2", "new2")
    35  
    36  	config, err := os.CreateTemp("", "carbonapi-redis-*.yaml")
    37  	if err != nil {
    38  		panic(err)
    39  	}
    40  	defer os.Remove(config.Name())
    41  	config.WriteString(fmt.Sprintf(`
    42  address: %s
    43  enabled: true
    44  `,
    45  		r.Addr(),
    46  	))
    47  	config.Close()
    48  
    49  	md = New(config.Name())
    50  	for _, m := range md {
    51  		metadata.RegisterFunction(m.Name, m.F)
    52  	}
    53  }
    54  
    55  func TestAliasByRedis(t *testing.T) {
    56  	now32 := int64(time.Now().Unix())
    57  
    58  	tests := []th.EvalTestItem{
    59  		{
    60  			`aliasByRedis(metric*,"alias")`,
    61  			map[parser.MetricRequest][]*types.MetricData{
    62  				{
    63  					Metric: "metric*",
    64  					From:   0,
    65  					Until:  1,
    66  				}: {
    67  					types.MakeMetricData("metric1", []float64{1, 2, 3, 4, 5}, 1, now32),
    68  					types.MakeMetricData("metric2", []float64{1, 2, 3, 4, 5}, 1, now32),
    69  				},
    70  			},
    71  			[]*types.MetricData{
    72  				types.MakeMetricData("new1", []float64{1, 2, 3, 4, 5}, 1, now32),
    73  				types.MakeMetricData("new2", []float64{1, 2, 3, 4, 5}, 1, now32),
    74  			},
    75  		},
    76  		{
    77  			`aliasByRedis(test.metric2,"alias")`,
    78  			map[parser.MetricRequest][]*types.MetricData{
    79  				{
    80  					Metric: "test.metric2",
    81  					From:   0,
    82  					Until:  1,
    83  				}: {
    84  					types.MakeMetricData(
    85  						"test.metric2", []float64{1, 2, 3, 4, 5}, 1, now32),
    86  				},
    87  			},
    88  			[]*types.MetricData{
    89  				types.MakeMetricData("new2", []float64{1, 2, 3, 4, 5}, 1, now32),
    90  			},
    91  		},
    92  		{
    93  			`aliasByRedis(*,"alias")`,
    94  			map[parser.MetricRequest][]*types.MetricData{
    95  				{
    96  					Metric: "*",
    97  					From:   0,
    98  					Until:  1,
    99  				}: {
   100  					types.MakeMetricData("test.metric2;tag1=value1", []float64{1, 2, 3, 4, 5}, 1, now32),
   101  				},
   102  			},
   103  			[]*types.MetricData{
   104  				types.MakeMetricData("new2", []float64{1, 2, 3, 4, 5}, 1, now32).SetTag("tag1", "value1"),
   105  			},
   106  		},
   107  		{
   108  			// non-existing alias
   109  			`aliasByRedis(*,"alias")`,
   110  			map[parser.MetricRequest][]*types.MetricData{
   111  				{
   112  					Metric: "*",
   113  					From:   0,
   114  					Until:  1,
   115  				}: {
   116  					types.MakeMetricData("test.metric3", []float64{1, 2, 3, 4, 5}, 1, now32),
   117  					types.MakeMetricData("test.metric3;tag1=value1", []float64{1, 2, 3, 4, 5}, 1, now32),
   118  				},
   119  			},
   120  			[]*types.MetricData{
   121  				types.MakeMetricData("test.metric3", []float64{1, 2, 3, 4, 5}, 1, now32),
   122  				types.MakeMetricData("test.metric3;tag1=value1", []float64{1, 2, 3, 4, 5}, 1, now32),
   123  			},
   124  		},
   125  		{
   126  			// save full path
   127  			`aliasByRedis(test.metric2,"alias", true)`,
   128  			map[parser.MetricRequest][]*types.MetricData{
   129  				{
   130  					Metric: "test.metric2",
   131  					From:   0,
   132  					Until:  1,
   133  				}: {
   134  					types.MakeMetricData("test.metric2", []float64{1, 2, 3, 4, 5}, 1, now32),
   135  				},
   136  			},
   137  			[]*types.MetricData{types.MakeMetricData("test.new2",
   138  				[]float64{1, 2, 3, 4, 5}, 1, now32)},
   139  		},
   140  	}
   141  
   142  	for _, tt := range tests {
   143  		testName := tt.Target
   144  		t.Run(testName, func(t *testing.T) {
   145  			eval := th.EvaluatorFromFunc(md[0].F)
   146  			th.TestEvalExpr(t, eval, &tt)
   147  		})
   148  	}
   149  }