[feature/backend] implement /users handler + switch to username + add display name + user management cli
This commit is contained in:
parent
1d712d4e6c
commit
86ab334bc9
38 changed files with 1851 additions and 506 deletions
|
@ -103,52 +103,50 @@ func newMockMultipartFile(data []byte) *mockMultipartFile {
|
|||
|
||||
func (s *ServiceImplTestSuite) TestCreateUser() {
|
||||
testCases := []struct {
|
||||
name string
|
||||
email string
|
||||
password string
|
||||
role string
|
||||
wantError bool
|
||||
name string
|
||||
username string
|
||||
email string
|
||||
password string
|
||||
role string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "Valid user creation",
|
||||
email: "test@example.com",
|
||||
password: "password123",
|
||||
role: "admin",
|
||||
wantError: false,
|
||||
name: "有效的用户",
|
||||
username: "testuser",
|
||||
email: "test@example.com",
|
||||
password: "password123",
|
||||
role: "user",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "Empty email",
|
||||
email: "",
|
||||
password: "password123",
|
||||
role: "user",
|
||||
wantError: true,
|
||||
name: "无效的邮箱",
|
||||
username: "testuser2",
|
||||
email: "invalid-email",
|
||||
password: "password123",
|
||||
role: "user",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "Empty password",
|
||||
email: "test@example.com",
|
||||
password: "",
|
||||
role: "user",
|
||||
wantError: true,
|
||||
},
|
||||
{
|
||||
name: "Invalid role",
|
||||
email: "test@example.com",
|
||||
password: "password123",
|
||||
role: "invalid_role",
|
||||
wantError: true,
|
||||
name: "空密码",
|
||||
username: "testuser3",
|
||||
email: "test3@example.com",
|
||||
password: "",
|
||||
role: "user",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
s.Run(tc.name, func() {
|
||||
user, err := s.svc.CreateUser(s.ctx, tc.email, tc.password, tc.role)
|
||||
if tc.wantError {
|
||||
assert.Error(s.T(), err)
|
||||
assert.Nil(s.T(), user)
|
||||
user, err := s.svc.CreateUser(s.ctx, tc.username, tc.email, tc.password, tc.role)
|
||||
if tc.wantErr {
|
||||
s.Error(err)
|
||||
s.Nil(user)
|
||||
} else {
|
||||
assert.NoError(s.T(), err)
|
||||
assert.NotNil(s.T(), user)
|
||||
assert.Equal(s.T(), tc.email, user.Email)
|
||||
s.NoError(err)
|
||||
s.NotNil(user)
|
||||
s.Equal(tc.email, user.Email)
|
||||
s.Equal(tc.username, user.Username)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -160,7 +158,7 @@ func (s *ServiceImplTestSuite) TestGetUserByEmail() {
|
|||
password := "password123"
|
||||
role := "user"
|
||||
|
||||
user, err := s.svc.CreateUser(s.ctx, email, password, role)
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser", email, password, role)
|
||||
require.NoError(s.T(), err)
|
||||
require.NotNil(s.T(), user)
|
||||
|
||||
|
@ -184,7 +182,7 @@ func (s *ServiceImplTestSuite) TestValidatePassword() {
|
|||
password := "password123"
|
||||
role := "user"
|
||||
|
||||
user, err := s.svc.CreateUser(s.ctx, email, password, role)
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser", email, password, role)
|
||||
require.NoError(s.T(), err)
|
||||
require.NotNil(s.T(), user)
|
||||
|
||||
|
@ -201,7 +199,7 @@ func (s *ServiceImplTestSuite) TestValidatePassword() {
|
|||
|
||||
func (s *ServiceImplTestSuite) TestRBAC() {
|
||||
s.Run("AssignRole", func() {
|
||||
user, err := s.svc.CreateUser(s.ctx, "test@example.com", "password", "admin")
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser", "test@example.com", "password", "admin")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
err = s.svc.AssignRole(s.ctx, user.ID, "user")
|
||||
|
@ -209,7 +207,7 @@ func (s *ServiceImplTestSuite) TestRBAC() {
|
|||
})
|
||||
|
||||
s.Run("RemoveRole", func() {
|
||||
user, err := s.svc.CreateUser(s.ctx, "test2@example.com", "password", "admin")
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser2", "test2@example.com", "password", "admin")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
err = s.svc.RemoveRole(s.ctx, user.ID, "admin")
|
||||
|
@ -218,7 +216,7 @@ func (s *ServiceImplTestSuite) TestRBAC() {
|
|||
|
||||
s.Run("HasPermission", func() {
|
||||
s.Run("Admin can create users", func() {
|
||||
user, err := s.svc.CreateUser(s.ctx, "admin@example.com", "password", "admin")
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser3", "admin@example.com", "password", "admin")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
hasPermission, err := s.svc.HasPermission(s.ctx, user.ID, "users:create")
|
||||
|
@ -227,7 +225,7 @@ func (s *ServiceImplTestSuite) TestRBAC() {
|
|||
})
|
||||
|
||||
s.Run("Editor cannot create users", func() {
|
||||
user, err := s.svc.CreateUser(s.ctx, "editor@example.com", "password", "editor")
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser4", "editor@example.com", "password", "editor")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
hasPermission, err := s.svc.HasPermission(s.ctx, user.ID, "users:create")
|
||||
|
@ -236,7 +234,7 @@ func (s *ServiceImplTestSuite) TestRBAC() {
|
|||
})
|
||||
|
||||
s.Run("User cannot create users", func() {
|
||||
user, err := s.svc.CreateUser(s.ctx, "user@example.com", "password", "user")
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser5", "user@example.com", "password", "user")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
hasPermission, err := s.svc.HasPermission(s.ctx, user.ID, "users:create")
|
||||
|
@ -245,7 +243,7 @@ func (s *ServiceImplTestSuite) TestRBAC() {
|
|||
})
|
||||
|
||||
s.Run("Editor can create posts", func() {
|
||||
user, err := s.svc.CreateUser(s.ctx, "editor2@example.com", "password", "editor")
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser6", "editor2@example.com", "password", "editor")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
hasPermission, err := s.svc.HasPermission(s.ctx, user.ID, "posts:create")
|
||||
|
@ -254,7 +252,7 @@ func (s *ServiceImplTestSuite) TestRBAC() {
|
|||
})
|
||||
|
||||
s.Run("User can read posts", func() {
|
||||
user, err := s.svc.CreateUser(s.ctx, "user2@example.com", "password", "user")
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser7", "user2@example.com", "password", "user")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
hasPermission, err := s.svc.HasPermission(s.ctx, user.ID, "posts:read")
|
||||
|
@ -263,7 +261,7 @@ func (s *ServiceImplTestSuite) TestRBAC() {
|
|||
})
|
||||
|
||||
s.Run("User cannot create posts", func() {
|
||||
user, err := s.svc.CreateUser(s.ctx, "user3@example.com", "password", "user")
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser8", "user3@example.com", "password", "user")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
hasPermission, err := s.svc.HasPermission(s.ctx, user.ID, "posts:create")
|
||||
|
@ -272,7 +270,7 @@ func (s *ServiceImplTestSuite) TestRBAC() {
|
|||
})
|
||||
|
||||
s.Run("Invalid permission format", func() {
|
||||
user, err := s.svc.CreateUser(s.ctx, "user4@example.com", "password", "user")
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser9", "user4@example.com", "password", "user")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
_, err = s.svc.HasPermission(s.ctx, user.ID, "invalid_permission")
|
||||
|
@ -284,7 +282,7 @@ func (s *ServiceImplTestSuite) TestRBAC() {
|
|||
|
||||
func (s *ServiceImplTestSuite) TestCategory() {
|
||||
// Create a test user with admin role for testing
|
||||
adminUser, err := s.svc.CreateUser(s.ctx, "admin@example.com", "password123", "admin")
|
||||
adminUser, err := s.svc.CreateUser(s.ctx, "testuser10", "admin@example.com", "password123", "admin")
|
||||
require.NoError(s.T(), err)
|
||||
require.NotNil(s.T(), adminUser)
|
||||
|
||||
|
@ -510,7 +508,7 @@ func (s *ServiceImplTestSuite) TestGetUserRoles() {
|
|||
ctx := context.Background()
|
||||
|
||||
// 创建测试用户,默认会有 "user" 角色
|
||||
user, err := s.svc.CreateUser(ctx, "test@example.com", "password123", "user")
|
||||
user, err := s.svc.CreateUser(ctx, "testuser", "test@example.com", "password123", "user")
|
||||
s.Require().NoError(err)
|
||||
|
||||
// 测试新用户有默认的 "user" 角色
|
||||
|
@ -840,7 +838,7 @@ func (s *ServiceImplTestSuite) TestPost() {
|
|||
func (s *ServiceImplTestSuite) TestMedia() {
|
||||
s.Run("Upload Media", func() {
|
||||
// Create a user first
|
||||
user, err := s.svc.CreateUser(s.ctx, "test@example.com", "password123", "")
|
||||
user, err := s.svc.CreateUser(s.ctx, "testuser", "test@example.com", "password123", "user")
|
||||
require.NoError(s.T(), err)
|
||||
require.NotNil(s.T(), user)
|
||||
|
||||
|
@ -963,7 +961,7 @@ func (s *ServiceImplTestSuite) TestMedia() {
|
|||
|
||||
s.Run("Delete Media - Unauthorized", func() {
|
||||
// Create a user
|
||||
user, err := s.svc.CreateUser(s.ctx, "another@example.com", "password123", "")
|
||||
user, err := s.svc.CreateUser(s.ctx, "anotheruser", "another@example.com", "password123", "user")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
// Mock file content
|
||||
|
@ -1010,7 +1008,7 @@ func (s *ServiceImplTestSuite) TestMedia() {
|
|||
require.NoError(s.T(), err)
|
||||
|
||||
// Try to delete with different user
|
||||
anotherUser, err := s.svc.CreateUser(s.ctx, "third@example.com", "password123", "")
|
||||
anotherUser, err := s.svc.CreateUser(s.ctx, "thirduser", "third@example.com", "password123", "user")
|
||||
require.NoError(s.T(), err)
|
||||
|
||||
err = s.svc.DeleteMedia(s.ctx, media.ID, anotherUser.ID)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue