Add ModulesConfig and ModuleToggle types to config.go for explicit module enable/disable in YAML. Add LoadState() that merges state from three sources: 1. Backward-compat YAML fields (auth.enabled, odoo.enabled) 2. Explicit modules.* YAML toggles (override compat) 3. Database module_state table (highest precedence) Validates dependency chain after loading. 5 loader tests. Ref #95
89 lines
2.2 KiB
Go
89 lines
2.2 KiB
Go
package modules
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/kindredsystems/silo/internal/config"
|
|
)
|
|
|
|
func boolPtr(v bool) *bool { return &v }
|
|
|
|
func TestLoadState_DefaultsOnly(t *testing.T) {
|
|
r := NewRegistry()
|
|
cfg := &config.Config{}
|
|
|
|
if err := LoadState(r, cfg, nil); err != nil {
|
|
t.Fatalf("LoadState: %v", err)
|
|
}
|
|
|
|
// Auth defaults to true from registry, but cfg.Auth.Enabled is false
|
|
// (zero value) and backward-compat applies, so auth ends up disabled.
|
|
if r.IsEnabled(Auth) {
|
|
t.Error("auth should be disabled (cfg.Auth.Enabled is false by default)")
|
|
}
|
|
}
|
|
|
|
func TestLoadState_BackwardCompat(t *testing.T) {
|
|
r := NewRegistry()
|
|
cfg := &config.Config{}
|
|
cfg.Auth.Enabled = true
|
|
cfg.Odoo.Enabled = true
|
|
|
|
if err := LoadState(r, cfg, nil); err != nil {
|
|
t.Fatalf("LoadState: %v", err)
|
|
}
|
|
|
|
if !r.IsEnabled(Auth) {
|
|
t.Error("auth should be enabled via cfg.Auth.Enabled")
|
|
}
|
|
if !r.IsEnabled(Odoo) {
|
|
t.Error("odoo should be enabled via cfg.Odoo.Enabled")
|
|
}
|
|
}
|
|
|
|
func TestLoadState_YAMLModulesOverrideCompat(t *testing.T) {
|
|
r := NewRegistry()
|
|
cfg := &config.Config{}
|
|
cfg.Auth.Enabled = true // compat says enabled
|
|
cfg.Modules.Auth = &config.ModuleToggle{Enabled: boolPtr(false)} // explicit says disabled
|
|
|
|
if err := LoadState(r, cfg, nil); err != nil {
|
|
t.Fatalf("LoadState: %v", err)
|
|
}
|
|
|
|
if r.IsEnabled(Auth) {
|
|
t.Error("modules.auth.enabled=false should override auth.enabled=true")
|
|
}
|
|
}
|
|
|
|
func TestLoadState_EnableJobsAndDAG(t *testing.T) {
|
|
r := NewRegistry()
|
|
cfg := &config.Config{}
|
|
cfg.Auth.Enabled = true
|
|
cfg.Modules.Jobs = &config.ModuleToggle{Enabled: boolPtr(true)}
|
|
cfg.Modules.DAG = &config.ModuleToggle{Enabled: boolPtr(true)}
|
|
|
|
if err := LoadState(r, cfg, nil); err != nil {
|
|
t.Fatalf("LoadState: %v", err)
|
|
}
|
|
|
|
if !r.IsEnabled(Jobs) {
|
|
t.Error("jobs should be enabled")
|
|
}
|
|
if !r.IsEnabled(DAG) {
|
|
t.Error("dag should be enabled")
|
|
}
|
|
}
|
|
|
|
func TestLoadState_InvalidDependency(t *testing.T) {
|
|
r := NewRegistry()
|
|
cfg := &config.Config{}
|
|
// Auth disabled (default), but enable jobs which depends on auth.
|
|
cfg.Modules.Jobs = &config.ModuleToggle{Enabled: boolPtr(true)}
|
|
|
|
err := LoadState(r, cfg, nil)
|
|
if err == nil {
|
|
t.Error("should fail: jobs enabled but auth disabled")
|
|
}
|
|
}
|