deleteRoleLogic_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package role
  2. import (
  3. "errors"
  4. "testing"
  5. "time"
  6. permModel "perms-system-server/internal/model/perm"
  7. roleModel "perms-system-server/internal/model/role"
  8. "perms-system-server/internal/model/roleperm"
  9. "perms-system-server/internal/model/userrole"
  10. "perms-system-server/internal/response"
  11. "perms-system-server/internal/svc"
  12. "perms-system-server/internal/testutil"
  13. "perms-system-server/internal/testutil/ctxhelper"
  14. "perms-system-server/internal/types"
  15. "github.com/stretchr/testify/assert"
  16. "github.com/stretchr/testify/require"
  17. )
  18. // TC-0126: 正常删除+级联
  19. func TestDeleteRole_WithCascading(t *testing.T) {
  20. ctx := ctxhelper.SuperAdminCtx()
  21. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  22. conn := testutil.GetTestSqlConn()
  23. now := time.Now().Unix()
  24. pc := testutil.UniqueId()
  25. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  26. ProductCode: pc, Name: testutil.UniqueId(), Status: 1, PermsLevel: 1,
  27. CreateTime: now, UpdateTime: now,
  28. })
  29. require.NoError(t, err)
  30. roleId, _ := roleRes.LastInsertId()
  31. pRes, err := svcCtx.SysPermModel.Insert(ctx, &permModel.SysPerm{
  32. ProductCode: pc, Name: testutil.UniqueId(), Code: testutil.UniqueId(),
  33. Status: 1, CreateTime: now, UpdateTime: now,
  34. })
  35. require.NoError(t, err)
  36. permId, _ := pRes.LastInsertId()
  37. rpRes, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
  38. RoleId: roleId, PermId: permId, CreateTime: now, UpdateTime: now,
  39. })
  40. require.NoError(t, err)
  41. rpId, _ := rpRes.LastInsertId()
  42. urRes, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{
  43. UserId: 888888, RoleId: roleId, CreateTime: now, UpdateTime: now,
  44. })
  45. require.NoError(t, err)
  46. urId, _ := urRes.LastInsertId()
  47. t.Cleanup(func() {
  48. testutil.CleanTable(ctx, conn, "`sys_role_perm`", rpId)
  49. testutil.CleanTable(ctx, conn, "`sys_user_role`", urId)
  50. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  51. testutil.CleanTable(ctx, conn, "`sys_perm`", permId)
  52. })
  53. logic := NewDeleteRoleLogic(ctx, svcCtx)
  54. err = logic.DeleteRole(&types.DeleteRoleReq{Id: roleId})
  55. require.NoError(t, err)
  56. _, err = svcCtx.SysRoleModel.FindOne(ctx, roleId)
  57. assert.Error(t, err)
  58. permIds, err := svcCtx.SysRolePermModel.FindPermIdsByRoleId(ctx, roleId)
  59. require.NoError(t, err)
  60. assert.Empty(t, permIds)
  61. roleIds, err := svcCtx.SysUserRoleModel.FindRoleIdsByUserId(ctx, 888888)
  62. require.NoError(t, err)
  63. assert.NotContains(t, roleIds, roleId)
  64. }
  65. // TC-0128: 无关联数据
  66. func TestDeleteRole_NoAssociations(t *testing.T) {
  67. ctx := ctxhelper.SuperAdminCtx()
  68. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  69. conn := testutil.GetTestSqlConn()
  70. now := time.Now().Unix()
  71. pc := testutil.UniqueId()
  72. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  73. ProductCode: pc, Name: testutil.UniqueId(), Status: 1, PermsLevel: 1,
  74. CreateTime: now, UpdateTime: now,
  75. })
  76. require.NoError(t, err)
  77. roleId, _ := roleRes.LastInsertId()
  78. t.Cleanup(func() {
  79. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  80. })
  81. logic := NewDeleteRoleLogic(ctx, svcCtx)
  82. err = logic.DeleteRole(&types.DeleteRoleReq{Id: roleId})
  83. require.NoError(t, err)
  84. _, err = svcCtx.SysRoleModel.FindOne(ctx, roleId)
  85. assert.Error(t, err)
  86. }
  87. // TC-1120: L-R14-1 非超管 DeleteRole 针对别产品的 roleId 必须 404 "角色不存在",
  88. // 与 RoleDetail 的 M-N3 / UpdateRole 的 TC-1119 口径一致。
  89. func TestDeleteRole_L_R14_1_CrossProductReturns404(t *testing.T) {
  90. ctx := ctxhelper.SuperAdminCtx()
  91. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  92. conn := testutil.GetTestSqlConn()
  93. now := time.Now().Unix()
  94. otherProduct := "l_r14_1_del_" + testutil.UniqueId()
  95. res, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  96. ProductCode: otherProduct, Name: testutil.UniqueId(), Status: 1, PermsLevel: 1,
  97. CreateTime: now, UpdateTime: now,
  98. })
  99. require.NoError(t, err)
  100. roleId, _ := res.LastInsertId()
  101. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_role`", roleId) })
  102. adminCtx := ctxhelper.AdminCtx("test_product")
  103. err = NewDeleteRoleLogic(adminCtx, svcCtx).DeleteRole(&types.DeleteRoleReq{Id: roleId})
  104. require.Error(t, err)
  105. var ce *response.CodeError
  106. require.True(t, errors.As(err, &ce))
  107. assert.Equal(t, 404, ce.Code(), "跨产品 roleId 必须 404")
  108. assert.Equal(t, "角色不存在", ce.Error(), "文案必须与 id 不存在完全一致")
  109. // DB 必须保持原状
  110. still, err := svcCtx.SysRoleModel.FindOne(ctx, roleId)
  111. require.NoError(t, err, "跨产品拒绝的 DeleteRole 不得真的删角色")
  112. assert.Equal(t, roleId, still.Id)
  113. }
  114. // TC-0540: deleteRole非管理员拒绝
  115. func TestDeleteRole_MemberRejected(t *testing.T) {
  116. pc := "test_product"
  117. ctx := ctxhelper.MemberCtx(pc)
  118. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  119. conn := testutil.GetTestSqlConn()
  120. now := time.Now().Unix()
  121. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  122. ProductCode: pc, Name: testutil.UniqueId(), Status: 1, PermsLevel: 1,
  123. CreateTime: now, UpdateTime: now,
  124. })
  125. require.NoError(t, err)
  126. roleId, _ := roleRes.LastInsertId()
  127. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_role`", roleId) })
  128. logic := NewDeleteRoleLogic(ctx, svcCtx)
  129. err = logic.DeleteRole(&types.DeleteRoleReq{Id: roleId})
  130. require.Error(t, err)
  131. var ce *response.CodeError
  132. require.True(t, errors.As(err, &ce))
  133. assert.Equal(t, 403, ce.Code())
  134. }