package services import ( "testing" "server/models" ) func strPtr(s string) *string { return &s } func TestParsePlatforms(t *testing.T) { cases := []struct { name string raw *string want int }{ {"nil 视为全端", nil, 0}, {"空串视为全端", strPtr(""), 0}, {"空格视为全端", strPtr(" "), 0}, {"单值 web", strPtr(`["web"]`), 1}, {"双值", strPtr(`["web","app"]`), 2}, {"大小写归一化", strPtr(`["WEB"]`), 1}, {"非法 JSON 退化为单值", strPtr("web"), 1}, } for _, c := range cases { got := ParsePlatforms(c.raw) if len(got) != c.want { t.Errorf("%s: got %d items (%v), want %d", c.name, len(got), got, c.want) } } } func TestHasPlatform(t *testing.T) { if !HasPlatform(nil, models.PlatformWeb) || !HasPlatform(nil, models.PlatformApp) { t.Error("未配置时应当全端可见") } web := []string{"web"} if !HasPlatform(web, "web") { t.Error("web 配置应在 web 端可见") } if HasPlatform(web, "app") { t.Error("web 配置不应在 app 端可见") } both := []string{"web", "app"} if !HasPlatform(both, "web") || !HasPlatform(both, "app") { t.Error("双端配置应两端都可见") } } func TestNormalizePlatforms(t *testing.T) { if got := NormalizePlatforms(nil); got != "" { t.Errorf("空输入应返回空串(表示全端),got %q", got) } if got := NormalizePlatforms([]string{"WEB", " app ", "web"}); got != `["web","app"]` { t.Errorf("应去重并小写归一化,got %q", got) } } // 模块级过滤:覆盖三种业务场景 func TestFilterModulesByPlatform(t *testing.T) { web := `["web"]` app := `["app"]` both := `["web","app"]` rows := []models.SystemModules{ {Code: "crm", Platforms: &web}, // 仅 Web {Code: "oa", Platforms: &app}, // 仅小程序 {Code: "cms", Platforms: &both}, // 双端 {Code: "erp", Platforms: nil}, // 未配置 → 全端 } got := FilterModulesByPlatform(rows, models.PlatformWeb) if len(got) != 3 { t.Errorf("Web 端应看到 crm/cms/erp 共 3 个,got %d", len(got)) } gotApp := FilterModulesByPlatform(rows, models.PlatformApp) if len(gotApp) != 3 { t.Errorf("移动端应看到 oa/cms/erp 共 3 个,got %d", len(gotApp)) } } func TestFilterMenusByPlatform(t *testing.T) { app := `["app"]` rows := []models.SystemMenu{ {Title: "线索", Platforms: strPtr(`["web"]`)}, {Title: "日程", Platforms: &app}, {Title: "客户", Platforms: nil}, } if got := FilterMenusByPlatform(rows, models.PlatformApp); len(got) != 2 { t.Errorf("移动端应看到 日程/客户 共 2 条,got %d", len(got)) } }