user_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package repository
  2. import (
  3. "context"
  4. "github.com/go-nunu/nunu-layout-advanced/pkg/log"
  5. "testing"
  6. "time"
  7. "github.com/DATA-DOG/go-sqlmock"
  8. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  9. "github.com/go-nunu/nunu-layout-advanced/internal/repository"
  10. "github.com/stretchr/testify/assert"
  11. "gorm.io/driver/mysql"
  12. "gorm.io/gorm"
  13. )
  14. var logger *log.Logger
  15. func setupRepository(t *testing.T) (repository.UserRepository, sqlmock.Sqlmock) {
  16. mockDB, mock, err := sqlmock.New()
  17. if err != nil {
  18. t.Fatalf("failed to create sqlmock: %v", err)
  19. }
  20. db, err := gorm.Open(mysql.New(mysql.Config{
  21. Conn: mockDB,
  22. SkipInitializeWithVersion: true,
  23. }), &gorm.Config{})
  24. if err != nil {
  25. t.Fatalf("failed to open gorm connection: %v", err)
  26. }
  27. //rdb, _ := redismock.NewClientMock()
  28. repo := repository.NewRepository(logger, db)
  29. userRepo := repository.NewUserRepository(repo)
  30. return userRepo, mock
  31. }
  32. func TestUserRepository_Create(t *testing.T) {
  33. userRepo, mock := setupRepository(t)
  34. ctx := context.Background()
  35. user := &model.User{
  36. Id: 1,
  37. UserId: "123",
  38. Nickname: "Test",
  39. Password: "password",
  40. Email: "test@example.com",
  41. CreatedAt: time.Now(),
  42. UpdatedAt: time.Now(),
  43. }
  44. mock.ExpectBegin()
  45. mock.ExpectExec("INSERT INTO `users`").
  46. WithArgs(user.UserId, user.Nickname, user.Password, user.Email, user.CreatedAt, user.UpdatedAt, user.DeletedAt, user.Id).
  47. WillReturnResult(sqlmock.NewResult(1, 1))
  48. mock.ExpectCommit()
  49. err := userRepo.Create(ctx, user)
  50. assert.NoError(t, err)
  51. assert.NoError(t, mock.ExpectationsWereMet())
  52. }
  53. func TestUserRepository_Update(t *testing.T) {
  54. userRepo, mock := setupRepository(t)
  55. ctx := context.Background()
  56. user := &model.User{
  57. Id: 1,
  58. UserId: "123",
  59. Nickname: "Test",
  60. Password: "password",
  61. Email: "test@example.com",
  62. CreatedAt: time.Now(),
  63. UpdatedAt: time.Now(),
  64. }
  65. mock.ExpectBegin()
  66. mock.ExpectExec("UPDATE `users`").WillReturnResult(sqlmock.NewResult(1, 1))
  67. mock.ExpectCommit()
  68. err := userRepo.Update(ctx, user)
  69. assert.NoError(t, err)
  70. assert.NoError(t, mock.ExpectationsWereMet())
  71. }
  72. func TestUserRepository_GetById(t *testing.T) {
  73. userRepo, mock := setupRepository(t)
  74. ctx := context.Background()
  75. userId := "123"
  76. rows := sqlmock.NewRows([]string{"id", "user_id", "username", "nickname", "password", "email", "created_at", "updated_at"}).
  77. AddRow(1, "123", "test", "Test", "password", "test@example.com", time.Now(), time.Now())
  78. mock.ExpectQuery("SELECT \\* FROM `users`").WillReturnRows(rows)
  79. user, err := userRepo.GetByID(ctx, userId)
  80. assert.NoError(t, err)
  81. assert.NotNil(t, user)
  82. assert.Equal(t, "123", user.UserId)
  83. assert.NoError(t, mock.ExpectationsWereMet())
  84. }
  85. func TestUserRepository_GetByUsername(t *testing.T) {
  86. userRepo, mock := setupRepository(t)
  87. ctx := context.Background()
  88. email := "test@example.com"
  89. rows := sqlmock.NewRows([]string{"id", "user_id", "username", "nickname", "password", "email", "created_at", "updated_at"}).
  90. AddRow(1, "123", "test", "Test", "password", "test@example.com", time.Now(), time.Now())
  91. mock.ExpectQuery("SELECT \\* FROM `users`").WillReturnRows(rows)
  92. user, err := userRepo.GetByEmail(ctx, email)
  93. assert.NoError(t, err)
  94. assert.NotNil(t, user)
  95. assert.Equal(t, "test@example.com", user.Email)
  96. assert.NoError(t, mock.ExpectationsWereMet())
  97. }