package config import "testing" func TestLoadRequiresDatabaseURL(t *testing.T) { t.Setenv("DATABASE_URL", "") if _, err := Load(); err == nil { t.Fatal("Load() error = nil, want required database url error") } } func TestValidateAPIRequiresLongSecret(t *testing.T) { t.Parallel() cfg := Config{SessionSecret: "short", CursorSecret: "cursor-secret-that-is-at-least-32-bytes"} if err := cfg.ValidateAPI(); err == nil { t.Fatal("ValidateAPI() error = nil, want secret length error") } } func TestValidateAPIRequiresLongCursorSecret(t *testing.T) { t.Parallel() cfg := Config{SessionSecret: "session-secret-that-is-at-least-32-bytes", CursorSecret: "short"} if err := cfg.ValidateAPI(); err == nil { t.Fatal("ValidateAPI() error = nil, want cursor secret length error") } } func TestValidateAPIRequiresIndependentCursorSecret(t *testing.T) { t.Parallel() secret := "shared-secret-that-is-at-least-32-characters" cfg := Config{SessionSecret: secret, CursorSecret: secret} if err := cfg.ValidateAPI(); err == nil { t.Fatal("ValidateAPI() error = nil, want independent secrets error") } } func TestValidateAPIRequiresGrowthBudgetsInProduction(t *testing.T) { t.Parallel() cfg := Config{SessionSecret: "session-secret-that-is-at-least-32-bytes", CursorSecret: "cursor-secret-that-is-at-least-32-bytes", AppEnv: "production", AIGrowthEnabled: true, AvalAIAPIKey: "key", AvalAIModel: "model", AIMaxConcurrent: 4, AICreatePerMinute: 10, AIUncachedScopesPerDay: 5} if err := cfg.ValidateAPI(); err == nil { t.Fatal("ValidateAPI() error = nil, want AI budget error") } cfg.AIDailyRequestBudget, cfg.AIDailyTokenBudget = 10, 10_000 if err := cfg.ValidateAPI(); err != nil { t.Fatalf("ValidateAPI() error = %v", err) } } func TestLoadGrowthDefaultsAreCostSafe(t *testing.T) { t.Setenv("DATABASE_URL", "postgresql://example") cfg, err := Load() if err != nil { t.Fatal(err) } if cfg.AIGrowthEnabled || cfg.AIDailyRequestBudget != 0 || cfg.AIDailyTokenBudget != 0 || cfg.AIMaxConcurrent != 4 { t.Fatalf("unsafe AI defaults: %+v", cfg) } }