package bootstrap import ( "sync/atomic" "testing" ) func TestParseEnvAndProductionValidate(t *testing.T) { t.Setenv("SPARK_ENV", "") t.Setenv("SPARK_JWT_SECRET", "") if parseEnv("") != EnvDev || parseEnv("production") != EnvProd || parseEnv("PROD") != EnvProd { t.Fatal("parseEnv") } dev := &Config{Env: "dev", JWT: JWTConfig{Secret: DefaultJWTSecret}} if err := dev.normalize(); err != nil { t.Fatal(err) } if dev.Production() { t.Fatal("dev") } prod := &Config{Env: "prod"} if err := prod.normalize(); err == nil { t.Fatal("prod missing stores") } prod = &Config{ Env: "prod", MySQL: MySQLConfig{DSN: "user:pass@tcp(127.0.0.1:3306)/im"}, Redis: RedisConfig{Addr: "127.0.0.1:6379"}, JWT: JWTConfig{Secret: DefaultJWTSecret}, } if err := prod.normalize(); err == nil { t.Fatal("prod default jwt") } prod.JWT.Secret = "long-enough-production-secret" if err := prod.normalize(); err == nil { t.Fatal("prod default admin jwt") } prod.Admin.JWTSecret = "production-admin-jwt-secret-not-default" prod.SMS = SMSConfig{SMTP: SMTPConfig{Host: "smtpdm.aliyun.com", Port: 465, Username: "noreply@sparkmail.wyrs365.com", Password: "test"}} if err := prod.normalize(); err != nil { t.Fatal(err) } if !prod.Production() { t.Fatal("prod flag") } } func TestRedisPasswordFromEnv(t *testing.T) { t.Setenv("SPARK_REDIS_PASSWORD", "from-env") cfg := &Config{Redis: RedisConfig{Addr: "127.0.0.1:6379", Password: "from-yaml"}} if err := cfg.normalize(); err != nil { t.Fatal(err) } if cfg.Redis.Password != "from-env" { t.Fatalf("password %q", cfg.Redis.Password) } } func TestProbeReadyDevSkipsStores(t *testing.T) { p := &Probe{requireDeps: false} ok, data := p.Ready(t.Context()) if ok { t.Fatal("not accepting") } rep := data.(ProbeReport) if rep.MySQL != depSkipped || rep.Redis != depSkipped || rep.Status != "not_ready" { t.Fatalf("%+v", rep) } var accepting atomic.Bool accepting.Store(true) p.accepting = &accepting ok, data = p.Ready(t.Context()) if !ok { t.Fatalf("%+v", data) } } func TestProbeReadyProdRequiresStores(t *testing.T) { var accepting atomic.Bool accepting.Store(true) p := &Probe{requireDeps: true, accepting: &accepting} ok, data := p.Ready(t.Context()) if ok { t.Fatal("want down") } rep := data.(ProbeReport) if rep.MySQL != depDown || rep.Redis != depDown { t.Fatalf("%+v", rep) } }