user_test.go 3.2 KB

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