forked from grafana.jool/grafana-jool
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
5.2 KiB
186 lines
5.2 KiB
package promclient_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"testing"
|
|
|
|
"github.com/grafana/grafana/pkg/tsdb/prometheus/promclient"
|
|
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
|
|
|
sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
|
"github.com/grafana/grafana/pkg/infra/httpclient"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
var headers = map[string]string{"Authorization": "token", "X-ID-Token": "id-token"}
|
|
|
|
func TestGetClient(t *testing.T) {
|
|
t.Run("it sets the SigV4 service if it exists", func(t *testing.T) {
|
|
tc := setup(`{"sigV4Auth":true}`)
|
|
|
|
setting.SigV4AuthEnabled = true
|
|
defer func() { setting.SigV4AuthEnabled = false }()
|
|
|
|
_, err := tc.promClientProvider.GetClient(headers)
|
|
require.Nil(t, err)
|
|
|
|
require.Equal(t, "aps", tc.httpProvider.opts.SigV4.Service)
|
|
})
|
|
|
|
t.Run("it always uses the custom params and custom headers middlewares", func(t *testing.T) {
|
|
tc := setup()
|
|
|
|
_, err := tc.promClientProvider.GetClient(headers)
|
|
require.Nil(t, err)
|
|
|
|
require.Len(t, tc.httpProvider.middlewares(), 2)
|
|
require.Contains(t, tc.httpProvider.middlewares(), "prom-custom-query-parameters")
|
|
require.Contains(t, tc.httpProvider.middlewares(), "CustomHeaders")
|
|
})
|
|
|
|
t.Run("oauth pass through", func(t *testing.T) {
|
|
t.Run("it sets the headers when 'oauthPassThru' is true and auth headers are passed", func(t *testing.T) {
|
|
tc := setup(`{"oauthPassThru":true}`)
|
|
_, err := tc.promClientProvider.GetClient(headers)
|
|
require.Nil(t, err)
|
|
|
|
require.Equal(t, headers, tc.httpProvider.opts.Headers)
|
|
})
|
|
|
|
t.Run("it only sets auth headers", func(t *testing.T) {
|
|
withNonAuth := map[string]string{"X-Not-Auth": "stuff"}
|
|
|
|
tc := setup(`{"oauthPassThru":true}`)
|
|
_, err := tc.promClientProvider.GetClient(withNonAuth)
|
|
require.Nil(t, err)
|
|
|
|
require.Equal(t, map[string]string{}, tc.httpProvider.opts.Headers)
|
|
})
|
|
|
|
t.Run("it does not error when headers are nil", func(t *testing.T) {
|
|
tc := setup(`{"oauthPassThru":true}`)
|
|
|
|
_, err := tc.promClientProvider.GetClient(nil)
|
|
require.Nil(t, err)
|
|
})
|
|
|
|
t.Run("it does not set the headers when 'oauthPassThru' is false", func(t *testing.T) {
|
|
tc := setup()
|
|
_, err := tc.promClientProvider.GetClient(headers)
|
|
require.Nil(t, err)
|
|
|
|
require.Len(t, tc.httpProvider.opts.Headers, 0)
|
|
})
|
|
})
|
|
|
|
t.Run("force get middleware", func(t *testing.T) {
|
|
t.Run("it add the force-get middleware when httpMethod is get", func(t *testing.T) {
|
|
tc := setup(`{"httpMethod":"get"}`)
|
|
|
|
_, err := tc.promClientProvider.GetClient(headers)
|
|
require.Nil(t, err)
|
|
|
|
require.Len(t, tc.httpProvider.middlewares(), 3)
|
|
require.Contains(t, tc.httpProvider.middlewares(), "force-http-get")
|
|
})
|
|
|
|
t.Run("it add the force-get middleware when httpMethod is get", func(t *testing.T) {
|
|
tc := setup(`{"httpMethod":"GET"}`)
|
|
|
|
_, err := tc.promClientProvider.GetClient(headers)
|
|
require.Nil(t, err)
|
|
|
|
require.Len(t, tc.httpProvider.middlewares(), 3)
|
|
require.Contains(t, tc.httpProvider.middlewares(), "force-http-get")
|
|
})
|
|
|
|
t.Run("it does not add the force-get middleware when httpMethod is POST", func(t *testing.T) {
|
|
tc := setup(`{"httpMethod":"POST"}`)
|
|
|
|
_, err := tc.promClientProvider.GetClient(headers)
|
|
require.Nil(t, err)
|
|
|
|
require.NotContains(t, tc.httpProvider.middlewares(), "force-http-get")
|
|
})
|
|
|
|
t.Run("it does not add the force-get middleware when json data is nil", func(t *testing.T) {
|
|
tc := setup()
|
|
|
|
_, err := tc.promClientProvider.GetClient(headers)
|
|
require.Nil(t, err)
|
|
|
|
require.NotContains(t, tc.httpProvider.middlewares(), "force-http-get")
|
|
})
|
|
|
|
t.Run("it does not add the force-get middleware when json data is empty", func(t *testing.T) {
|
|
tc := setup(`{}`)
|
|
|
|
_, err := tc.promClientProvider.GetClient(headers)
|
|
require.Nil(t, err)
|
|
|
|
require.NotContains(t, tc.httpProvider.middlewares(), "force-http-get")
|
|
})
|
|
|
|
t.Run("it does not add the force-get middleware httpMethod is null", func(t *testing.T) {
|
|
tc := setup(`{"httpMethod":null}`)
|
|
|
|
_, err := tc.promClientProvider.GetClient(headers)
|
|
require.Nil(t, err)
|
|
|
|
require.NotContains(t, tc.httpProvider.middlewares(), "force-http-get")
|
|
})
|
|
})
|
|
}
|
|
|
|
func setup(jsonData ...string) *testContext {
|
|
var rawData []byte
|
|
if len(jsonData) > 0 {
|
|
rawData = []byte(jsonData[0])
|
|
}
|
|
|
|
var jd promclient.JsonData
|
|
_ = json.Unmarshal(rawData, &jd)
|
|
|
|
settings := backend.DataSourceInstanceSettings{URL: "test-url", JSONData: rawData}
|
|
hp := &fakeHttpClientProvider{}
|
|
p := promclient.NewProvider(settings, jd, hp, nil)
|
|
|
|
return &testContext{
|
|
httpProvider: hp,
|
|
promClientProvider: p,
|
|
}
|
|
}
|
|
|
|
type testContext struct {
|
|
httpProvider *fakeHttpClientProvider
|
|
promClientProvider *promclient.Provider
|
|
}
|
|
|
|
type fakeHttpClientProvider struct {
|
|
httpclient.Provider
|
|
|
|
opts sdkhttpclient.Options
|
|
}
|
|
|
|
func (p *fakeHttpClientProvider) GetTransport(opts ...sdkhttpclient.Options) (http.RoundTripper, error) {
|
|
p.opts = opts[0]
|
|
return http.DefaultTransport, nil
|
|
}
|
|
|
|
func (p *fakeHttpClientProvider) middlewares() []string {
|
|
var middlewareNames []string
|
|
for _, m := range p.opts.Middlewares {
|
|
mw, ok := m.(sdkhttpclient.MiddlewareName)
|
|
if !ok {
|
|
panic("unexpected middleware type")
|
|
}
|
|
|
|
middlewareNames = append(middlewareNames, mw.MiddlewareName())
|
|
}
|
|
return middlewareNames
|
|
}
|
|
|