feat: improvements in entity domain logic

This commit is contained in:
Elton Minetto
2020-10-07 22:57:54 -03:00
parent 098477169a
commit 83c00526b2
10 changed files with 35 additions and 30 deletions
+5 -1
View File
@@ -27,12 +27,16 @@ func NewBook(title string, author string, pages int, quantity int) (*Book, error
Quantity: quantity, Quantity: quantity,
CreatedAt: time.Now(), CreatedAt: time.Now(),
} }
err := b.Validate()
if err != nil {
return nil, domain.ErrInvalidEntity
}
return b, nil return b, nil
} }
//Validate validate book //Validate validate book
func (b *Book) Validate() error { func (b *Book) Validate() error {
if b.Title == "" || b.Author == "" || b.Pages <= 0 { if b.Title == "" || b.Author == "" || b.Pages <= 0 || b.Quantity <= 0 {
return domain.ErrInvalidEntity return domain.ErrInvalidEntity
} }
return nil return nil
+3 -4
View File
@@ -9,7 +9,7 @@ import (
) )
func TestNewBook(t *testing.T) { func TestNewBook(t *testing.T) {
b, err := entity.NewBook("American Gods", "Neil Gaiman", 100, 0) b, err := entity.NewBook("American Gods", "Neil Gaiman", 100, 1)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, b.Title, "American Gods") assert.Equal(t, b.Title, "American Gods")
assert.NotNil(t, b.ID) assert.NotNil(t, b.ID)
@@ -37,7 +37,7 @@ func TestBookValidate(t *testing.T) {
author: "Neil Gaiman", author: "Neil Gaiman",
pages: 100, pages: 100,
quantity: 0, quantity: 0,
want: nil, want: domain.ErrInvalidEntity,
}, },
{ {
title: "", title: "",
@@ -63,8 +63,7 @@ func TestBookValidate(t *testing.T) {
} }
for _, tc := range tests { for _, tc := range tests {
b, err := entity.NewBook(tc.title, tc.author, tc.pages, tc.quantity) _, err := entity.NewBook(tc.title, tc.author, tc.pages, tc.quantity)
err = b.Validate()
assert.Equal(t, err, tc.want) assert.Equal(t, err, tc.want)
} }
+17 -3
View File
@@ -19,8 +19,9 @@ type User struct {
Books []ID Books []ID
} }
//NewUser create a new user
func NewUser(email, password, firstName, lastName string) (*User, error) { func NewUser(email, password, firstName, lastName string) (*User, error) {
e := &User{ u := &User{
ID: NewID(), ID: NewID(),
Email: email, Email: email,
FirstName: firstName, FirstName: firstName,
@@ -31,15 +32,25 @@ func NewUser(email, password, firstName, lastName string) (*User, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
e.Password = pwd u.Password = pwd
return e, nil err = u.Validate()
if err != nil {
return nil, domain.ErrInvalidEntity
}
return u, nil
} }
//AddBook add a book
func (u *User) AddBook(id ID) error { func (u *User) AddBook(id ID) error {
_, err := u.GetBook(id)
if err == nil {
return domain.ErrBookAlreadyBorrowed
}
u.Books = append(u.Books, id) u.Books = append(u.Books, id)
return nil return nil
} }
//RemoveBook remove a book
func (u *User) RemoveBook(id ID) error { func (u *User) RemoveBook(id ID) error {
for i, j := range u.Books { for i, j := range u.Books {
if j == id { if j == id {
@@ -50,6 +61,7 @@ func (u *User) RemoveBook(id ID) error {
return domain.ErrNotFound return domain.ErrNotFound
} }
//GetBook get a book
func (u *User) GetBook(id ID) (ID, error) { func (u *User) GetBook(id ID) (ID, error) {
for _, v := range u.Books { for _, v := range u.Books {
if v == id { if v == id {
@@ -59,6 +71,7 @@ func (u *User) GetBook(id ID) (ID, error) {
return id, domain.ErrNotFound return id, domain.ErrNotFound
} }
//Validate validate data
func (u *User) Validate() error { func (u *User) Validate() error {
if u.Email == "" || u.FirstName == "" || u.LastName == "" || u.Password == "" { if u.Email == "" || u.FirstName == "" || u.LastName == "" || u.Password == "" {
return domain.ErrInvalidEntity return domain.ErrInvalidEntity
@@ -67,6 +80,7 @@ func (u *User) Validate() error {
return nil return nil
} }
//ValidatePassword
func (u *User) ValidatePassword(p string) error { func (u *User) ValidatePassword(p string) error {
err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(p)) err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(p))
if err != nil { if err != nil {
+6 -3
View File
@@ -27,9 +27,13 @@ func TestValidatePassword(t *testing.T) {
func TestAddBook(t *testing.T) { func TestAddBook(t *testing.T) {
u, _ := entity.NewUser("[email protected]", "new_password", "Steve", "Jobs") u, _ := entity.NewUser("[email protected]", "new_password", "Steve", "Jobs")
err := u.AddBook(entity.NewID()) bID := entity.NewID()
err := u.AddBook(bID)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, 1, len(u.Books)) assert.Equal(t, 1, len(u.Books))
err = u.AddBook(bID)
assert.Equal(t, domain.ErrBookAlreadyBorrowed, err)
} }
func TestRemoveBook(t *testing.T) { func TestRemoveBook(t *testing.T) {
@@ -101,8 +105,7 @@ func TestUserValidate(t *testing.T) {
} }
for _, tc := range tests { for _, tc := range tests {
u, err := entity.NewUser(tc.email, tc.password, tc.firstName, tc.lastName) _, err := entity.NewUser(tc.email, tc.password, tc.firstName, tc.lastName)
err = u.Validate()
assert.Equal(t, err, tc.want) assert.Equal(t, err, tc.want)
} }
+1 -2
View File
@@ -5,10 +5,9 @@
package mock package mock
import ( import (
reflect "reflect"
entity "github.com/eminetto/clean-architecture-go-v2/domain/entity" entity "github.com/eminetto/clean-architecture-go-v2/domain/entity"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
reflect "reflect"
) )
// MockReader is a mock of Reader interface // MockReader is a mock of Reader interface
-4
View File
@@ -27,10 +27,6 @@ func (s *Service) CreateBook(title string, author string, pages int, quantity in
if err != nil { if err != nil {
return b.ID, err return b.ID, err
} }
err = b.Validate()
if err != nil {
return b.ID, err
}
return s.repo.Create(b) return s.repo.Create(b)
} }
+1 -2
View File
@@ -5,10 +5,9 @@
package mock package mock
import ( import (
reflect "reflect"
entity "github.com/eminetto/clean-architecture-go-v2/domain/entity" entity "github.com/eminetto/clean-architecture-go-v2/domain/entity"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
reflect "reflect"
) )
// MockUseCase is a mock of UseCase interface // MockUseCase is a mock of UseCase interface
-4
View File
@@ -35,10 +35,6 @@ func (s *Service) Borrow(u *entity.User, b *entity.Book) error {
return domain.ErrNotEnoughBooks return domain.ErrNotEnoughBooks
} }
_, err = u.GetBook(b.ID)
if err == nil {
return domain.ErrBookAlreadyBorrowed
}
err = u.AddBook(b.ID) err = u.AddBook(b.ID)
if err != nil { if err != nil {
return err return err
+1 -2
View File
@@ -5,10 +5,9 @@
package mock package mock
import ( import (
reflect "reflect"
entity "github.com/eminetto/clean-architecture-go-v2/domain/entity" entity "github.com/eminetto/clean-architecture-go-v2/domain/entity"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
reflect "reflect"
) )
// MockReader is a mock of Reader interface // MockReader is a mock of Reader interface
+1 -5
View File
@@ -25,11 +25,7 @@ func NewService(r Repository) *Service {
func (s *Service) CreateUser(email, password, firstName, lastName string) (entity.ID, error) { func (s *Service) CreateUser(email, password, firstName, lastName string) (entity.ID, error) {
e, err := entity.NewUser(email, password, firstName, lastName) e, err := entity.NewUser(email, password, firstName, lastName)
if err != nil { if err != nil {
return e.ID, domain.ErrInvalidEntity return e.ID, err
}
err = e.Validate()
if err != nil {
return e.ID, domain.ErrInvalidEntity
} }
return s.repo.Create(e) return s.repo.Create(e)
} }