userProductsLogic_test.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package member
  2. import (
  3. "database/sql"
  4. "testing"
  5. "time"
  6. "perms-system-server/internal/consts"
  7. "perms-system-server/internal/loaders"
  8. productModel "perms-system-server/internal/model/product"
  9. memberModel "perms-system-server/internal/model/productmember"
  10. userModel "perms-system-server/internal/model/user"
  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-1270: 超管查询他人产品列表,正常返回
  19. func TestUserProducts_SuperAdmin_OK(t *testing.T) {
  20. ctx := ctxhelper.SuperAdminCtx()
  21. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  22. conn := testutil.GetTestSqlConn()
  23. now := time.Now().Unix()
  24. uid := testutil.UniqueId()
  25. pRes, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  26. Code: uid, Name: "TestProd", AppKey: uid, AppSecret: "s1",
  27. Status: 1, CreateTime: now, UpdateTime: now,
  28. })
  29. require.NoError(t, err)
  30. pId, _ := pRes.LastInsertId()
  31. uRes, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
  32. Username: uid, Password: testutil.HashPassword("pass"), Nickname: "Nick",
  33. Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2,
  34. Status: 1, CreateTime: now, UpdateTime: now,
  35. })
  36. require.NoError(t, err)
  37. uId, _ := uRes.LastInsertId()
  38. mRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &memberModel.SysProductMember{
  39. ProductCode: uid, UserId: uId, MemberType: "MEMBER",
  40. Status: 1, CreateTime: now, UpdateTime: now,
  41. })
  42. require.NoError(t, err)
  43. mId, _ := mRes.LastInsertId()
  44. t.Cleanup(func() {
  45. testutil.CleanTable(ctx, conn, "`sys_product_member`", mId)
  46. testutil.CleanTable(ctx, conn, "`sys_user`", uId)
  47. testutil.CleanTable(ctx, conn, "`sys_product`", pId)
  48. })
  49. logic := NewUserProductsLogic(ctx, svcCtx)
  50. resp, err := logic.UserProducts(&types.UserProductsReq{UserId: uId})
  51. require.NoError(t, err)
  52. require.Len(t, resp.List, 1)
  53. assert.Equal(t, uid, resp.List[0].ProductCode)
  54. assert.Equal(t, "TestProd", resp.List[0].ProductName)
  55. assert.Equal(t, "MEMBER", resp.List[0].MemberType)
  56. assert.Equal(t, int64(1), resp.List[0].Status)
  57. }
  58. // TC-1271: 本人查询自己的产品列表,正常返回
  59. func TestUserProducts_Self_OK(t *testing.T) {
  60. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  61. conn := testutil.GetTestSqlConn()
  62. now := time.Now().Unix()
  63. uid := testutil.UniqueId()
  64. pRes, err := svcCtx.SysProductModel.Insert(ctxhelper.SuperAdminCtx(), &productModel.SysProduct{
  65. Code: uid, Name: "TestProd2", AppKey: uid, AppSecret: "s2",
  66. Status: 1, CreateTime: now, UpdateTime: now,
  67. })
  68. require.NoError(t, err)
  69. pId, _ := pRes.LastInsertId()
  70. uRes, err := svcCtx.SysUserModel.Insert(ctxhelper.SuperAdminCtx(), &userModel.SysUser{
  71. Username: uid, Password: testutil.HashPassword("pass"), Nickname: "Nick2",
  72. Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2,
  73. Status: 1, CreateTime: now, UpdateTime: now,
  74. })
  75. require.NoError(t, err)
  76. uId, _ := uRes.LastInsertId()
  77. mRes, err := svcCtx.SysProductMemberModel.Insert(ctxhelper.SuperAdminCtx(), &memberModel.SysProductMember{
  78. ProductCode: uid, UserId: uId, MemberType: "ADMIN",
  79. Status: 1, CreateTime: now, UpdateTime: now,
  80. })
  81. require.NoError(t, err)
  82. mId, _ := mRes.LastInsertId()
  83. t.Cleanup(func() {
  84. testutil.CleanTable(ctxhelper.SuperAdminCtx(), conn, "`sys_product_member`", mId)
  85. testutil.CleanTable(ctxhelper.SuperAdminCtx(), conn, "`sys_user`", uId)
  86. testutil.CleanTable(ctxhelper.SuperAdminCtx(), conn, "`sys_product`", pId)
  87. })
  88. // 本人上下文
  89. ctx := ctxhelper.CustomCtx(&loaders.UserDetails{
  90. UserId: uId,
  91. Username: uid,
  92. IsSuperAdmin: false,
  93. MemberType: consts.MemberTypeAdmin,
  94. Status: consts.StatusEnabled,
  95. ProductCode: uid,
  96. })
  97. logic := NewUserProductsLogic(ctx, svcCtx)
  98. resp, err := logic.UserProducts(&types.UserProductsReq{UserId: uId})
  99. require.NoError(t, err)
  100. require.Len(t, resp.List, 1)
  101. assert.Equal(t, uid, resp.List[0].ProductCode)
  102. assert.Equal(t, "ADMIN", resp.List[0].MemberType)
  103. }
  104. // TC-1272: 非超管查询他人产品列表,返回 403
  105. func TestUserProducts_OtherUser_Forbidden(t *testing.T) {
  106. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  107. ctx := ctxhelper.CustomCtx(&loaders.UserDetails{
  108. UserId: 20,
  109. Username: "user20",
  110. IsSuperAdmin: false,
  111. MemberType: consts.MemberTypeMember,
  112. Status: consts.StatusEnabled,
  113. ProductCode: "crm",
  114. })
  115. logic := NewUserProductsLogic(ctx, svcCtx)
  116. resp, err := logic.UserProducts(&types.UserProductsReq{UserId: 99})
  117. assert.Nil(t, resp)
  118. assert.Error(t, err)
  119. assert.Contains(t, err.Error(), "无权查看他人")
  120. }
  121. // TC-1273: 用户未加入任何产品,返回空列表
  122. func TestUserProducts_Empty(t *testing.T) {
  123. ctx := ctxhelper.SuperAdminCtx()
  124. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  125. conn := testutil.GetTestSqlConn()
  126. now := time.Now().Unix()
  127. uid := testutil.UniqueId()
  128. uRes, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
  129. Username: uid, Password: testutil.HashPassword("pass"), Nickname: "Nick3",
  130. Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2,
  131. Status: 1, CreateTime: now, UpdateTime: now,
  132. })
  133. require.NoError(t, err)
  134. uId, _ := uRes.LastInsertId()
  135. t.Cleanup(func() {
  136. testutil.CleanTable(ctx, conn, "`sys_user`", uId)
  137. })
  138. logic := NewUserProductsLogic(ctx, svcCtx)
  139. resp, err := logic.UserProducts(&types.UserProductsReq{UserId: uId})
  140. require.NoError(t, err)
  141. assert.Empty(t, resp.List)
  142. }