Files
gitea/services/user/block_test.go
T
EvenandGitHub 06e334121f fix(user): allow unblocking users promoted to admin (#39192)
Fixes #39189.

`IsUserBlockedBy` intentionally treats admin users as not blocked, but
`CanUnblockUser` was also using it to determine whether a blocking
relationship exists. If a previously blocked user is later promoted to
admin, the existing `user_blocking` record remains but can no longer be
removed.

This change separates those two concerns by adding `HasBlocking` for
checking the persisted blocking relationship. `CanUnblockUser` uses that
relationship check while `IsUserBlockedBy` keeps its existing admin-user
behavior.

A regression test verifies that an admin is still not considered blocked
while an existing blocking relationship can still be unblocked.
2026-09-23 16:54:12 +00:00

70 lines
2.9 KiB
Go

// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package user
import (
"testing"
"gitea.dev/models/unittest"
user_model "gitea.dev/models/user"
"github.com/stretchr/testify/assert"
)
func TestCanBlockUser(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
user29 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29})
org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
// Doer can't self block
assert.False(t, CanBlockUser(t.Context(), user1, user2, user1))
// Blocker can't be blockee
assert.False(t, CanBlockUser(t.Context(), user1, user2, user2))
// Can't block already blocked user
assert.False(t, CanBlockUser(t.Context(), user1, user2, user29))
// Blockee can't be an organization
assert.False(t, CanBlockUser(t.Context(), user1, user2, org3))
// Doer must be blocker or admin
assert.False(t, CanBlockUser(t.Context(), user2, user4, user29))
// Organization can't block a member
assert.False(t, CanBlockUser(t.Context(), user1, org3, user4))
// Doer must be organization owner or admin if blocker is an organization
assert.False(t, CanBlockUser(t.Context(), user4, org3, user2))
assert.True(t, CanBlockUser(t.Context(), user1, user2, user4))
assert.True(t, CanBlockUser(t.Context(), user2, user2, user4))
assert.True(t, CanBlockUser(t.Context(), user2, org3, user29))
}
func TestCanUnblockUser(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
user28 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 28})
user29 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29})
org17 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 17})
// Doer can't self unblock
assert.False(t, CanUnblockUser(t.Context(), user1, user2, user1))
// Can't unblock not blocked user
assert.False(t, CanUnblockUser(t.Context(), user1, user2, user28))
// Doer must be blocker or admin
assert.False(t, CanUnblockUser(t.Context(), user28, user2, user29))
// Doer must be organization owner or admin if blocker is an organization
assert.False(t, CanUnblockUser(t.Context(), user2, org17, user28))
assert.True(t, CanUnblockUser(t.Context(), user1, user2, user29))
assert.True(t, CanUnblockUser(t.Context(), user2, user2, user29))
assert.True(t, CanUnblockUser(t.Context(), user1, org17, user28))
// Existing block can still be removed after the blockee becomes an admin.
user29.IsAdmin = true
assert.False(t, user_model.IsUserBlockedBy(t.Context(), user29, user2.ID))
assert.True(t, CanUnblockUser(t.Context(), user2, user2, user29))
}