QueryService: Return application/json and better errors (#84234)

This commit is contained in:
Ryan McKinley
2024-03-19 16:52:15 +03:00
committed by GitHub
parent d1f791cf1f
commit e27c08cfa9
10 changed files with 293 additions and 92 deletions
+72 -42
View File
@@ -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)
})
}