github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/internal/mysqltest/mysqltest.go (about)

     1  package mysqltest
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  	"testing"
     7  
     8  	"github.com/oinume/lekcije/backend/domain/repository"
     9  	"github.com/oinume/lekcije/backend/infrastructure/mysql"
    10  	"github.com/oinume/lekcije/backend/model2"
    11  )
    12  
    13  type Repositories struct {
    14  	sqlDB                *sql.DB
    15  	db                   repository.DB
    16  	followingTeacher     repository.FollowingTeacher
    17  	lesson               repository.Lesson
    18  	lessonStatusLog      repository.LessonStatusLog
    19  	notificationTimeSpan repository.NotificationTimeSpan
    20  	statNotifier         repository.StatNotifier
    21  	teacher              repository.Teacher
    22  	user                 repository.User
    23  	userAPIToken         repository.UserAPIToken
    24  	userGoogle           repository.UserGoogle
    25  }
    26  
    27  func NewRepositories(sqlDB *sql.DB) *Repositories {
    28  	return &Repositories{
    29  		sqlDB:                sqlDB,
    30  		db:                   mysql.NewDBRepository(sqlDB),
    31  		followingTeacher:     mysql.NewFollowingTeacherRepository(sqlDB),
    32  		lesson:               mysql.NewLessonRepository(sqlDB),
    33  		lessonStatusLog:      mysql.NewLessonStatusLogRepository(sqlDB),
    34  		notificationTimeSpan: mysql.NewNotificationTimeSpanRepository(sqlDB),
    35  		statNotifier:         mysql.NewStatNotifierRepository(sqlDB),
    36  		teacher:              mysql.NewTeacherRepository(sqlDB),
    37  		user:                 mysql.NewUserRepository(sqlDB),
    38  		userAPIToken:         mysql.NewUserAPITokenRepository(sqlDB),
    39  		userGoogle:           mysql.NewUserGoogleRepository(sqlDB),
    40  	}
    41  }
    42  
    43  func (r *Repositories) DB() repository.DB {
    44  	return r.db
    45  }
    46  
    47  func (r *Repositories) FollowingTeacher() repository.FollowingTeacher {
    48  	return r.followingTeacher
    49  }
    50  
    51  func (r *Repositories) Lesson() repository.Lesson {
    52  	return r.lesson
    53  }
    54  
    55  func (r *Repositories) LessonStatusLog() repository.LessonStatusLog {
    56  	return r.lessonStatusLog
    57  }
    58  
    59  func (r *Repositories) NotificationTimeSpan() repository.NotificationTimeSpan {
    60  	return r.notificationTimeSpan
    61  }
    62  
    63  func (r *Repositories) StatNotifier() repository.StatNotifier {
    64  	return r.statNotifier
    65  }
    66  
    67  func (r *Repositories) Teacher() repository.Teacher {
    68  	return r.teacher
    69  }
    70  
    71  func (r *Repositories) User() repository.User {
    72  	return r.user
    73  }
    74  
    75  func (r *Repositories) UserAPIToken() repository.UserAPIToken {
    76  	return r.userAPIToken
    77  }
    78  
    79  func (r *Repositories) UserGoogle() repository.UserGoogle {
    80  	return r.userGoogle
    81  }
    82  
    83  func (r *Repositories) CreateFollowingTeachers(ctx context.Context, t *testing.T, followingTeachers ...*model2.FollowingTeacher) {
    84  	t.Helper()
    85  	userIDCheck := make(map[uint]struct{}, len(followingTeachers))
    86  	for _, ft := range followingTeachers {
    87  		userIDCheck[ft.UserID] = struct{}{}
    88  	}
    89  	if len(userIDCheck) > 1 {
    90  		t.Fatal("CreateFollowingTeachers failed because userID in followingTeachers is not same")
    91  	}
    92  	for _, ft := range followingTeachers {
    93  		if err := r.followingTeacher.Create(ctx, ft); err != nil {
    94  			t.Fatalf("CreateFollowingTeachers failed: %v", err)
    95  		}
    96  	}
    97  }
    98  
    99  func (r *Repositories) CreateLessons(
   100  	ctx context.Context, t *testing.T,
   101  	lessons ...*model2.Lesson,
   102  ) {
   103  	t.Helper()
   104  	for _, lesson := range lessons {
   105  		if err := r.lesson.Create(ctx, lesson, false); err != nil {
   106  			t.Fatalf("CreateLessons failed: %v", err)
   107  		}
   108  	}
   109  }
   110  
   111  func (r *Repositories) CreateNotificationTimeSpans(
   112  	ctx context.Context, t *testing.T,
   113  	timeSpans ...*model2.NotificationTimeSpan,
   114  ) {
   115  	t.Helper()
   116  	userIDCheck := make(map[uint]struct{}, len(timeSpans))
   117  	for _, ts := range timeSpans {
   118  		userIDCheck[ts.UserID] = struct{}{}
   119  	}
   120  	if len(userIDCheck) > 1 {
   121  		t.Fatal("CreateNotificationTimeSpans failed because userID in timeSpans is not same")
   122  	}
   123  	for _, ts := range timeSpans {
   124  		if err := r.notificationTimeSpan.UpdateAll(ctx, ts.UserID, timeSpans); err != nil {
   125  			t.Fatalf("CreateNotificationTimeSpans failed: %v", err)
   126  		}
   127  	}
   128  }
   129  
   130  func (r *Repositories) CreateTeachers(ctx context.Context, t *testing.T, teachers ...*model2.Teacher) {
   131  	t.Helper()
   132  	for _, teacher := range teachers {
   133  		if err := r.teacher.Create(ctx, teacher); err != nil {
   134  			t.Fatalf("CreateTeachers failed: %v", err)
   135  		}
   136  	}
   137  }
   138  
   139  func (r *Repositories) CreateUsers(ctx context.Context, t *testing.T, users ...*model2.User) {
   140  	t.Helper()
   141  	for _, u := range users {
   142  		if err := r.user.CreateWithExec(ctx, r.sqlDB, u); err != nil {
   143  			t.Fatalf("CreateUsers failed: %v", err)
   144  		}
   145  	}
   146  }
   147  
   148  func (r *Repositories) CreateUserAPITokens(ctx context.Context, t *testing.T, userAPITokens ...*model2.UserAPIToken) {
   149  	t.Helper()
   150  	for _, uat := range userAPITokens {
   151  		if err := r.userAPIToken.Create(ctx, uat); err != nil {
   152  			t.Fatalf("CreateUserAPITokens failed: %v", err)
   153  		}
   154  	}
   155  }
   156  
   157  func (r *Repositories) CreateUserGoogles(ctx context.Context, t *testing.T, userGoogles ...*model2.UserGoogle) {
   158  	t.Helper()
   159  	for _, ug := range userGoogles {
   160  		if err := r.userGoogle.CreateWithExec(ctx, r.sqlDB, ug); err != nil {
   161  			t.Fatalf("CreateUserGoogles failed: %v", err)
   162  		}
   163  	}
   164  }