fix: move some logic to domain entities

This commit is contained in:
Elton Minetto
2020-10-05 08:49:21 -03:00
parent c008dbab29
commit 098477169a
25 changed files with 493 additions and 183 deletions
+2 -1
View File
@@ -5,9 +5,10 @@
package mock
import (
reflect "reflect"
entity "github.com/eminetto/clean-architecture-go-v2/domain/entity"
gomock "github.com/golang/mock/gomock"
reflect "reflect"
)
// MockUseCase is a mock of UseCase interface
+21 -20
View File
@@ -34,12 +34,15 @@ func (s *Service) Borrow(u *entity.User, b *entity.Book) error {
if b.Quantity <= 0 {
return domain.ErrNotEnoughBooks
}
for _, v := range u.Books {
if v == b.ID {
return domain.ErrBookAlreadyBorrowed
}
_, err = u.GetBook(b.ID)
if err == nil {
return domain.ErrBookAlreadyBorrowed
}
err = u.AddBook(b.ID)
if err != nil {
return err
}
u.Books = append(u.Books, b.ID)
err = s.userService.UpdateUser(u)
if err != nil {
return err
@@ -66,13 +69,13 @@ func (s *Service) Return(b *entity.Book) error {
borrowed := false
var borrowedBy entity.ID
for _, u := range all {
for _, bookID := range u.Books {
if bookID == b.ID {
borrowed = true
borrowedBy = u.ID
break
}
_, err := u.GetBook(b.ID)
if err != nil {
continue
}
borrowed = true
borrowedBy = u.ID
break
}
if !borrowed {
return domain.ErrBookNotBorrowed
@@ -81,15 +84,13 @@ func (s *Service) Return(b *entity.Book) error {
if err != nil {
return err
}
for i, j := range u.Books {
if j == b.ID {
u.Books = append(u.Books[:i], u.Books[i+1:]...)
err = s.userService.UpdateUser(u)
if err != nil {
return err
}
break
}
err = u.RemoveBook(b.ID)
if err != nil {
return err
}
err = s.userService.UpdateUser(u)
if err != nil {
return err
}
b.Quantity++
err = s.bookService.UpdateBook(b)
+48 -17
View File
@@ -19,23 +19,35 @@ func Test_Borrow(t *testing.T) {
bMock := bmock.NewMockUseCase(controller)
uc := NewService(uMock, bMock)
t.Run("user not found", func(t *testing.T) {
u := entity.NewFixtureUser()
b := entity.NewFixtureBook()
u := &entity.User{
ID: entity.NewID(),
}
b := &entity.Book{
ID: entity.NewID(),
}
uMock.EXPECT().GetUser(u.ID).Return(nil, domain.ErrNotFound)
err := uc.Borrow(u, b)
assert.Equal(t, domain.ErrNotFound, err)
})
t.Run("book not found", func(t *testing.T) {
u := entity.NewFixtureUser()
b := entity.NewFixtureBook()
u := &entity.User{
ID: entity.NewID(),
}
b := &entity.Book{
ID: entity.NewID(),
}
uMock.EXPECT().GetUser(u.ID).Return(u, nil)
bMock.EXPECT().GetBook(b.ID).Return(nil, domain.ErrNotFound)
err := uc.Borrow(u, b)
assert.Equal(t, domain.ErrNotFound, err)
})
t.Run("not enough books to borrow", func(t *testing.T) {
u := entity.NewFixtureUser()
b := entity.NewFixtureBook()
u := &entity.User{
ID: entity.NewID(),
}
b := &entity.Book{
ID: entity.NewID(),
}
b.Quantity = 0
uMock.EXPECT().GetUser(u.ID).Return(u, nil)
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
@@ -43,9 +55,13 @@ func Test_Borrow(t *testing.T) {
assert.Equal(t, domain.ErrNotEnoughBooks, err)
})
t.Run("book already borrowed", func(t *testing.T) {
u := entity.NewFixtureUser()
b := entity.NewFixtureBook()
u.Books = []entity.ID{b.ID}
u := &entity.User{
ID: entity.NewID(),
}
b := &entity.Book{
ID: entity.NewID(),
}
u.AddBook(b.ID)
b.Quantity = 1
uMock.EXPECT().GetUser(u.ID).Return(u, nil)
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
@@ -53,8 +69,13 @@ func Test_Borrow(t *testing.T) {
assert.Equal(t, domain.ErrBookAlreadyBorrowed, err)
})
t.Run("sucess", func(t *testing.T) {
u := entity.NewFixtureUser()
b := entity.NewFixtureBook()
u := &entity.User{
ID: entity.NewID(),
}
b := &entity.Book{
ID: entity.NewID(),
Quantity: 10,
}
uMock.EXPECT().GetUser(u.ID).Return(u, nil)
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
uMock.EXPECT().UpdateUser(u).Return(nil)
@@ -71,23 +92,33 @@ func Test_Return(t *testing.T) {
bMock := bmock.NewMockUseCase(controller)
uc := NewService(uMock, bMock)
t.Run("book not found", func(t *testing.T) {
b := entity.NewFixtureBook()
b := &entity.Book{
ID: entity.NewID(),
}
bMock.EXPECT().GetBook(b.ID).Return(nil, domain.ErrNotFound)
err := uc.Return(b)
assert.Equal(t, domain.ErrNotFound, err)
})
t.Run("book not borrowed", func(t *testing.T) {
u := entity.NewFixtureUser()
b := entity.NewFixtureBook()
u := &entity.User{
ID: entity.NewID(),
}
b := &entity.Book{
ID: entity.NewID(),
}
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
uMock.EXPECT().ListUsers().Return([]*entity.User{u}, nil)
err := uc.Return(b)
assert.Equal(t, domain.ErrBookNotBorrowed, err)
})
t.Run("success", func(t *testing.T) {
u := entity.NewFixtureUser()
b := entity.NewFixtureBook()
u.Books = []entity.ID{b.ID}
u := &entity.User{
ID: entity.NewID(),
}
b := &entity.Book{
ID: entity.NewID(),
}
u.AddBook(b.ID)
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
uMock.EXPECT().GetUser(u.ID).Return(u, nil)
uMock.EXPECT().ListUsers().Return([]*entity.User{u}, nil)