Skip to content

Commit

Permalink
improve uc testing
Browse files Browse the repository at this point in the history
  • Loading branch information
Matthieu Jacquot committed Aug 10, 2018
1 parent 9e19957 commit 0377d99
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 35 deletions.
9 changes: 6 additions & 3 deletions implem/mock.uc/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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{}

Expand All @@ -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),
Expand Down
71 changes: 39 additions & 32 deletions uc/userEdit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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)
})
}
Expand Down

0 comments on commit 0377d99

Please sign in to comment.