package config import ( "testing" "time" ) func TestLoadReadsRequestTimeout(t *testing.T) { t.Setenv("REQUEST_TIMEOUT_MS", "1200") cfg := Load() if cfg.RequestTimeout != 1200*time.Millisecond { t.Fatalf("RequestTimeout = %s, want 1.2s", cfg.RequestTimeout) } } func TestLoadReadsPlatformRelease(t *testing.T) { t.Setenv("PLATFORM_RELEASE", "platform-20260704153005") cfg := Load() if cfg.PlatformRelease != "platform-20260704153005" { t.Fatalf("PlatformRelease = %q", cfg.PlatformRelease) } } func TestLoadReadsAMapServerAPIKey(t *testing.T) { t.Setenv("AMAP_API_KEY", "server-map-key") cfg := Load() if cfg.AMapAPIKey != "server-map-key" { t.Fatalf("AMapAPIKey = %q", cfg.AMapAPIKey) } } func TestLoadSelectsProductionDataModeWhenMySQLIsConfigured(t *testing.T) { t.Setenv("DATA_MODE", "") t.Setenv("MYSQL_DSN", "user:password@tcp(db:3306)/platform") if cfg := Load(); cfg.DataMode != "production" { t.Fatalf("DataMode = %q, want production", cfg.DataMode) } } func TestLoadKeepsExplicitMockDataMode(t *testing.T) { t.Setenv("DATA_MODE", "mock") t.Setenv("MYSQL_DSN", "user:password@tcp(db:3306)/platform") if cfg := Load(); cfg.DataMode != "mock" { t.Fatalf("DataMode = %q, want mock", cfg.DataMode) } } func TestLoadReadsAlertNotificationDispatcherSettings(t *testing.T) { t.Setenv("ALERT_NOTIFICATION_TARGETS_JSON", `[{"id":"night-shift","label":"夜班负责人","channels":["sms"]}]`) t.Setenv("ALERT_NOTIFICATION_SMS_URL", "https://gateway.example.test/sms") t.Setenv("ALERT_NOTIFICATION_SMS_SECRET", "signing-secret") t.Setenv("ALERT_NOTIFICATION_BATCH_SIZE", "48") t.Setenv("ALERT_NOTIFICATION_POLL_INTERVAL_MS", "750") t.Setenv("ALERT_NOTIFICATION_LEASE_SEC", "45") t.Setenv("ALERT_NOTIFICATION_TIMEOUT_MS", "8000") cfg := Load() if cfg.AlertNotificationTargetsJSON == "" || cfg.AlertNotificationSMSURL != "https://gateway.example.test/sms" || cfg.AlertNotificationSMSSecret != "signing-secret" { t.Fatalf("notification target or gateway settings were not loaded: %+v", cfg) } if cfg.AlertNotificationBatchSize != 48 || cfg.AlertNotificationPollInterval != 750*time.Millisecond || cfg.AlertNotificationLease != 45*time.Second || cfg.AlertNotificationTimeout != 8*time.Second { t.Fatalf("notification worker timing settings were not loaded: %+v", cfg) } } func TestLoadReadsHistoryCleanupAutomationSettings(t *testing.T) { t.Setenv("HISTORY_EXPORT_CLEANUP_AUTOMATION_ENABLED", "true") t.Setenv("HISTORY_EXPORT_CLEANUP_POLL_SEC", "45") t.Setenv("HISTORY_EXPORT_CLEANUP_LEASE_SEC", "420") cfg := Load() if !cfg.HistoryCleanupAutomation || cfg.HistoryCleanupPollInterval != 45*time.Second || cfg.HistoryCleanupLease != 7*time.Minute { t.Fatalf("history cleanup automation settings were not loaded: %+v", cfg) } }