From 8257897bf56eea95c08555336b8b475b39619f35 Mon Sep 17 00:00:00 2001 From: long-agent Date: Sat, 11 Apr 2026 22:19:44 +0800 Subject: [PATCH] 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 --- .../role_permission_repository_test.go | 55 +++++++++++++++++++ internal/repository/user_repository_test.go | 47 ++++++++++++++++ .../repository/user_role_repository_test.go | 45 +++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 internal/repository/role_permission_repository_test.go diff --git a/internal/repository/role_permission_repository_test.go b/internal/repository/role_permission_repository_test.go new file mode 100644 index 0000000..5e52bc7 --- /dev/null +++ b/internal/repository/role_permission_repository_test.go @@ -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)) + } +} diff --git a/internal/repository/user_repository_test.go b/internal/repository/user_repository_test.go index 7d9b9b7..e799b8e 100644 --- a/internal/repository/user_repository_test.go +++ b/internal/repository/user_repository_test.go @@ -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") + } +} + diff --git a/internal/repository/user_role_repository_test.go b/internal/repository/user_role_repository_test.go index 69e2715..bdc8784 100644 --- a/internal/repository/user_role_repository_test.go +++ b/internal/repository/user_role_repository_test.go @@ -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)) + } +}