85 lines
2.9 KiB
Go
85 lines
2.9 KiB
Go
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)
|
|
}
|
|
}
|
|
|
|
func TestLoadSelectsAgentRouterProvider(t *testing.T) {
|
|
t.Setenv("DATABASE_URL", "postgresql://example")
|
|
t.Setenv("AI_PROVIDER", AIProviderAgentRouter)
|
|
t.Setenv("AGENTROUTER_API_KEY", "agentrouter-key")
|
|
t.Setenv("AGENTROUTER_BASE_URL", "https://agentrouter.example/v1")
|
|
t.Setenv("AGENTROUTER_MODEL", "gpt-test")
|
|
|
|
cfg, err := Load()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
provider := cfg.SelectedAIProvider()
|
|
if provider.Name != AIProviderAgentRouter || provider.APIKey != "agentrouter-key" || provider.BaseURL != "https://agentrouter.example/v1" || provider.Model != "gpt-test" {
|
|
t.Fatalf("SelectedAIProvider() = %+v", provider)
|
|
}
|
|
}
|
|
|
|
func TestLoadRejectsUnknownAIProvider(t *testing.T) {
|
|
t.Setenv("DATABASE_URL", "postgresql://example")
|
|
t.Setenv("AI_PROVIDER", "unknown")
|
|
|
|
if _, err := Load(); err == nil {
|
|
t.Fatal("Load() error = nil, want unknown provider error")
|
|
}
|
|
}
|