package config import ( "testing" "time" "github.com/stretchr/testify/require" ) func TestLoadFromEnvUsesDefaults(t *testing.T) { t.Setenv(redisAddrEnvVar, "127.0.0.1:6379") cfg, err := LoadFromEnv() require.NoError(t, err) defaults := DefaultConfig() require.Equal(t, defaults.ShutdownTimeout, cfg.ShutdownTimeout) require.Equal(t, defaults.Logging.Level, cfg.Logging.Level) require.Equal(t, defaults.InternalHTTP, cfg.InternalHTTP) require.Equal(t, defaults.AdminHTTP, cfg.AdminHTTP) require.Equal(t, "127.0.0.1:6379", cfg.Redis.Addr) require.Equal(t, defaults.Redis.DB, cfg.Redis.DB) require.Equal(t, defaults.Redis.DomainEventsStream, cfg.Redis.DomainEventsStream) require.Equal(t, defaults.Redis.DomainEventsStreamMaxLen, cfg.Redis.DomainEventsStreamMaxLen) require.Equal(t, defaults.Telemetry, cfg.Telemetry) } func TestLoadFromEnvAppliesOverrides(t *testing.T) { t.Setenv(shutdownTimeoutEnvVar, "9s") t.Setenv(logLevelEnvVar, "debug") t.Setenv(internalHTTPAddrEnvVar, "127.0.0.1:18091") t.Setenv(internalHTTPReadHeaderTimeoutEnvVar, "3s") t.Setenv(internalHTTPRequestTimeoutEnvVar, "750ms") t.Setenv(adminHTTPAddrEnvVar, "127.0.0.1:19091") t.Setenv(adminHTTPIdleTimeoutEnvVar, "90s") t.Setenv(redisAddrEnvVar, "127.0.0.1:6380") t.Setenv(redisUsernameEnvVar, "alice") t.Setenv(redisPasswordEnvVar, "secret") t.Setenv(redisDBEnvVar, "3") t.Setenv(redisTLSEnabledEnvVar, "true") t.Setenv(redisOperationTimeoutEnvVar, "900ms") t.Setenv(redisKeyspacePrefixEnvVar, "user:custom:") t.Setenv(redisDomainEventsStreamEnvVar, "user:test_events") t.Setenv(redisDomainEventsStreamMaxLenEnvVar, "2048") t.Setenv(otelServiceNameEnvVar, "galaxy-user-stage12") t.Setenv(otelTracesExporterEnvVar, "otlp") t.Setenv(otelMetricsExporterEnvVar, "otlp") t.Setenv(otelExporterOTLPTracesProtocolEnvVar, "grpc") t.Setenv(otelExporterOTLPMetricsProtocolEnvVar, "http/protobuf") t.Setenv(otelStdoutTracesEnabledEnvVar, "true") t.Setenv(otelStdoutMetricsEnabledEnvVar, "true") cfg, err := LoadFromEnv() require.NoError(t, err) require.Equal(t, 9*time.Second, cfg.ShutdownTimeout) require.Equal(t, "debug", cfg.Logging.Level) require.Equal(t, "127.0.0.1:18091", cfg.InternalHTTP.Addr) require.Equal(t, 3*time.Second, cfg.InternalHTTP.ReadHeaderTimeout) require.Equal(t, 750*time.Millisecond, cfg.InternalHTTP.RequestTimeout) require.Equal(t, "127.0.0.1:19091", cfg.AdminHTTP.Addr) require.Equal(t, 90*time.Second, cfg.AdminHTTP.IdleTimeout) require.Equal(t, "127.0.0.1:6380", cfg.Redis.Addr) require.Equal(t, "alice", cfg.Redis.Username) require.Equal(t, "secret", cfg.Redis.Password) require.Equal(t, 3, cfg.Redis.DB) require.True(t, cfg.Redis.TLSEnabled) require.Equal(t, 900*time.Millisecond, cfg.Redis.OperationTimeout) require.Equal(t, "user:custom:", cfg.Redis.KeyspacePrefix) require.Equal(t, "user:test_events", cfg.Redis.DomainEventsStream) require.Equal(t, int64(2048), cfg.Redis.DomainEventsStreamMaxLen) require.Equal(t, "galaxy-user-stage12", cfg.Telemetry.ServiceName) require.Equal(t, "otlp", cfg.Telemetry.TracesExporter) require.Equal(t, "otlp", cfg.Telemetry.MetricsExporter) require.Equal(t, "grpc", cfg.Telemetry.TracesProtocol) require.Equal(t, "http/protobuf", cfg.Telemetry.MetricsProtocol) require.True(t, cfg.Telemetry.StdoutTracesEnabled) require.True(t, cfg.Telemetry.StdoutMetricsEnabled) } func TestLoadFromEnvRejectsInvalidValues(t *testing.T) { tests := []struct { name string envName string envVal string }{ {name: "invalid duration", envName: shutdownTimeoutEnvVar, envVal: "later"}, {name: "invalid bool", envName: redisTLSEnabledEnvVar, envVal: "sometimes"}, {name: "invalid log level", envName: logLevelEnvVar, envVal: "verbose"}, {name: "invalid int", envName: redisDBEnvVar, envVal: "db-three"}, {name: "invalid stream max len", envName: redisDomainEventsStreamMaxLenEnvVar, envVal: "many"}, {name: "invalid traces exporter", envName: otelTracesExporterEnvVar, envVal: "zipkin"}, {name: "invalid metrics protocol", envName: otelExporterOTLPMetricsProtocolEnvVar, envVal: "udp"}, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Setenv(redisAddrEnvVar, "127.0.0.1:6379") t.Setenv(tt.envName, tt.envVal) _, err := LoadFromEnv() require.Error(t, err) }) } }