feat(role): 新增平台角色管理功能增强
- 权限表增加 available_for_role_types 字段,支持标记权限可用角色类型 - 权限列表和权限树接口支持按 available_for_role_type 过滤 - 新增角色状态切换接口 PUT /api/admin/roles/:id/status - 角色分配权限时验证权限的可用角色类型 - 完善数据库迁移脚本和单元测试 - 补充数据库迁移相关开发规范文档
This commit is contained in:
@@ -437,3 +437,143 @@ func TestPermissionAPI_GetTree(t *testing.T) {
|
||||
assert.Equal(t, 0, result.Code)
|
||||
})
|
||||
}
|
||||
|
||||
// TestPermissionAPI_GetTreeByAvailableForRoleType 测试按角色类型过滤权限树 API
|
||||
func TestPermissionAPI_GetTreeByRoleType(t *testing.T) {
|
||||
env := setupPermTestEnv(t)
|
||||
defer env.cleanup()
|
||||
|
||||
testUserID := uint(1)
|
||||
env.app.Use(func(c *fiber.Ctx) error {
|
||||
ctx := middleware.SetUserContext(c.UserContext(), middleware.NewSimpleUserContext(testUserID, constants.UserTypeSuperAdmin, 0))
|
||||
c.SetUserContext(ctx)
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
platformPerm := &model.Permission{
|
||||
PermName: "平台权限",
|
||||
PermCode: "platform:manage",
|
||||
PermType: constants.PermissionTypeMenu,
|
||||
AvailableForRoleTypes: "1",
|
||||
Status: constants.StatusEnabled,
|
||||
}
|
||||
env.db.Create(platformPerm)
|
||||
|
||||
customerPerm := &model.Permission{
|
||||
PermName: "客户权限",
|
||||
PermCode: "customer:manage",
|
||||
PermType: constants.PermissionTypeMenu,
|
||||
AvailableForRoleTypes: "2",
|
||||
Status: constants.StatusEnabled,
|
||||
}
|
||||
env.db.Create(customerPerm)
|
||||
|
||||
commonPerm := &model.Permission{
|
||||
PermName: "通用权限",
|
||||
PermCode: "common:view",
|
||||
PermType: constants.PermissionTypeMenu,
|
||||
AvailableForRoleTypes: "1,2",
|
||||
Status: constants.StatusEnabled,
|
||||
}
|
||||
env.db.Create(commonPerm)
|
||||
|
||||
t.Run("按角色类型过滤权限树-平台角色", func(t *testing.T) {
|
||||
req := httptest.NewRequest("GET", fmt.Sprintf("/api/admin/permissions/tree?available_for_role_type=%d", constants.RoleTypePlatform), nil)
|
||||
resp, err := env.app.Test(req)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, fiber.StatusOK, resp.StatusCode)
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, result.Code)
|
||||
})
|
||||
|
||||
t.Run("按角色类型过滤权限树-客户角色", func(t *testing.T) {
|
||||
req := httptest.NewRequest("GET", "/api/admin/permissions/tree?available_for_role_type=2", nil)
|
||||
resp, err := env.app.Test(req)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, fiber.StatusOK, resp.StatusCode)
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, result.Code)
|
||||
})
|
||||
|
||||
t.Run("按平台和角色类型过滤", func(t *testing.T) {
|
||||
req := httptest.NewRequest("GET", "/api/admin/permissions/tree?platform=all&available_for_role_type=1", nil)
|
||||
resp, err := env.app.Test(req)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, fiber.StatusOK, resp.StatusCode)
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, result.Code)
|
||||
})
|
||||
}
|
||||
|
||||
// TestPermissionAPI_FilterByAvailableForRoleType 测试按角色类型过滤权限
|
||||
func TestPermissionAPI_FilterByAvailableForRoleTypes(t *testing.T) {
|
||||
env := setupPermTestEnv(t)
|
||||
defer env.cleanup()
|
||||
|
||||
testUserID := uint(1)
|
||||
env.app.Use(func(c *fiber.Ctx) error {
|
||||
ctx := middleware.SetUserContext(c.UserContext(), middleware.NewSimpleUserContext(testUserID, constants.UserTypeSuperAdmin, 0))
|
||||
c.SetUserContext(ctx)
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
platformPerm := &model.Permission{
|
||||
PermName: "平台专用权限",
|
||||
PermCode: "platform:only",
|
||||
PermType: constants.PermissionTypeMenu,
|
||||
AvailableForRoleTypes: "1",
|
||||
Status: constants.StatusEnabled,
|
||||
}
|
||||
env.db.Create(platformPerm)
|
||||
|
||||
customerPerm := &model.Permission{
|
||||
PermName: "客户专用权限",
|
||||
PermCode: "customer:only",
|
||||
PermType: constants.PermissionTypeMenu,
|
||||
AvailableForRoleTypes: "2",
|
||||
Status: constants.StatusEnabled,
|
||||
}
|
||||
env.db.Create(customerPerm)
|
||||
|
||||
commonPerm := &model.Permission{
|
||||
PermName: "通用权限",
|
||||
PermCode: "common:all",
|
||||
PermType: constants.PermissionTypeMenu,
|
||||
AvailableForRoleTypes: "1,2",
|
||||
Status: constants.StatusEnabled,
|
||||
}
|
||||
env.db.Create(commonPerm)
|
||||
|
||||
t.Run("过滤平台角色可用权限", func(t *testing.T) {
|
||||
req := httptest.NewRequest("GET", "/api/admin/permissions?available_for_role_type=1", nil)
|
||||
resp, err := env.app.Test(req)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, fiber.StatusOK, resp.StatusCode)
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, result.Code)
|
||||
})
|
||||
|
||||
t.Run("按角色类型过滤权限树", func(t *testing.T) {
|
||||
req := httptest.NewRequest("GET", fmt.Sprintf("/api/admin/permissions/tree?available_for_role_type=%d", constants.RoleTypePlatform), nil)
|
||||
resp, err := env.app.Test(req)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, fiber.StatusOK, resp.StatusCode)
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, result.Code)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -517,3 +517,109 @@ func TestRoleAPI_RemovePermission(t *testing.T) {
|
||||
assert.NotNil(t, rp.DeletedAt)
|
||||
})
|
||||
}
|
||||
|
||||
// TestRoleAPI_UpdateStatus 测试角色状态切换 API
|
||||
func TestRoleAPI_UpdateStatus(t *testing.T) {
|
||||
env := setupRoleTestEnv(t)
|
||||
defer env.teardown()
|
||||
|
||||
// 添加测试中间件
|
||||
testUserID := uint(1)
|
||||
env.app.Use(func(c *fiber.Ctx) error {
|
||||
ctx := middleware.SetUserContext(c.UserContext(), middleware.NewSimpleUserContext(testUserID, constants.UserTypeSuperAdmin, 0))
|
||||
c.SetUserContext(ctx)
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
// 创建测试角色
|
||||
testRole := &model.Role{
|
||||
RoleName: "状态切换测试角色",
|
||||
RoleType: constants.RoleTypePlatform,
|
||||
Status: constants.StatusEnabled,
|
||||
}
|
||||
env.db.Create(testRole)
|
||||
|
||||
t.Run("成功禁用角色", func(t *testing.T) {
|
||||
reqBody := model.UpdateRoleStatusRequest{
|
||||
Status: constants.StatusDisabled,
|
||||
}
|
||||
|
||||
jsonBody, _ := json.Marshal(reqBody)
|
||||
req := httptest.NewRequest("PUT", fmt.Sprintf("/api/admin/roles/%d/status", testRole.ID), bytes.NewReader(jsonBody))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
resp, err := env.app.Test(req)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, fiber.StatusOK, resp.StatusCode)
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, result.Code)
|
||||
|
||||
// 验证数据库中状态已更新
|
||||
var updated model.Role
|
||||
env.db.First(&updated, testRole.ID)
|
||||
assert.Equal(t, constants.StatusDisabled, updated.Status)
|
||||
})
|
||||
|
||||
t.Run("成功启用角色", func(t *testing.T) {
|
||||
reqBody := model.UpdateRoleStatusRequest{
|
||||
Status: constants.StatusEnabled,
|
||||
}
|
||||
|
||||
jsonBody, _ := json.Marshal(reqBody)
|
||||
req := httptest.NewRequest("PUT", fmt.Sprintf("/api/admin/roles/%d/status", testRole.ID), bytes.NewReader(jsonBody))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
resp, err := env.app.Test(req)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, fiber.StatusOK, resp.StatusCode)
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, result.Code)
|
||||
|
||||
// 验证数据库中状态已更新
|
||||
var updated model.Role
|
||||
env.db.First(&updated, testRole.ID)
|
||||
assert.Equal(t, constants.StatusEnabled, updated.Status)
|
||||
})
|
||||
|
||||
t.Run("角色不存在返回错误", func(t *testing.T) {
|
||||
reqBody := model.UpdateRoleStatusRequest{
|
||||
Status: constants.StatusEnabled,
|
||||
}
|
||||
|
||||
jsonBody, _ := json.Marshal(reqBody)
|
||||
req := httptest.NewRequest("PUT", "/api/admin/roles/99999/status", bytes.NewReader(jsonBody))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
resp, err := env.app.Test(req)
|
||||
require.NoError(t, err)
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, errors.CodeRoleNotFound, result.Code)
|
||||
})
|
||||
|
||||
t.Run("无效状态值返回错误", func(t *testing.T) {
|
||||
reqBody := map[string]interface{}{
|
||||
"status": 99, // 无效状态
|
||||
}
|
||||
|
||||
jsonBody, _ := json.Marshal(reqBody)
|
||||
req := httptest.NewRequest("PUT", fmt.Sprintf("/api/admin/roles/%d/status", testRole.ID), bytes.NewReader(jsonBody))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
resp, err := env.app.Test(req)
|
||||
require.NoError(t, err)
|
||||
|
||||
var result response.Response
|
||||
err = json.NewDecoder(resp.Body).Decode(&result)
|
||||
require.NoError(t, err)
|
||||
assert.NotEqual(t, 0, result.Code)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ func TestPermissionPlatformFilter_Tree(t *testing.T) {
|
||||
require.NoError(t, db.Create(child).Error)
|
||||
|
||||
// 获取权限树
|
||||
tree, err := service.GetTree(ctx)
|
||||
tree, err := service.GetTree(ctx, nil)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, tree, 1)
|
||||
|
||||
|
||||
239
tests/unit/permission_store_test.go
Normal file
239
tests/unit/permission_store_test.go
Normal file
@@ -0,0 +1,239 @@
|
||||
package unit
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/break/junhong_cmp_fiber/internal/model"
|
||||
"github.com/break/junhong_cmp_fiber/internal/store/postgres"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
||||
"github.com/break/junhong_cmp_fiber/tests/testutils"
|
||||
)
|
||||
|
||||
func TestPermissionStore_List_AvailableForRoleTypes(t *testing.T) {
|
||||
db, redisClient := testutils.SetupTestDB(t)
|
||||
defer testutils.TeardownTestDB(t, db, redisClient)
|
||||
|
||||
store := postgres.NewPermissionStore(db)
|
||||
ctx := context.Background()
|
||||
|
||||
platformPerm := &model.Permission{
|
||||
PermName: "平台专用权限",
|
||||
PermCode: "platform:only",
|
||||
PermType: 1,
|
||||
Platform: "all",
|
||||
AvailableForRoleTypes: "1",
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err := store.Create(ctx, platformPerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
customerPerm := &model.Permission{
|
||||
PermName: "客户专用权限",
|
||||
PermCode: "customer:only",
|
||||
PermType: 1,
|
||||
Platform: "all",
|
||||
AvailableForRoleTypes: "2",
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err = store.Create(ctx, customerPerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
commonPerm := &model.Permission{
|
||||
PermName: "通用权限",
|
||||
PermCode: "common:perm",
|
||||
PermType: 1,
|
||||
Platform: "all",
|
||||
AvailableForRoleTypes: "1,2",
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err = store.Create(ctx, commonPerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("过滤平台角色可用权限", func(t *testing.T) {
|
||||
filters := map[string]interface{}{
|
||||
"available_for_role_type": 1,
|
||||
}
|
||||
perms, _, err := store.List(ctx, nil, filters)
|
||||
require.NoError(t, err)
|
||||
|
||||
var codes []string
|
||||
for _, p := range perms {
|
||||
codes = append(codes, p.PermCode)
|
||||
}
|
||||
assert.Contains(t, codes, "platform:only")
|
||||
assert.Contains(t, codes, "common:perm")
|
||||
assert.NotContains(t, codes, "customer:only")
|
||||
})
|
||||
|
||||
t.Run("过滤客户角色可用权限", func(t *testing.T) {
|
||||
filters := map[string]interface{}{
|
||||
"available_for_role_type": 2,
|
||||
}
|
||||
perms, _, err := store.List(ctx, nil, filters)
|
||||
require.NoError(t, err)
|
||||
|
||||
var codes []string
|
||||
for _, p := range perms {
|
||||
codes = append(codes, p.PermCode)
|
||||
}
|
||||
assert.Contains(t, codes, "customer:only")
|
||||
assert.Contains(t, codes, "common:perm")
|
||||
assert.NotContains(t, codes, "platform:only")
|
||||
})
|
||||
|
||||
t.Run("不过滤时返回所有权限", func(t *testing.T) {
|
||||
perms, _, err := store.List(ctx, nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
var codes []string
|
||||
for _, p := range perms {
|
||||
codes = append(codes, p.PermCode)
|
||||
}
|
||||
assert.Contains(t, codes, "platform:only")
|
||||
assert.Contains(t, codes, "customer:only")
|
||||
assert.Contains(t, codes, "common:perm")
|
||||
})
|
||||
}
|
||||
|
||||
func TestPermissionStore_GetAll_AvailableForRoleType(t *testing.T) {
|
||||
db, redisClient := testutils.SetupTestDB(t)
|
||||
defer testutils.TeardownTestDB(t, db, redisClient)
|
||||
|
||||
store := postgres.NewPermissionStore(db)
|
||||
ctx := context.Background()
|
||||
|
||||
platformPerm := &model.Permission{
|
||||
PermName: "平台菜单",
|
||||
PermCode: "platform:menu",
|
||||
PermType: 1,
|
||||
Platform: "all",
|
||||
AvailableForRoleTypes: "1",
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err := store.Create(ctx, platformPerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
customerPerm := &model.Permission{
|
||||
PermName: "客户菜单",
|
||||
PermCode: "customer:menu",
|
||||
PermType: 1,
|
||||
Platform: "all",
|
||||
AvailableForRoleTypes: "2",
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err = store.Create(ctx, customerPerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("GetAll按平台角色类型过滤", func(t *testing.T) {
|
||||
roleType := 1
|
||||
perms, err := store.GetAll(ctx, &roleType)
|
||||
require.NoError(t, err)
|
||||
|
||||
var codes []string
|
||||
for _, p := range perms {
|
||||
codes = append(codes, p.PermCode)
|
||||
}
|
||||
assert.Contains(t, codes, "platform:menu")
|
||||
assert.NotContains(t, codes, "customer:menu")
|
||||
})
|
||||
|
||||
t.Run("GetAll按客户角色类型过滤", func(t *testing.T) {
|
||||
roleType := 2
|
||||
perms, err := store.GetAll(ctx, &roleType)
|
||||
require.NoError(t, err)
|
||||
|
||||
var codes []string
|
||||
for _, p := range perms {
|
||||
codes = append(codes, p.PermCode)
|
||||
}
|
||||
assert.Contains(t, codes, "customer:menu")
|
||||
assert.NotContains(t, codes, "platform:menu")
|
||||
})
|
||||
|
||||
t.Run("GetAll不过滤时返回所有", func(t *testing.T) {
|
||||
perms, err := store.GetAll(ctx, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
var codes []string
|
||||
for _, p := range perms {
|
||||
codes = append(codes, p.PermCode)
|
||||
}
|
||||
assert.Contains(t, codes, "platform:menu")
|
||||
assert.Contains(t, codes, "customer:menu")
|
||||
})
|
||||
}
|
||||
|
||||
func TestPermissionStore_GetByPlatform_AvailableForRoleType(t *testing.T) {
|
||||
db, redisClient := testutils.SetupTestDB(t)
|
||||
defer testutils.TeardownTestDB(t, db, redisClient)
|
||||
|
||||
store := postgres.NewPermissionStore(db)
|
||||
ctx := context.Background()
|
||||
|
||||
webPlatformPerm := &model.Permission{
|
||||
PermName: "Web平台权限",
|
||||
PermCode: "web:platform",
|
||||
PermType: 1,
|
||||
Platform: "web",
|
||||
AvailableForRoleTypes: "1",
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err := store.Create(ctx, webPlatformPerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
h5CustomerPerm := &model.Permission{
|
||||
PermName: "H5客户权限",
|
||||
PermCode: "h5:customer",
|
||||
PermType: 1,
|
||||
Platform: "h5",
|
||||
AvailableForRoleTypes: "2",
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err = store.Create(ctx, h5CustomerPerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("同时按平台和角色类型过滤", func(t *testing.T) {
|
||||
roleType := 1
|
||||
perms, err := store.GetByPlatform(ctx, "web", &roleType)
|
||||
require.NoError(t, err)
|
||||
|
||||
var codes []string
|
||||
for _, p := range perms {
|
||||
codes = append(codes, p.PermCode)
|
||||
}
|
||||
assert.Contains(t, codes, "web:platform")
|
||||
assert.NotContains(t, codes, "h5:customer")
|
||||
})
|
||||
}
|
||||
182
tests/unit/role_service_test.go
Normal file
182
tests/unit/role_service_test.go
Normal file
@@ -0,0 +1,182 @@
|
||||
package unit
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/break/junhong_cmp_fiber/internal/model"
|
||||
"github.com/break/junhong_cmp_fiber/internal/service/role"
|
||||
"github.com/break/junhong_cmp_fiber/internal/store/postgres"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
||||
"github.com/break/junhong_cmp_fiber/tests/testutils"
|
||||
)
|
||||
|
||||
func TestRoleService_AssignPermissions_ValidateAvailableForRoleTypes(t *testing.T) {
|
||||
db, redisClient := testutils.SetupTestDB(t)
|
||||
defer testutils.TeardownTestDB(t, db, redisClient)
|
||||
|
||||
roleStore := postgres.NewRoleStore(db)
|
||||
permStore := postgres.NewPermissionStore(db)
|
||||
rolePermStore := postgres.NewRolePermissionStore(db)
|
||||
service := role.New(roleStore, permStore, rolePermStore)
|
||||
|
||||
ctx := createContextWithUserID(1)
|
||||
|
||||
platformRole := &model.Role{
|
||||
RoleName: "平台管理员",
|
||||
RoleDesc: "平台角色",
|
||||
RoleType: 1,
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err := roleStore.Create(ctx, platformRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
customerRole := &model.Role{
|
||||
RoleName: "客户管理员",
|
||||
RoleDesc: "客户角色",
|
||||
RoleType: 2,
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err = roleStore.Create(ctx, customerRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
platformPerm := &model.Permission{
|
||||
PermName: "平台权限",
|
||||
PermCode: "platform:manage",
|
||||
PermType: 1,
|
||||
Platform: "all",
|
||||
AvailableForRoleTypes: "1",
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err = permStore.Create(ctx, platformPerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
customerPerm := &model.Permission{
|
||||
PermName: "客户权限",
|
||||
PermCode: "customer:manage",
|
||||
PermType: 1,
|
||||
Platform: "all",
|
||||
AvailableForRoleTypes: "2",
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err = permStore.Create(ctx, customerPerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
commonPerm := &model.Permission{
|
||||
PermName: "通用权限",
|
||||
PermCode: "common:view",
|
||||
PermType: 1,
|
||||
Platform: "all",
|
||||
AvailableForRoleTypes: "1,2",
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err = permStore.Create(ctx, commonPerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("为平台角色分配平台权限-成功", func(t *testing.T) {
|
||||
rps, err := service.AssignPermissions(ctx, platformRole.ID, []uint{platformPerm.ID})
|
||||
require.NoError(t, err)
|
||||
assert.NotEmpty(t, rps)
|
||||
})
|
||||
|
||||
t.Run("为平台角色分配通用权限-成功", func(t *testing.T) {
|
||||
rps, err := service.AssignPermissions(ctx, platformRole.ID, []uint{commonPerm.ID})
|
||||
require.NoError(t, err)
|
||||
assert.NotEmpty(t, rps)
|
||||
})
|
||||
|
||||
t.Run("为平台角色分配客户专用权限-失败", func(t *testing.T) {
|
||||
_, err := service.AssignPermissions(ctx, platformRole.ID, []uint{customerPerm.ID})
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "不适用于此角色类型")
|
||||
})
|
||||
|
||||
t.Run("为客户角色分配客户权限-成功", func(t *testing.T) {
|
||||
rps, err := service.AssignPermissions(ctx, customerRole.ID, []uint{customerPerm.ID})
|
||||
require.NoError(t, err)
|
||||
assert.NotEmpty(t, rps)
|
||||
})
|
||||
|
||||
t.Run("为客户角色分配平台专用权限-失败", func(t *testing.T) {
|
||||
_, err := service.AssignPermissions(ctx, customerRole.ID, []uint{platformPerm.ID})
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "不适用于此角色类型")
|
||||
})
|
||||
|
||||
t.Run("批量分配权限时部分不匹配-失败", func(t *testing.T) {
|
||||
_, err := service.AssignPermissions(ctx, platformRole.ID, []uint{platformPerm.ID, customerPerm.ID})
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "不适用于此角色类型")
|
||||
})
|
||||
}
|
||||
|
||||
func TestRoleService_UpdateStatus(t *testing.T) {
|
||||
db, redisClient := testutils.SetupTestDB(t)
|
||||
defer testutils.TeardownTestDB(t, db, redisClient)
|
||||
|
||||
roleStore := postgres.NewRoleStore(db)
|
||||
permStore := postgres.NewPermissionStore(db)
|
||||
rolePermStore := postgres.NewRolePermissionStore(db)
|
||||
service := role.New(roleStore, permStore, rolePermStore)
|
||||
|
||||
ctx := createContextWithUserID(1)
|
||||
|
||||
testRole := &model.Role{
|
||||
RoleName: "测试角色",
|
||||
RoleDesc: "用于测试状态切换",
|
||||
RoleType: 1,
|
||||
Status: constants.StatusEnabled,
|
||||
BaseModel: model.BaseModel{
|
||||
Creator: 1,
|
||||
Updater: 1,
|
||||
},
|
||||
}
|
||||
err := roleStore.Create(ctx, testRole)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("禁用角色", func(t *testing.T) {
|
||||
err := service.UpdateStatus(ctx, testRole.ID, constants.StatusDisabled)
|
||||
require.NoError(t, err)
|
||||
|
||||
role, err := roleStore.GetByID(ctx, testRole.ID)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, constants.StatusDisabled, role.Status)
|
||||
})
|
||||
|
||||
t.Run("启用角色", func(t *testing.T) {
|
||||
err := service.UpdateStatus(ctx, testRole.ID, constants.StatusEnabled)
|
||||
require.NoError(t, err)
|
||||
|
||||
role, err := roleStore.GetByID(ctx, testRole.ID)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, constants.StatusEnabled, role.Status)
|
||||
})
|
||||
|
||||
t.Run("更新不存在的角色-失败", func(t *testing.T) {
|
||||
err := service.UpdateStatus(ctx, 99999, constants.StatusEnabled)
|
||||
require.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "角色不存在")
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user