diff --git a/implem/mock.uc/builder.go b/implem/mock.uc/builder.go index bd78b1e..66cd820 100644 --- a/implem/mock.uc/builder.go +++ b/implem/mock.uc/builder.go @@ -11,7 +11,7 @@ import ( // MockedInteractor : is used in order to update its properties accordingly to each test conditions type MockedInteractor struct { - Logger uc.Logger + Logger *MockLogger UserRW *MockUserRW ArticleRW *MockArticleRW UserValidator *MockUserValidator @@ -22,7 +22,10 @@ type MockedInteractor struct { CommentRW *MockCommentRW } -type TestFunc = func(interactor *MockedInteractor) +type Tester struct { + Calls func(interactor *MockedInteractor) + ShouldPass bool +} type SimpleLogger struct{} @@ -33,7 +36,7 @@ func (SimpleLogger) Log(logs ...interface{}) { //NewMockedInteractor : the MockedInteractor constructor func NewMockedInteractor(mockCtrl *gomock.Controller) MockedInteractor { return MockedInteractor{ - Logger: SimpleLogger{}, + Logger: NewMockLogger(mockCtrl), UserRW: NewMockUserRW(mockCtrl), ArticleRW: NewMockArticleRW(mockCtrl), UserValidator: NewMockUserValidator(mockCtrl), diff --git a/uc/userEdit_test.go b/uc/userEdit_test.go index 1c0cdcc..fc08305 100644 --- a/uc/userEdit_test.go +++ b/uc/userEdit_test.go @@ -26,6 +26,7 @@ func TestEditUser_happyCase(t *testing.T) { } i := mock.NewMockedInteractor(mockCtrl) + i.Logger.EXPECT().Log(gomock.Any()).AnyTimes() i.UserRW.EXPECT().GetByName(rick.Password).Return(&rick, nil).AnyTimes() urw(&i) @@ -45,55 +46,61 @@ func TestEditUser_happyCase(t *testing.T) { } func TestInteractor_UserEdit_fails(t *testing.T) { - rick := testData.User("rick") - invalidCalls := map[string]mock.TestFunc{ - "error return on uRW.GetByName": func(i *mock.MockedInteractor) { - i.UserRW.EXPECT().GetByName(gomock.Any()).Return(nil, errors.New("")) - }, - "nil, nil return on uRW.GetByName": func(i *mock.MockedInteractor) { - i.UserRW.EXPECT().GetByName(gomock.Any()).Return(nil, nil) - }, - "uRW.GetByName returns wrong name": func(i *mock.MockedInteractor) { - i.UserRW.EXPECT().GetByName(gomock.Any()).Return(&domain.User{Name: "hi there"}, nil) - }, - "user not validated": func(i *mock.MockedInteractor) { - i.UserValidator.EXPECT().CheckUser(gomock.Any()).Return(errors.New("")) - }, - "failed to save the user": func(i *mock.MockedInteractor) { - i.UserRW.EXPECT().Save(gomock.Any()).Return(errors.New("")) - }, - "failed to gen token": func(i *mock.MockedInteractor) { - i.AuthHandler.EXPECT().GenUserToken(gomock.Any()).Return("", errors.New("")).AnyTimes() - }, + mutations := map[string]mock.Tester{ + "shouldPass": {Calls: func(i *mock.MockedInteractor) { + // change nothing + }, ShouldPass: true}, + "error return on uRW.GetByName": { + Calls: func(i *mock.MockedInteractor) { + i.UserRW.EXPECT().GetByName(gomock.Any()).Return(nil, errors.New("")) + }}, + "nil, nil return on uRW.GetByName": { + Calls: func(i *mock.MockedInteractor) { + i.UserRW.EXPECT().GetByName(gomock.Any()).Return(nil, nil) + }}, + "uRW.GetByName returns wrong name": { + Calls: func(i *mock.MockedInteractor) { + i.UserRW.EXPECT().GetByName(gomock.Any()).Return(&domain.User{Name: "hi there"}, nil) + }}, + "user not validated": { + Calls: func(i *mock.MockedInteractor) { + i.UserValidator.EXPECT().CheckUser(gomock.Any()).Return(errors.New("")) + }}, + "failed to save the user": { + Calls: func(i *mock.MockedInteractor) { + i.UserRW.EXPECT().Save(gomock.Any()).Return(errors.New("")) + }}, + "failed to gen token": { + Calls: func(i *mock.MockedInteractor) { + i.AuthHandler.EXPECT().GenUserToken(gomock.Any()).Return("", errors.New("")).AnyTimes() + }}, } + rick := testData.User("rick") + // same as the happy case but with any parameter and called any number of times (including 0) validCalls := func(i *mock.MockedInteractor) { + i.Logger.EXPECT().Log(gomock.Any()).AnyTimes() i.UserRW.EXPECT().GetByName(gomock.Any()).Return(&rick, nil).AnyTimes() i.UserValidator.EXPECT().CheckUser(gomock.Any()).Return(nil).AnyTimes() i.UserRW.EXPECT().Save(gomock.Any()).Return(nil).AnyTimes() i.AuthHandler.EXPECT().GenUserToken(gomock.Any()).Return("token", nil).AnyTimes() } - { // just to be sure, validCalls don't send any error - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - i := mock.NewMockedInteractor(mockCtrl) - validCalls(&i) - _, _, err := i.GetUCHandler().UserEdit("rick", nil) - assert.NoError(t, err) - } - - for testName, invalidCall := range invalidCalls { + for testName, mutation := range mutations { t.Run(testName, func(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() i := mock.NewMockedInteractor(mockCtrl) - invalidCall(&i) // put the tested call first (important) - validCalls(&i) // then fill the gaps with valid calls + mutation.Calls(&i) // put the tested call first (important) + validCalls(&i) // then fill the gaps with valid calls _, _, err := i.GetUCHandler().UserEdit("rick", nil) + if mutation.ShouldPass { + assert.NoError(t, err) + return + } assert.Error(t, err) }) }