updateRoleAudit_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package role
  2. import (
  3. "errors"
  4. "testing"
  5. "time"
  6. roleModel "perms-system-server/internal/model/role"
  7. "perms-system-server/internal/response"
  8. "perms-system-server/internal/svc"
  9. "perms-system-server/internal/testutil"
  10. "perms-system-server/internal/testutil/ctxhelper"
  11. "perms-system-server/internal/types"
  12. "github.com/stretchr/testify/assert"
  13. "github.com/stretchr/testify/require"
  14. )
  15. // TC-0730: L-3 修复:非超管 admin 不能降低角色 PermsLevel
  16. func TestUpdateRole_NonSuperAdminCannotDemoteLevel(t *testing.T) {
  17. ctx := ctxhelper.SuperAdminCtx()
  18. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  19. conn := testutil.GetTestSqlConn()
  20. now := time.Now().Unix()
  21. pc := testutil.UniqueId()
  22. pid := mustInsertEnabledProduct(t, ctx, svcCtx, pc)
  23. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  24. ProductCode: pc, Name: testutil.UniqueId(),
  25. Status: 1, PermsLevel: 100, CreateTime: now, UpdateTime: now,
  26. })
  27. require.NoError(t, err)
  28. roleId, _ := roleRes.LastInsertId()
  29. t.Cleanup(func() {
  30. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  31. testutil.CleanTable(ctx, conn, "`sys_product`", pid)
  32. })
  33. adminCtx := ctxhelper.AdminCtx(pc)
  34. err = NewUpdateRoleLogic(adminCtx, svcCtx).UpdateRole(&types.UpdateRoleReq{
  35. Id: roleId, Name: "low", Remark: "demote attempt", PermsLevel: 10,
  36. })
  37. require.Error(t, err)
  38. var ce *response.CodeError
  39. require.True(t, errors.As(err, &ce))
  40. assert.Equal(t, 403, ce.Code())
  41. assert.Contains(t, ce.Error(), "不能降低角色的权限级别")
  42. persisted, err := svcCtx.SysRoleModel.FindOne(ctx, roleId)
  43. require.NoError(t, err)
  44. assert.Equal(t, int64(100), persisted.PermsLevel, "PermsLevel 必须保持不变")
  45. }
  46. // TC-0731: L-3 修复:非超管 admin 可以保持或提升 PermsLevel
  47. func TestUpdateRole_NonSuperAdminCanRaiseOrKeepLevel(t *testing.T) {
  48. ctx := ctxhelper.SuperAdminCtx()
  49. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  50. conn := testutil.GetTestSqlConn()
  51. now := time.Now().Unix()
  52. pc := testutil.UniqueId()
  53. pid := mustInsertEnabledProduct(t, ctx, svcCtx, pc)
  54. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  55. ProductCode: pc, Name: testutil.UniqueId(),
  56. Status: 1, PermsLevel: 100, CreateTime: now, UpdateTime: now,
  57. })
  58. require.NoError(t, err)
  59. roleId, _ := roleRes.LastInsertId()
  60. t.Cleanup(func() {
  61. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  62. testutil.CleanTable(ctx, conn, "`sys_product`", pid)
  63. })
  64. adminCtx := ctxhelper.AdminCtx(pc)
  65. require.NoError(t, NewUpdateRoleLogic(adminCtx, svcCtx).UpdateRole(&types.UpdateRoleReq{
  66. Id: roleId, Name: "keep", Remark: "keep level", PermsLevel: 100,
  67. }), "PermsLevel 保持不变应允许")
  68. require.NoError(t, NewUpdateRoleLogic(adminCtx, svcCtx).UpdateRole(&types.UpdateRoleReq{
  69. Id: roleId, Name: "raise", Remark: "raise level", PermsLevel: 500,
  70. }), "PermsLevel 提升应允许")
  71. persisted, err := svcCtx.SysRoleModel.FindOne(ctx, roleId)
  72. require.NoError(t, err)
  73. assert.Equal(t, int64(500), persisted.PermsLevel)
  74. }
  75. // TC-0732: L-3:超管可以任意降低 PermsLevel
  76. func TestUpdateRole_SuperAdminCanDemoteLevel(t *testing.T) {
  77. ctx := ctxhelper.SuperAdminCtx()
  78. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  79. conn := testutil.GetTestSqlConn()
  80. now := time.Now().Unix()
  81. pc := testutil.UniqueId()
  82. pid := mustInsertEnabledProduct(t, ctx, svcCtx, pc)
  83. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  84. ProductCode: pc, Name: testutil.UniqueId(),
  85. Status: 1, PermsLevel: 500, CreateTime: now, UpdateTime: now,
  86. })
  87. require.NoError(t, err)
  88. roleId, _ := roleRes.LastInsertId()
  89. t.Cleanup(func() {
  90. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  91. testutil.CleanTable(ctx, conn, "`sys_product`", pid)
  92. })
  93. require.NoError(t, NewUpdateRoleLogic(ctx, svcCtx).UpdateRole(&types.UpdateRoleReq{
  94. Id: roleId, Name: "down", Remark: "superadmin demote", PermsLevel: 10,
  95. }))
  96. persisted, err := svcCtx.SysRoleModel.FindOne(ctx, roleId)
  97. require.NoError(t, err)
  98. assert.Equal(t, int64(10), persisted.PermsLevel)
  99. }
  100. // TC-0733: L-3:边界 PermsLevel 校验
  101. func TestUpdateRole_PermsLevelBoundary(t *testing.T) {
  102. ctx := ctxhelper.SuperAdminCtx()
  103. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  104. conn := testutil.GetTestSqlConn()
  105. now := time.Now().Unix()
  106. pc := testutil.UniqueId()
  107. pid := mustInsertEnabledProduct(t, ctx, svcCtx, pc)
  108. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  109. ProductCode: pc, Name: testutil.UniqueId(),
  110. Status: 1, PermsLevel: 50, CreateTime: now, UpdateTime: now,
  111. })
  112. require.NoError(t, err)
  113. roleId, _ := roleRes.LastInsertId()
  114. t.Cleanup(func() {
  115. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  116. testutil.CleanTable(ctx, conn, "`sys_product`", pid)
  117. })
  118. for _, level := range []int64{0, -1, 1000, 10000} {
  119. err := NewUpdateRoleLogic(ctx, svcCtx).UpdateRole(&types.UpdateRoleReq{
  120. Id: roleId, Name: "b", PermsLevel: level,
  121. })
  122. require.Error(t, err, "PermsLevel=%d 应当被拒", level)
  123. var ce *response.CodeError
  124. require.True(t, errors.As(err, &ce))
  125. assert.Equal(t, 400, ce.Code())
  126. }
  127. }