package business import ( "context" "kra/internal/biz/business" "testing" ) func TestRankingStorageDifferentRootAndBusinessScopes(t *testing.T) { db, _, scope, filter := prepareAnalyticsData(t) r := NewRankingRepo(testData{db}) ctx := context.Background() f := business.RankingRange{AnalyticsFilter: filter, PreviousBegin: "2026-10-01", PreviousEnd: "2026-10-03"} data, err := r.Collect(ctx, business.GameRanking, scope, f) if err != nil || len(data.Current) != 3 || data.Current[business.AnalyticsKey{SourceDB: "lx", ID: 1}].Name != "游戏甲" { t.Fatalf("游戏排行或当前名称错误: %+v %v", data, err) } scope.Viewer = business.UserScope{SelfID: 7, IncludeSelf: true, DescendantPath: "0,7"} data, err = r.Collect(ctx, business.BusinessRanking, scope, f) if err != nil { t.Fatal(err) } var child *business.RankingBusiness for _, target := range data.Businesses { if target.ID == 8 { child = target } if target.ID != 8 && target.ID != 10 { t.Fatal("一级只能排行直属下级") } } if child == nil || len(child.Channels) != 5 { t.Fatalf("二级本人的 hw 和下属三级的 lx 渠道应合并: %+v", child) } if _, ok := data.Current[business.AnalyticsKey{SourceDB: "lx", ID: 0}]; ok { t.Fatal("商务榜渠道映射不应包含官方流水") } scope.Viewer = business.UserScope{SelfID: 8, IncludeSelf: true, DescendantPath: "0,7,8"} data, err = r.Collect(ctx, business.BusinessRanking, scope, f) if err != nil || len(data.Businesses) != 1 || data.Businesses[0].ID != 9 || len(data.Businesses[0].Channels) != 4 { t.Fatal("二级商务榜只能展示直属三级及其渠道") } scope.Viewer = business.UserScope{All: true} data, err = r.Collect(ctx, business.BusinessRanking, scope, f) if err != nil { t.Fatal(err) } seen := map[uint]bool{} for _, b := range data.Businesses { seen[b.ID] = true } if !seen[7] || !seen[8] || !seen[9] || seen[1] || seen[99] { t.Fatal("超管应展示所选平台有渠道的各级商务,不能包含普通框架管理员") } if err := db.Exec("UPDATE tab_promote SET top_promote_id=777 WHERE source_db='lx' AND id=100").Error; err != nil { t.Fatal(err) } scope = business.AnalyticsScope{Viewer: channelTestScope(), IncludeSub: false, IDCardDedup: true} data, err = r.Collect(ctx, business.ChannelRanking, scope, f) root := data.Current[business.AnalyticsKey{SourceDB: "lx", ID: 777}] if err != nil || root == nil || portraitTestMoney(root.Pay) != "10.10" || root.Counts.Register != 1 { t.Fatalf("独立渠道榜使用 COALESCE(top,id),不应误用工作台 CASE 根算法: %+v %v", root, err) } if err := db.Exec("DROP TABLE tab_sw_report_day_key").Error; err != nil { t.Fatal(err) } data, err = r.Collect(ctx, business.ChannelRanking, scope, f) if err != nil || data.Available { t.Fatal("缺表应明确未接入") } }