user_test.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. package service_test
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "github.com/go-nunu/nunu-layout-advanced/mocks/repository"
  7. "os"
  8. "testing"
  9. "github.com/go-nunu/nunu-layout-advanced/internal/middleware"
  10. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  11. "github.com/go-nunu/nunu-layout-advanced/internal/service"
  12. "github.com/go-nunu/nunu-layout-advanced/pkg/config"
  13. "github.com/go-nunu/nunu-layout-advanced/pkg/helper/sid"
  14. "github.com/go-nunu/nunu-layout-advanced/pkg/log"
  15. "github.com/golang/mock/gomock"
  16. "github.com/stretchr/testify/assert"
  17. "golang.org/x/crypto/bcrypt"
  18. )
  19. var (
  20. srv *service.Service
  21. )
  22. func TestMain(m *testing.M) {
  23. fmt.Println("begin")
  24. os.Setenv("APP_CONF", "../../../config/local.yml")
  25. conf := config.NewConfig()
  26. logger := log.NewLog(conf)
  27. jwt := middleware.NewJwt(conf)
  28. sf := sid.NewSid()
  29. srv = service.NewService(logger, sf, jwt)
  30. code := m.Run()
  31. fmt.Println("test end")
  32. os.Exit(code)
  33. }
  34. func TestUserService_Register(t *testing.T) {
  35. ctrl := gomock.NewController(t)
  36. defer ctrl.Finish()
  37. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  38. userService := service.NewUserService(srv, mockUserRepo)
  39. ctx := context.Background()
  40. req := &service.RegisterRequest{
  41. Username: "testuser",
  42. Password: "password",
  43. Email: "test@example.com",
  44. }
  45. mockUserRepo.EXPECT().GetByUsername(ctx, req.Username).Return(nil, nil)
  46. mockUserRepo.EXPECT().Create(ctx, gomock.Any()).Return(nil)
  47. err := userService.Register(ctx, req)
  48. assert.NoError(t, err)
  49. }
  50. func TestUserService_Register_UsernameExists(t *testing.T) {
  51. ctrl := gomock.NewController(t)
  52. defer ctrl.Finish()
  53. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  54. userService := service.NewUserService(srv, mockUserRepo)
  55. ctx := context.Background()
  56. req := &service.RegisterRequest{
  57. Username: "testuser",
  58. Password: "password",
  59. Email: "test@example.com",
  60. }
  61. mockUserRepo.EXPECT().GetByUsername(ctx, req.Username).Return(&model.User{}, nil)
  62. err := userService.Register(ctx, req)
  63. assert.Error(t, err)
  64. }
  65. func TestUserService_Login(t *testing.T) {
  66. ctrl := gomock.NewController(t)
  67. defer ctrl.Finish()
  68. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  69. userService := service.NewUserService(srv, mockUserRepo)
  70. ctx := context.Background()
  71. req := &service.LoginRequest{
  72. Username: "testuser",
  73. Password: "password",
  74. }
  75. hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
  76. if err != nil {
  77. t.Error("failed to hash password")
  78. }
  79. mockUserRepo.EXPECT().GetByUsername(ctx, req.Username).Return(&model.User{
  80. Password: string(hashedPassword),
  81. }, nil)
  82. token, err := userService.Login(ctx, req)
  83. assert.NoError(t, err)
  84. assert.NotEmpty(t, token)
  85. }
  86. func TestUserService_Login_UserNotFound(t *testing.T) {
  87. ctrl := gomock.NewController(t)
  88. defer ctrl.Finish()
  89. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  90. userService := service.NewUserService(srv, mockUserRepo)
  91. ctx := context.Background()
  92. req := &service.LoginRequest{
  93. Username: "testuser",
  94. Password: "password",
  95. }
  96. mockUserRepo.EXPECT().GetByUsername(ctx, req.Username).Return(nil, errors.New("user not found"))
  97. _, err := userService.Login(ctx, req)
  98. assert.Error(t, err)
  99. }
  100. func TestUserService_GetProfile(t *testing.T) {
  101. ctrl := gomock.NewController(t)
  102. defer ctrl.Finish()
  103. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  104. userService := service.NewUserService(srv, mockUserRepo)
  105. ctx := context.Background()
  106. userId := "123"
  107. mockUserRepo.EXPECT().GetByID(ctx, userId).Return(&model.User{
  108. UserId: userId,
  109. Username: "testuser",
  110. Email: "test@example.com",
  111. }, nil)
  112. user, err := userService.GetProfile(ctx, userId)
  113. assert.NoError(t, err)
  114. assert.Equal(t, userId, user.UserId)
  115. assert.Equal(t, "testuser", user.Username)
  116. assert.Equal(t, "test@example.com", user.Email)
  117. }
  118. func TestUserService_UpdateProfile(t *testing.T) {
  119. ctrl := gomock.NewController(t)
  120. defer ctrl.Finish()
  121. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  122. userService := service.NewUserService(srv, mockUserRepo)
  123. ctx := context.Background()
  124. userId := "123"
  125. req := &service.UpdateProfileRequest{
  126. Nickname: "testuser",
  127. Email: "test@example.com",
  128. }
  129. mockUserRepo.EXPECT().GetByID(ctx, userId).Return(&model.User{
  130. UserId: userId,
  131. Username: "testuser",
  132. Email: "old@example.com",
  133. }, nil)
  134. mockUserRepo.EXPECT().Update(ctx, gomock.Any()).Return(nil)
  135. err := userService.UpdateProfile(ctx, userId, req)
  136. assert.NoError(t, err)
  137. }
  138. func TestUserService_UpdateProfile_UserNotFound(t *testing.T) {
  139. ctrl := gomock.NewController(t)
  140. defer ctrl.Finish()
  141. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  142. userService := service.NewUserService(srv, mockUserRepo)
  143. ctx := context.Background()
  144. userId := "123"
  145. req := &service.UpdateProfileRequest{
  146. Nickname: "testuser",
  147. Email: "test@example.com",
  148. }
  149. mockUserRepo.EXPECT().GetByID(ctx, userId).Return(nil, errors.New("user not found"))
  150. err := userService.UpdateProfile(ctx, userId, req)
  151. assert.Error(t, err)
  152. }
  153. func TestUserService_GenerateToken(t *testing.T) {
  154. ctrl := gomock.NewController(t)
  155. defer ctrl.Finish()
  156. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  157. userService := service.NewUserService(srv, mockUserRepo)
  158. ctx := context.Background()
  159. userId := "123"
  160. result, err := userService.GenerateToken(ctx, userId)
  161. assert.NoError(t, err)
  162. assert.NotEmpty(t, result)
  163. }