diff --git a/pkg/tsdb/prometheus/prometheus_test.go b/pkg/tsdb/prometheus/prometheus_test.go new file mode 100644 index 00000000000..d5ee22300a7 --- /dev/null +++ b/pkg/tsdb/prometheus/prometheus_test.go @@ -0,0 +1,103 @@ +package prometheus + +import ( + "context" + "net/http" + "testing" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/datasource" + sdkHttpClient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" + "github.com/grafana/grafana/pkg/infra/httpclient" + "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/setting" + "github.com/stretchr/testify/require" +) + +type fakeSender struct{} + +func (sender *fakeSender) Send(resp *backend.CallResourceResponse) error { + return nil +} + +type fakeRoundtripper struct{} + +func (rt *fakeRoundtripper) RoundTrip(req *http.Request) (*http.Response, error) { + return &http.Response{ + Status: "200", + StatusCode: 200, + Header: nil, + Body: nil, + ContentLength: 0, + }, nil +} + +type fakeHTTPClientProvider struct { + httpclient.Provider + opts []sdkHttpClient.Options +} + +func (provider *fakeHTTPClientProvider) New(opts ...sdkHttpClient.Options) (*http.Client, error) { + client := &http.Client{} + client.Transport = &fakeRoundtripper{} + provider.opts = opts + return client, nil +} + +func TestClient(t *testing.T) { + t.Run("Service", func(t *testing.T) { + t.Run("CallResource", func(t *testing.T) { + t.Run("Adds correct headers", func(t *testing.T) { + // Not a great test as right now we put the headers form request and custom headers into a client during + // it's creation and then relly on sdk middleware to add it to the request later on. This is hard to + // test so for now this just checks if the correct headers are passed to the http client not whether + // they are actually added to the request. + + httpProvider := &fakeHTTPClientProvider{} + service := &Service{ + im: datasource.NewInstanceManager(newInstanceSettings(httpProvider, &setting.Cfg{}, &featuremgmt.FeatureManager{}, nil)), + } + + req := &backend.CallResourceRequest{ + PluginContext: backend.PluginContext{ + OrgID: 0, + PluginID: "prometheus", + User: nil, + AppInstanceSettings: nil, + DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{ + ID: 0, + UID: "", + Type: "prometheus", + Name: "test-prom", + URL: "http://localhost:9090", + User: "", + Database: "", + BasicAuthEnabled: true, + BasicAuthUser: "admin", + // Custom headers from data source configuration + JSONData: []byte("{\"httpHeaderName1\":\"x-tenant-id\"}"), + DecryptedSecureJSONData: map[string]string{ + "httpHeaderValue1": "0987", + }, + Updated: time.Time{}, + }, + }, + Path: "/api/v1/series", + Method: http.MethodPost, + URL: "/api/v1/series", + // Header in the request itself sent from the browser + Headers: map[string][]string{ + "foo": {"bar"}, + }, + Body: []byte("match%5B%5D: ALERTS\nstart: 1655271408\nend: 1655293008"), + } + + sender := &fakeSender{} + err := service.CallResource(context.Background(), req, sender) + require.NoError(t, err) + require.Equal(t, map[string]string{"X-Tenant-Id": "0987", "foo": "bar"}, httpProvider.opts[0].Headers) + }) + }) + }) +} diff --git a/pkg/tsdb/prometheus/resource/resource.go b/pkg/tsdb/prometheus/resource/resource.go index c6479f68185..4c58be8d5ce 100644 --- a/pkg/tsdb/prometheus/resource/resource.go +++ b/pkg/tsdb/prometheus/resource/resource.go @@ -81,8 +81,6 @@ func New( return nil, fmt.Errorf("error reading settings: %w", err) } - p := client.NewProvider(settings, jsonData, httpClientProvider, cfg, features, plog) - customHeaders := make(map[string]string) var jsonDataMap map[string]interface{} @@ -113,7 +111,7 @@ func New( return &Resource{ log: plog, - provider: p, + provider: client.NewProvider(settings, jsonData, httpClientProvider, cfg, features, plog), customHeaders: customHeaders, }, nil }