package config import ( "strings" "testing" "git.yeij.top/AskaEth/Cyrene_v2/internal/platform" ) // TestLoad_DataDirPlatformSentinel 覆盖数据目录的两种取法(design/13 §2, // 裁决 12.4.2 + 15.4.1):未配置走默认 `./data`;显式哨兵 `platform` 才走 // 平台标准数据目录;显式路径原样保留。 func TestLoad_DataDirPlatformSentinel(t *testing.T) { t.Setenv("JWT_SECRET", strings.Repeat("s", 40)) unsetEnvForTest(t, "DATA_DIR") cfg, err := Load("") if err != nil { t.Fatalf("Load() error: %v", err) } if cfg.DataDir != "./data" { t.Errorf("DataDir = %q, want ./data (unset keeps the historic default)", cfg.DataDir) } t.Setenv("DATA_DIR", "platform") cfg, err = Load("") if err != nil { t.Fatalf("Load() with sentinel error: %v", err) } if want := platform.DefaultDataDir(); cfg.DataDir != want { t.Errorf("DataDir = %q, want the platform standard dir %q", cfg.DataDir, want) } // 显式路径(含显式 ./data)不被改写。 for _, p := range []string{"./data", "/var/lib/cyrene"} { t.Setenv("DATA_DIR", p) cfg, err = Load("") if err != nil { t.Fatalf("Load() with DATA_DIR=%q error: %v", p, err) } if cfg.DataDir != p { t.Errorf("DataDir = %q, want %q verbatim", cfg.DataDir, p) } } } // TestAdminPathPrefix 覆盖安全入口前缀的归一化(裁决 1.6 / 16.4.7, // design/07 §0.2):默认 `admin` → `/admin`,自定义 `xxx/admin` → // `/xxx/admin`(即 `host/xxx/admin` 形态),非法值一律挂回默认。 func TestAdminPathPrefix(t *testing.T) { want := map[string]string{ "": "/admin", "admin": "/admin", "/admin": "/admin", "/admin/": "/admin", "xxx/admin": "/xxx/admin", "/xxx/admin/": "/xxx/admin", " a / b ": "/a/b", "../etc": "/admin", "a/../b": "/admin", "a//b": "/admin", "a?b": "/admin", "a#b": "/admin", " ": "/admin", } for in, exp := range want { cfg := ServerConfig{AdminPath: in} if got := cfg.AdminPathPrefix(); got != exp { t.Errorf("AdminPath %q → %q, want %q", in, got, exp) } } }