fix(roles): роли на себя выдавать можно, самомодерация запрещена
Владелец сервера или участник с MANAGE_ROLES не мог выдать роль себе: общий запрет самомодерации (кик, бан, тайм-аут) распространялся и на оформление. Проверка иерархии для ролей вынесена отдельно: себя менять можно, владельца и администратора инстанса — по-прежнему нет.
This commit is contained in:
@@ -302,3 +302,49 @@ func TestPersonalStyleAvailability(t *testing.T) {
|
||||
t.Fatalf("сброс стиля = %d", rec.Code)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSelfRoleAssignmentForCosmetics(t *testing.T) {
|
||||
srv, owner, _, guildID, _ := cosmeticsFixture(t)
|
||||
frameID, status := uploadCosmetic(t, srv, guildID, "frame", "Своя", owner)
|
||||
if status != http.StatusOK {
|
||||
t.Fatalf("загрузка рамки: статус %d", status)
|
||||
}
|
||||
// Свою роль выдать можно: иначе владелец не примерит оформление.
|
||||
created := doJSON(t, srv, http.MethodPost, "/api/v1/guilds/"+guildID+"/roles",
|
||||
`{"name":"Своя роль","cosmetic_frame_id":"`+frameID+`"}`, owner)
|
||||
roleID := decodeResponse[struct {
|
||||
Role struct {
|
||||
ID string `json:"id"`
|
||||
} `json:"role"`
|
||||
}](t, created).Role.ID
|
||||
|
||||
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
|
||||
|
||||
granted := doJSON(t, srv, http.MethodPut,
|
||||
"/api/v1/guilds/"+guildID+"/members/"+ownerID+"/roles/"+roleID, "", owner)
|
||||
if granted.Code != http.StatusOK {
|
||||
t.Fatalf("выдача роли себе = %d (%s)", granted.Code, granted.Body.String())
|
||||
}
|
||||
effective := memberCosmetics(t, srv, guildID, ownerID, owner)
|
||||
if effective.FrameID != frameID {
|
||||
t.Fatalf("рамка не применилась: %+v", effective)
|
||||
}
|
||||
|
||||
// Свою роль можно и снять (владелец остаётся владельцем).
|
||||
revoked := doJSON(t, srv, http.MethodDelete,
|
||||
"/api/v1/guilds/"+guildID+"/members/"+ownerID+"/roles/"+roleID, "", owner)
|
||||
if revoked.Code != http.StatusOK {
|
||||
t.Fatalf("снятие своей роли = %d (%s)", revoked.Code, revoked.Body.String())
|
||||
}
|
||||
|
||||
// Самомодерация по-прежнему запрещена: кик себя отклоняется.
|
||||
kick := doJSON(t, srv, http.MethodDelete, "/api/v1/guilds/"+guildID+"/members/"+ownerID, "", owner)
|
||||
if kick.Code != http.StatusForbidden {
|
||||
t.Fatalf("кик себя = %d, ожидался 403", kick.Code)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user