From eceae5d1013cf985dc2d00b1a1aad1a1beee0ab4 Mon Sep 17 00:00:00 2001 From: slorello89 Date: Mon, 12 Jun 2023 15:50:02 -0400 Subject: [PATCH 1/3] handling scalars in JSON.GET --- pkg/redis-json.go | 25 ++++++++++++++++++------- pkg/redis-json_test.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/pkg/redis-json.go b/pkg/redis-json.go index 3898231..4bc5e3e 100644 --- a/pkg/redis-json.go +++ b/pkg/redis-json.go @@ -122,16 +122,27 @@ func queryJsonGet(qm queryModel, client redisClient) backend.DataResponse { // Value switch e := entry.(type) { - case string: + case string, bool, float64: i := "Value" if _, ok := fields[i]; !ok { - fields[i] = data.NewField(i, nil, []string{}) - frame.Fields = append(frame.Fields, fields[i]) - - // Generate empty values for all previous rows - for j := 0; j < rowscount-1; j++ { - fields[i].Append("") + switch entry.(type) { + case string: + fields[i] = data.NewField(i, nil, []string{}) + for j := 0; j < rowscount-1; j++ { + fields[i].Append("") + } + case bool: + fields[i] = data.NewField(i, nil, []bool{}) + for j := 0; j < rowscount-1; j++ { + fields[i].Append(false) + } + case float64: + fields[i] = data.NewField(i, nil, []float64{}) + for j := 0; j < rowscount-1; j++ { + fields[i].Append(0) + } } + frame.Fields = append(frame.Fields, fields[i]) } // Insert value for current row diff --git a/pkg/redis-json_test.go b/pkg/redis-json_test.go index e6b5e40..973e32e 100644 --- a/pkg/redis-json_test.go +++ b/pkg/redis-json_test.go @@ -2,12 +2,25 @@ package main import ( "errors" + "fmt" + "github.com/mediocregopher/radix/v3" "testing" "github.com/redisgrafana/grafana-redis-datasource/pkg/models" "github.com/stretchr/testify/require" ) +func TestQueryGetNumber(t *testing.T) { + // Client + radixClient, _ := radix.NewPool("tcp", fmt.Sprintf("%s:%d", "localhost", 6379), 10) + client := radixV3Impl{radixClient: radixClient} + + qm := queryModel{Command: "JSON.GET", Key: "test:2", Path: "$.age"} + + queryJsonGet(qm, &client) + +} + /** * Type and Length commands with Key and Path */ @@ -160,6 +173,29 @@ func TestQueryJsonObjKeys(t *testing.T) { func TestQueryJsonGet(t *testing.T) { t.Parallel() + t.Run("Should return a single float64 in frame", func(t *testing.T) { + t.Parallel() + + client := testClient{rcv: "[42]"} + + resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client) + + require.Len(t, resp.Frames, 1) + require.Len(t, resp.Frames[0].Fields, 1) + require.Equal(t, resp.Frames[0].Fields[0].At(0), float64(42)) + + }) + + t.Run("Should return a single boolean in frame", func(t *testing.T) { + t.Parallel() + + client := testClient{rcv: "[true]"} + resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.bool"}, &client) + require.Len(t, resp.Frames, 1) + require.Len(t, resp.Frames[0].Fields, 1) + require.Equal(t, resp.Frames[0].Fields[0].At(0), true) + }) + t.Run("should handle encoded JSON with string", func(t *testing.T) { t.Parallel() From 23a3efd742718d8ad6170883fbf6c1af7a38c3eb Mon Sep 17 00:00:00 2001 From: slorello89 Date: Mon, 12 Jun 2023 15:54:44 -0400 Subject: [PATCH 2/3] removing accidentally added test --- pkg/redis-json_test.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/pkg/redis-json_test.go b/pkg/redis-json_test.go index 973e32e..3b7d2df 100644 --- a/pkg/redis-json_test.go +++ b/pkg/redis-json_test.go @@ -2,25 +2,12 @@ package main import ( "errors" - "fmt" - "github.com/mediocregopher/radix/v3" "testing" "github.com/redisgrafana/grafana-redis-datasource/pkg/models" "github.com/stretchr/testify/require" ) -func TestQueryGetNumber(t *testing.T) { - // Client - radixClient, _ := radix.NewPool("tcp", fmt.Sprintf("%s:%d", "localhost", 6379), 10) - client := radixV3Impl{radixClient: radixClient} - - qm := queryModel{Command: "JSON.GET", Key: "test:2", Path: "$.age"} - - queryJsonGet(qm, &client) - -} - /** * Type and Length commands with Key and Path */ From 8886c47dbf3b41c2e953366be4aac0bad6721a0b Mon Sep 17 00:00:00 2001 From: slorello89 Date: Tue, 13 Jun 2023 07:08:40 -0400 Subject: [PATCH 3/3] adding tests for scalar arrys --- pkg/redis-json.go | 2 +- pkg/redis-json_test.go | 49 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/pkg/redis-json.go b/pkg/redis-json.go index 4bc5e3e..0a94b45 100644 --- a/pkg/redis-json.go +++ b/pkg/redis-json.go @@ -139,7 +139,7 @@ func queryJsonGet(qm queryModel, client redisClient) backend.DataResponse { case float64: fields[i] = data.NewField(i, nil, []float64{}) for j := 0; j < rowscount-1; j++ { - fields[i].Append(0) + fields[i].Append(float64(0)) } } frame.Fields = append(frame.Fields, fields[i]) diff --git a/pkg/redis-json_test.go b/pkg/redis-json_test.go index 3b7d2df..49192ab 100644 --- a/pkg/redis-json_test.go +++ b/pkg/redis-json_test.go @@ -160,6 +160,55 @@ func TestQueryJsonObjKeys(t *testing.T) { func TestQueryJsonGet(t *testing.T) { t.Parallel() + t.Run("Should return four strings in frame", func(t *testing.T) { + t.Parallel() + + client := testClient{rcv: "[[],\"gin\",\"rum\",\"whiskey\"]"} + + resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client) + + require.Len(t, resp.Frames, 1) + require.Len(t, resp.Frames[0].Fields, 1) + require.Equal(t, resp.Frames[0].Fields[0].Len(), 4) + require.Equal(t, resp.Frames[0].Fields[0].At(0), "") + require.Equal(t, resp.Frames[0].Fields[0].At(1), "gin") + require.Equal(t, resp.Frames[0].Fields[0].At(2), "rum") + require.Equal(t, resp.Frames[0].Fields[0].At(3), "whiskey") + }) + + t.Run("Should return four booleans in frame", func(t *testing.T) { + t.Parallel() + + client := testClient{rcv: "[[],true,false,true]"} + + resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client) + + require.Len(t, resp.Frames, 1) + require.Len(t, resp.Frames[0].Fields, 1) + require.Equal(t, resp.Frames[0].Fields[0].Len(), 4) + require.Equal(t, resp.Frames[0].Fields[0].At(0), false) + require.Equal(t, resp.Frames[0].Fields[0].At(1), true) + require.Equal(t, resp.Frames[0].Fields[0].At(2), false) + require.Equal(t, resp.Frames[0].Fields[0].At(3), true) + }) + + t.Run("Should return four float64 in frame", func(t *testing.T) { + t.Parallel() + + client := testClient{rcv: "[[],42,43,44]"} + + resp := queryJsonGet(queryModel{Command: models.JsonGet, Key: "test:json", Path: "$.num"}, &client) + + require.Len(t, resp.Frames, 1) + require.Len(t, resp.Frames[0].Fields, 1) + require.Equal(t, resp.Frames[0].Fields[0].Len(), 4) + require.Equal(t, resp.Frames[0].Fields[0].At(0), float64(0)) + require.Equal(t, resp.Frames[0].Fields[0].At(1), float64(42)) + require.Equal(t, resp.Frames[0].Fields[0].At(2), float64(43)) + require.Equal(t, resp.Frames[0].Fields[0].At(3), float64(44)) + + }) + t.Run("Should return a single float64 in frame", func(t *testing.T) { t.Parallel()