Skip to content

Commit 8d2c00c

Browse files
committed
feat(plugin-config): update default plugin Enabled behavior to false and expand test coverage
- Changed default plugin `Enabled` state from `true` to `false` across configurations, runtime logic, and YAML defaults. - Added helper function `enabledPluginConfigs` for generating plugin configs with `Enabled` set explicitly. - Expanded unit tests in `pluginhost`, `config`, and `management` to validate behavior changes for disabled plugins, default settings, and skipped load scenarios.
1 parent 125c092 commit 8d2c00c

8 files changed

Lines changed: 72 additions & 16 deletions

File tree

internal/api/handlers/management/plugin_store.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ func pluginLocalStatuses(pluginsEnabled bool, pluginsDir string, configs map[str
548548
status.Registered = true
549549
status.InstalledVersion = strings.TrimSpace(info.Metadata.Version)
550550
if _, configured := configs[info.ID]; !configured && !status.Enabled {
551-
status.Enabled = true
551+
status.Enabled = false
552552
}
553553
statuses[info.ID] = status
554554
}

internal/api/handlers/management/plugins.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (h *Handler) ListPlugins(c *gin.Context) {
9090
entries[file.ID] = pluginListEntry{
9191
ID: htmlsanitize.String(file.ID),
9292
Path: htmlsanitize.String(file.Path),
93-
Enabled: true,
93+
Enabled: false,
9494
ConfigFields: []pluginConfigFieldInfo{},
9595
Menus: []pluginMenuInfo{},
9696
}
@@ -118,10 +118,6 @@ func (h *Handler) ListPlugins(c *gin.Context) {
118118
entry.ConfigFields = pluginConfigFields(info.Metadata.ConfigFields)
119119
entry.Menus = pluginMenus(info.Menus)
120120
entry.Metadata = pluginMetadata(info.Metadata)
121-
_, configured := configs[info.ID]
122-
if !configured && !entry.Enabled {
123-
entry.Enabled = true
124-
}
125121
entries[info.ID] = entry
126122
}
127123
}
@@ -397,7 +393,7 @@ func normalizedPluginsDir(dir string) string {
397393

398394
func pluginInstanceEnabled(item config.PluginInstanceConfig) bool {
399395
if item.Enabled == nil {
400-
return true
396+
return false
401397
}
402398
return *item.Enabled
403399
}

internal/api/handlers/management/plugins_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ func TestListPluginsIncludesScannedAndConfiguredPlugins(t *testing.T) {
158158
t.Fatalf("unregistered plugin entry has runtime fields: %#v", item)
159159
}
160160
}
161-
if got, ok := entries["scanned"]; !ok || got.Configured || !got.Enabled || got.EffectiveEnabled || got.Path == "" {
161+
if got, ok := entries["scanned"]; !ok || got.Configured || got.Enabled || got.EffectiveEnabled || got.Path == "" {
162162
t.Fatalf("scanned entry = %#v, exists=%v", got, ok)
163163
}
164164
if got, ok := entries["configured-only"]; !ok || !got.Configured || got.Enabled || got.EffectiveEnabled || got.Path != "" {

internal/config/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ type PluginsConfig struct {
172172

173173
// PluginInstanceConfig stores host-owned plugin settings and the original plugin YAML subtree.
174174
type PluginInstanceConfig struct {
175-
// Enabled toggles this plugin instance. Nil is normalized to true during YAML parsing.
175+
// Enabled toggles this plugin instance. Nil is normalized to false during YAML parsing.
176176
Enabled *bool `yaml:"enabled,omitempty" json:"enabled,omitempty"`
177177
// Priority controls plugin startup and routing order.
178178
Priority int `yaml:"priority,omitempty" json:"priority,omitempty"`
@@ -187,7 +187,7 @@ func (c *PluginInstanceConfig) UnmarshalYAML(value *yaml.Node) error {
187187
}
188188

189189
c.Priority = 0
190-
defaultEnabled := true
190+
defaultEnabled := false
191191
c.Enabled = &defaultEnabled
192192

193193
if value == nil || value.Kind == 0 {

internal/config/plugin_config_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ plugins:
6666
t.Fatal("Plugins.Configs[\"sample\"] missing")
6767
}
6868
if plugin.Enabled == nil {
69-
t.Fatal("Plugin.Enabled = nil, want true pointer")
69+
t.Fatal("Plugin.Enabled = nil, want false pointer")
7070
}
71-
if !*plugin.Enabled {
72-
t.Fatal("Plugin.Enabled = false, want true")
71+
if *plugin.Enabled {
72+
t.Fatal("Plugin.Enabled = true, want false")
7373
}
7474
if plugin.Priority != 0 {
7575
t.Fatalf("Plugin.Priority = %d, want 0", plugin.Priority)

internal/pluginhost/config.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"gopkg.in/yaml.v3"
1111
)
1212

13-
var defaultRuntimeConfigYAML = []byte("enabled: true\npriority: 0\n")
13+
var defaultRuntimeConfigYAML = []byte("enabled: false\npriority: 0\n")
1414

1515
type runtimeConfig struct {
1616
Enabled bool
@@ -48,7 +48,7 @@ func runtimeConfigFromConfig(cfg *config.Config) runtimeConfig {
4848

4949
for _, id := range ids {
5050
item := cfg.Plugins.Configs[id]
51-
enabled := true
51+
enabled := false
5252
if item.Enabled != nil {
5353
enabled = *item.Enabled
5454
}
@@ -66,7 +66,7 @@ func runtimeConfigFromConfig(cfg *config.Config) runtimeConfig {
6666
func defaultRuntimeItemConfig(id string) runtimeItemConfig {
6767
return runtimeItemConfig{
6868
ID: id,
69-
Enabled: true,
69+
Enabled: false,
7070
Priority: 0,
7171
ConfigYAML: append([]byte(nil), defaultRuntimeConfigYAML...),
7272
}

internal/pluginhost/config_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,19 @@ func TestRuntimeConfigYAMLAddsHostDefaultsToRawPluginConfig(t *testing.T) {
3333
}
3434
}
3535
}
36+
37+
func TestRuntimeConfigYAMLDefaultsEnabledFalse(t *testing.T) {
38+
item := config.PluginInstanceConfig{
39+
Priority: 3,
40+
}
41+
42+
got := string(runtimeConfigYAML(item, false))
43+
for _, want := range []string{
44+
"enabled: false",
45+
"priority: 3",
46+
} {
47+
if !strings.Contains(got, want) {
48+
t.Fatalf("runtimeConfigYAML() missing %q in:\n%s", want, got)
49+
}
50+
}
51+
}

internal/pluginhost/host_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ import (
1616
"github.com/tidwall/gjson"
1717
)
1818

19+
func enabledPluginConfigs(ids ...string) map[string]config.PluginInstanceConfig {
20+
enabled := true
21+
configs := make(map[string]config.PluginInstanceConfig, len(ids))
22+
for _, id := range ids {
23+
configs[id] = config.PluginInstanceConfig{Enabled: &enabled}
24+
}
25+
return configs
26+
}
27+
1928
func TestHostApplyConfig_DisabledGlobalSkipsSnapshot(t *testing.T) {
2029
loader := newTestSymbolLoader()
2130
h := NewForTest(loader)
@@ -67,6 +76,30 @@ func TestHostApplyConfig_DisabledPluginSkipsCapability(t *testing.T) {
6776
}
6877
}
6978

79+
func TestHostApplyConfig_DefaultDisabledPluginSkipsLoad(t *testing.T) {
80+
loader := newTestSymbolLoader()
81+
plugin := &testPlugin{
82+
registerResult: validTestPlugin("alpha"),
83+
reconfigureResult: validTestPlugin("alpha"),
84+
}
85+
loader.lookups["alpha"] = newTestSymbolLookup(plugin)
86+
h := NewForTest(loader)
87+
88+
h.ApplyConfig(context.Background(), &config.Config{
89+
Plugins: config.PluginsConfig{
90+
Enabled: true,
91+
Dir: makePluginDir(t, "alpha"),
92+
},
93+
})
94+
95+
if plugin.registerCalls != 0 || loader.openCalls != 0 {
96+
t.Fatalf("calls = register %d open %d, want 0", plugin.registerCalls, loader.openCalls)
97+
}
98+
if len(h.Snapshot().records) != 0 {
99+
t.Fatalf("Snapshot records = %d, want 0", len(h.Snapshot().records))
100+
}
101+
}
102+
70103
func TestPluginLoadedTracksLoadedPluginAfterDisabled(t *testing.T) {
71104
disabled := false
72105
loader := newTestSymbolLoader()
@@ -83,6 +116,7 @@ func TestPluginLoadedTracksLoadedPluginAfterDisabled(t *testing.T) {
83116
Plugins: config.PluginsConfig{
84117
Enabled: true,
85118
Dir: pluginsDir,
119+
Configs: enabledPluginConfigs("alpha"),
86120
},
87121
})
88122

@@ -136,6 +170,7 @@ func TestHostUnloadPluginTargetsOnlyRequestedPlugin(t *testing.T) {
136170
Plugins: config.PluginsConfig{
137171
Enabled: true,
138172
Dir: makePluginDir(t, "alpha", "bravo"),
173+
Configs: enabledPluginConfigs("alpha", "bravo"),
139174
},
140175
}
141176

@@ -191,6 +226,7 @@ func TestHostApplyConfigRegistersPluginThinkingApplier(t *testing.T) {
191226
Plugins: config.PluginsConfig{
192227
Enabled: true,
193228
Dir: makePluginDir(t, "alpha"),
229+
Configs: enabledPluginConfigs("alpha"),
194230
},
195231
}
196232
t.Cleanup(func() {
@@ -240,6 +276,7 @@ func TestHostApplyConfigRegistersInterceptorOnlyPlugin(t *testing.T) {
240276
Plugins: config.PluginsConfig{
241277
Enabled: true,
242278
Dir: makePluginDir(t, "alpha"),
279+
Configs: enabledPluginConfigs("alpha"),
243280
},
244281
})
245282

@@ -282,6 +319,7 @@ func TestHostApplyConfigDispatchesInterceptorRPCMethods(t *testing.T) {
282319
Plugins: config.PluginsConfig{
283320
Enabled: true,
284321
Dir: makePluginDir(t, "alpha"),
322+
Configs: enabledPluginConfigs("alpha"),
285323
},
286324
})
287325

@@ -488,6 +526,7 @@ func TestHostApplyConfig_ReconfigureCalledOnReload(t *testing.T) {
488526
Plugins: config.PluginsConfig{
489527
Enabled: true,
490528
Dir: makePluginDir(t, "alpha"),
529+
Configs: enabledPluginConfigs("alpha"),
491530
},
492531
}
493532

@@ -529,6 +568,7 @@ func TestRegisteredPluginsIncludesMetadataAndOAuthCapability(t *testing.T) {
529568
Plugins: config.PluginsConfig{
530569
Enabled: true,
531570
Dir: makePluginDir(t, "alpha"),
571+
Configs: enabledPluginConfigs("alpha"),
532572
},
533573
})
534574

@@ -589,6 +629,7 @@ func TestHostApplyConfig_PanicFusesPluginForProcessLifetime(t *testing.T) {
589629
Plugins: config.PluginsConfig{
590630
Enabled: true,
591631
Dir: makePluginDir(t, "alpha"),
632+
Configs: enabledPluginConfigs("alpha"),
592633
},
593634
}
594635

@@ -674,6 +715,7 @@ func TestHostApplyConfigSerializesLifecycleCalls(t *testing.T) {
674715
Plugins: config.PluginsConfig{
675716
Enabled: true,
676717
Dir: makePluginDir(t, "alpha"),
718+
Configs: enabledPluginConfigs("alpha"),
677719
},
678720
}
679721

@@ -896,6 +938,7 @@ func newBlockingOpenHost(t *testing.T) (*Host, *config.Config, <-chan struct{},
896938
Plugins: config.PluginsConfig{
897939
Enabled: true,
898940
Dir: makePluginDir(t, "alpha"),
941+
Configs: enabledPluginConfigs("alpha"),
899942
},
900943
}
901944
return h, cfg, openStarted, releaseOpen
@@ -928,6 +971,7 @@ func newBlockingRegisterHost(t *testing.T) (*Host, *config.Config, <-chan struct
928971
Plugins: config.PluginsConfig{
929972
Enabled: true,
930973
Dir: makePluginDir(t, "alpha"),
974+
Configs: enabledPluginConfigs("alpha"),
931975
},
932976
}
933977
return h, cfg, registerStarted, releaseRegister

0 commit comments

Comments
 (0)