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-0049: 正常获取-含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-0050: 不含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-0052: 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-0053: 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()) }