@ -10,6 +10,7 @@ import (
"github.com/google/go-cmp/cmp"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/xorcare/pointer"
)
@ -18,6 +19,14 @@ func prepare(text string) io.ReadCloser {
return ioutil . NopCloser ( strings . NewReader ( text ) )
}
func addQueryToQueries ( query Query ) [ ] Query {
var queries [ ] Query
query . RefID = "A"
query . RawQuery = "Test raw query"
queries = append ( queries , query )
return queries
}
func TestInfluxdbResponseParser ( t * testing . T ) {
t . Run ( "Influxdb response parser should handle invalid JSON" , func ( t * testing . T ) {
parser := & ResponseParser { }
@ -26,7 +35,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
query := & Query { }
result := parser . Parse ( prepare ( response ) , query )
result := parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
require . Nil ( t , result . Responses [ "A" ] . Frames )
require . Error ( t , result . Responses [ "A" ] . Error )
@ -72,8 +81,9 @@ func TestInfluxdbResponseParser(t *testing.T) {
} ) ,
newField ,
)
testFrame . Meta = & data . FrameMeta { ExecutedQueryString : "Test raw query" }
result := parser . Parse ( prepare ( response ) , query )
result := parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame := result . Responses [ "A" ]
if diff := cmp . Diff ( testFrame , frame . Frames [ 0 ] , data . FrameTestCompareOptions ( ) ... ) ; diff != "" {
@ -81,6 +91,61 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
} )
t . Run ( "Influxdb response parser should parse two responses with different refIDs" , func ( t * testing . T ) {
parser := & ResponseParser { }
response := `
{
"results" : [
{
"series" : [ { } ]
} ,
{
"series" : [ { } ]
}
]
}
`
query := & Query { }
var queries = addQueryToQueries ( * query )
queryB := & Query { }
queryB . RefID = "B"
queries = append ( queries , * queryB )
result := parser . Parse ( prepare ( response ) , queries )
assert . Len ( t , result . Responses , 2 )
assert . Contains ( t , result . Responses , "A" )
assert . Contains ( t , result . Responses , "B" )
assert . NotContains ( t , result . Responses , "C" )
} )
t . Run ( "Influxdb response parser populates the RawQuery in the response meta ExecutedQueryString" , func ( t * testing . T ) {
parser := & ResponseParser { }
response := `
{
"results" : [
{
"series" : [
{
"name" : "cpu" ,
"columns" : [ "time" , "mean" ]
}
]
}
]
}
`
query := & Query { }
query . RawQuery = "Test raw query"
result := parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame := result . Responses [ "A" ]
assert . Equal ( t , frame . Frames [ 0 ] . Meta . ExecutedQueryString , "Test raw query" )
} )
t . Run ( "Influxdb response parser with invalid value-format" , func ( t * testing . T ) {
parser := & ResponseParser { }
@ -119,8 +184,9 @@ func TestInfluxdbResponseParser(t *testing.T) {
} ) ,
newField ,
)
testFrame . Meta = & data . FrameMeta { ExecutedQueryString : "Test raw query" }
result := parser . Parse ( prepare ( response ) , query )
result := parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame := result . Responses [ "A" ]
if diff := cmp . Diff ( testFrame , frame . Frames [ 0 ] , data . FrameTestCompareOptions ( ) ... ) ; diff != "" {
@ -166,8 +232,9 @@ func TestInfluxdbResponseParser(t *testing.T) {
} ) ,
newField ,
)
testFrame . Meta = & data . FrameMeta { ExecutedQueryString : "Test raw query" }
result := parser . Parse ( prepare ( response ) , query )
result := parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame := result . Responses [ "A" ]
if diff := cmp . Diff ( testFrame , frame . Frames [ 0 ] , data . FrameTestCompareOptions ( ) ... ) ; diff != "" {
@ -217,7 +284,8 @@ func TestInfluxdbResponseParser(t *testing.T) {
} ) ,
newField ,
)
result := parser . Parse ( prepare ( response ) , query )
testFrame . Meta = & data . FrameMeta { ExecutedQueryString : "Test raw query" }
result := parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
t . Run ( "should parse aliases" , func ( t * testing . T ) {
frame := result . Responses [ "A" ]
if diff := cmp . Diff ( testFrame , frame . Frames [ 0 ] , data . FrameTestCompareOptions ( ) ... ) ; diff != "" {
@ -225,7 +293,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias $m $measurement" , Measurement : "10m" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name := "alias 10m 10m"
@ -236,7 +304,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias $col" , Measurement : "10m" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias mean"
testFrame . Name = name
@ -256,7 +324,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias $tag_datacenter" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias America"
testFrame . Name = name
@ -270,7 +338,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias $tag_datacenter/$tag_datacenter" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias America/America"
testFrame . Name = name
@ -284,7 +352,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias [[col]]" , Measurement : "10m" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias mean"
testFrame . Name = name
@ -294,7 +362,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias $0 $1 $2 $3 $4" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias cpu upc $2 $3 $4"
testFrame . Name = name
@ -304,7 +372,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias $1" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias upc"
testFrame . Name = name
@ -314,7 +382,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias $5" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias $5"
testFrame . Name = name
@ -324,7 +392,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "series alias" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "series alias"
testFrame . Name = name
@ -334,7 +402,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias [[m]] [[measurement]]" , Measurement : "10m" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias 10m 10m"
testFrame . Name = name
@ -344,7 +412,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias [[tag_datacenter]]" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias America"
testFrame . Name = name
@ -354,7 +422,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias [[tag_dc.region.name]]" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias Northeast"
testFrame . Name = name
@ -364,7 +432,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias [[tag_cluster-name]]" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias Cluster"
testFrame . Name = name
@ -374,7 +442,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias [[tag_/cluster/name/]]" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias Cluster/"
testFrame . Name = name
@ -384,7 +452,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias [[tag_@cluster@name@]]" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias Cluster@"
testFrame . Name = name
@ -395,7 +463,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
} )
t . Run ( "shouldn't parse aliases" , func ( t * testing . T ) {
query = & Query { Alias : "alias words with no brackets" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame := result . Responses [ "A" ]
name := "alias words with no brackets"
testFrame . Name = name
@ -405,7 +473,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias Test 1.5" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias Test 1.5"
testFrame . Name = name
@ -415,7 +483,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = & Query { Alias : "alias Test -1" }
result = parser . Parse ( prepare ( response ) , query )
result = parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
frame = result . Responses [ "A" ]
name = "alias Test -1"
testFrame . Name = name
@ -454,6 +522,10 @@ func TestInfluxdbResponseParser(t *testing.T) {
`
query := & Query { }
var queries = addQueryToQueries ( * query )
queryB := & Query { }
queryB . RefID = "B"
queries = append ( queries , * queryB )
labels , err := data . LabelsFromString ( "datacenter=America" )
require . Nil ( t , err )
newField := data . NewField ( "value" , labels , [ ] * float64 {
@ -469,14 +541,15 @@ func TestInfluxdbResponseParser(t *testing.T) {
} ) ,
newField ,
)
result := parser . Parse ( prepare ( response ) , query )
testFrame . Meta = & data . FrameMeta { ExecutedQueryString : "Test raw query" }
result := parser . Parse ( prepare ( response ) , queries )
frame := result . Responses [ "A" ]
if diff := cmp . Diff ( testFrame , frame . Frames [ 0 ] , data . FrameTestCompareOptions ( ) ... ) ; diff != "" {
t . Errorf ( "Result mismatch (-want +got):\n%s" , diff )
}
require . EqualError ( t , result . Responses [ "A " ] . Error , "query-timeout limit exceeded" )
require . EqualError ( t , result . Responses [ "B " ] . Error , "query-timeout limit exceeded" )
} )
t . Run ( "Influxdb response parser with top-level error" , func ( t * testing . T ) {
@ -490,7 +563,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
query := & Query { }
result := parser . Parse ( prepare ( response ) , query )
result := parser . Parse ( prepare ( response ) , addQueryToQueries ( * query ) )
require . Nil ( t , result . Responses [ "A" ] . Frames )