user_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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. err := os.Setenv("APP_CONF", "../../../config/local.yml")
  25. if err != nil {
  26. panic(err)
  27. }
  28. conf := config.NewConfig()
  29. logger := log.NewLog(conf)
  30. jwt := middleware.NewJwt(conf)
  31. sf := sid.NewSid()
  32. srv = service.NewService(logger, sf, jwt)
  33. code := m.Run()
  34. fmt.Println("test end")
  35. os.Exit(code)
  36. }
  37. func TestUserService_Register(t *testing.T) {
  38. ctrl := gomock.NewController(t)
  39. defer ctrl.Finish()
  40. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  41. userService := service.NewUserService(srv, mockUserRepo)
  42. ctx := context.Background()
  43. req := &service.RegisterRequest{
  44. Username: "testuser",
  45. Password: "password",
  46. Email: "test@example.com",
  47. }
  48. mockUserRepo.EXPECT().GetByUsername(ctx, req.Username).Return(nil, nil)
  49. mockUserRepo.EXPECT().Create(ctx, gomock.Any()).Return(nil)
  50. err := userService.Register(ctx, req)
  51. assert.NoError(t, err)
  52. }
  53. func TestUserService_Register_UsernameExists(t *testing.T) {
  54. ctrl := gomock.NewController(t)
  55. defer ctrl.Finish()
  56. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  57. userService := service.NewUserService(srv, mockUserRepo)
  58. ctx := context.Background()
  59. req := &service.RegisterRequest{
  60. Username: "testuser",
  61. Password: "password",
  62. Email: "test@example.com",
  63. }
  64. mockUserRepo.EXPECT().GetByUsername(ctx, req.Username).Return(&model.User{}, nil)
  65. err := userService.Register(ctx, req)
  66. assert.Error(t, err)
  67. }
  68. func TestUserService_Login(t *testing.T) {
  69. ctrl := gomock.NewController(t)
  70. defer ctrl.Finish()
  71. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  72. userService := service.NewUserService(srv, mockUserRepo)
  73. ctx := context.Background()
  74. req := &service.LoginRequest{
  75. Username: "testuser",
  76. Password: "password",
  77. }
  78. hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
  79. if err != nil {
  80. t.Error("failed to hash password")
  81. }
  82. mockUserRepo.EXPECT().GetByUsername(ctx, req.Username).Return(&model.User{
  83. Password: string(hashedPassword),
  84. }, nil)
  85. token, err := userService.Login(ctx, req)
  86. assert.NoError(t, err)
  87. assert.NotEmpty(t, token)
  88. }
  89. func TestUserService_Login_UserNotFound(t *testing.T) {
  90. ctrl := gomock.NewController(t)
  91. defer ctrl.Finish()
  92. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  93. userService := service.NewUserService(srv, mockUserRepo)
  94. ctx := context.Background()
  95. req := &service.LoginRequest{
  96. Username: "testuser",
  97. Password: "password",
  98. }
  99. mockUserRepo.EXPECT().GetByUsername(ctx, req.Username).Return(nil, errors.New("user not found"))
  100. _, err := userService.Login(ctx, req)
  101. assert.Error(t, err)
  102. }
  103. func TestUserService_GetProfile(t *testing.T) {
  104. ctrl := gomock.NewController(t)
  105. defer ctrl.Finish()
  106. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  107. userService := service.NewUserService(srv, mockUserRepo)
  108. ctx := context.Background()
  109. userId := "123"
  110. mockUserRepo.EXPECT().GetByID(ctx, userId).Return(&model.User{
  111. UserId: userId,
  112. Username: "testuser",
  113. Email: "test@example.com",
  114. }, nil)
  115. user, err := userService.GetProfile(ctx, userId)
  116. assert.NoError(t, err)
  117. assert.Equal(t, userId, user.UserId)
  118. assert.Equal(t, "testuser", user.Username)
  119. assert.Equal(t, "test@example.com", user.Email)
  120. }
  121. func TestUserService_UpdateProfile(t *testing.T) {
  122. ctrl := gomock.NewController(t)
  123. defer ctrl.Finish()
  124. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  125. userService := service.NewUserService(srv, mockUserRepo)
  126. ctx := context.Background()
  127. userId := "123"
  128. req := &service.UpdateProfileRequest{
  129. Nickname: "testuser",
  130. Email: "test@example.com",
  131. }
  132. mockUserRepo.EXPECT().GetByID(ctx, userId).Return(&model.User{
  133. UserId: userId,
  134. Username: "testuser",
  135. Email: "old@example.com",
  136. }, nil)
  137. mockUserRepo.EXPECT().Update(ctx, gomock.Any()).Return(nil)
  138. err := userService.UpdateProfile(ctx, userId, req)
  139. assert.NoError(t, err)
  140. }
  141. func TestUserService_UpdateProfile_UserNotFound(t *testing.T) {
  142. ctrl := gomock.NewController(t)
  143. defer ctrl.Finish()
  144. mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
  145. userService := service.NewUserService(srv, mockUserRepo)
  146. ctx := context.Background()
  147. userId := "123"
  148. req := &service.UpdateProfileRequest{
  149. Nickname: "testuser",
  150. Email: "test@example.com",
  151. }
  152. mockUserRepo.EXPECT().GetByID(ctx, userId).Return(nil, errors.New("user not found"))
  153. err := userService.UpdateProfile(ctx, userId, req)
  154. assert.Error(t, err)
  155. }