memberListLogic_test.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package member
  2. import (
  3. "database/sql"
  4. "testing"
  5. "time"
  6. productModel "perms-system-server/internal/model/product"
  7. memberModel "perms-system-server/internal/model/productmember"
  8. userModel "perms-system-server/internal/model/user"
  9. "perms-system-server/internal/svc"
  10. "perms-system-server/internal/testutil"
  11. "perms-system-server/internal/testutil/ctxhelper"
  12. "perms-system-server/internal/types"
  13. "github.com/stretchr/testify/assert"
  14. "github.com/stretchr/testify/require"
  15. )
  16. // TC-0222: 正常查询(批量查用户)
  17. func TestMemberList_Normal(t *testing.T) {
  18. ctx := ctxhelper.SuperAdminCtx()
  19. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  20. conn := testutil.GetTestSqlConn()
  21. now := time.Now().Unix()
  22. uid := testutil.UniqueId()
  23. pRes, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  24. Code: uid, Name: "test_prod", AppKey: uid, AppSecret: "s1",
  25. Status: 1, CreateTime: now, UpdateTime: now,
  26. })
  27. require.NoError(t, err)
  28. pId, _ := pRes.LastInsertId()
  29. uRes, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
  30. Username: uid, Password: testutil.HashPassword("pass"), Nickname: "TestNick",
  31. Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2,
  32. Status: 1, CreateTime: now, UpdateTime: now,
  33. })
  34. require.NoError(t, err)
  35. uId, _ := uRes.LastInsertId()
  36. mRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &memberModel.SysProductMember{
  37. ProductCode: uid, UserId: uId, MemberType: "MEMBER",
  38. Status: 1, CreateTime: now, UpdateTime: now,
  39. })
  40. require.NoError(t, err)
  41. mId, _ := mRes.LastInsertId()
  42. t.Cleanup(func() {
  43. testutil.CleanTable(ctx, conn, "`sys_product_member`", mId)
  44. testutil.CleanTable(ctx, conn, "`sys_user`", uId)
  45. testutil.CleanTable(ctx, conn, "`sys_product`", pId)
  46. })
  47. logic := NewMemberListLogic(ctx, svcCtx)
  48. resp, err := logic.MemberList(&types.MemberListReq{
  49. ProductCode: uid,
  50. Page: 1,
  51. PageSize: 10,
  52. })
  53. require.NoError(t, err)
  54. assert.Equal(t, int64(1), resp.Total)
  55. items, ok := resp.List.([]types.MemberItem)
  56. require.True(t, ok)
  57. require.Len(t, items, 1)
  58. assert.Equal(t, uid, items[0].Username)
  59. assert.Equal(t, "TestNick", items[0].Nickname)
  60. assert.Equal(t, "MEMBER", items[0].MemberType)
  61. assert.Equal(t, uId, items[0].UserId)
  62. }
  63. // TC-0225: 空成员列表
  64. func TestMemberList_Empty(t *testing.T) {
  65. ctx := ctxhelper.SuperAdminCtx()
  66. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  67. uid := testutil.UniqueId()
  68. logic := NewMemberListLogic(ctx, svcCtx)
  69. resp, err := logic.MemberList(&types.MemberListReq{
  70. ProductCode: uid,
  71. Page: 1,
  72. PageSize: 10,
  73. })
  74. require.NoError(t, err)
  75. assert.Equal(t, int64(0), resp.Total)
  76. }
  77. // TC-0224: pageSize超过上限
  78. func TestMemberList_PageSizeLimit(t *testing.T) {
  79. ctx := ctxhelper.SuperAdminCtx()
  80. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  81. uid := testutil.UniqueId()
  82. logic := NewMemberListLogic(ctx, svcCtx)
  83. resp, err := logic.MemberList(&types.MemberListReq{
  84. ProductCode: uid,
  85. Page: 1,
  86. PageSize: 200,
  87. })
  88. require.NoError(t, err)
  89. assert.Equal(t, int64(0), resp.Total)
  90. }
  91. // TC-0223: 成员用户已删除
  92. func TestMemberList_DeletedUserEmptyInfo(t *testing.T) {
  93. ctx := ctxhelper.SuperAdminCtx()
  94. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  95. conn := testutil.GetTestSqlConn()
  96. now := time.Now().Unix()
  97. uid := testutil.UniqueId()
  98. pRes, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  99. Code: uid, Name: "test_prod", AppKey: uid, AppSecret: "s1",
  100. Status: 1, CreateTime: now, UpdateTime: now,
  101. })
  102. require.NoError(t, err)
  103. pId, _ := pRes.LastInsertId()
  104. nonExistUserId := int64(999999888)
  105. mRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &memberModel.SysProductMember{
  106. ProductCode: uid, UserId: nonExistUserId, MemberType: "MEMBER",
  107. Status: 1, CreateTime: now, UpdateTime: now,
  108. })
  109. require.NoError(t, err)
  110. mId, _ := mRes.LastInsertId()
  111. t.Cleanup(func() {
  112. testutil.CleanTable(ctx, conn, "`sys_product_member`", mId)
  113. testutil.CleanTable(ctx, conn, "`sys_product`", pId)
  114. })
  115. logic := NewMemberListLogic(ctx, svcCtx)
  116. resp, err := logic.MemberList(&types.MemberListReq{
  117. ProductCode: uid,
  118. Page: 1,
  119. PageSize: 10,
  120. })
  121. require.NoError(t, err)
  122. require.NotNil(t, resp)
  123. assert.Equal(t, int64(1), resp.Total)
  124. items, ok := resp.List.([]types.MemberItem)
  125. require.True(t, ok)
  126. require.Len(t, items, 1)
  127. assert.Equal(t, "", items[0].Username)
  128. assert.Equal(t, "", items[0].Nickname)
  129. }
  130. // TC-1305: 非超管不传productCode时从JWT获取
  131. func TestMemberList_NonSuperAdminUsesJWTProductCode(t *testing.T) {
  132. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  133. conn := testutil.GetTestSqlConn()
  134. now := time.Now().Unix()
  135. pc := testutil.UniqueId()
  136. uRes, err := svcCtx.SysUserModel.Insert(ctxhelper.SuperAdminCtx(), &userModel.SysUser{
  137. Username: testutil.UniqueId(), Password: testutil.HashPassword("pass"), Nickname: "Nick",
  138. Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2,
  139. Status: 1, CreateTime: now, UpdateTime: now,
  140. })
  141. require.NoError(t, err)
  142. uId, _ := uRes.LastInsertId()
  143. mRes, err := svcCtx.SysProductMemberModel.Insert(ctxhelper.SuperAdminCtx(), &memberModel.SysProductMember{
  144. ProductCode: pc, UserId: uId, MemberType: "MEMBER",
  145. Status: 1, CreateTime: now, UpdateTime: now,
  146. })
  147. require.NoError(t, err)
  148. mId, _ := mRes.LastInsertId()
  149. t.Cleanup(func() {
  150. testutil.CleanTable(ctxhelper.SuperAdminCtx(), conn, "`sys_product_member`", mId)
  151. testutil.CleanTable(ctxhelper.SuperAdminCtx(), conn, "`sys_user`", uId)
  152. })
  153. ctx := ctxhelper.AdminCtx(pc)
  154. logic := NewMemberListLogic(ctx, svcCtx)
  155. resp, err := logic.MemberList(&types.MemberListReq{
  156. Page: 1,
  157. PageSize: 10,
  158. })
  159. require.NoError(t, err)
  160. assert.Equal(t, int64(1), resp.Total)
  161. }
  162. // TC-1306: 非超管传了其他产品code时被忽略,仍返回JWT产品数据
  163. func TestMemberList_NonSuperAdminIgnoresReqProductCode(t *testing.T) {
  164. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  165. conn := testutil.GetTestSqlConn()
  166. now := time.Now().Unix()
  167. pc := testutil.UniqueId()
  168. uRes, err := svcCtx.SysUserModel.Insert(ctxhelper.SuperAdminCtx(), &userModel.SysUser{
  169. Username: testutil.UniqueId(), Password: testutil.HashPassword("pass"), Nickname: "Nick",
  170. Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2,
  171. Status: 1, CreateTime: now, UpdateTime: now,
  172. })
  173. require.NoError(t, err)
  174. uId, _ := uRes.LastInsertId()
  175. mRes, err := svcCtx.SysProductMemberModel.Insert(ctxhelper.SuperAdminCtx(), &memberModel.SysProductMember{
  176. ProductCode: pc, UserId: uId, MemberType: "MEMBER",
  177. Status: 1, CreateTime: now, UpdateTime: now,
  178. })
  179. require.NoError(t, err)
  180. mId, _ := mRes.LastInsertId()
  181. t.Cleanup(func() {
  182. testutil.CleanTable(ctxhelper.SuperAdminCtx(), conn, "`sys_product_member`", mId)
  183. testutil.CleanTable(ctxhelper.SuperAdminCtx(), conn, "`sys_user`", uId)
  184. })
  185. ctx := ctxhelper.AdminCtx(pc)
  186. logic := NewMemberListLogic(ctx, svcCtx)
  187. resp, err := logic.MemberList(&types.MemberListReq{
  188. ProductCode: "other_product_code",
  189. Page: 1,
  190. PageSize: 10,
  191. })
  192. require.NoError(t, err)
  193. assert.Equal(t, int64(1), resp.Total)
  194. }
  195. // TC-1307: 超管不传productCode时返回全量数据
  196. func TestMemberList_SuperAdminNoProductCodeReturnsAll(t *testing.T) {
  197. ctx := ctxhelper.SuperAdminCtx()
  198. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  199. conn := testutil.GetTestSqlConn()
  200. now := time.Now().Unix()
  201. pc1 := testutil.UniqueId()
  202. pc2 := testutil.UniqueId()
  203. uRes, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
  204. Username: testutil.UniqueId(), Password: testutil.HashPassword("pass"), Nickname: "Nick",
  205. Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2,
  206. Status: 1, CreateTime: now, UpdateTime: now,
  207. })
  208. require.NoError(t, err)
  209. uId, _ := uRes.LastInsertId()
  210. m1Res, err := svcCtx.SysProductMemberModel.Insert(ctx, &memberModel.SysProductMember{
  211. ProductCode: pc1, UserId: uId, MemberType: "MEMBER",
  212. Status: 1, CreateTime: now, UpdateTime: now,
  213. })
  214. require.NoError(t, err)
  215. m1Id, _ := m1Res.LastInsertId()
  216. m2Res, err := svcCtx.SysProductMemberModel.Insert(ctx, &memberModel.SysProductMember{
  217. ProductCode: pc2, UserId: uId, MemberType: "ADMIN",
  218. Status: 1, CreateTime: now, UpdateTime: now,
  219. })
  220. require.NoError(t, err)
  221. m2Id, _ := m2Res.LastInsertId()
  222. t.Cleanup(func() {
  223. testutil.CleanTable(ctx, conn, "`sys_product_member`", m1Id, m2Id)
  224. testutil.CleanTable(ctx, conn, "`sys_user`", uId)
  225. })
  226. logic := NewMemberListLogic(ctx, svcCtx)
  227. resp, err := logic.MemberList(&types.MemberListReq{
  228. Page: 1,
  229. PageSize: 10000,
  230. })
  231. require.NoError(t, err)
  232. assert.GreaterOrEqual(t, resp.Total, int64(2))
  233. }