* Use secrets service in pluginproxy
* Use secrets service in pluginxontext
* Use secrets service in pluginsettings
* Use secrets service in provisioning
* Use secrets service in authinfoservice
* Use secrets service in api
* Use secrets service in sqlstore
* Use secrets service in dashboardshapshots
* Use secrets service in tsdb
* Use secrets service in datasources
* Use secrets service in alerting
* Use secrets service in ngalert
* Break cyclic dependancy
* Refactor service
* Break cyclic dependancy
* Add FakeSecretsStore
* Setup Secrets Service in sqlstore
* Fix
* Continue secrets service refactoring
* Fix cyclic dependancy in sqlstore tests
* Fix secrets service references
* Fix linter errors
* Add fake secrets service for tests
* Refactor SetupTestSecretsService
* Update setting up secret service in tests
* Fix missing secrets service in multiorg_alertmanager_test
* Use fake db in tests and sort imports
* Use fake db in datasources tests
* Fix more tests
* Fix linter issues
* Attempt to fix plugin proxy tests
* Pass secrets service to getPluginProxiedRequest in pluginproxy tests
* Fix pluginproxy tests
* Revert using secrets service in alerting and provisioning
* Update decryptFn in alerting migration
* Rename defaultProvider to currentProvider
* Use fake secrets service in alert channels tests
* Refactor secrets service test helper
* Update setting up secrets service in tests
* Revert alerting changes in api
* Add comments
* Remove secrets service from background services
* Convert global encryption functions into vars
* Revert "Convert global encryption functions into vars"
This reverts commit 498eb19859.
* Add feature toggle for envelope encryption
* Rename toggle
Co-authored-by: Emil Tullstedt <emil.tullstedt@grafana.com>
Co-authored-by: Joan López de la Franca Beltran <joanjan14@gmail.com>
123 lines
3.8 KiB
Go
123 lines
3.8 KiB
Go
package tsdb
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
|
"github.com/grafana/grafana/pkg/bus"
|
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
|
"github.com/grafana/grafana/pkg/models"
|
|
"github.com/grafana/grafana/pkg/plugins"
|
|
"github.com/grafana/grafana/pkg/services/datasources"
|
|
"github.com/grafana/grafana/pkg/services/secrets/fakes"
|
|
secretsManager "github.com/grafana/grafana/pkg/services/secrets/manager"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
"golang.org/x/oauth2"
|
|
)
|
|
|
|
func TestHandleRequest(t *testing.T) {
|
|
t.Run("Should invoke plugin manager QueryData when handling request for query", func(t *testing.T) {
|
|
svc, _, pm := createService(t)
|
|
backendPluginManagerCalled := false
|
|
pm.QueryDataHandlerFunc = func(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
|
backendPluginManagerCalled = true
|
|
return backend.NewQueryDataResponse(), nil
|
|
}
|
|
|
|
ds := &models.DataSource{Id: 12, Type: "unregisteredType", JsonData: simplejson.New()}
|
|
req := plugins.DataQuery{
|
|
TimeRange: &plugins.DataTimeRange{},
|
|
Queries: []plugins.DataSubQuery{
|
|
{RefID: "A", DataSource: &models.DataSource{Id: 1, Type: "test"}, Model: simplejson.New()},
|
|
{RefID: "B", DataSource: &models.DataSource{Id: 1, Type: "test"}, Model: simplejson.New()},
|
|
},
|
|
}
|
|
_, err := svc.HandleRequest(context.Background(), ds, req)
|
|
require.NoError(t, err)
|
|
require.True(t, backendPluginManagerCalled)
|
|
})
|
|
}
|
|
|
|
//nolint: staticcheck // plugins.DataPlugin deprecated
|
|
type resultsFn func(context plugins.DataQuery) plugins.DataQueryResult
|
|
|
|
type fakeExecutor struct {
|
|
//nolint: staticcheck // plugins.DataPlugin deprecated
|
|
results map[string]plugins.DataQueryResult
|
|
resultsFn map[string]resultsFn
|
|
}
|
|
|
|
//nolint: staticcheck // plugins.DataPlugin deprecated
|
|
func (e *fakeExecutor) DataQuery(ctx context.Context, dsInfo *models.DataSource, context plugins.DataQuery) (
|
|
plugins.DataResponse, error) {
|
|
result := plugins.DataResponse{Results: make(map[string]plugins.DataQueryResult)}
|
|
for _, query := range context.Queries {
|
|
if results, has := e.results[query.RefID]; has {
|
|
result.Results[query.RefID] = results
|
|
}
|
|
if testFunc, has := e.resultsFn[query.RefID]; has {
|
|
result.Results[query.RefID] = testFunc(context)
|
|
}
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func (e *fakeExecutor) Return(refID string, series plugins.DataTimeSeriesSlice) {
|
|
//nolint: staticcheck // plugins.DataPlugin deprecated
|
|
e.results[refID] = plugins.DataQueryResult{
|
|
RefID: refID, Series: series,
|
|
}
|
|
}
|
|
|
|
func (e *fakeExecutor) HandleQuery(refId string, fn resultsFn) {
|
|
e.resultsFn[refId] = fn
|
|
}
|
|
|
|
type fakePluginsClient struct {
|
|
plugins.Client
|
|
backend.QueryDataHandlerFunc
|
|
}
|
|
|
|
func (m *fakePluginsClient) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
|
if m.QueryDataHandlerFunc != nil {
|
|
return m.QueryDataHandlerFunc.QueryData(ctx, req)
|
|
}
|
|
|
|
return nil, nil
|
|
}
|
|
|
|
type fakeOAuthTokenService struct {
|
|
}
|
|
|
|
func (s *fakeOAuthTokenService) GetCurrentOAuthToken(context.Context, *models.SignedInUser) *oauth2.Token {
|
|
return nil
|
|
}
|
|
|
|
func (s *fakeOAuthTokenService) IsOAuthPassThruEnabled(*models.DataSource) bool {
|
|
return false
|
|
}
|
|
|
|
func createService(t *testing.T) (*Service, *fakeExecutor, *fakePluginsClient) {
|
|
fakePluginsClient := &fakePluginsClient{}
|
|
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore())
|
|
dsService := datasources.ProvideService(bus.New(), nil, secretsService)
|
|
|
|
s := newService(
|
|
setting.NewCfg(),
|
|
fakePluginsClient,
|
|
&fakeOAuthTokenService{},
|
|
dsService,
|
|
)
|
|
e := &fakeExecutor{
|
|
//nolint: staticcheck // plugins.DataPlugin deprecated
|
|
results: make(map[string]plugins.DataQueryResult),
|
|
resultsFn: make(map[string]resultsFn),
|
|
}
|
|
|
|
return s, e, fakePluginsClient
|
|
}
|