Skip to content

Commit

Permalink
add tests to uc/articles
Browse files Browse the repository at this point in the history
  • Loading branch information
Matthieu Jacquot committed Jul 29, 2018
1 parent a8cbe1f commit 82a1bab
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 25 deletions.
36 changes: 21 additions & 15 deletions implem/mock.uc/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ import (

// MockedInteractor : is used in order to update its properties accordingly to each test conditions
type MockedInteractor struct {
Logger uc.Logger
UserRW *MockUserRW
ArticleRW *MockArticleRW
UserValidator *MockUserValidator
AuthHandler *MockAuthHandler
Logger uc.Logger
UserRW *MockUserRW
ArticleRW *MockArticleRW
UserValidator *MockUserValidator
AuthHandler *MockAuthHandler
Slugger *MockSlugger
ArticleValidator *MockArticleValidator
}

type SimpleLogger struct{}
Expand All @@ -27,21 +29,25 @@ func (SimpleLogger) Log(logs ...interface{}) {
//NewMockedInteractor : the MockedInteractor constructor
func NewMockedInteractor(mockCtrl *gomock.Controller) MockedInteractor {
return MockedInteractor{
Logger: SimpleLogger{},
UserRW: NewMockUserRW(mockCtrl),
ArticleRW: NewMockArticleRW(mockCtrl),
UserValidator: NewMockUserValidator(mockCtrl),
AuthHandler: NewMockAuthHandler(mockCtrl),
Logger: SimpleLogger{},
UserRW: NewMockUserRW(mockCtrl),
ArticleRW: NewMockArticleRW(mockCtrl),
UserValidator: NewMockUserValidator(mockCtrl),
AuthHandler: NewMockAuthHandler(mockCtrl),
Slugger: NewMockSlugger(mockCtrl),
ArticleValidator: NewMockArticleValidator(mockCtrl),
}
}

//GetUCHandler : returns a uc.interactor in order to call its methods aka the use cases to test
func (i MockedInteractor) GetUCHandler() uc.Handler {
return uc.HandlerConstructor{
Logger: i.Logger,
UserRW: i.UserRW,
ArticleRW: i.ArticleRW,
UserValidator: i.UserValidator,
AuthHandler: i.AuthHandler,
Logger: i.Logger,
UserRW: i.UserRW,
ArticleRW: i.ArticleRW,
UserValidator: i.UserValidator,
AuthHandler: i.AuthHandler,
Slugger: i.Slugger,
ArticleValidator: i.ArticleValidator,
}.New()
}
30 changes: 20 additions & 10 deletions uc/HANDLER.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,13 @@ type TagsLogic interface {
}

type HandlerConstructor struct {
Logger Logger
UserRW UserRW
ArticleRW ArticleRW
UserValidator UserValidator
AuthHandler AuthHandler
Logger Logger
UserRW UserRW
ArticleRW ArticleRW
UserValidator UserValidator
AuthHandler AuthHandler
Slugger Slugger
ArticleValidator ArticleValidator
}

func (c HandlerConstructor) New() Handler {
Expand All @@ -78,12 +80,20 @@ func (c HandlerConstructor) New() Handler {
if c.AuthHandler == nil {
log.Fatal("missing AuthHandler")
}
if c.Slugger == nil {
log.Fatal("missing Slugger")
}
if c.ArticleValidator == nil {
log.Fatal("missing ArticleValidator")
}

return interactor{
logger: c.Logger,
userRW: c.UserRW,
articleRW: c.ArticleRW,
userValidator: c.UserValidator,
authHandler: c.AuthHandler,
logger: c.Logger,
userRW: c.UserRW,
articleRW: c.ArticleRW,
userValidator: c.UserValidator,
authHandler: c.AuthHandler,
slugger: c.Slugger,
articleValidator: c.ArticleValidator,
}
}
82 changes: 82 additions & 0 deletions uc/article_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package uc_test

import (
"testing"

"github.com/err0r500/go-realworld-clean/domain"
mock "github.com/err0r500/go-realworld-clean/implem/mock.uc"
"github.com/err0r500/go-realworld-clean/testData"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/assert"
)

func TestInteractor_ArticlePost(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
rick := testData.User("rick")

article := domain.Article{
Title: "article Title",
}
slug := "article-title"

i := mock.NewMockedInteractor(mockCtrl)
i.UserRW.EXPECT().GetByName(rick.Name).Return(&rick, nil).Times(1)
i.Slugger.EXPECT().NewSlug(article.Title).Return(slug).Times(1)
i.ArticleRW.EXPECT().GetBySlug(slug).Return(nil, nil).Times(1)
i.ArticleValidator.EXPECT().BeforeCreationCheck(gomock.Any()).Return(nil).Times(1)
i.ArticleRW.EXPECT().Create(gomock.Any())

_, err := i.GetUCHandler().ArticlePost(rick.Name, article)
assert.NoError(t, err)
}

func TestInteractor_ArticlePut(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
jane := testData.User("jane")
origArticle := testData.Article("janeArticle")
req := domain.Article{
Title: "newTitle",
Description: "newDescription",
Body: origArticle.Body,
TagList: origArticle.TagList,
}

toInsert := origArticle
toInsert.Title = req.Title
toInsert.Description = req.Description

i := mock.NewMockedInteractor(mockCtrl)
i.ArticleRW.EXPECT().GetBySlug(origArticle.Slug).Return(&origArticle, nil).Times(1)
i.ArticleValidator.EXPECT().BeforeUpdateCheck(&toInsert).Return(nil).Times(1)
i.ArticleRW.EXPECT().Save(toInsert)

_, err := i.GetUCHandler().ArticlePut(jane.Name, origArticle.Slug, req)
assert.NoError(t, err)
}

func TestInteractor_ArticleDelete(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
jane := testData.User("jane")
article := testData.Article("janeArticle")

i := mock.NewMockedInteractor(mockCtrl)
i.ArticleRW.EXPECT().GetBySlug(article.Slug).Return(&article, nil).Times(1)
i.ArticleRW.EXPECT().Delete(article.Slug)

assert.NoError(t, i.GetUCHandler().ArticleDelete(jane.Name, article.Slug))
}

func TestInteractor_ArticleGet(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
article := testData.Article("janeArticle")

i := mock.NewMockedInteractor(mockCtrl)
i.ArticleRW.EXPECT().GetBySlug(article.Slug).Return(&article, nil).Times(1)

_, err := i.GetUCHandler().ArticleGet(article.Slug)
assert.NoError(t, err)
}

0 comments on commit 82a1bab

Please sign in to comment.