package service import ( "testing" "github.com/freefire/jiang13-bbs/model" "github.com/glebarez/sqlite" "gorm.io/gorm" ) // 板块右栏聚合:管理员应携带等级(AfterFind 按累计积分计算)与颁发的徽章 func TestBoardSidebarModeratorsCarryLevelAndBadges(t *testing.T) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) if err != nil { t.Fatalf("open sqlite: %v", err) } if err := db.AutoMigrate(&model.User{}, &model.Board{}, &model.UserBoard{}, &model.Post{}, &model.Comment{}, &model.Badge{}, &model.UserBadge{}); err != nil { t.Fatalf("migrate: %v", err) } board := model.Board{Name: "综合讨论"} if err := db.Create(&board).Error; err != nil { t.Fatalf("seed board: %v", err) } // 高积分管理员 + 低积分管理员 + 普通用户(不入列) modHigh := model.User{Username: "mod_high", Password: "x", Role: model.RoleBoardAdmin, TotalPoints: 10000} modLow := model.User{Username: "mod_low", Password: "x", Role: model.RoleBoardAdmin} plain := model.User{Username: "plain", Password: "x"} for _, u := range []*model.User{&modHigh, &modLow, &plain} { if err := db.Create(u).Error; err != nil { t.Fatalf("seed user: %v", err) } } for _, uid := range []uint{modHigh.ID, modLow.ID, plain.ID} { if err := db.Create(&model.UserBoard{UserID: uid, BoardID: board.ID}).Error; err != nil { t.Fatalf("seed user_board: %v", err) } } badge := model.Badge{Name: "骨灰玩家", Icon: "medal", Color: "gold"} if err := db.Create(&badge).Error; err != nil { t.Fatalf("seed badge: %v", err) } if err := db.Create(&model.UserBadge{BadgeID: badge.ID, UserID: modHigh.ID, AwardedBy: 1}).Error; err != nil { t.Fatalf("seed user_badge: %v", err) } s := NewBoardService(db) data, err := s.Sidebar(board.ID) if err != nil { t.Fatalf("Sidebar: %v", err) } if len(data.Moderators) != 2 { t.Fatalf("应只含 2 名 board_admin,got %d", len(data.Moderators)) } first := data.Moderators[0] if first.Username != "mod_high" { t.Fatalf("排序错位: %+v", first) } if first.Level <= 1 { t.Fatalf("高积分管理员等级应 >1,got %d", first.Level) } if len(first.Badges) != 1 || first.Badges[0].Badge.Name != "骨灰玩家" { t.Fatalf("徽章未随行加载: %+v", first.Badges) } if data.Moderators[1].Level != 1 || len(data.Moderators[1].Badges) != 0 { t.Fatalf("低积分管理员应为 Lv.1 无徽章: %+v", data.Moderators[1]) } }