| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- package auth
- import (
- "context"
- "database/sql"
- "errors"
- "fmt"
- "math/rand"
- "testing"
- "time"
- "perms-system-server/internal/middleware"
- "perms-system-server/internal/model/perm"
- "perms-system-server/internal/model/productmember"
- userModel "perms-system-server/internal/model/user"
- "perms-system-server/internal/response"
- "perms-system-server/internal/svc"
- "perms-system-server/internal/testutil"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- )
- // TC-0045: 正常获取-含productCode
- func TestUserInfo_WithProductCode(t *testing.T) {
- svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
- conn := testutil.GetTestSqlConn()
- ctx := context.Background()
- now := time.Now().Unix()
- username := testutil.UniqueId()
- hashed := testutil.HashPassword("pass123")
- res, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
- Username: username,
- Password: hashed,
- Nickname: "info_test",
- Avatar: sql.NullString{String: "https://avatar.test/a.png", Valid: true},
- Email: username + "@test.com",
- Phone: "13900000001",
- Remark: "",
- DeptId: 0,
- IsSuperAdmin: 2,
- MustChangePassword: 2,
- Status: 1,
- CreateTime: now,
- UpdateTime: now,
- })
- require.NoError(t, err)
- userId, _ := res.LastInsertId()
- pc := fmt.Sprintf("tp_ui_%d", rand.Intn(100000))
- pmRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &productmember.SysProductMember{
- ProductCode: pc, UserId: userId, MemberType: "DEVELOPER", Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- pmId, _ := pmRes.LastInsertId()
- permRes, err := svcCtx.SysPermModel.Insert(ctx, &perm.SysPerm{
- ProductCode: pc, Name: "ui_perm", Code: fmt.Sprintf("ui_c_%d", rand.Intn(100000)), Status: 1, CreateTime: now, UpdateTime: now,
- })
- require.NoError(t, err)
- permId, _ := permRes.LastInsertId()
- t.Cleanup(func() {
- testutil.CleanTable(ctx, conn, "`sys_perm`", permId)
- testutil.CleanTable(ctx, conn, "`sys_product_member`", pmId)
- testutil.CleanTable(ctx, conn, "`sys_user`", userId)
- })
- ud := svcCtx.UserDetailsLoader.Load(ctx, userId, pc)
- infoCtx := middleware.WithUserDetails(context.Background(), ud)
- logic := NewUserInfoLogic(infoCtx, svcCtx)
- info, err := logic.UserInfo()
- require.NoError(t, err)
- require.NotNil(t, info)
- assert.Equal(t, userId, info.UserId)
- assert.Equal(t, username, info.Username)
- assert.Equal(t, "info_test", info.Nickname)
- assert.Equal(t, "https://avatar.test/a.png", info.Avatar)
- assert.Equal(t, username+"@test.com", info.Email)
- assert.Equal(t, "DEVELOPER", info.MemberType)
- assert.NotEmpty(t, info.Perms)
- permObj, _ := svcCtx.SysPermModel.FindOne(ctx, permId)
- assert.Contains(t, info.Perms, permObj.Code)
- }
- // TC-0046: 不含productCode
- func TestUserInfo_WithoutProductCode(t *testing.T) {
- svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
- conn := testutil.GetTestSqlConn()
- ctx := context.Background()
- now := time.Now().Unix()
- username := testutil.UniqueId()
- hashed := testutil.HashPassword("pass123")
- res, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
- Username: username,
- Password: hashed,
- Nickname: "nopc_test",
- Avatar: sql.NullString{},
- Email: username + "@test.com",
- Phone: "13900000002",
- Remark: "",
- DeptId: 0,
- IsSuperAdmin: 2,
- MustChangePassword: 2,
- Status: 1,
- CreateTime: now,
- UpdateTime: now,
- })
- require.NoError(t, err)
- userId, _ := res.LastInsertId()
- t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_user`", userId) })
- ud := svcCtx.UserDetailsLoader.Load(ctx, userId, "")
- infoCtx := middleware.WithUserDetails(context.Background(), ud)
- logic := NewUserInfoLogic(infoCtx, svcCtx)
- info, err := logic.UserInfo()
- require.NoError(t, err)
- require.NotNil(t, info)
- assert.Equal(t, userId, info.UserId)
- assert.Equal(t, username, info.Username)
- assert.Equal(t, "", info.Avatar)
- assert.Empty(t, info.Perms)
- assert.Empty(t, info.MemberType)
- }
- // TC-0048: context中无UserDetails(未登录)
- func TestUserInfo_UserIdZero(t *testing.T) {
- svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
- logic := NewUserInfoLogic(context.Background(), svcCtx)
- info, err := logic.UserInfo()
- assert.Nil(t, info)
- var codeErr *response.CodeError
- require.True(t, errors.As(err, &codeErr))
- assert.Equal(t, 401, codeErr.Code())
- assert.Equal(t, "未登录", codeErr.Error())
- }
- // TC-0049: context中无UserDetails(中间件未注入)
- func TestUserInfo_UserNotFound(t *testing.T) {
- svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
- logic := NewUserInfoLogic(context.Background(), svcCtx)
- info, err := logic.UserInfo()
- assert.Nil(t, info)
- var codeErr *response.CodeError
- require.True(t, errors.As(err, &codeErr))
- assert.Equal(t, 401, codeErr.Code())
- assert.Equal(t, "未登录", codeErr.Error())
- }
|