user_test.go 5.1 KB

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