github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/interface/graphql/resolver/viewer_test.go (about) 1 package resolver 2 3 import ( 4 "context" 5 "fmt" 6 "strings" 7 "testing" 8 9 "github.com/morikuni/failure" 10 11 "github.com/oinume/lekcije/backend/context_data" 12 "github.com/oinume/lekcije/backend/errors" 13 "github.com/oinume/lekcije/backend/infrastructure/ga_measurement" 14 graphqlmodel "github.com/oinume/lekcije/backend/interface/graphql/model" 15 "github.com/oinume/lekcije/backend/internal/assertion" 16 "github.com/oinume/lekcije/backend/internal/modeltest" 17 "github.com/oinume/lekcije/backend/internal/mysqltest" 18 "github.com/oinume/lekcije/backend/model" 19 "github.com/oinume/lekcije/backend/model2" 20 "github.com/oinume/lekcije/backend/registry" 21 "github.com/oinume/lekcije/backend/usecase" 22 ) 23 24 func TestUpdateViewer(t *testing.T) { 25 helper := model.NewTestHelper() 26 db := helper.DB(t) 27 repos := mysqltest.NewRepositories(db.DB()) 28 userUsecase := usecase.NewUser(repos.DB(), repos.User(), repos.UserGoogle()) 29 resolver := NewResolver( 30 repos.FollowingTeacher(), 31 nil, 32 registry.NewGAMeasurementUsecase(ga_measurement.NewFakeClient()), 33 repos.NotificationTimeSpan(), 34 nil, 35 repos.Teacher(), 36 repos.User(), 37 userUsecase, 38 ) 39 40 type testCase struct { 41 apiToken string 42 input graphqlmodel.UpdateViewerInput 43 wantResult *graphqlmodel.User 44 wantErrorCode failure.StringCode 45 } 46 tests := map[string]struct { 47 setup func(ctx context.Context) *testCase 48 }{ 49 "ok": { 50 setup: func(ctx context.Context) *testCase { 51 user := modeltest.NewUser() 52 repos.CreateUsers(ctx, t, user) 53 userAPIToken := modeltest.NewUserAPIToken(func(uat *model2.UserAPIToken) { 54 uat.UserID = user.ID 55 }) 56 repos.CreateUserAPITokens(ctx, t, userAPIToken) 57 newEmail := fmt.Sprintf("updated-%d@example.com", user.ID) 58 return &testCase{ 59 apiToken: userAPIToken.Token, 60 input: graphqlmodel.UpdateViewerInput{ 61 Email: &newEmail, 62 }, 63 wantResult: &graphqlmodel.User{ 64 ID: fmt.Sprint(user.ID), 65 Email: newEmail, 66 ShowTutorial: !user.IsFollowedTeacher(), 67 }, 68 wantErrorCode: "", 69 } 70 }, 71 }, 72 "invalid_email_format": { 73 setup: func(ctx context.Context) *testCase { 74 user := modeltest.NewUser() 75 repos.CreateUsers(ctx, t, user) 76 userAPIToken := modeltest.NewUserAPIToken(func(uat *model2.UserAPIToken) { 77 uat.UserID = user.ID 78 }) 79 repos.CreateUserAPITokens(ctx, t, userAPIToken) 80 newEmail := "invalid" 81 return &testCase{ 82 apiToken: userAPIToken.Token, 83 input: graphqlmodel.UpdateViewerInput{ 84 Email: &newEmail, 85 }, 86 wantResult: &graphqlmodel.User{ 87 ID: fmt.Sprint(user.ID), 88 Email: user.Email, 89 ShowTutorial: !user.IsFollowedTeacher(), 90 }, 91 wantErrorCode: errors.InvalidArgument, 92 } 93 }, 94 }, 95 "duplicate_email": { 96 setup: func(ctx context.Context) *testCase { 97 user := modeltest.NewUser() 98 repos.CreateUsers(ctx, t, user) 99 userAPIToken := modeltest.NewUserAPIToken(func(uat *model2.UserAPIToken) { 100 uat.UserID = user.ID 101 }) 102 repos.CreateUserAPITokens(ctx, t, userAPIToken) 103 newEmail := user.Email 104 return &testCase{ 105 apiToken: userAPIToken.Token, 106 input: graphqlmodel.UpdateViewerInput{ 107 Email: &newEmail, 108 }, 109 wantResult: &graphqlmodel.User{ 110 ID: fmt.Sprint(user.ID), 111 Email: newEmail, 112 }, 113 wantErrorCode: errors.InvalidArgument, 114 } 115 }, 116 }, 117 } 118 119 for name, test := range tests { 120 t.Run(name, func(t *testing.T) { 121 ctx := context.Background() 122 tc := test.setup(ctx) 123 ctx = context_data.SetAPIToken(ctx, tc.apiToken) 124 ctx = context_data.SetGAMeasurementEvent(ctx, &model2.GAMeasurementEvent{}) 125 got, err := resolver.Mutation().UpdateViewer(ctx, tc.input) 126 if err != nil { 127 if tc.wantErrorCode == "" { 128 t.Fatalf("unexpected error: %v", err) 129 } else { 130 if !strings.Contains(err.Error(), tc.wantErrorCode.ErrorCode()) { 131 t.Fatalf("err must contain code: wantErrorCode=%v, err=%v", tc.wantErrorCode, err) 132 } 133 return // OK 134 } 135 } 136 fmt.Printf("user = %+v\n", got) 137 138 if tc.wantErrorCode != "" { 139 t.Fatalf("wantErrorCode is not empty but no error: wantErrorCode=%v", tc.wantErrorCode) 140 } 141 142 assertion.AssertEqual(t, tc.wantResult, got, "") 143 }) 144 } 145 }