bindRolePermsLogic_test.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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/response"
  10. "perms-system-server/internal/svc"
  11. "perms-system-server/internal/testutil"
  12. "perms-system-server/internal/testutil/ctxhelper"
  13. "perms-system-server/internal/types"
  14. "github.com/stretchr/testify/assert"
  15. "github.com/stretchr/testify/require"
  16. )
  17. // TC-0096: 正常绑定
  18. func TestBindRolePerms_Normal(t *testing.T) {
  19. ctx := ctxhelper.SuperAdminCtx()
  20. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  21. conn := testutil.GetTestSqlConn()
  22. now := time.Now().Unix()
  23. pc := testutil.UniqueId()
  24. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  25. ProductCode: pc, Name: testutil.UniqueId(), Status: 1, PermsLevel: 1,
  26. CreateTime: now, UpdateTime: now,
  27. })
  28. require.NoError(t, err)
  29. roleId, _ := roleRes.LastInsertId()
  30. p1Res, err := svcCtx.SysPermModel.Insert(ctx, &permModel.SysPerm{
  31. ProductCode: pc, Name: testutil.UniqueId(), Code: testutil.UniqueId(),
  32. Status: 1, CreateTime: now, UpdateTime: now,
  33. })
  34. require.NoError(t, err)
  35. p1Id, _ := p1Res.LastInsertId()
  36. p2Res, err := svcCtx.SysPermModel.Insert(ctx, &permModel.SysPerm{
  37. ProductCode: pc, Name: testutil.UniqueId(), Code: testutil.UniqueId(),
  38. Status: 1, CreateTime: now, UpdateTime: now,
  39. })
  40. require.NoError(t, err)
  41. p2Id, _ := p2Res.LastInsertId()
  42. t.Cleanup(func() {
  43. testutil.CleanTableByField(ctx, conn, "`sys_role_perm`", "roleId", roleId)
  44. testutil.CleanTable(ctx, conn, "`sys_perm`", p1Id, p2Id)
  45. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  46. })
  47. logic := NewBindRolePermsLogic(ctx, svcCtx)
  48. err = logic.BindRolePerms(&types.BindPermsReq{
  49. RoleId: roleId,
  50. PermIds: []int64{p1Id, p2Id},
  51. })
  52. require.NoError(t, err)
  53. permIds, err := svcCtx.SysRolePermModel.FindPermIdsByRoleId(ctx, roleId)
  54. require.NoError(t, err)
  55. assert.ElementsMatch(t, []int64{p1Id, p2Id}, permIds)
  56. }
  57. // TC-0097: 角色不存在
  58. func TestBindRolePerms_RoleNotFound(t *testing.T) {
  59. ctx := ctxhelper.SuperAdminCtx()
  60. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  61. logic := NewBindRolePermsLogic(ctx, svcCtx)
  62. err := logic.BindRolePerms(&types.BindPermsReq{
  63. RoleId: 999999999,
  64. PermIds: []int64{1},
  65. })
  66. require.Error(t, err)
  67. var ce *response.CodeError
  68. require.True(t, errors.As(err, &ce))
  69. assert.Equal(t, 404, ce.Code())
  70. assert.Equal(t, "角色不存在", ce.Error())
  71. }
  72. // TC-0098: 清空权限
  73. func TestBindRolePerms_EmptyPermIds(t *testing.T) {
  74. ctx := ctxhelper.SuperAdminCtx()
  75. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  76. conn := testutil.GetTestSqlConn()
  77. now := time.Now().Unix()
  78. pc := testutil.UniqueId()
  79. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  80. ProductCode: pc, Name: testutil.UniqueId(), Status: 1, PermsLevel: 1,
  81. CreateTime: now, UpdateTime: now,
  82. })
  83. require.NoError(t, err)
  84. roleId, _ := roleRes.LastInsertId()
  85. pRes, err := svcCtx.SysPermModel.Insert(ctx, &permModel.SysPerm{
  86. ProductCode: pc, Name: testutil.UniqueId(), Code: testutil.UniqueId(),
  87. Status: 1, CreateTime: now, UpdateTime: now,
  88. })
  89. require.NoError(t, err)
  90. pId, _ := pRes.LastInsertId()
  91. rpRes, err := svcCtx.SysRolePermModel.Insert(ctx, &roleperm.SysRolePerm{
  92. RoleId: roleId, PermId: pId, CreateTime: now, UpdateTime: now,
  93. })
  94. require.NoError(t, err)
  95. rpId, _ := rpRes.LastInsertId()
  96. t.Cleanup(func() {
  97. testutil.CleanTable(ctx, conn, "`sys_role_perm`", rpId)
  98. testutil.CleanTable(ctx, conn, "`sys_perm`", pId)
  99. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  100. })
  101. logic := NewBindRolePermsLogic(ctx, svcCtx)
  102. err = logic.BindRolePerms(&types.BindPermsReq{
  103. RoleId: roleId,
  104. PermIds: []int64{},
  105. })
  106. require.NoError(t, err)
  107. permIds, err := svcCtx.SysRolePermModel.FindPermIdsByRoleId(ctx, roleId)
  108. require.NoError(t, err)
  109. assert.Empty(t, permIds)
  110. }
  111. // TC-0096: 正常绑定
  112. func TestBindRolePerms_Rebind(t *testing.T) {
  113. ctx := ctxhelper.SuperAdminCtx()
  114. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  115. conn := testutil.GetTestSqlConn()
  116. now := time.Now().Unix()
  117. pc := testutil.UniqueId()
  118. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  119. ProductCode: pc, Name: testutil.UniqueId(), Status: 1, PermsLevel: 1,
  120. CreateTime: now, UpdateTime: now,
  121. })
  122. require.NoError(t, err)
  123. roleId, _ := roleRes.LastInsertId()
  124. var permIds []int64
  125. for i := 0; i < 3; i++ {
  126. pRes, err := svcCtx.SysPermModel.Insert(ctx, &permModel.SysPerm{
  127. ProductCode: pc, Name: testutil.UniqueId(), Code: testutil.UniqueId(),
  128. Status: 1, CreateTime: now, UpdateTime: now,
  129. })
  130. require.NoError(t, err)
  131. pId, _ := pRes.LastInsertId()
  132. permIds = append(permIds, pId)
  133. }
  134. t.Cleanup(func() {
  135. testutil.CleanTableByField(ctx, conn, "`sys_role_perm`", "roleId", roleId)
  136. testutil.CleanTable(ctx, conn, "`sys_perm`", permIds...)
  137. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  138. })
  139. logic := NewBindRolePermsLogic(ctx, svcCtx)
  140. err = logic.BindRolePerms(&types.BindPermsReq{
  141. RoleId: roleId,
  142. PermIds: []int64{permIds[0], permIds[1]},
  143. })
  144. require.NoError(t, err)
  145. got, err := svcCtx.SysRolePermModel.FindPermIdsByRoleId(ctx, roleId)
  146. require.NoError(t, err)
  147. assert.ElementsMatch(t, []int64{permIds[0], permIds[1]}, got)
  148. err = logic.BindRolePerms(&types.BindPermsReq{
  149. RoleId: roleId,
  150. PermIds: []int64{permIds[1], permIds[2]},
  151. })
  152. require.NoError(t, err)
  153. got, err = svcCtx.SysRolePermModel.FindPermIdsByRoleId(ctx, roleId)
  154. require.NoError(t, err)
  155. assert.ElementsMatch(t, []int64{permIds[1], permIds[2]}, got)
  156. }
  157. // TC-0099: 重复permId
  158. func TestBindRolePerms_DuplicatePermId(t *testing.T) {
  159. ctx := ctxhelper.SuperAdminCtx()
  160. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  161. conn := testutil.GetTestSqlConn()
  162. now := time.Now().Unix()
  163. pc := testutil.UniqueId()
  164. roleRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  165. ProductCode: pc, Name: testutil.UniqueId(), Status: 1, PermsLevel: 1,
  166. CreateTime: now, UpdateTime: now,
  167. })
  168. require.NoError(t, err)
  169. roleId, _ := roleRes.LastInsertId()
  170. pRes, err := svcCtx.SysPermModel.Insert(ctx, &permModel.SysPerm{
  171. ProductCode: pc, Name: testutil.UniqueId(), Code: testutil.UniqueId(),
  172. Status: 1, CreateTime: now, UpdateTime: now,
  173. })
  174. require.NoError(t, err)
  175. pId, _ := pRes.LastInsertId()
  176. t.Cleanup(func() {
  177. testutil.CleanTableByField(ctx, conn, "`sys_role_perm`", "roleId", roleId)
  178. testutil.CleanTable(ctx, conn, "`sys_perm`", pId)
  179. testutil.CleanTable(ctx, conn, "`sys_role`", roleId)
  180. })
  181. logic := NewBindRolePermsLogic(ctx, svcCtx)
  182. err = logic.BindRolePerms(&types.BindPermsReq{
  183. RoleId: roleId,
  184. PermIds: []int64{pId, pId},
  185. })
  186. assert.Error(t, err)
  187. }
  188. // TC-0490: bindRolePerms非管理员拒绝
  189. func TestBindRolePerms_MemberRejected(t *testing.T) {
  190. ctx := ctxhelper.MemberCtx("test_product")
  191. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  192. logic := NewBindRolePermsLogic(ctx, svcCtx)
  193. err := logic.BindRolePerms(&types.BindPermsReq{RoleId: 1, PermIds: []int64{1}})
  194. require.Error(t, err)
  195. var ce *response.CodeError
  196. require.True(t, errors.As(err, &ce))
  197. assert.Equal(t, 403, ce.Code())
  198. }