feat: improvements in structures

This commit is contained in:
Elton Minetto
2020-09-29 21:51:18 -03:00
parent 201f7607e1
commit 2c7f87e73a
41 changed files with 821 additions and 1265 deletions
+19 -19
View File
@@ -6,28 +6,28 @@ import (
"net/http"
"time"
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/book"
"github.com/eminetto/clean-architecture-go-v2/domain"
"github.com/eminetto/clean-architecture-go-v2/api/presenter"
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book"
"github.com/codegangsta/negroni"
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
"github.com/gorilla/mux"
)
func listBooks(manager book.Manager) http.Handler {
func listBooks(service book.UseCase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
errorMessage := "Error reading books"
var data []*book.Book
var data []*entity.Book
var err error
title := r.URL.Query().Get("title")
switch {
case title == "":
data, err = manager.List()
data, err = service.ListBooks()
default:
data, err = manager.Search(title)
data, err = service.SearchBooks(title)
}
w.Header().Set("Content-Type", "application/json")
if err != nil && err != domain.ErrNotFound {
@@ -58,7 +58,7 @@ func listBooks(manager book.Manager) http.Handler {
})
}
func createBook(manager book.Manager) http.Handler {
func createBook(service book.UseCase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
errorMessage := "Error adding book"
var input struct {
@@ -74,7 +74,7 @@ func createBook(manager book.Manager) http.Handler {
w.Write([]byte(errorMessage))
return
}
b := &book.Book{
b := &entity.Book{
ID: entity.NewID(),
Title: input.Title,
Author: input.Author,
@@ -82,7 +82,7 @@ func createBook(manager book.Manager) http.Handler {
Quantity: input.Quantity,
CreatedAt: time.Now(),
}
b.ID, err = manager.Create(b)
b.ID, err = service.CreateBook(b)
if err != nil {
log.Println(err.Error())
w.WriteHeader(http.StatusInternalServerError)
@@ -107,7 +107,7 @@ func createBook(manager book.Manager) http.Handler {
})
}
func getBook(manager book.Manager) http.Handler {
func getBook(service book.UseCase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
errorMessage := "Error reading book"
vars := mux.Vars(r)
@@ -117,7 +117,7 @@ func getBook(manager book.Manager) http.Handler {
w.Write([]byte(errorMessage))
return
}
data, err := manager.Get(id)
data, err := service.GetBook(id)
if err != nil && err != domain.ErrNotFound {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(errorMessage))
@@ -143,7 +143,7 @@ func getBook(manager book.Manager) http.Handler {
})
}
func deleteBook(manager book.Manager) http.Handler {
func deleteBook(service book.UseCase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
errorMessage := "Error removing bookmark"
vars := mux.Vars(r)
@@ -153,7 +153,7 @@ func deleteBook(manager book.Manager) http.Handler {
w.Write([]byte(errorMessage))
return
}
err = manager.Delete(id)
err = service.DeleteBook(id)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(errorMessage))
@@ -163,20 +163,20 @@ func deleteBook(manager book.Manager) http.Handler {
}
//MakeBookHandlers make url handlers
func MakeBookHandlers(r *mux.Router, n negroni.Negroni, manager book.Manager) {
func MakeBookHandlers(r *mux.Router, n negroni.Negroni, service book.UseCase) {
r.Handle("/v1/book", n.With(
negroni.Wrap(listBooks(manager)),
negroni.Wrap(listBooks(service)),
)).Methods("GET", "OPTIONS").Name("listBooks")
r.Handle("/v1/book", n.With(
negroni.Wrap(createBook(manager)),
negroni.Wrap(createBook(service)),
)).Methods("POST", "OPTIONS").Name("createBook")
r.Handle("/v1/book/{id}", n.With(
negroni.Wrap(getBook(manager)),
negroni.Wrap(getBook(service)),
)).Methods("GET", "OPTIONS").Name("getBook")
r.Handle("/v1/book/{id}", n.With(
negroni.Wrap(deleteBook(manager)),
negroni.Wrap(deleteBook(service)),
)).Methods("DELETE", "OPTIONS").Name("deleteBook")
}
+21 -23
View File
@@ -11,10 +11,8 @@ import (
"github.com/eminetto/clean-architecture-go-v2/domain"
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book"
"github.com/codegangsta/negroni"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book/mock"
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/book/mock"
"github.com/golang/mock/gomock"
"github.com/gorilla/mux"
"github.com/stretchr/testify/assert"
@@ -23,17 +21,17 @@ import (
func Test_listBooks(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
manager := mock.NewMockManager(controller)
manager := mock.NewMockUseCase(controller)
r := mux.NewRouter()
n := negroni.New()
MakeBookHandlers(r, *n, manager)
path, err := r.GetRoute("listBooks").GetPathTemplate()
assert.Nil(t, err)
assert.Equal(t, "/v1/book", path)
b := book.NewFixtureBook()
b := entity.NewFixtureBook()
manager.EXPECT().
List().
Return([]*book.Book{b}, nil)
ListBooks().
Return([]*entity.Book{b}, nil)
ts := httptest.NewServer(listBooks(manager))
defer ts.Close()
res, err := http.Get(ts.URL)
@@ -44,11 +42,11 @@ func Test_listBooks(t *testing.T) {
func Test_listBooks_NotFound(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
manager := mock.NewMockManager(controller)
manager := mock.NewMockUseCase(controller)
ts := httptest.NewServer(listBooks(manager))
defer ts.Close()
manager.EXPECT().
Search("book of books").
SearchBooks("book of books").
Return(nil, domain.ErrNotFound)
res, err := http.Get(ts.URL + "?title=book+of+books")
assert.Nil(t, err)
@@ -58,11 +56,11 @@ func Test_listBooks_NotFound(t *testing.T) {
func Test_listBooks_Search(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
manager := mock.NewMockManager(controller)
b := book.NewFixtureBook()
manager := mock.NewMockUseCase(controller)
b := entity.NewFixtureBook()
manager.EXPECT().
Search("ozzy").
Return([]*book.Book{b}, nil)
SearchBooks("ozzy").
Return([]*entity.Book{b}, nil)
ts := httptest.NewServer(listBooks(manager))
defer ts.Close()
res, err := http.Get(ts.URL + "?title=ozzy")
@@ -73,7 +71,7 @@ func Test_listBooks_Search(t *testing.T) {
func Test_createBook(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
manager := mock.NewMockManager(controller)
manager := mock.NewMockUseCase(controller)
r := mux.NewRouter()
n := negroni.New()
MakeBookHandlers(r, *n, manager)
@@ -82,7 +80,7 @@ func Test_createBook(t *testing.T) {
assert.Equal(t, "/v1/book", path)
manager.EXPECT().
Create(gomock.Any()).
CreateBook(gomock.Any()).
Return(entity.NewID(), nil)
h := createBook(manager)
@@ -97,7 +95,7 @@ func Test_createBook(t *testing.T) {
resp, _ := http.Post(ts.URL+"/v1/book", "application/json", strings.NewReader(payload))
assert.Equal(t, http.StatusCreated, resp.StatusCode)
var b *book.Book
var b *entity.Book
json.NewDecoder(resp.Body).Decode(&b)
assert.Equal(t, "Ozzy Osbourne", b.Author)
}
@@ -105,16 +103,16 @@ func Test_createBook(t *testing.T) {
func Test_getBook(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
manager := mock.NewMockManager(controller)
manager := mock.NewMockUseCase(controller)
r := mux.NewRouter()
n := negroni.New()
MakeBookHandlers(r, *n, manager)
path, err := r.GetRoute("getBook").GetPathTemplate()
assert.Nil(t, err)
assert.Equal(t, "/v1/book/{id}", path)
b := book.NewFixtureBook()
b := entity.NewFixtureBook()
manager.EXPECT().
Get(b.ID).
GetBook(b.ID).
Return(b, nil)
handler := getBook(manager)
r.Handle("/v1/book/{id}", handler)
@@ -123,7 +121,7 @@ func Test_getBook(t *testing.T) {
res, err := http.Get(ts.URL + "/v1/book/" + b.ID.String())
assert.Nil(t, err)
assert.Equal(t, http.StatusOK, res.StatusCode)
var d *book.Book
var d *entity.Book
json.NewDecoder(res.Body).Decode(&d)
assert.NotNil(t, d)
assert.Equal(t, b.ID, d.ID)
@@ -132,15 +130,15 @@ func Test_getBook(t *testing.T) {
func Test_deleteBook(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
manager := mock.NewMockManager(controller)
manager := mock.NewMockUseCase(controller)
r := mux.NewRouter()
n := negroni.New()
MakeBookHandlers(r, *n, manager)
path, err := r.GetRoute("deleteBook").GetPathTemplate()
assert.Nil(t, err)
assert.Equal(t, "/v1/book/{id}", path)
b := book.NewFixtureBook()
manager.EXPECT().Delete(b.ID).Return(nil)
b := entity.NewFixtureBook()
manager.EXPECT().DeleteBook(b.ID).Return(nil)
handler := deleteBook(manager)
req, _ := http.NewRequest("DELETE", "/v1/bookmark/"+b.ID.String(), nil)
r.Handle("/v1/bookmark/{id}", handler).Methods("DELETE", "OPTIONS")
+13 -14
View File
@@ -4,20 +4,19 @@ import (
"fmt"
"net/http"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user"
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/book"
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/user"
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/loan"
"github.com/eminetto/clean-architecture-go-v2/domain"
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book"
"github.com/codegangsta/negroni"
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
"github.com/gorilla/mux"
)
func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.UseCase) http.Handler {
func borrowBook(bookService book.UseCase, userService user.UseCase, loanService loan.UseCase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
errorMessage := "Error borrowing book"
vars := mux.Vars(r)
@@ -27,7 +26,7 @@ func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.U
w.Write([]byte(errorMessage))
return
}
b, err := bManager.Get(bID)
b, err := bookService.GetBook(bID)
if err != nil && err != domain.ErrNotFound {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(errorMessage))
@@ -44,7 +43,7 @@ func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.U
w.Write([]byte(errorMessage))
return
}
u, err := uManager.Get(uID)
u, err := userService.GetUser(uID)
if err != nil && err != domain.ErrNotFound {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(errorMessage))
@@ -55,7 +54,7 @@ func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.U
w.Write([]byte(errorMessage))
return
}
err = loanUseCase.Borrow(u, b)
err = loanService.Borrow(u, b)
if err != nil {
fmt.Println(err)
w.WriteHeader(http.StatusInternalServerError)
@@ -66,7 +65,7 @@ func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.U
})
}
func returnBook(bManager book.Manager, loanUseCase loan.UseCase) http.Handler {
func returnBook(bookService book.UseCase, loanService loan.UseCase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
errorMessage := "Error returning book"
vars := mux.Vars(r)
@@ -76,7 +75,7 @@ func returnBook(bManager book.Manager, loanUseCase loan.UseCase) http.Handler {
w.Write([]byte(errorMessage))
return
}
b, err := bManager.Get(bID)
b, err := bookService.GetBook(bID)
if err != nil && err != domain.ErrNotFound {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(errorMessage))
@@ -87,7 +86,7 @@ func returnBook(bManager book.Manager, loanUseCase loan.UseCase) http.Handler {
w.Write([]byte(errorMessage))
return
}
err = loanUseCase.Return(b)
err = loanService.Return(b)
if err != nil && err != domain.ErrNotFound {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(errorMessage))
@@ -98,12 +97,12 @@ func returnBook(bManager book.Manager, loanUseCase loan.UseCase) http.Handler {
}
//MakeLoanHandlers make url handlers
func MakeLoanHandlers(r *mux.Router, n negroni.Negroni, bManager book.Manager, uManager user.Manager, loanUseCase loan.UseCase) {
func MakeLoanHandlers(r *mux.Router, n negroni.Negroni, bookService book.UseCase, userService user.UseCase, loanService loan.UseCase) {
r.Handle("/v1/loan/borrow/{book_id}/{user_id}", n.With(
negroni.Wrap(borrowBook(bManager, uManager, loanUseCase)),
negroni.Wrap(borrowBook(bookService, userService, loanService)),
)).Methods("GET", "OPTIONS").Name("borrowBook")
r.Handle("/v1/loan/return/{book_id}", n.With(
negroni.Wrap(returnBook(bManager, loanUseCase)),
negroni.Wrap(returnBook(bookService, loanService)),
)).Methods("GET", "OPTIONS").Name("returnBook")
}
+17 -21
View File
@@ -6,17 +6,13 @@ import (
"net/http/httptest"
"testing"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book"
"github.com/eminetto/clean-architecture-go-v2/domain"
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
"github.com/codegangsta/negroni"
bmock "github.com/eminetto/clean-architecture-go-v2/domain/entity/book/mock"
umock "github.com/eminetto/clean-architecture-go-v2/domain/entity/user/mock"
bmock "github.com/eminetto/clean-architecture-go-v2/domain/usecase/book/mock"
lmock "github.com/eminetto/clean-architecture-go-v2/domain/usecase/loan/mock"
umock "github.com/eminetto/clean-architecture-go-v2/domain/usecase/user/mock"
"github.com/golang/mock/gomock"
"github.com/gorilla/mux"
"github.com/stretchr/testify/assert"
@@ -25,8 +21,8 @@ import (
func Test_borrowBook(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
uMock := umock.NewMockManager(controller)
bMock := bmock.NewMockManager(controller)
uMock := umock.NewMockUseCase(controller)
bMock := bmock.NewMockUseCase(controller)
lMock := lmock.NewMockUseCase(controller)
r := mux.NewRouter()
n := negroni.New()
@@ -39,7 +35,7 @@ func Test_borrowBook(t *testing.T) {
t.Run("book not found", func(t *testing.T) {
bID := entity.NewID()
uID := entity.NewID()
bMock.EXPECT().Get(bID).Return(nil, domain.ErrNotFound)
bMock.EXPECT().GetBook(bID).Return(nil, domain.ErrNotFound)
ts := httptest.NewServer(r)
defer ts.Close()
res, err := http.Get(fmt.Sprintf("%s/v1/loan/borrow/%s/%s", ts.URL, bID.String(), uID.String()))
@@ -47,10 +43,10 @@ func Test_borrowBook(t *testing.T) {
assert.Equal(t, http.StatusNotFound, res.StatusCode)
})
t.Run("user not found", func(t *testing.T) {
b := book.NewFixtureBook()
b := entity.NewFixtureBook()
uID := entity.NewID()
bMock.EXPECT().Get(b.ID).Return(b, nil)
uMock.EXPECT().Get(uID).Return(nil, domain.ErrNotFound)
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
uMock.EXPECT().GetUser(uID).Return(nil, domain.ErrNotFound)
ts := httptest.NewServer(r)
defer ts.Close()
res, err := http.Get(fmt.Sprintf("%s/v1/loan/borrow/%s/%s", ts.URL, b.ID.String(), uID.String()))
@@ -58,10 +54,10 @@ func Test_borrowBook(t *testing.T) {
assert.Equal(t, http.StatusNotFound, res.StatusCode)
})
t.Run("success", func(t *testing.T) {
b := book.NewFixtureBook()
u := user.NewFixtureUser()
bMock.EXPECT().Get(b.ID).Return(b, nil)
uMock.EXPECT().Get(u.ID).Return(u, nil)
b := entity.NewFixtureBook()
u := entity.NewFixtureUser()
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
uMock.EXPECT().GetUser(u.ID).Return(u, nil)
lMock.EXPECT().Borrow(u, b).Return(nil)
ts := httptest.NewServer(r)
defer ts.Close()
@@ -74,8 +70,8 @@ func Test_borrowBook(t *testing.T) {
func Test_returnBook(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
uMock := umock.NewMockManager(controller)
bMock := bmock.NewMockManager(controller)
uMock := umock.NewMockUseCase(controller)
bMock := bmock.NewMockUseCase(controller)
lMock := lmock.NewMockUseCase(controller)
r := mux.NewRouter()
n := negroni.New()
@@ -87,7 +83,7 @@ func Test_returnBook(t *testing.T) {
r.Handle("/v1/loan/return/{book_id}", handler)
t.Run("book not found", func(t *testing.T) {
bID := entity.NewID()
bMock.EXPECT().Get(bID).Return(nil, domain.ErrNotFound)
bMock.EXPECT().GetBook(bID).Return(nil, domain.ErrNotFound)
ts := httptest.NewServer(r)
defer ts.Close()
res, err := http.Get(fmt.Sprintf("%s/v1/loan/return/%s", ts.URL, bID.String()))
@@ -95,8 +91,8 @@ func Test_returnBook(t *testing.T) {
assert.Equal(t, http.StatusNotFound, res.StatusCode)
})
t.Run("success", func(t *testing.T) {
b := book.NewFixtureBook()
bMock.EXPECT().Get(b.ID).Return(b, nil)
b := entity.NewFixtureBook()
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
lMock.EXPECT().Return(b).Return(nil)
ts := httptest.NewServer(r)
defer ts.Close()
+17 -17
View File
@@ -6,7 +6,7 @@ import (
"net/http"
"time"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user"
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/user"
"github.com/eminetto/clean-architecture-go-v2/domain"
@@ -18,17 +18,17 @@ import (
"github.com/gorilla/mux"
)
func listUsers(manager user.Manager) http.Handler {
func listUsers(service user.UseCase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
errorMessage := "Error reading users"
var data []*user.User
var data []*entity.User
var err error
name := r.URL.Query().Get("name")
switch {
case name == "":
data, err = manager.List()
data, err = service.ListUsers()
default:
data, err = manager.Search(name)
data, err = service.SearchUsers(name)
}
w.Header().Set("Content-Type", "application/json")
if err != nil && err != domain.ErrNotFound {
@@ -58,7 +58,7 @@ func listUsers(manager user.Manager) http.Handler {
})
}
func createUser(manager user.Manager) http.Handler {
func createUser(service user.UseCase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
errorMessage := "Error adding user"
var input struct {
@@ -75,7 +75,7 @@ func createUser(manager user.Manager) http.Handler {
return
}
//TODO: validate data ;)
u := &user.User{
u := &entity.User{
ID: entity.NewID(),
Email: input.Email,
Password: input.Password,
@@ -83,7 +83,7 @@ func createUser(manager user.Manager) http.Handler {
LastName: input.LastName,
CreatedAt: time.Now(),
}
u.ID, err = manager.Create(u)
u.ID, err = service.CreateUser(u)
if err != nil {
log.Println(err.Error())
w.WriteHeader(http.StatusInternalServerError)
@@ -107,7 +107,7 @@ func createUser(manager user.Manager) http.Handler {
})
}
func getUser(manager user.Manager) http.Handler {
func getUser(service user.UseCase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
errorMessage := "Error reading user"
vars := mux.Vars(r)
@@ -117,7 +117,7 @@ func getUser(manager user.Manager) http.Handler {
w.Write([]byte(errorMessage))
return
}
data, err := manager.Get(id)
data, err := service.GetUser(id)
w.Header().Set("Content-Type", "application/json")
if err != nil && err != domain.ErrNotFound {
w.WriteHeader(http.StatusInternalServerError)
@@ -143,7 +143,7 @@ func getUser(manager user.Manager) http.Handler {
})
}
func deleteUser(manager user.Manager) http.Handler {
func deleteUser(service user.UseCase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
errorMessage := "Error removing user"
vars := mux.Vars(r)
@@ -153,7 +153,7 @@ func deleteUser(manager user.Manager) http.Handler {
w.Write([]byte(errorMessage))
return
}
err = manager.Delete(id)
err = service.DeleteUser(id)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(errorMessage))
@@ -163,20 +163,20 @@ func deleteUser(manager user.Manager) http.Handler {
}
//MakeUserHandlers make url handlers
func MakeUserHandlers(r *mux.Router, n negroni.Negroni, manager user.Manager) {
func MakeUserHandlers(r *mux.Router, n negroni.Negroni, service user.UseCase) {
r.Handle("/v1/user", n.With(
negroni.Wrap(listUsers(manager)),
negroni.Wrap(listUsers(service)),
)).Methods("GET", "OPTIONS").Name("listUsers")
r.Handle("/v1/user", n.With(
negroni.Wrap(createUser(manager)),
negroni.Wrap(createUser(service)),
)).Methods("POST", "OPTIONS").Name("createUser")
r.Handle("/v1/user/{id}", n.With(
negroni.Wrap(getUser(manager)),
negroni.Wrap(getUser(service)),
)).Methods("GET", "OPTIONS").Name("getUser")
r.Handle("/v1/user/{id}", n.With(
negroni.Wrap(deleteUser(manager)),
negroni.Wrap(deleteUser(service)),
)).Methods("DELETE", "OPTIONS").Name("deleteUser")
}
+19 -20
View File
@@ -12,8 +12,7 @@ import (
"github.com/eminetto/clean-architecture-go-v2/api/presenter"
"github.com/eminetto/clean-architecture-go-v2/domain"
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user/mock"
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/user/mock"
"github.com/golang/mock/gomock"
"github.com/gorilla/mux"
"github.com/stretchr/testify/assert"
@@ -22,17 +21,17 @@ import (
func Test_listUsers(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
m := mock.NewMockManager(controller)
m := mock.NewMockUseCase(controller)
r := mux.NewRouter()
n := negroni.New()
MakeUserHandlers(r, *n, m)
path, err := r.GetRoute("listUsers").GetPathTemplate()
assert.Nil(t, err)
assert.Equal(t, "/v1/user", path)
u := user.NewFixtureUser()
u := entity.NewFixtureUser()
m.EXPECT().
List().
Return([]*user.User{u}, nil)
ListUsers().
Return([]*entity.User{u}, nil)
ts := httptest.NewServer(listUsers(m))
defer ts.Close()
res, err := http.Get(ts.URL)
@@ -43,11 +42,11 @@ func Test_listUsers(t *testing.T) {
func Test_listUsers_NotFound(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
m := mock.NewMockManager(controller)
m := mock.NewMockUseCase(controller)
ts := httptest.NewServer(listUsers(m))
defer ts.Close()
m.EXPECT().
Search("dio").
SearchUsers("dio").
Return(nil, domain.ErrNotFound)
res, err := http.Get(ts.URL + "?name=dio")
assert.Nil(t, err)
@@ -57,11 +56,11 @@ func Test_listUsers_NotFound(t *testing.T) {
func Test_listUsers_Search(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
m := mock.NewMockManager(controller)
u := user.NewFixtureUser()
m := mock.NewMockUseCase(controller)
u := entity.NewFixtureUser()
m.EXPECT().
Search("ozzy").
Return([]*user.User{u}, nil)
SearchUsers("ozzy").
Return([]*entity.User{u}, nil)
ts := httptest.NewServer(listUsers(m))
defer ts.Close()
res, err := http.Get(ts.URL + "?name=ozzy")
@@ -72,7 +71,7 @@ func Test_listUsers_Search(t *testing.T) {
func Test_createUser(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
m := mock.NewMockManager(controller)
m := mock.NewMockUseCase(controller)
r := mux.NewRouter()
n := negroni.New()
MakeUserHandlers(r, *n, m)
@@ -81,7 +80,7 @@ func Test_createUser(t *testing.T) {
assert.Equal(t, "/v1/user", path)
m.EXPECT().
Create(gomock.Any()).
CreateUser(gomock.Any()).
Return(entity.NewID(), nil)
h := createUser(m)
@@ -105,16 +104,16 @@ func Test_createUser(t *testing.T) {
func Test_getUser(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
m := mock.NewMockManager(controller)
m := mock.NewMockUseCase(controller)
r := mux.NewRouter()
n := negroni.New()
MakeUserHandlers(r, *n, m)
path, err := r.GetRoute("getUser").GetPathTemplate()
assert.Nil(t, err)
assert.Equal(t, "/v1/user/{id}", path)
u := user.NewFixtureUser()
u := entity.NewFixtureUser()
m.EXPECT().
Get(u.ID).
GetUser(u.ID).
Return(u, nil)
handler := getUser(m)
r.Handle("/v1/user/{id}", handler)
@@ -132,15 +131,15 @@ func Test_getUser(t *testing.T) {
func Test_deleteUser(t *testing.T) {
controller := gomock.NewController(t)
defer controller.Finish()
m := mock.NewMockManager(controller)
m := mock.NewMockUseCase(controller)
r := mux.NewRouter()
n := negroni.New()
MakeUserHandlers(r, *n, m)
path, err := r.GetRoute("deleteUser").GetPathTemplate()
assert.Nil(t, err)
assert.Equal(t, "/v1/user/{id}", path)
u := user.NewFixtureUser()
m.EXPECT().Delete(u.ID).Return(nil)
u := entity.NewFixtureUser()
m.EXPECT().DeleteUser(u.ID).Return(nil)
handler := deleteUser(m)
req, _ := http.NewRequest("DELETE", "/v1/user/"+u.ID.String(), nil)
r.Handle("/v1/user/{id}", handler).Methods("DELETE", "OPTIONS")
+10 -8
View File
@@ -9,13 +9,15 @@ import (
"strconv"
"time"
brepo "github.com/eminetto/clean-architecture-go-v2/domain/repository/book"
urepo "github.com/eminetto/clean-architecture-go-v2/domain/repository/user"
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/book"
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/user"
"github.com/eminetto/clean-architecture-go-v2/pkg/password"
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/loan"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user"
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/codegangsta/negroni"
@@ -37,13 +39,13 @@ func main() {
}
defer db.Close()
bookRepo := book.NewMySQLRepository(db)
bookManager := book.NewManager(bookRepo)
bookRepo := brepo.NewMySQLRepository(db)
bookManager := book.NewService(bookRepo)
userRepo := user.NewMySQLRepoRepository(db)
userManager := user.NewManager(userRepo, password.NewService())
userRepo := urepo.NewMySQLRepoRepository(db)
userManager := user.NewService(userRepo, password.NewService())
loanUseCase := loan.NewUseCase(userManager, bookManager)
loanUseCase := loan.NewService(userManager, bookManager)
metricService, err := metric.NewPrometheusService()
if err != nil {