github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/infrastructure/mysql/user_test.go (about)

     1  package mysql_test
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/google/go-cmp/cmp/cmpopts"
     9  
    10  	"github.com/oinume/lekcije/backend/infrastructure/mysql"
    11  	"github.com/oinume/lekcije/backend/internal/assertion"
    12  	"github.com/oinume/lekcije/backend/internal/modeltest"
    13  	"github.com/oinume/lekcije/backend/internal/mysqltest"
    14  	"github.com/oinume/lekcije/backend/model2"
    15  )
    16  
    17  func Test_userRepository_FindAllByEmailVerifiedIsTrue(t *testing.T) {
    18  	repo := mysql.NewUserRepository(helper.DB(t).DB())
    19  	repos := mysqltest.NewRepositories(helper.DB(t).DB())
    20  
    21  	type testCase struct {
    22  		wantUsers []*model2.User
    23  	}
    24  	tests := map[string]struct {
    25  		setup   func(ctx context.Context) *testCase
    26  		wantErr bool
    27  	}{
    28  		"normal": {
    29  			setup: func(ctx context.Context) *testCase {
    30  				helper.TruncateAllTables(t)
    31  				//boil.DebugMode = true
    32  				//boil.DebugWriter = os.Stdout
    33  				user1 := modeltest.NewUser(func(u *model2.User) {
    34  					u.EmailVerified = 1
    35  				})
    36  				user2 := modeltest.NewUser(func(u *model2.User) {
    37  					u.EmailVerified = 1
    38  				})
    39  				user3 := modeltest.NewUser(func(u *model2.User) {
    40  					u.EmailVerified = 1
    41  				})
    42  				repos.CreateUsers(ctx, t, user1, user2, user3)
    43  
    44  				ft1 := modeltest.NewFollowingTeacher(func(ft *model2.FollowingTeacher) {
    45  					ft.UserID = user1.ID
    46  				})
    47  				ft2 := modeltest.NewFollowingTeacher(func(ft *model2.FollowingTeacher) {
    48  					ft.UserID = user2.ID
    49  				})
    50  				repos.CreateFollowingTeachers(ctx, t, ft1)
    51  				repos.CreateFollowingTeachers(ctx, t, ft2)
    52  
    53  				return &testCase{
    54  					wantUsers: []*model2.User{user1, user2},
    55  				}
    56  			},
    57  		},
    58  		"no email verified users": {
    59  			setup: func(ctx context.Context) *testCase {
    60  				helper.TruncateAllTables(t)
    61  				user1 := modeltest.NewUser(func(u *model2.User) {
    62  					u.EmailVerified = 0
    63  				})
    64  				repos.CreateUsers(ctx, t, user1)
    65  				ft1 := modeltest.NewFollowingTeacher(func(ft *model2.FollowingTeacher) {
    66  					ft.UserID = user1.ID
    67  				})
    68  				repos.CreateFollowingTeachers(ctx, t, ft1)
    69  
    70  				return &testCase{
    71  					wantUsers: []*model2.User{},
    72  				}
    73  			},
    74  		},
    75  	}
    76  	for name, tt := range tests {
    77  		t.Run(name, func(t *testing.T) {
    78  			ctx := context.Background()
    79  			tc := tt.setup(ctx)
    80  			gotUsers, err := repo.FindAllByEmailVerifiedIsTrue(ctx, 10)
    81  			if (err != nil) != tt.wantErr {
    82  				t.Fatalf("FindAllByEmailVerifiedIsTrue: error = %v, wantErr %v", err, tt.wantErr)
    83  			}
    84  
    85  			assertion.AssertEqual(t, len(tc.wantUsers), len(gotUsers), "user length doesn't match")
    86  			for i := range tc.wantUsers {
    87  				assertion.AssertEqual(t, tc.wantUsers[i], gotUsers[i], "", cmpopts.EquateApproxTime(10*time.Second))
    88  			}
    89  		})
    90  	}
    91  }