The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
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.
 
 
 
 
 
 
grafana/pkg/services/provisioning/plugins/config_reader_test.go

101 lines
3.2 KiB

package plugins
import (
"context"
"os"
"testing"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/plugins"
"github.com/stretchr/testify/require"
)
const (
incorrectSettings = "./testdata/test-configs/incorrect-settings"
brokenYaml = "./testdata/test-configs/broken-yaml"
emptyFolder = "./testdata/test-configs/empty_folder"
unknownApp = "./testdata/test-configs/unknown-app"
correctProperties = "./testdata/test-configs/correct-properties"
)
func TestConfigReader(t *testing.T) {
t.Run("Broken yaml should return error", func(t *testing.T) {
reader := newConfigReader(log.New("test logger"), nil)
_, err := reader.readConfig(context.Background(), brokenYaml)
require.Error(t, err)
})
t.Run("Skip invalid directory", func(t *testing.T) {
cfgProvider := newConfigReader(log.New("test logger"), nil)
cfg, err := cfgProvider.readConfig(context.Background(), emptyFolder)
require.NoError(t, err)
require.Len(t, cfg, 0)
})
t.Run("Unknown app plugin should return error", func(t *testing.T) {
cfgProvider := newConfigReader(log.New("test logger"), fakePluginStore{})
_, err := cfgProvider.readConfig(context.Background(), unknownApp)
require.Error(t, err)
require.Equal(t, "plugin not installed: \"nonexisting\"", err.Error())
})
t.Run("Read incorrect properties", func(t *testing.T) {
cfgProvider := newConfigReader(log.New("test logger"), nil)
_, err := cfgProvider.readConfig(context.Background(), incorrectSettings)
require.Error(t, err)
require.Equal(t, "app item 1 in configuration doesn't contain required field type", err.Error())
})
t.Run("Can read correct properties", func(t *testing.T) {
pm := fakePluginStore{
apps: map[string]plugins.PluginDTO{
"test-plugin": {},
"test-plugin-2": {},
},
}
err := os.Setenv("ENABLE_PLUGIN_VAR", "test-plugin")
require.NoError(t, err)
t.Cleanup(func() {
_ = os.Unsetenv("ENABLE_PLUGIN_VAR")
})
cfgProvider := newConfigReader(log.New("test logger"), pm)
cfg, err := cfgProvider.readConfig(context.Background(), correctProperties)
require.NoError(t, err)
require.Len(t, cfg, 1)
testCases := []struct {
ExpectedPluginID string
ExpectedOrgID int64
ExpectedOrgName string
ExpectedEnabled bool
}{
{ExpectedPluginID: "test-plugin", ExpectedOrgID: 2, ExpectedOrgName: "", ExpectedEnabled: true},
{ExpectedPluginID: "test-plugin-2", ExpectedOrgID: 3, ExpectedOrgName: "", ExpectedEnabled: false},
{ExpectedPluginID: "test-plugin", ExpectedOrgID: 0, ExpectedOrgName: "Org 3", ExpectedEnabled: true},
{ExpectedPluginID: "test-plugin-2", ExpectedOrgID: 1, ExpectedOrgName: "", ExpectedEnabled: true},
}
for index, tc := range testCases {
app := cfg[0].Apps[index]
require.NotNil(t, app)
require.Equal(t, tc.ExpectedPluginID, app.PluginID)
require.Equal(t, tc.ExpectedOrgID, app.OrgID)
require.Equal(t, tc.ExpectedOrgName, app.OrgName)
require.Equal(t, tc.ExpectedEnabled, app.Enabled)
}
})
}
type fakePluginStore struct {
plugins.Store
apps map[string]plugins.PluginDTO
}
func (pr fakePluginStore) Plugin(_ context.Context, pluginID string) (plugins.PluginDTO, bool) {
p, exists := pr.apps[pluginID]
return p, exists
}