userInfoLogic_test.go 4.9 KB

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