package config import ( "strings" "testing" ) // TestLoad_BackgroundThinkingDefaults 锁定后台思考心跳(design/12 §N A1)的 env // 契约默认值:普通心跳 900s、安静窗口内心跳 3600s。后者必须与设计稿一致(1 小时), // 否则「没配这个键」与「配了但解析失败」会走向不同的行为。 func TestLoad_BackgroundThinkingDefaults(t *testing.T) { t.Setenv("JWT_SECRET", strings.Repeat("s", 40)) cfg, err := Load("") if err != nil { t.Fatalf("Load() error: %v", err) } got := cfg.Background if !got.Enabled { t.Error("ENABLE_BACKGROUND_THINKING 默认应为 true") } if got.IntervalSec != 900 { t.Errorf("THINK_INTERVAL_SEC = %d, want 900", got.IntervalSec) } if got.QuietIntervalSec != 3600 { t.Errorf("THINK_QUIET_INTERVAL_SEC = %d, want 3600(design/12 §N A1)", got.QuietIntervalSec) } if got.QuietStartHour != 23 || got.QuietEndHour != 7 { t.Errorf("安静时段 = %d-%d, want 23-7", got.QuietStartHour, got.QuietEndHour) } } // TestLoad_BackgroundThinkingEnvOverrides 锁定键名与类型:写进 .env 的旋钮真的生效 // (键名写错会静默沿用默认值,这类错误只能靠这条用例抓住)。 // `THINK_QUIET_INTERVAL_SEC=0` 是**合法值**(关闭降频,design/12 §N A3),因此它必须 // 原样解析成 0,不能被默认值覆盖。 func TestLoad_BackgroundThinkingEnvOverrides(t *testing.T) { t.Setenv("JWT_SECRET", strings.Repeat("s", 40)) t.Setenv("THINK_INTERVAL_SEC", "1200") t.Setenv("THINK_QUIET_INTERVAL_SEC", "0") cfg, err := Load("") if err != nil { t.Fatalf("Load() error: %v", err) } if cfg.Background.IntervalSec != 1200 { t.Fatalf("THINK_INTERVAL_SEC 未生效:%d", cfg.Background.IntervalSec) } if cfg.Background.QuietIntervalSec != 0 { t.Fatalf("THINK_QUIET_INTERVAL_SEC=0 必须原样解析成 0(关闭降频),得到 %d", cfg.Background.QuietIntervalSec) } }