userInfoLogic_test.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package auth
  2. import (
  3. "context"
  4. "database/sql"
  5. "errors"
  6. "fmt"
  7. "math/rand"
  8. "testing"
  9. "time"
  10. "perms-system-server/internal/middleware"
  11. "perms-system-server/internal/model/perm"
  12. productModel "perms-system-server/internal/model/product"
  13. "perms-system-server/internal/model/productmember"
  14. userModel "perms-system-server/internal/model/user"
  15. "perms-system-server/internal/response"
  16. "perms-system-server/internal/svc"
  17. "perms-system-server/internal/testutil"
  18. "github.com/stretchr/testify/assert"
  19. "github.com/stretchr/testify/require"
  20. )
  21. // TC-0049: 正常获取-含productCode
  22. func TestUserInfo_WithProductCode(t *testing.T) {
  23. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  24. conn := testutil.GetTestSqlConn()
  25. ctx := context.Background()
  26. now := time.Now().Unix()
  27. username := testutil.UniqueId()
  28. hashed := testutil.HashPassword("pass123")
  29. res, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
  30. Username: username,
  31. Password: hashed,
  32. Nickname: "info_test",
  33. Avatar: sql.NullString{String: "https://avatar.test/a.png", Valid: true},
  34. Email: username + "@test.com",
  35. Phone: "13900000001",
  36. Remark: "",
  37. DeptId: 0,
  38. IsSuperAdmin: 2,
  39. MustChangePassword: 2,
  40. Status: 1,
  41. CreateTime: now,
  42. UpdateTime: now,
  43. })
  44. require.NoError(t, err)
  45. userId, _ := res.LastInsertId()
  46. pc := fmt.Sprintf("tp_ui_%d_%d", time.Now().UnixNano(), rand.Intn(100000))
  47. pRes, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  48. Code: pc, Name: "ui_prod", AppKey: pc + "_k", AppSecret: "s",
  49. Status: 1, CreateTime: now, UpdateTime: now,
  50. })
  51. require.NoError(t, err)
  52. pId, _ := pRes.LastInsertId()
  53. pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
  54. ProductCode: pc, UserId: userId, MemberType: "DEVELOPER", Status: 1, CreateTime: now, UpdateTime: now,
  55. })
  56. require.NoError(t, err)
  57. pmId, _ := pmRes.LastInsertId()
  58. permRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
  59. ProductCode: pc, Name: "ui_perm", Code: fmt.Sprintf("ui_c_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
  60. })
  61. require.NoError(t, err)
  62. permId, _ := permRes.LastInsertId()
  63. t.Cleanup(func() {
  64. testutil.CleanTable(ctx, conn, "`sys_perm`", permId)
  65. testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
  66. testutil.CleanTable(ctx, conn, "`sys_product`", pId)
  67. testutil.CleanTable(ctx, conn, "`sys_user`", userId)
  68. })
  69. ud, _ := svcCtx.UserDetailsLoader.Load(ctx, userId, pc)
  70. infoCtx := middleware.WithUserDetails(context.Background(), ud)
  71. logic := NewUserInfoLogic(infoCtx, svcCtx)
  72. info, err := logic.UserInfo()
  73. require.NoError(t, err)
  74. require.NotNil(t, info)
  75. assert.Equal(t, userId, info.UserId)
  76. assert.Equal(t, username, info.Username)
  77. assert.Equal(t, "info_test", info.Nickname)
  78. assert.Equal(t, "https://avatar.test/a.png", info.Avatar)
  79. assert.Equal(t, username+"@test.com", info.Email)
  80. assert.Equal(t, "DEVELOPER", info.MemberType)
  81. assert.NotEmpty(t, info.Perms)
  82. permObj, _ := svcCtx.SysPermModel.FindOne(ctx, permId)
  83. assert.Contains(t, info.Perms, permObj.Code)
  84. }
  85. // TC-0050: 不含productCode
  86. func TestUserInfo_WithoutProductCode(t *testing.T) {
  87. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  88. conn := testutil.GetTestSqlConn()
  89. ctx := context.Background()
  90. now := time.Now().Unix()
  91. username := testutil.UniqueId()
  92. hashed := testutil.HashPassword("pass123")
  93. res, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
  94. Username: username,
  95. Password: hashed,
  96. Nickname: "nopc_test",
  97. Avatar: sql.NullString{},
  98. Email: username + "@test.com",
  99. Phone: "13900000002",
  100. Remark: "",
  101. DeptId: 0,
  102. IsSuperAdmin: 2,
  103. MustChangePassword: 2,
  104. Status: 1,
  105. CreateTime: now,
  106. UpdateTime: now,
  107. })
  108. require.NoError(t, err)
  109. userId, _ := res.LastInsertId()
  110. t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_user`", userId) })
  111. ud, _ := svcCtx.UserDetailsLoader.Load(ctx, userId, "")
  112. infoCtx := middleware.WithUserDetails(context.Background(), ud)
  113. logic := NewUserInfoLogic(infoCtx, svcCtx)
  114. info, err := logic.UserInfo()
  115. require.NoError(t, err)
  116. require.NotNil(t, info)
  117. assert.Equal(t, userId, info.UserId)
  118. assert.Equal(t, username, info.Username)
  119. assert.Equal(t, "", info.Avatar)
  120. assert.Empty(t, info.Perms)
  121. assert.Empty(t, info.MemberType)
  122. }
  123. // TC-0052: context中无UserDetails(未登录)
  124. func TestUserInfo_UserIdZero(t *testing.T) {
  125. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  126. logic := NewUserInfoLogic(context.Background(), svcCtx)
  127. info, err := logic.UserInfo()
  128. assert.Nil(t, info)
  129. var codeErr *response.CodeError
  130. require.True(t, errors.As(err, &codeErr))
  131. assert.Equal(t, 401, codeErr.Code())
  132. assert.Equal(t, "未登录", codeErr.Error())
  133. }
  134. // TC-0053: context中无UserDetails(中间件未注入)
  135. func TestUserInfo_UserNotFound(t *testing.T) {
  136. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  137. logic := NewUserInfoLogic(context.Background(), svcCtx)
  138. info, err := logic.UserInfo()
  139. assert.Nil(t, info)
  140. var codeErr *response.CodeError
  141. require.True(t, errors.As(err, &codeErr))
  142. assert.Equal(t, 401, codeErr.Code())
  143. assert.Equal(t, "未登录", codeErr.Error())
  144. }