test: add tests for GetPermissionsByIDs, GetUserRolesAndPermissions, ListCursor
Repository test coverage improved to 80.4% - role_permission_repository_test.go: GetPermissionsByIDs test - user_role_repository_test.go: GetUserRolesAndPermissions test - user_repository_test.go: ListCursor test
This commit is contained in:
55
internal/repository/role_permission_repository_test.go
Normal file
55
internal/repository/role_permission_repository_test.go
Normal file
@@ -0,0 +1,55 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/user-management-system/internal/domain"
|
||||
)
|
||||
|
||||
func TestRolePermissionRepository_GetPermissionsByIDs(t *testing.T) {
|
||||
db := setupTestDB(t)
|
||||
repo := NewRolePermissionRepository(db)
|
||||
ctx := context.Background()
|
||||
|
||||
// 创建权限
|
||||
perm1 := &domain.Permission{Code: "perm1", Name: "权限1", Status: domain.PermissionStatusEnabled}
|
||||
perm2 := &domain.Permission{Code: "perm2", Name: "权限2", Status: domain.PermissionStatusEnabled}
|
||||
db.WithContext(ctx).Create(perm1)
|
||||
db.WithContext(ctx).Create(perm2)
|
||||
|
||||
// 创建角色
|
||||
role := &domain.Role{Code: "test-role", Name: "测试角色", Status: domain.RoleStatusEnabled}
|
||||
db.WithContext(ctx).Create(role)
|
||||
|
||||
// 分配权限
|
||||
repo.Create(ctx, &domain.RolePermission{RoleID: role.ID, PermissionID: perm1.ID})
|
||||
repo.Create(ctx, &domain.RolePermission{RoleID: role.ID, PermissionID: perm2.ID})
|
||||
|
||||
// 测试批量获取权限
|
||||
perms, err := repo.GetPermissionsByIDs(ctx, []int64{perm1.ID, perm2.ID})
|
||||
if err != nil {
|
||||
t.Fatalf("GetPermissionsByIDs() error = %v", err)
|
||||
}
|
||||
if len(perms) != 2 {
|
||||
t.Errorf("len(perms) = %d, want 2", len(perms))
|
||||
}
|
||||
|
||||
// 测试空列表
|
||||
emptyPerms, err := repo.GetPermissionsByIDs(ctx, []int64{})
|
||||
if err != nil {
|
||||
t.Fatalf("GetPermissionsByIDs() empty error = %v", err)
|
||||
}
|
||||
if len(emptyPerms) != 0 {
|
||||
t.Errorf("len(emptyPerms) = %d, want 0", len(emptyPerms))
|
||||
}
|
||||
|
||||
// 测试不存在的ID
|
||||
nonExistentPerms, err := repo.GetPermissionsByIDs(ctx, []int64{9999})
|
||||
if err != nil {
|
||||
t.Fatalf("GetPermissionsByIDs() non-existent error = %v", err)
|
||||
}
|
||||
if len(nonExistentPerms) != 0 {
|
||||
t.Errorf("len(nonExistentPerms) = %d, want 0", len(nonExistentPerms))
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/user-management-system/internal/domain"
|
||||
"github.com/user-management-system/internal/pagination"
|
||||
)
|
||||
|
||||
func setupTestDB(t *testing.T) *gorm.DB {
|
||||
@@ -658,3 +659,49 @@ func TestUserRepository_AdvancedSearch_LikeSpecialChars(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestUserRepository_ListCursor 测试用户游标分页查询
|
||||
func TestUserRepository_ListCursor(t *testing.T) {
|
||||
db := setupTestDB(t)
|
||||
repo := NewUserRepository(db)
|
||||
ctx := context.Background()
|
||||
|
||||
// 创建多个用户
|
||||
for i := 0; i < 5; i++ {
|
||||
repo.Create(ctx, &domain.User{
|
||||
Username: "cursoruser" + string(rune('a'+i)),
|
||||
Password: "hash",
|
||||
Status: domain.UserStatusActive,
|
||||
})
|
||||
}
|
||||
|
||||
// 第一次查询
|
||||
filter := &AdvancedFilter{Status: int(domain.UserStatusActive), Offset: 0, Limit: 3}
|
||||
users, hasMore, err := repo.ListCursor(ctx, filter, 3, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("ListCursor() error = %v", err)
|
||||
}
|
||||
if len(users) != 3 {
|
||||
t.Errorf("len(users) = %d, want 3", len(users))
|
||||
}
|
||||
if !hasMore {
|
||||
t.Error("hasMore should be true when more users exist")
|
||||
}
|
||||
|
||||
// 使用游标继续查询
|
||||
lastUser := users[len(users)-1]
|
||||
cursor := &pagination.Cursor{
|
||||
LastID: lastUser.ID,
|
||||
LastValue: lastUser.CreatedAt,
|
||||
}
|
||||
users2, hasMore2, err := repo.ListCursor(ctx, filter, 3, cursor)
|
||||
if err != nil {
|
||||
t.Fatalf("ListCursor() error = %v", err)
|
||||
}
|
||||
if len(users2) != 2 {
|
||||
t.Errorf("len(users2) = %d, want 2", len(users2))
|
||||
}
|
||||
if hasMore2 {
|
||||
t.Error("hasMore2 should be false")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,3 +34,48 @@ func TestUserRoleRepository_DeleteByUserAndRole(t *testing.T) {
|
||||
t.Error("DeleteByUserAndRole should have removed the association")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUserRoleRepository_GetUserRolesAndPermissions(t *testing.T) {
|
||||
db := setupTestDB(t)
|
||||
repo := NewUserRoleRepository(db)
|
||||
ctx := context.Background()
|
||||
|
||||
// 创建用户
|
||||
user := &domain.User{Username: "permuser", Password: "hash", Status: domain.UserStatusActive}
|
||||
db.WithContext(ctx).Create(user)
|
||||
|
||||
// 创建权限
|
||||
perm1 := &domain.Permission{Code: "user:read", Name: "读取用户", Status: domain.PermissionStatusEnabled}
|
||||
perm2 := &domain.Permission{Code: "user:write", Name: "写入用户", Status: domain.PermissionStatusEnabled}
|
||||
db.WithContext(ctx).Create(perm1)
|
||||
db.WithContext(ctx).Create(perm2)
|
||||
|
||||
// 创建角色并分配权限
|
||||
role := &domain.Role{Code: "editor", Name: "编辑者", Status: domain.RoleStatusEnabled}
|
||||
db.WithContext(ctx).Create(role)
|
||||
|
||||
// 角色-权限关联
|
||||
rpRepo := NewRolePermissionRepository(db)
|
||||
rpRepo.Create(ctx, &domain.RolePermission{RoleID: role.ID, PermissionID: perm1.ID})
|
||||
rpRepo.Create(ctx, &domain.RolePermission{RoleID: role.ID, PermissionID: perm2.ID})
|
||||
|
||||
// 用户-角色关联
|
||||
repo.Create(ctx, &domain.UserRole{UserID: user.ID, RoleID: role.ID})
|
||||
|
||||
// 测试获取用户角色和权限
|
||||
roles, perms, err := repo.GetUserRolesAndPermissions(ctx, user.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetUserRolesAndPermissions() error = %v", err)
|
||||
}
|
||||
|
||||
if len(roles) != 1 {
|
||||
t.Errorf("len(roles) = %d, want 1", len(roles))
|
||||
}
|
||||
if roles[0].Code != "editor" {
|
||||
t.Errorf("roles[0].Code = %s, want editor", roles[0].Code)
|
||||
}
|
||||
|
||||
if len(perms) != 2 {
|
||||
t.Errorf("len(perms) = %d, want 2", len(perms))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user