user_test.go 5.6 KB

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