removeMemberLogic_test.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package member
  2. import (
  3. "database/sql"
  4. "testing"
  5. "time"
  6. permModel "perms-system-server/internal/model/perm"
  7. productModel "perms-system-server/internal/model/product"
  8. memberModel "perms-system-server/internal/model/productmember"
  9. roleModel "perms-system-server/internal/model/role"
  10. userModel "perms-system-server/internal/model/user"
  11. "perms-system-server/internal/model/userperm"
  12. "perms-system-server/internal/model/userrole"
  13. "perms-system-server/internal/response"
  14. "perms-system-server/internal/svc"
  15. "perms-system-server/internal/testutil"
  16. "perms-system-server/internal/testutil/ctxhelper"
  17. "perms-system-server/internal/types"
  18. "github.com/stretchr/testify/assert"
  19. "github.com/stretchr/testify/require"
  20. )
  21. // TC-0226: 正常移除+级联(事务内)
  22. func TestRemoveMember_WithCascade(t *testing.T) {
  23. ctx := ctxhelper.SuperAdminCtx()
  24. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  25. conn := testutil.GetTestSqlConn()
  26. now := time.Now().Unix()
  27. uid := testutil.UniqueId()
  28. pRes, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  29. Code: uid, Name: "test_prod", AppKey: uid, AppSecret: "s1",
  30. Status: 1, CreateTime: now, UpdateTime: now,
  31. })
  32. require.NoError(t, err)
  33. pId, _ := pRes.LastInsertId()
  34. uRes, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
  35. Username: uid, Password: testutil.HashPassword("pass"), Nickname: "nick",
  36. Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2,
  37. Status: 1, CreateTime: now, UpdateTime: now,
  38. })
  39. require.NoError(t, err)
  40. uId, _ := uRes.LastInsertId()
  41. mRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &memberModel.SysProductMember{
  42. ProductCode: uid, UserId: uId, MemberType: "MEMBER",
  43. Status: 1, CreateTime: now, UpdateTime: now,
  44. })
  45. require.NoError(t, err)
  46. mId, _ := mRes.LastInsertId()
  47. rRes, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  48. ProductCode: uid, Name: uid, Status: 1, PermsLevel: 1,
  49. CreateTime: now, UpdateTime: now,
  50. })
  51. require.NoError(t, err)
  52. rId, _ := rRes.LastInsertId()
  53. urRes, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{
  54. UserId: uId, RoleId: rId, CreateTime: now, UpdateTime: now,
  55. })
  56. require.NoError(t, err)
  57. urId, _ := urRes.LastInsertId()
  58. pmRes, err := svcCtx.SysPermModel.Insert(ctx, &permModel.SysPerm{
  59. ProductCode: uid, Name: "perm1", Code: uid + "_perm",
  60. Status: 1, CreateTime: now, UpdateTime: now,
  61. })
  62. require.NoError(t, err)
  63. pmId, _ := pmRes.LastInsertId()
  64. upRes, err := svcCtx.SysUserPermModel.Insert(ctx, &userperm.SysUserPerm{
  65. UserId: uId, PermId: pmId, Effect: "ALLOW",
  66. CreateTime: now, UpdateTime: now,
  67. })
  68. require.NoError(t, err)
  69. upId, _ := upRes.LastInsertId()
  70. t.Cleanup(func() {
  71. testutil.CleanTable(ctx, conn, "`sys_user_perm`", upId)
  72. testutil.CleanTable(ctx, conn, "`sys_user_role`", urId)
  73. testutil.CleanTable(ctx, conn, "`sys_perm`", pmId)
  74. testutil.CleanTable(ctx, conn, "`sys_role`", rId)
  75. testutil.CleanTable(ctx, conn, "`sys_product_member`", mId)
  76. testutil.CleanTable(ctx, conn, "`sys_user`", uId)
  77. testutil.CleanTable(ctx, conn, "`sys_product`", pId)
  78. })
  79. logic := NewRemoveMemberLogic(ctx, svcCtx)
  80. err = logic.RemoveMember(&types.RemoveMemberReq{Id: mId})
  81. require.NoError(t, err)
  82. _, err = svcCtx.SysProductMemberModel.FindOne(ctx, mId)
  83. assert.Error(t, err)
  84. roles, err := svcCtx.SysUserRoleModel.FindRoleIdsByUserId(ctx, uId)
  85. require.NoError(t, err)
  86. assert.Empty(t, roles)
  87. allow, err := svcCtx.SysUserPermModel.FindPermIdsByUserIdAndEffectForProduct(ctx, uId, "ALLOW", uid)
  88. require.NoError(t, err)
  89. assert.Empty(t, allow)
  90. deny, err := svcCtx.SysUserPermModel.FindPermIdsByUserIdAndEffectForProduct(ctx, uId, "DENY", uid)
  91. require.NoError(t, err)
  92. assert.Empty(t, deny)
  93. }
  94. // TC-0228: 成员不存在
  95. func TestRemoveMember_NotFound(t *testing.T) {
  96. ctx := ctxhelper.SuperAdminCtx()
  97. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  98. logic := NewRemoveMemberLogic(ctx, svcCtx)
  99. err := logic.RemoveMember(&types.RemoveMemberReq{Id: 999999999})
  100. require.Error(t, err)
  101. ce, ok := err.(*response.CodeError)
  102. require.True(t, ok)
  103. assert.Equal(t, 404, ce.Code())
  104. assert.Equal(t, "成员不存在", ce.Error())
  105. }
  106. // TC-0227: 跨产品隔离
  107. func TestRemoveMember_CrossProductIsolation(t *testing.T) {
  108. ctx := ctxhelper.SuperAdminCtx()
  109. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  110. conn := testutil.GetTestSqlConn()
  111. now := time.Now().Unix()
  112. uid1 := testutil.UniqueId()
  113. uid2 := testutil.UniqueId()
  114. p1Res, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  115. Code: uid1, Name: "prod1", AppKey: uid1, AppSecret: "s1",
  116. Status: 1, CreateTime: now, UpdateTime: now,
  117. })
  118. require.NoError(t, err)
  119. p1Id, _ := p1Res.LastInsertId()
  120. p2Res, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  121. Code: uid2, Name: "prod2", AppKey: uid2, AppSecret: "s2",
  122. Status: 1, CreateTime: now, UpdateTime: now,
  123. })
  124. require.NoError(t, err)
  125. p2Id, _ := p2Res.LastInsertId()
  126. uRes, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
  127. Username: uid1, Password: testutil.HashPassword("pass"), Nickname: "nick",
  128. Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2,
  129. Status: 1, CreateTime: now, UpdateTime: now,
  130. })
  131. require.NoError(t, err)
  132. uId, _ := uRes.LastInsertId()
  133. m1Res, err := svcCtx.SysProductMemberModel.Insert(ctx, &memberModel.SysProductMember{
  134. ProductCode: uid1, UserId: uId, MemberType: "MEMBER",
  135. Status: 1, CreateTime: now, UpdateTime: now,
  136. })
  137. require.NoError(t, err)
  138. m1Id, _ := m1Res.LastInsertId()
  139. m2Res, err := svcCtx.SysProductMemberModel.Insert(ctx, &memberModel.SysProductMember{
  140. ProductCode: uid2, UserId: uId, MemberType: "MEMBER",
  141. Status: 1, CreateTime: now, UpdateTime: now,
  142. })
  143. require.NoError(t, err)
  144. m2Id, _ := m2Res.LastInsertId()
  145. r1Res, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  146. ProductCode: uid1, Name: uid1, Status: 1, PermsLevel: 1,
  147. CreateTime: now, UpdateTime: now,
  148. })
  149. require.NoError(t, err)
  150. r1Id, _ := r1Res.LastInsertId()
  151. r2Res, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  152. ProductCode: uid2, Name: uid2, Status: 1, PermsLevel: 1,
  153. CreateTime: now, UpdateTime: now,
  154. })
  155. require.NoError(t, err)
  156. r2Id, _ := r2Res.LastInsertId()
  157. ur1Res, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{
  158. UserId: uId, RoleId: r1Id, CreateTime: now, UpdateTime: now,
  159. })
  160. require.NoError(t, err)
  161. ur1Id, _ := ur1Res.LastInsertId()
  162. ur2Res, err := svcCtx.SysUserRoleModel.Insert(ctx, &userrole.SysUserRole{
  163. UserId: uId, RoleId: r2Id, CreateTime: now, UpdateTime: now,
  164. })
  165. require.NoError(t, err)
  166. ur2Id, _ := ur2Res.LastInsertId()
  167. t.Cleanup(func() {
  168. testutil.CleanTable(ctx, conn, "`sys_user_role`", ur1Id, ur2Id)
  169. testutil.CleanTable(ctx, conn, "`sys_role`", r1Id, r2Id)
  170. testutil.CleanTable(ctx, conn, "`sys_product_member`", m1Id, m2Id)
  171. testutil.CleanTable(ctx, conn, "`sys_user`", uId)
  172. testutil.CleanTable(ctx, conn, "`sys_product`", p1Id, p2Id)
  173. })
  174. logic := NewRemoveMemberLogic(ctx, svcCtx)
  175. err = logic.RemoveMember(&types.RemoveMemberReq{Id: m1Id})
  176. require.NoError(t, err)
  177. _, err = svcCtx.SysProductMemberModel.FindOne(ctx, m1Id)
  178. assert.Error(t, err)
  179. m2, err := svcCtx.SysProductMemberModel.FindOne(ctx, m2Id)
  180. require.NoError(t, err)
  181. assert.Equal(t, uid2, m2.ProductCode)
  182. roleIds, err := svcCtx.SysUserRoleModel.FindRoleIdsByUserId(ctx, uId)
  183. require.NoError(t, err)
  184. assert.Contains(t, roleIds, r2Id)
  185. assert.NotContains(t, roleIds, r1Id)
  186. }