package services import ( "testing" "github.com/stretchr/testify/suite" ) type UserServiceTestSuite struct { ServiceTestSuite } func TestUserServiceSuite(t *testing.T) { suite.Run(t, new(UserServiceTestSuite)) } func (s *UserServiceTestSuite) TestRegisterByPhone() { user, err := s.svc.RegisterByPhone("13800138000") s.Require().NoError(err) s.NotEmpty(user.ID) s.Equal("13800138000", *user.Phone) s.Equal(0, user.Points) } func (s *UserServiceTestSuite) TestRegisterByPhone_Duplicate() { _, err := s.svc.RegisterByPhone("13800138001") s.Require().NoError(err) _, err = s.svc.RegisterByPhone("13800138001") s.Error(err) s.Contains(err.Error(), "已注册") } func (s *UserServiceTestSuite) TestGetByPhone() { created, err := s.svc.RegisterByPhone("13800138002") s.Require().NoError(err) found, err := s.svc.GetByPhone("13800138002") s.Require().NoError(err) s.Equal(created.ID, found.ID) } func (s *UserServiceTestSuite) TestGetByPhone_NotFound() { _, err := s.svc.GetByPhone("13800999999") s.Error(err) } func (s *UserServiceTestSuite) TestGetByID() { created, err := s.svc.RegisterByPhone("13800138003") s.Require().NoError(err) found, err := s.svc.GetByID(created.ID) s.Require().NoError(err) s.Equal(*created.Phone, *found.Phone) } func (s *UserServiceTestSuite) TestUpdateProfile() { user, err := s.svc.RegisterByPhone("13800138004") s.Require().NoError(err) updated, err := s.svc.UpdateProfile(user.ID, map[string]interface{}{ "nickname": "TestUser", "bio": "Hello", }) s.Require().NoError(err) s.Equal("TestUser", *updated.Nickname) s.Equal("Hello", *updated.Bio) } func (s *UserServiceTestSuite) TestUpdateProfile_RejectInvalidFields() { user, err := s.svc.RegisterByPhone("13800138005") s.Require().NoError(err) updated, err := s.svc.UpdateProfile(user.ID, map[string]interface{}{ "points": 9999, // points is not in the allowed list }) s.Require().NoError(err) s.Equal(0, updated.Points) // should not have changed } func (s *UserServiceTestSuite) TestDeleteAccount() { user, err := s.svc.RegisterByPhone("13800138006") s.Require().NoError(err) err = s.svc.DeleteAccount(user.ID) s.Require().NoError(err) // After delete, the user still exists but fields are cleared deleted, err := s.svc.GetByID(user.ID) s.Require().NoError(err) s.Nil(deleted.Phone) s.Nil(deleted.Nickname) } func (s *UserServiceTestSuite) TestHashAndCheckPassword() { hash, err := HashPassword("my-secret-pwd") s.Require().NoError(err) s.NotEmpty(hash) s.True(CheckPassword(hash, "my-secret-pwd")) s.False(CheckPassword(hash, "wrong-password")) }