mirror of
https://github.com/grafana/grafana.git
synced 2026-06-10 09:01:30 -04:00
143 lines
4.4 KiB
Go
143 lines
4.4 KiB
Go
|
|
package pluginproxy
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"crypto/tls"
|
||
|
|
"errors"
|
||
|
|
"net/http"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
||
|
|
"github.com/stretchr/testify/require"
|
||
|
|
|
||
|
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
||
|
|
"github.com/grafana/grafana/pkg/infra/httpclient"
|
||
|
|
"github.com/grafana/grafana/pkg/services/datasources"
|
||
|
|
dsfakes "github.com/grafana/grafana/pkg/services/datasources/fakes"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestNewDataSourceLoader(t *testing.T) {
|
||
|
|
ds := &datasources.DataSource{
|
||
|
|
ID: 7,
|
||
|
|
UID: "abc-123",
|
||
|
|
OrgID: 1,
|
||
|
|
Name: "My Prometheus",
|
||
|
|
Type: datasources.DS_PROMETHEUS,
|
||
|
|
URL: "https://prom.example.com",
|
||
|
|
}
|
||
|
|
|
||
|
|
loader, err := NewDataSourceLoader(ds, &dsfakes.FakeDataSourceService{})
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
require.Equal(t, datasources.DS_PROMETHEUS, loader.PluginType())
|
||
|
|
|
||
|
|
v0, err := loader.DataSource(context.Background())
|
||
|
|
require.NoError(t, err)
|
||
|
|
require.Equal(t, "abc-123", v0.Name, "ObjectMeta.Name should be the datasource UID")
|
||
|
|
require.Equal(t, "My Prometheus", v0.Spec.Title(), "Spec.Title should be the human-readable name")
|
||
|
|
require.Equal(t, "https://prom.example.com", v0.Spec.URL())
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestDataSourceLoader_PassesDataSourceToService(t *testing.T) {
|
||
|
|
ds := &datasources.DataSource{
|
||
|
|
UID: "abc-123",
|
||
|
|
Type: datasources.DS_PROMETHEUS,
|
||
|
|
URL: "https://prom.example.com",
|
||
|
|
JsonData: simplejson.New(),
|
||
|
|
}
|
||
|
|
|
||
|
|
stub := &recordingDSService{
|
||
|
|
password: "pw",
|
||
|
|
basicAuthPassword: "bap",
|
||
|
|
values: map[string]string{"key": "value"},
|
||
|
|
transport: http.DefaultTransport,
|
||
|
|
}
|
||
|
|
loader, err := NewDataSourceLoader(ds, stub)
|
||
|
|
require.NoError(t, err)
|
||
|
|
ctx := context.Background()
|
||
|
|
|
||
|
|
pw, err := loader.DecryptedPassword(ctx)
|
||
|
|
require.NoError(t, err)
|
||
|
|
require.Equal(t, "pw", pw)
|
||
|
|
|
||
|
|
bap, err := loader.DecryptedBasicAuthPassword(ctx)
|
||
|
|
require.NoError(t, err)
|
||
|
|
require.Equal(t, "bap", bap)
|
||
|
|
|
||
|
|
vals, err := loader.DecryptedValues(ctx)
|
||
|
|
require.NoError(t, err)
|
||
|
|
require.Equal(t, map[string]string{"key": "value"}, vals)
|
||
|
|
|
||
|
|
rt, err := loader.GetHTTPTransport(ctx, &noopProvider{})
|
||
|
|
require.NoError(t, err)
|
||
|
|
require.Equal(t, http.DefaultTransport, rt)
|
||
|
|
|
||
|
|
require.Same(t, ds, stub.lastPassword, "DecryptedPassword should receive the original *datasources.DataSource")
|
||
|
|
require.Same(t, ds, stub.lastBasicAuth, "DecryptedBasicAuthPassword should receive the original *datasources.DataSource")
|
||
|
|
require.Same(t, ds, stub.lastValues, "DecryptedValues should receive the original *datasources.DataSource")
|
||
|
|
require.Same(t, ds, stub.lastTransport, "GetHTTPTransport should receive the original *datasources.DataSource")
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestDataSourceLoader_PropagatesServiceError(t *testing.T) {
|
||
|
|
ds := &datasources.DataSource{UID: "abc-123", Type: datasources.DS_PROMETHEUS}
|
||
|
|
wantErr := errors.New("boom")
|
||
|
|
stub := &recordingDSService{err: wantErr}
|
||
|
|
|
||
|
|
loader, err := NewDataSourceLoader(ds, stub)
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
_, err = loader.DecryptedPassword(context.Background())
|
||
|
|
require.ErrorIs(t, err, wantErr)
|
||
|
|
}
|
||
|
|
|
||
|
|
type recordingDSService struct {
|
||
|
|
dsfakes.FakeDataSourceService
|
||
|
|
|
||
|
|
password string
|
||
|
|
basicAuthPassword string
|
||
|
|
values map[string]string
|
||
|
|
transport http.RoundTripper
|
||
|
|
err error
|
||
|
|
|
||
|
|
lastPassword *datasources.DataSource
|
||
|
|
lastBasicAuth *datasources.DataSource
|
||
|
|
lastValues *datasources.DataSource
|
||
|
|
lastTransport *datasources.DataSource
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *recordingDSService) DecryptedPassword(_ context.Context, ds *datasources.DataSource) (string, error) {
|
||
|
|
s.lastPassword = ds
|
||
|
|
return s.password, s.err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *recordingDSService) DecryptedBasicAuthPassword(_ context.Context, ds *datasources.DataSource) (string, error) {
|
||
|
|
s.lastBasicAuth = ds
|
||
|
|
return s.basicAuthPassword, s.err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *recordingDSService) DecryptedValues(_ context.Context, ds *datasources.DataSource) (map[string]string, error) {
|
||
|
|
s.lastValues = ds
|
||
|
|
return s.values, s.err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *recordingDSService) GetHTTPTransport(_ context.Context, ds *datasources.DataSource, _ httpclient.Provider, _ ...sdkhttpclient.Middleware) (http.RoundTripper, error) {
|
||
|
|
s.lastTransport = ds
|
||
|
|
return s.transport, s.err
|
||
|
|
}
|
||
|
|
|
||
|
|
type noopProvider struct{}
|
||
|
|
|
||
|
|
func (noopProvider) New(_ ...sdkhttpclient.Options) (*http.Client, error) {
|
||
|
|
return http.DefaultClient, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (noopProvider) GetTransport(_ ...sdkhttpclient.Options) (http.RoundTripper, error) {
|
||
|
|
return http.DefaultTransport, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (noopProvider) GetTLSConfig(_ ...sdkhttpclient.Options) (*tls.Config, error) {
|
||
|
|
return &tls.Config{}, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
var _ httpclient.Provider = noopProvider{}
|