user_test.go 5.7 KB

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