QueryService: Return application/json and better errors (#84234)
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||
@@ -48,50 +49,25 @@ func TestIntegrationSimpleQuery(t *testing.T) {
|
||||
Version: "v0alpha1",
|
||||
})
|
||||
|
||||
q1 := data.DataQuery{
|
||||
CommonQueryProperties: data.CommonQueryProperties{
|
||||
RefID: "X",
|
||||
Datasource: &data.DataSourceRef{
|
||||
Type: "grafana-testdata-datasource",
|
||||
UID: ds.UID,
|
||||
},
|
||||
},
|
||||
}
|
||||
q1.Set("scenarioId", "csv_content")
|
||||
q1.Set("csvContent", "a\n1")
|
||||
|
||||
q2 := data.DataQuery{
|
||||
CommonQueryProperties: data.CommonQueryProperties{
|
||||
RefID: "Y",
|
||||
Datasource: &data.DataSourceRef{
|
||||
UID: "__expr__",
|
||||
},
|
||||
},
|
||||
}
|
||||
q2.Set("type", "math")
|
||||
q2.Set("expression", "$X + 2")
|
||||
|
||||
body, err := json.Marshal(&data.QueryDataRequest{
|
||||
Queries: []data.DataQuery{
|
||||
q1, q2,
|
||||
// https://github.com/grafana/grafana-plugin-sdk-go/pull/921
|
||||
// data.NewDataQuery(map[string]any{
|
||||
// "refId": "X",
|
||||
// "datasource": data.DataSourceRef{
|
||||
// Type: "grafana-testdata-datasource",
|
||||
// UID: ds.UID,
|
||||
// },
|
||||
// "scenarioId": "csv_content",
|
||||
// "csvContent": "a\n1",
|
||||
// }),
|
||||
// data.NewDataQuery(map[string]any{
|
||||
// "refId": "Y",
|
||||
// "datasource": data.DataSourceRef{
|
||||
// UID: "__expr__",
|
||||
// },
|
||||
// "type": "math",
|
||||
// "expression": "$X + 2",
|
||||
// }),
|
||||
data.NewDataQuery(map[string]any{
|
||||
"refId": "X",
|
||||
"datasource": data.DataSourceRef{
|
||||
Type: "grafana-testdata-datasource",
|
||||
UID: ds.UID,
|
||||
},
|
||||
"scenarioId": "csv_content",
|
||||
"csvContent": "a\n1",
|
||||
}),
|
||||
data.NewDataQuery(map[string]any{
|
||||
"refId": "Y",
|
||||
"datasource": data.DataSourceRef{
|
||||
UID: "__expr__",
|
||||
},
|
||||
"type": "math",
|
||||
"expression": "$X + 2",
|
||||
}),
|
||||
},
|
||||
})
|
||||
|
||||
@@ -108,6 +84,10 @@ func TestIntegrationSimpleQuery(t *testing.T) {
|
||||
|
||||
require.NoError(t, result.Error())
|
||||
|
||||
contentType := "?"
|
||||
result.ContentType(&contentType)
|
||||
require.Equal(t, "application/json", contentType)
|
||||
|
||||
body, err = result.Raw()
|
||||
require.NoError(t, err)
|
||||
fmt.Printf("OUT: %s", string(body))
|
||||
@@ -126,4 +106,54 @@ func TestIntegrationSimpleQuery(t *testing.T) {
|
||||
require.Equal(t, int64(1), vX)
|
||||
require.Equal(t, float64(3), vY) // 1 + 2, but always float64
|
||||
})
|
||||
|
||||
t.Run("Gets an error with invalid queries", func(t *testing.T) {
|
||||
client := helper.Org1.Admin.RESTClient(t, &schema.GroupVersion{
|
||||
Group: "query.grafana.app",
|
||||
Version: "v0alpha1",
|
||||
})
|
||||
|
||||
body, err := json.Marshal(&data.QueryDataRequest{
|
||||
Queries: []data.DataQuery{
|
||||
data.NewDataQuery(map[string]any{
|
||||
"refId": "Y",
|
||||
"datasource": data.DataSourceRef{
|
||||
UID: "__expr__",
|
||||
},
|
||||
"type": "math",
|
||||
"expression": "$X + 2", // invalid X does not exit
|
||||
}),
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
result := client.Post().
|
||||
Namespace("default").
|
||||
Suffix("query").
|
||||
SetHeader("Content-type", "application/json").
|
||||
Body(body).
|
||||
Do(context.Background())
|
||||
|
||||
body, err = result.Raw()
|
||||
//fmt.Printf("OUT: %s", string(body))
|
||||
|
||||
require.Error(t, err, "expecting a 400")
|
||||
require.JSONEq(t, `{
|
||||
"status": "Failure",
|
||||
"metadata": {},
|
||||
"message": "did not execute expression [Y] due to a failure to of the dependent expression or query [X]",
|
||||
"reason": "BadRequest",
|
||||
"details": { "group": "query.grafana.app" },
|
||||
"code": 400,
|
||||
"messageId": "sse.dependencyError",
|
||||
"extra": { "depRefId": "X", "refId": "Y" }
|
||||
}`, string(body))
|
||||
|
||||
statusCode := -1
|
||||
contentType := "?"
|
||||
result.ContentType(&contentType)
|
||||
result.StatusCode(&statusCode)
|
||||
require.Equal(t, "application/json", contentType)
|
||||
require.Equal(t, http.StatusBadRequest, statusCode)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user