mirror of https://github.com/grafana/grafana
Plugins: Update renderer plugin source (#80643)
* rework renderer plugin source * add testspull/80787/head
parent
4b113f87f9
commit
3885497553
@ -0,0 +1,71 @@ |
||||
package sources |
||||
|
||||
import ( |
||||
"errors" |
||||
"path/filepath" |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/require" |
||||
|
||||
"github.com/grafana/grafana/pkg/plugins" |
||||
) |
||||
|
||||
func TestDirAsLocalSources(t *testing.T) { |
||||
testdataDir := "../testdata" |
||||
|
||||
tests := []struct { |
||||
name string |
||||
pluginsPath string |
||||
expected []*LocalSource |
||||
err error |
||||
}{ |
||||
{ |
||||
name: "Empty path returns an error", |
||||
pluginsPath: "", |
||||
expected: []*LocalSource{}, |
||||
err: errors.New("plugins path not configured"), |
||||
}, |
||||
{ |
||||
name: "Directory with subdirectories", |
||||
pluginsPath: filepath.Join(testdataDir, "pluginRootWithDist"), |
||||
expected: []*LocalSource{ |
||||
{ |
||||
paths: []string{filepath.Join(testdataDir, "pluginRootWithDist", "datasource")}, |
||||
class: plugins.ClassExternal, |
||||
}, |
||||
{ |
||||
paths: []string{filepath.Join(testdataDir, "pluginRootWithDist", "dist")}, |
||||
class: plugins.ClassExternal, |
||||
}, |
||||
{ |
||||
paths: []string{filepath.Join(testdataDir, "pluginRootWithDist", "panel")}, |
||||
class: plugins.ClassExternal, |
||||
}, |
||||
}, |
||||
}, |
||||
{ |
||||
name: "Directory with no subdirectories", |
||||
pluginsPath: filepath.Join(testdataDir, "pluginRootWithDist", "datasource"), |
||||
expected: nil, |
||||
}, |
||||
{ |
||||
name: "Directory with a symlink to a directory", |
||||
pluginsPath: filepath.Join(testdataDir, "symbolic-plugin-dirs"), |
||||
expected: []*LocalSource{ |
||||
{ |
||||
paths: []string{filepath.Join(testdataDir, "symbolic-plugin-dirs", "plugin")}, |
||||
class: plugins.ClassExternal, |
||||
}, |
||||
}, |
||||
}, |
||||
} |
||||
for _, tt := range tests { |
||||
t.Run(tt.name, func(t *testing.T) { |
||||
got, err := DirAsLocalSources(tt.pluginsPath, plugins.ClassExternal) |
||||
if tt.err != nil { |
||||
require.Errorf(t, err, tt.err.Error()) |
||||
} |
||||
require.Equal(t, tt.expected, got) |
||||
}) |
||||
} |
||||
} |
@ -0,0 +1,82 @@ |
||||
package renderer |
||||
|
||||
import ( |
||||
"context" |
||||
"path/filepath" |
||||
"strings" |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/require" |
||||
|
||||
"github.com/grafana/grafana/pkg/plugins" |
||||
"github.com/grafana/grafana/pkg/plugins/config" |
||||
"github.com/grafana/grafana/pkg/plugins/manager/fakes" |
||||
) |
||||
|
||||
func TestRenderer(t *testing.T) { |
||||
t.Run("Test Renderer will treat directories under plugins path as individual sources", func(t *testing.T) { |
||||
testdataDir := filepath.Join("testdata", "plugins") |
||||
|
||||
numLoaded := 0 |
||||
numUnloaded := 0 |
||||
loader := &fakes.FakeLoader{ |
||||
LoadFunc: func(ctx context.Context, src plugins.PluginSource) ([]*plugins.Plugin, error) { |
||||
require.True(t, src.PluginClass(ctx) == plugins.ClassExternal) |
||||
require.Len(t, src.PluginURIs(ctx), 1) |
||||
require.True(t, strings.HasPrefix(src.PluginURIs(ctx)[0], testdataDir)) |
||||
|
||||
numLoaded++ |
||||
return []*plugins.Plugin{}, nil |
||||
}, |
||||
UnloadFunc: func(_ context.Context, _ *plugins.Plugin) (*plugins.Plugin, error) { |
||||
numUnloaded++ |
||||
return nil, nil |
||||
}, |
||||
} |
||||
cfg := &config.Cfg{ |
||||
PluginsPath: filepath.Join(testdataDir), |
||||
} |
||||
|
||||
m := NewManager(cfg, loader) |
||||
|
||||
r, exists := m.Renderer(context.Background()) |
||||
require.False(t, exists) |
||||
require.Equal(t, 4, numLoaded) |
||||
require.Equal(t, 0, numUnloaded) |
||||
require.Nil(t, r) |
||||
}) |
||||
|
||||
t.Run("Test Renderer load all directories until a plugin is returned", func(t *testing.T) { |
||||
testdataDir := filepath.Join("testdata", "plugins") |
||||
|
||||
numLoaded := 0 |
||||
numUnloaded := 0 |
||||
p := &plugins.Plugin{ |
||||
JSONData: plugins.JSONData{ID: "test"}, |
||||
} |
||||
loader := &fakes.FakeLoader{ |
||||
LoadFunc: func(ctx context.Context, src plugins.PluginSource) ([]*plugins.Plugin, error) { |
||||
numLoaded++ |
||||
if strings.HasPrefix(src.PluginURIs(ctx)[0], filepath.Join(testdataDir, "renderer")) { |
||||
return []*plugins.Plugin{p}, nil |
||||
} |
||||
return []*plugins.Plugin{}, nil |
||||
}, |
||||
UnloadFunc: func(_ context.Context, _ *plugins.Plugin) (*plugins.Plugin, error) { |
||||
numUnloaded++ |
||||
return nil, nil |
||||
}, |
||||
} |
||||
cfg := &config.Cfg{ |
||||
PluginsPath: filepath.Join(testdataDir), |
||||
} |
||||
|
||||
m := NewManager(cfg, loader) |
||||
|
||||
r, exists := m.Renderer(context.Background()) |
||||
require.True(t, exists) |
||||
require.Equal(t, 3, numLoaded) |
||||
require.Equal(t, 0, numUnloaded) |
||||
require.NotNil(t, r) |
||||
}) |
||||
} |
@ -0,0 +1,3 @@ |
||||
{ |
||||
"type": "app" |
||||
} |
@ -0,0 +1,3 @@ |
||||
{ |
||||
"type": "datasource" |
||||
} |
@ -0,0 +1,3 @@ |
||||
{ |
||||
"type": "renderer" |
||||
} |
@ -0,0 +1,3 @@ |
||||
{ |
||||
"type": "secretsmanager" |
||||
} |
Loading…
Reference in new issue