- httpapi:新增 POST /api/shutdown(admin 会话或 X-Shutdown-Token 常量时间比对) 与 GET /api/rules/switches(recorder 可读,只回布尔开关);settings/standings 的 重复 DTO 收敛到 internal/dto;standings.showIndividualMedals 贯通到设置读写与前端 - export:抽出 export.Service,新增自动备份定时任务(backup.intervalMinutes/keep), 自动、手动、发布前三类备份共用同一把互斥锁与滚动清理 - realtime:/ws 去掉 InsecureSkipVerify,改用 OriginPatterns(同源与无 Origin 放行, 跨站需命中 server.allowedOrigins) - console:停止服务改走 POST /api/shutdown 优雅关闭(5 秒宽限后回退强杀), 服务管理器新增「已连接的大屏实例」卡片 - deploy:build.bat 改用 for /f 读内部署名——set /p 在 chcp 65001 下返回空, 导致最近这次构建的 exe 里根本没注入署名 - docs:备份策略、关闭超时、Origin 配置的说明与实现对齐
32 lines
808 B
Go
32 lines
808 B
Go
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)
|
|
}
|
|
}
|