diff --git a/e2e-tests/cypress/tests/integration/channels/plugins/link_tooltip_spec.js b/e2e-tests/cypress/tests/integration/channels/plugins/link_tooltip_spec.js index 58a65272b9c..4f95f412f43 100644 --- a/e2e-tests/cypress/tests/integration/channels/plugins/link_tooltip_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/plugins/link_tooltip_spec.js @@ -17,18 +17,10 @@ describe('Link tooltips', () => { cy.shouldNotRunOnCloudEdition(); cy.shouldHavePluginUploadEnabled(); - // # Set plugin settings, including demo plugin defaults so that - // OnConfigurationChange can create the demo user with a valid email + // # Set plugin settings const newSettings = { PluginSettings: { Enable: true, - Plugins: { - [demoPlugin.id]: { - channelname: 'demo_plugin', - username: 'demo_plugin', - lastname: 'Plugin User', - }, - }, }, ServiceSettings: { EnableGifPicker: true, diff --git a/server/channels/app/plugin_api.go b/server/channels/app/plugin_api.go index de29ba9f534..71d025efabb 100644 --- a/server/channels/app/plugin_api.go +++ b/server/channels/app/plugin_api.go @@ -55,6 +55,11 @@ func (api *PluginAPI) LoadPluginConfiguration(dest any) error { for _, setting := range api.manifest.SettingsSchema.Settings { finalConfig[strings.ToLower(setting.Key)] = setting.Default } + for _, section := range api.manifest.SettingsSchema.Sections { + for _, setting := range section.Settings { + finalConfig[strings.ToLower(setting.Key)] = setting.Default + } + } } // If we have settings given we override the defaults with them diff --git a/server/channels/app/plugin_api_test.go b/server/channels/app/plugin_api_test.go index 8903b2bc2bc..4688a231bfc 100644 --- a/server/channels/app/plugin_api_test.go +++ b/server/channels/app/plugin_api_test.go @@ -982,6 +982,101 @@ func TestPluginAPILoadPluginConfigurationDefaults(t *testing.T) { require.NoError(t, err) } +func TestPluginAPILoadPluginConfigurationDefaultsFromSections(t *testing.T) { + mainHelper.Parallel(t) + th := Setup(t) + + var pluginJson map[string]any + err := json.Unmarshal([]byte(`{"mysectionstringsetting": "override"}`), &pluginJson) + require.NoError(t, err) + + th.App.UpdateConfig(func(cfg *model.Config) { + cfg.PluginSettings.Plugins["testsectiondefaults"] = pluginJson + }) + + manifest := &model.Manifest{ + Id: "testsectiondefaults", + SettingsSchema: &model.PluginSettingsSchema{ + Sections: []*model.PluginSettingsSection{ + { + Key: "section1", + Settings: []*model.PluginSetting{ + {Key: "MySectionStringSetting", Type: "text", Default: "notthis"}, + {Key: "MySectionIntSetting", Type: "text", Default: float64(42)}, + {Key: "MySectionBoolSetting", Type: "bool", Default: true}, + }, + }, + }, + }, + } + + api := NewPluginAPI(th.App, th.Context, manifest) + + var dest struct { + MySectionStringSetting string + MySectionIntSetting int + MySectionBoolSetting bool + } + err = api.LoadPluginConfiguration(&dest) + require.NoError(t, err) + + assert.Equal(t, "override", dest.MySectionStringSetting) // saved config overrides default + assert.Equal(t, 42, dest.MySectionIntSetting) // default applied from section + assert.True(t, dest.MySectionBoolSetting) // default applied from section +} + +func TestPluginAPILoadPluginConfigurationDefaultsMixed(t *testing.T) { + mainHelper.Parallel(t) + th := Setup(t) + + var pluginJson map[string]any + err := json.Unmarshal([]byte(`{"toplevelsetting": "saved_value"}`), &pluginJson) + require.NoError(t, err) + + th.App.UpdateConfig(func(cfg *model.Config) { + cfg.PluginSettings.Plugins["testmixeddefaults"] = pluginJson + }) + + manifest := &model.Manifest{ + Id: "testmixeddefaults", + SettingsSchema: &model.PluginSettingsSchema{ + Settings: []*model.PluginSetting{ + {Key: "TopLevelSetting", Type: "text", Default: "top_default"}, + {Key: "TopLevelBool", Type: "bool", Default: true}, + }, + Sections: []*model.PluginSettingsSection{ + { + Key: "section1", + Settings: []*model.PluginSetting{ + {Key: "SectionSetting", Type: "text", Default: "section_default"}, + {Key: "SectionInt", Type: "text", Default: float64(99)}, + }, + }, + }, + }, + } + + api := NewPluginAPI(th.App, th.Context, manifest) + + var dest struct { + TopLevelSetting string + TopLevelBool bool + SectionSetting string + SectionInt int + } + err = api.LoadPluginConfiguration(&dest) + require.NoError(t, err) + + // Top-level: saved config overrides default + assert.Equal(t, "saved_value", dest.TopLevelSetting) + // Top-level: default applied + assert.True(t, dest.TopLevelBool) + // Section: default applied + assert.Equal(t, "section_default", dest.SectionSetting) + // Section: default applied + assert.Equal(t, 99, dest.SectionInt) +} + func TestPluginAPIGetPlugins(t *testing.T) { mainHelper.Parallel(t) th := Setup(t)