Skip to content

Commit

Permalink
Added tests for backend part
Browse files Browse the repository at this point in the history
  • Loading branch information
dmitryk-dk committed Feb 20, 2024
1 parent 1c35687 commit 04997a0
Show file tree
Hide file tree
Showing 4 changed files with 407 additions and 2 deletions.
98 changes: 98 additions & 0 deletions pkg/plugin/query_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package plugin

import (
"testing"
)

func TestQuery_getQueryURL(t *testing.T) {
type fields struct {
RefID string
Expr string
MaxLines int
}
type args struct {
rawURL string
queryParams string
}
tests := []struct {
name string
fields fields
args args
want string
wantErr bool
}{
{
name: "empty values",
fields: fields{
RefID: "1",
Expr: "",
MaxLines: 0,
},
args: args{
rawURL: "",
queryParams: "",
},
want: "",
wantErr: true,
},
{
name: "has rawURL without params",
fields: fields{
RefID: "1",
Expr: "",
MaxLines: 0,
},
args: args{
rawURL: "http://127.0.0.1:9428",
queryParams: "",
},
want: "http://127.0.0.1:9428/select/logsql/query?limit=1000&query=",
wantErr: false,
},
{
name: "has expression and max lines",
fields: fields{
RefID: "1",
Expr: "_time:1s",
MaxLines: 10,
},
args: args{
rawURL: "http://127.0.0.1:9428",
queryParams: "",
},
want: "http://127.0.0.1:9428/select/logsql/query?limit=10&query=_time%3A1s",
wantErr: false,
},
{
name: "has expression and max lines, with queryParams",
fields: fields{
RefID: "1",
Expr: "_time:1s and syslog",
MaxLines: 10,
},
args: args{
rawURL: "http://127.0.0.1:9428",
queryParams: "a=1&b=2",
},
want: "http://127.0.0.1:9428/select/logsql/query?a=1&b=2&limit=10&query=_time%3A1s+and+syslog",
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
q := &Query{
RefID: tt.fields.RefID,
Expr: tt.fields.Expr,
MaxLines: tt.fields.MaxLines,
}
got, err := q.getQueryURL(tt.args.rawURL, tt.args.queryParams)
if (err != nil) != tt.wantErr {
t.Errorf("getQueryURL() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("getQueryURL() got = %v, want %v", got, tt.want)
}
})
}
}
5 changes: 3 additions & 2 deletions pkg/plugin/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package plugin

import (
"encoding/json"
"fmt"
"io"

"github.com/VictoriaMetrics/metricsql"
Expand Down Expand Up @@ -48,7 +49,7 @@ func parseStreamResponse(reader io.Reader) backend.DataResponse {
var r Response
err := dec.Decode(&r)
if err != nil {
return newResponseError(err, backend.StatusInternal)
return newResponseError(fmt.Errorf("error decode response: %s", err), backend.StatusInternal)
}

for fieldName, value := range r {
Expand All @@ -58,7 +59,7 @@ func parseStreamResponse(reader io.Reader) backend.DataResponse {
case timeField:
getTime, err := utils.GetTime(value)
if err != nil {
return newResponseError(err, backend.StatusInternal)
return newResponseError(fmt.Errorf("error parse time from _time field: %s", err), backend.StatusInternal)
}
timeFd.Append(getTime)
case streamField:
Expand Down
127 changes: 127 additions & 0 deletions pkg/plugin/response_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package plugin

import (
"bytes"
"fmt"
"io"
"reflect"
"testing"
"time"

"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/data"
)

func Test_parseStreamResponse(t *testing.T) {
f := func(remoteResp string) io.Reader {
return io.NopCloser(bytes.NewBuffer([]byte(remoteResp)))
}
tests := []struct {
name string
reader func(remoteResp string) io.Reader
response string
want func() backend.DataResponse
}{
{
name: "empty response",
reader: func(remoteResp string) io.Reader {
return io.NopCloser(bytes.NewBuffer([]byte(remoteResp)))
},
response: "",
want: func() backend.DataResponse {
labelsField := data.NewFieldFromFieldType(data.FieldTypeJSON, 0)
labelsField.Name = gLabelsField

timeFd := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
timeFd.Name = gTimeField

lineField := data.NewFieldFromFieldType(data.FieldTypeString, 0)
lineField.Name = gLineField

frame := data.NewFrame("", timeFd, lineField, labelsField)

rsp := backend.DataResponse{}
frame.Meta = &data.FrameMeta{}
rsp.Frames = append(rsp.Frames, frame)

return rsp
},
},
{
name: "incorrect response",
reader: f,
response: "abcd",
want: func() backend.DataResponse {
return newResponseError(fmt.Errorf("error decode response: invalid character 'a' looking for beginning of value"), backend.StatusInternal)
},
},
{
name: "incorrect time in the response",
reader: f,
response: `{"_time":"acdf"}`,
want: func() backend.DataResponse {
return newResponseError(fmt.Errorf("error parse time from _time field: cannot parse acdf: cannot parse duration \"acdf\""), backend.StatusInternal)
},
},
{
name: "incorrect time in the response",
reader: f,
response: `{"_time":"acdf"}`,
want: func() backend.DataResponse {
return newResponseError(fmt.Errorf("error parse time from _time field: cannot parse acdf: cannot parse duration \"acdf\""), backend.StatusInternal)
},
},
{
name: "invalid labels in the resposne",
reader: f,
response: `{"_time":"2024-02-20", "_stream":"{application=\"logs-benchmark-Apache.log-1708437847\",hostname=}"}`,
want: func() backend.DataResponse {
return newResponseError(fmt.Errorf("StringExpr: unexpected token \"}\"; want \"string\"; unparsed data: \"}\""), backend.StatusInternal)
},
},
{
name: "correct response line",
reader: f,
response: `{"_msg":"123","_stream":"{application=\"logs-benchmark-Apache.log-1708437847\",hostname=\"e28a622d7792\"}","_time":"2024-02-20T14:04:27Z"}`,
want: func() backend.DataResponse {
labelsField := data.NewFieldFromFieldType(data.FieldTypeJSON, 0)
labelsField.Name = gLabelsField

timeFd := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
timeFd.Name = gTimeField

lineField := data.NewFieldFromFieldType(data.FieldTypeString, 0)
lineField.Name = gLineField

timeFd.Append(time.Date(2024, 02, 20, 14, 04, 27, 0, time.UTC))

lineField.Append("123")

labels := data.Labels{
"application": "logs-benchmark-Apache.log-1708437847",
"hostname": "e28a622d7792",
}

b, _ := labelsToJSON(labels)

labelsField.Append(b)
frame := data.NewFrame("", timeFd, lineField, labelsField)

rsp := backend.DataResponse{}
frame.Meta = &data.FrameMeta{}
rsp.Frames = append(rsp.Frames, frame)

return rsp
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
r := tt.reader(tt.response)
w := tt.want()
if got := parseStreamResponse(r); !reflect.DeepEqual(got, w) {
t.Errorf("parseStreamResponse() = %#v, want %#v", got, w)
}
})
}
}
Loading

0 comments on commit 04997a0

Please sign in to comment.