package user import ( "testing" "yunyan/comm" ) // 客户端拿到的就是这三个布尔值,各端据此决定「提示更新 / 阻断使用 / 隐藏未过审功能」, // 判定错了直接表现为线上事故,故逐个组合固化。 func TestEvalChannelUpgrade(t *testing.T) { cfg := &comm.ChannelApp{Version: "1.10.0", MinVersion: "1.5.0", ForceUpdate: true, ReviewVersion: "1.11.0"} cases := []struct { name string cfg *comm.ChannelApp client string need, force, reviewing bool }{ {"低于最低支持版本:强更", cfg, "1.4.9", true, true, false}, {"高于最低支持、低于线上:只提示更新", cfg, "1.9.0", true, false, false}, {"已是线上最新:什么都不提示", cfg, "1.10.0", false, false, false}, {"高于线上版本(内测包):不提示", cfg, "1.11.0", false, false, true}, {"送审版本:标记审核期", cfg, "1.11.0", false, false, true}, {"客户端未上报版本:一律 false,不能把老客户端全挡住", cfg, "", false, false, false}, {"该渠道未配置:一律 false", nil, "1.0.0", false, false, false}, {"字符串比较陷阱:1.9 < 1.10 应判定为需更新", cfg, "1.9.9", true, false, false}, } for _, c := range cases { t.Run(c.name, func(t *testing.T) { need, force, reviewing := evalChannelUpgrade(c.cfg, c.client) if need != c.need || force != c.force || reviewing != c.reviewing { t.Fatalf("client=%q 得到 need=%v force=%v reviewing=%v,期望 need=%v force=%v reviewing=%v", c.client, need, force, reviewing, c.need, c.force, c.reviewing) } }) } } // 运营把最低支持版本填得比线上版本还高时,不能出现「必须更新但没有更新可用」这种客户端无解的组合。 func TestEvalChannelUpgradeForceImpliesNeed(t *testing.T) { cfg := &comm.ChannelApp{Version: "1.0.0", MinVersion: "2.0.0", ForceUpdate: true} need, force, _ := evalChannelUpgrade(cfg, "1.5.0") if !force { t.Fatal("低于最低支持版本应强更") } if !need { t.Fatal("强更时 needupdate 必须同时为 true,否则客户端会收到「必须更新但无更新」") } } // 停用/草稿的渠道由 model 层过滤成 nil,这里确认 nil 不会 panic 也不会误判。 func TestEvalChannelUpgradeNilSafe(t *testing.T) { if need, force, reviewing := evalChannelUpgrade(nil, "1.0.0"); need || force || reviewing { t.Fatal("nil 配置必须全 false") } }