2026-08-04 00:11:56 +02:00
|
|
|
package config
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"strings"
|
|
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestLoadApp(t *testing.T) {
|
|
|
|
|
tests := []struct {
|
2026-08-04 18:17:24 +02:00
|
|
|
name string
|
|
|
|
|
values map[string]string
|
|
|
|
|
want time.Duration
|
|
|
|
|
wantIdle time.Duration
|
|
|
|
|
wantErr string
|
2026-08-04 00:11:56 +02:00
|
|
|
}{
|
2026-08-04 18:17:24 +02:00
|
|
|
// Every registry key is mandatory: main seeds the DB with defaults
|
|
|
|
|
// at startup, so LoadApp always receives a complete map.
|
|
|
|
|
{name: "seeded defaults", values: map[string]string{"session.duration": "720", "session.setup_timeout": "15"}, want: 720 * time.Hour, wantIdle: 15 * time.Minute},
|
|
|
|
|
{name: "custom values", values: map[string]string{"session.duration": "168", "session.setup_timeout": "30"}, want: 168 * time.Hour, wantIdle: 30 * time.Minute},
|
|
|
|
|
{name: "missing key fails fast", values: map[string]string{"session.duration": "720"}, wantErr: "missing key"},
|
|
|
|
|
{name: "nil map fails fast", values: nil, wantErr: "missing key"},
|
|
|
|
|
{name: "invalid stored value", values: map[string]string{"session.duration": "zero", "session.setup_timeout": "15"}, wantErr: "session.duration"},
|
|
|
|
|
{name: "invalid setup timeout", values: map[string]string{"session.duration": "720", "session.setup_timeout": "0"}, wantErr: "session.setup_timeout"},
|
|
|
|
|
{name: "unknown stored key", values: map[string]string{"session.duration": "720", "session.setup_timeout": "15", "bogus.key": "1"}, wantErr: "unknown configuration key"},
|
2026-08-04 00:11:56 +02:00
|
|
|
}
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
2026-08-04 18:17:24 +02:00
|
|
|
got, err := LoadApp(tt.values)
|
2026-08-04 00:11:56 +02:00
|
|
|
if tt.wantErr != "" {
|
|
|
|
|
if err == nil || !strings.Contains(err.Error(), tt.wantErr) {
|
|
|
|
|
t.Fatalf("err = %v, want containing %q", err, tt.wantErr)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("LoadApp: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if got.SessionDuration != tt.want {
|
|
|
|
|
t.Fatalf("SessionDuration = %v, want %v", got.SessionDuration, tt.want)
|
|
|
|
|
}
|
2026-08-04 18:17:24 +02:00
|
|
|
if got.SetupTimeout != tt.wantIdle {
|
|
|
|
|
t.Fatalf("SetupSessionIdleTimeout = %v, want %v", got.SetupTimeout, tt.wantIdle)
|
2026-08-04 17:44:37 +02:00
|
|
|
}
|
2026-08-04 00:11:56 +02:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestValidateAppValue(t *testing.T) {
|
|
|
|
|
if err := ValidateAppValue("session.duration", "24"); err != nil {
|
|
|
|
|
t.Fatalf("valid value rejected: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if err := ValidateAppValue("session.duration", "-1"); err == nil {
|
|
|
|
|
t.Fatal("negative hours accepted")
|
|
|
|
|
}
|
|
|
|
|
if err := ValidateAppValue("session.duration", "1.5"); err == nil {
|
|
|
|
|
t.Fatal("non-integer accepted")
|
|
|
|
|
}
|
|
|
|
|
if err := ValidateAppValue("nope", "1"); err == nil {
|
|
|
|
|
t.Fatal("unknown key accepted")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestDisplayEnv_MasksSecrets(t *testing.T) {
|
2026-08-04 16:04:18 +02:00
|
|
|
cfg := EnvConfig{
|
|
|
|
|
BackendAddr: ":8080", OIDCClientSecret: "hunter2",
|
2026-08-04 00:11:56 +02:00
|
|
|
SessionSecret: []byte("0123456789abcdef0123456789abcdef"),
|
|
|
|
|
}
|
|
|
|
|
entries := map[string]string{}
|
|
|
|
|
for _, e := range cfg.DisplayEnv() {
|
|
|
|
|
entries[e.Name] = e.Value
|
|
|
|
|
}
|
|
|
|
|
if entries["GENIUSRUN_BACKEND_ADDR"] != ":8080" {
|
|
|
|
|
t.Errorf("GENIUSRUN_BACKEND_ADDR = %q", entries["GENIUSRUN_BACKEND_ADDR"])
|
|
|
|
|
}
|
|
|
|
|
if entries["GENIUSRUN_OIDC_CLIENT_SECRET"] != "•••• (set)" {
|
|
|
|
|
t.Errorf("client secret not masked: %q", entries["GENIUSRUN_OIDC_CLIENT_SECRET"])
|
|
|
|
|
}
|
|
|
|
|
if entries["GENIUSRUN_SESSION_SECRET"] != "•••• (set)" {
|
|
|
|
|
t.Errorf("session secret not masked: %q", entries["GENIUSRUN_SESSION_SECRET"])
|
|
|
|
|
}
|
2026-08-04 16:04:18 +02:00
|
|
|
empty := EnvConfig{}
|
2026-08-04 00:11:56 +02:00
|
|
|
for _, e := range empty.DisplayEnv() {
|
|
|
|
|
if e.Name == "GENIUSRUN_OIDC_CLIENT_SECRET" && e.Value != "(unset)" {
|
|
|
|
|
t.Errorf("unset secret = %q, want (unset)", e.Value)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|