feat(profile): системные бейджи рядом с ником
- участники сервера отдают список бейджей из badges_json (AGENT.md 7.2): список расширяемый, назначается только системой - клиент: каталог бейджей (щит администратора инстанса, корона владельца, ранний сторонник, проверенный), неизвестные показываются нейтральной меткой - бейджи видны в ленте, списке участников и друзьях вместо текстовой плашки - тесты: Go (бейджи в списке участников) и Vitest (каталог и отрисовка)
This commit is contained in:
@@ -478,3 +478,46 @@ func TestChannelBackgroundUploadAndDelete(t *testing.T) {
|
||||
t.Fatalf("фон не снят: %s", removed.Body.String())
|
||||
}
|
||||
}
|
||||
|
||||
func TestMembersCarrySystemBadges(t *testing.T) {
|
||||
srv, owner, _, guildID, _ := cosmeticsFixture(t)
|
||||
me := doJSON(t, srv, http.MethodGet, "/api/v1/users/@me", "", owner)
|
||||
ownerID := decodeResponse[struct {
|
||||
User struct {
|
||||
ID string `json:"id"`
|
||||
} `json:"user"`
|
||||
}](t, me).User.ID
|
||||
// Бейдж назначает система (AGENT.md 7.2): в тесте ставим его напрямую.
|
||||
id, err := parseID("user_id", ownerID)
|
||||
if err != nil {
|
||||
t.Fatalf("parse user id: %v", err)
|
||||
}
|
||||
if err := srv.store.SetUserBadges(t.Context(), id, []string{"instance_admin"}); err != nil {
|
||||
t.Fatalf("set badges: %v", err)
|
||||
}
|
||||
|
||||
list := doJSON(t, srv, http.MethodGet, "/api/v1/guilds/"+guildID+"/members", "", owner)
|
||||
members := decodeResponse[struct {
|
||||
Members []struct {
|
||||
UserID string `json:"user_id"`
|
||||
Badges []string `json:"badges"`
|
||||
} `json:"members"`
|
||||
}](t, list)
|
||||
|
||||
var found bool
|
||||
for _, entry := range members.Members {
|
||||
if entry.Badges == nil {
|
||||
t.Fatalf("бейджи должны быть списком, а не null")
|
||||
}
|
||||
if entry.UserID != ownerID {
|
||||
continue
|
||||
}
|
||||
found = true
|
||||
if !contains(entry.Badges, "instance_admin") {
|
||||
t.Fatalf("бейджи владельца = %v, ожидался instance_admin", entry.Badges)
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
t.Fatalf("участник %s не найден: %s", ownerID, list.Body.String())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user