package config import ( "os" "path/filepath" "reflect" "testing" ) func TestDefaultAllowedOrigins(t *testing.T) { if got := Default().Server.AllowedOrigins; len(got) != 0 { t.Fatalf("默认白名单应为空: %v", got) } } func TestLoadAllowedOrigins(t *testing.T) { path := filepath.Join(t.TempDir(), "config.yaml") raw := "server:\n allowedOrigins:\n - http://a.example\n - https://b.example\n" if err := os.WriteFile(path, []byte(raw), 0o644); err != nil { t.Fatalf("写入配置: %v", err) } cfg, err := Load(path) if err != nil { t.Fatalf("加载配置: %v", err) } want := []string{"http://a.example", "https://b.example"} if !reflect.DeepEqual(cfg.Server.AllowedOrigins, want) { t.Fatalf("白名单解析错误: got %v want %v", cfg.Server.AllowedOrigins, want) } } // -data 只在非空时覆盖配置:不传与传空串都必须保持配置文件里的值, // 否则 Console 之外的便携/手工运行会被改写数据目录。 func TestApplyDataDir(t *testing.T) { cases := []struct { name string dir string want string applied bool }{ {"非空覆盖配置值", `/var/lib/scoreboard`, `/var/lib/scoreboard`, true}, {"两侧空白会被去掉", " /var/lib/scoreboard ", `/var/lib/scoreboard`, true}, {"空串保持配置值", "", "cfg-data", false}, {"纯空白等于不传", " ", "cfg-data", false}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { path := filepath.Join(t.TempDir(), "config.yaml") if err := os.WriteFile(path, []byte("dataDir: cfg-data\nserver:\n port: 19540\n"), 0o644); err != nil { t.Fatalf("写入配置: %v", err) } cfg, err := Load(path) if err != nil { t.Fatalf("加载配置: %v", err) } if got := cfg.ApplyDataDir(tc.dir); got != tc.applied { t.Fatalf("ApplyDataDir(%q) 覆盖标记: got %v want %v", tc.dir, got, tc.applied) } if cfg.DataDir != tc.want { t.Fatalf("ApplyDataDir(%q) 后 DataDir: got %q want %q", tc.dir, cfg.DataDir, tc.want) } }) } } // 日志配置:默认值开箱即用,配了 log.dir 就按它走,不配就落在 /logs。 func TestLogConfigDefaultsAndDirPath(t *testing.T) { def := Default().Log if def.Level != "info" { t.Fatalf("默认级别应为 info,得到 %q", def.Level) } if def.MaxSizeMB <= 0 || def.KeepFiles <= 0 { t.Fatalf("大小上限与保留份数都要有默认值,得到 %+v", def) } if got := def.DirPath("/data/sb"); got != filepath.Join("/data/sb", "logs") { t.Fatalf("未配 dir 时应落在数据目录下的 logs,得到 %q", got) } path := filepath.Join(t.TempDir(), "config.yaml") raw := "log:\n level: warn\n dir: /var/log/scoreboard\n maxSizeMB: 5\n keepFiles: 3\n" if err := os.WriteFile(path, []byte(raw), 0o644); err != nil { t.Fatalf("写入配置: %v", err) } cfg, err := Load(path) if err != nil { t.Fatalf("加载配置: %v", err) } if cfg.Log.Level != "warn" || cfg.Log.MaxSizeMB != 5 || cfg.Log.KeepFiles != 3 { t.Fatalf("log 段解析错误: %+v", cfg.Log) } if got := cfg.Log.DirPath("/data/sb"); got != "/var/log/scoreboard" { t.Fatalf("配了 dir 就该用它,得到 %q", got) } }