From be7bcbf94e7202b8e9dce6bdb828b71175ac6f52 Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Tue, 22 Mar 2022 15:34:27 +0100 Subject: [PATCH] Chore: Add tests for plugin settings sqlstore (#46792) Follow up of #46777 adding tests for plugin settings in sqlstore package. --- pkg/services/sqlstore/plugin_setting_test.go | 194 +++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 pkg/services/sqlstore/plugin_setting_test.go diff --git a/pkg/services/sqlstore/plugin_setting_test.go b/pkg/services/sqlstore/plugin_setting_test.go new file mode 100644 index 00000000000..091e332f306 --- /dev/null +++ b/pkg/services/sqlstore/plugin_setting_test.go @@ -0,0 +1,194 @@ +//go:build integration +// +build integration + +package sqlstore + +import ( + "context" + "testing" + "time" + + "github.com/grafana/grafana/pkg/bus" + "github.com/grafana/grafana/pkg/models" + "github.com/stretchr/testify/require" +) + +func TestPluginSettings(t *testing.T) { + store := InitTestDB(t) + + t.Run("Existing plugin settings", func(t *testing.T) { + existing := models.PluginSetting{ + OrgId: 1, + PluginId: "existing", + Enabled: false, + Pinned: false, + JsonData: map[string]interface{}{ + "key": "value", + }, + SecureJsonData: map[string][]byte{ + "secureKey": []byte("secureValue"), + }, + PluginVersion: "1.0.0", + Created: time.Now(), + Updated: time.Now(), + } + + err := store.WithTransactionalDbSession(context.Background(), func(sess *DBSession) error { + affectedRows, innerErr := sess.Insert(&existing) + require.Equal(t, int64(1), affectedRows) + return innerErr + }) + + require.NoError(t, err) + require.Greater(t, existing.Id, int64(0)) + + t.Run("GetPluginSettings with orgID=0 should return all existing plugin settings", func(t *testing.T) { + pluginSettings, err := store.GetPluginSettings(context.Background(), 0) + require.NoError(t, err) + require.Len(t, pluginSettings, 1) + ps := pluginSettings[0] + require.Equal(t, existing.OrgId, ps.OrgId) + require.Equal(t, existing.PluginId, ps.PluginId) + require.False(t, ps.Enabled) + require.Nil(t, ps.JsonData) + require.Nil(t, ps.SecureJsonData) + }) + + t.Run("GetPluginSettings with orgID=1 should return all existing plugin settings", func(t *testing.T) { + pluginSettings, err := store.GetPluginSettings(context.Background(), 1) + require.NoError(t, err) + require.Len(t, pluginSettings, 1) + ps := pluginSettings[0] + require.Equal(t, existing.OrgId, ps.OrgId) + require.Equal(t, existing.PluginId, ps.PluginId) + require.False(t, ps.Enabled) + require.Nil(t, ps.JsonData) + require.Nil(t, ps.SecureJsonData) + }) + + t.Run("GetPluginSettingById should return existing plugin settings", func(t *testing.T) { + query := &models.GetPluginSettingByIdQuery{ + OrgId: existing.OrgId, + PluginId: existing.PluginId, + } + err := store.GetPluginSettingById(context.Background(), query) + require.NoError(t, err) + ps := query.Result + require.NotNil(t, ps) + require.Equal(t, existing.OrgId, ps.OrgId) + require.Equal(t, existing.PluginId, ps.PluginId) + require.False(t, ps.Enabled) + require.NotNil(t, ps.JsonData) + require.Equal(t, existing.JsonData, ps.JsonData) + require.NotNil(t, ps.SecureJsonData) + require.Equal(t, existing.SecureJsonData, ps.SecureJsonData) + }) + + t.Run("UpdatePluginSetting should update existing plugin settings and publish PluginStateChangedEvent", func(t *testing.T) { + var pluginStateChangedEvent *models.PluginStateChangedEvent + bus.AddEventListener(func(_ context.Context, evt *models.PluginStateChangedEvent) error { + pluginStateChangedEvent = evt + return nil + }) + + cmd := &models.UpdatePluginSettingCmd{ + OrgId: existing.OrgId, + PluginId: existing.PluginId, + Enabled: true, + PluginVersion: "1.0.1", + JsonData: map[string]interface{}{ + "key2": "value2", + }, + EncryptedSecureJsonData: map[string][]byte{ + "secureKey": []byte("secureValue"), + "secureKey2": []byte("secureValue2"), + }, + Pinned: true, + } + err := store.UpdatePluginSetting(context.Background(), cmd) + + require.NoError(t, err) + require.NotNil(t, pluginStateChangedEvent) + require.Equal(t, existing.OrgId, pluginStateChangedEvent.OrgId) + require.Equal(t, existing.PluginId, pluginStateChangedEvent.PluginId) + require.True(t, pluginStateChangedEvent.Enabled) + + err = store.UpdatePluginSettingVersion(context.Background(), &models.UpdatePluginSettingVersionCmd{ + OrgId: cmd.OrgId, + PluginId: cmd.PluginId, + PluginVersion: "1.0.2", + }) + require.NoError(t, err) + + t.Run("GetPluginSettingById should return updated plugin settings", func(t *testing.T) { + query := &models.GetPluginSettingByIdQuery{ + OrgId: existing.OrgId, + PluginId: existing.PluginId, + } + err := store.GetPluginSettingById(context.Background(), query) + require.NoError(t, err) + ps := query.Result + require.NotNil(t, ps) + require.Equal(t, existing.OrgId, ps.OrgId) + require.Equal(t, existing.PluginId, ps.PluginId) + require.True(t, ps.Enabled) + require.NotNil(t, ps.JsonData) + require.Equal(t, cmd.JsonData, ps.JsonData) + require.NotNil(t, ps.SecureJsonData) + require.Equal(t, cmd.EncryptedSecureJsonData, ps.SecureJsonData) + require.Equal(t, "1.0.2", ps.PluginVersion) + require.True(t, ps.Pinned) + }) + }) + }) + + t.Run("Non-existing plugin settings", func(t *testing.T) { + t.Run("UpdatePluginSetting should insert plugin settings and publish PluginStateChangedEvent", func(t *testing.T) { + var pluginStateChangedEvent *models.PluginStateChangedEvent + bus.AddEventListener(func(_ context.Context, evt *models.PluginStateChangedEvent) error { + pluginStateChangedEvent = evt + return nil + }) + + cmd := &models.UpdatePluginSettingCmd{ + PluginId: "test", + Enabled: true, + OrgId: 1, + PluginVersion: "1.0.0", + JsonData: map[string]interface{}{ + "key": "value", + }, + EncryptedSecureJsonData: map[string][]byte{ + "secureKey": []byte("secureValue"), + }, + } + err := store.UpdatePluginSetting(context.Background(), cmd) + + require.NoError(t, err) + require.NotNil(t, pluginStateChangedEvent) + require.Equal(t, cmd.OrgId, pluginStateChangedEvent.OrgId) + require.Equal(t, cmd.PluginId, pluginStateChangedEvent.PluginId) + require.True(t, pluginStateChangedEvent.Enabled) + + t.Run("GetPluginSettingById should return inserted plugin settings", func(t *testing.T) { + query := &models.GetPluginSettingByIdQuery{ + OrgId: cmd.OrgId, + PluginId: cmd.PluginId, + } + err := store.GetPluginSettingById(context.Background(), query) + require.NoError(t, err) + ps := query.Result + require.NotNil(t, ps) + require.Equal(t, cmd.OrgId, ps.OrgId) + require.Equal(t, cmd.PluginId, ps.PluginId) + require.True(t, ps.Enabled) + require.NotNil(t, ps.JsonData) + require.Equal(t, cmd.JsonData, ps.JsonData) + require.NotNil(t, ps.SecureJsonData) + require.Equal(t, cmd.EncryptedSecureJsonData, ps.SecureJsonData) + require.Equal(t, cmd.PluginVersion, ps.PluginVersion) + require.False(t, ps.Pinned) + }) + }) + }) +}