Skip to content

Commit

Permalink
add score calculation, hystrix and unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Muhammad Ichsan R authored and Muhammad Ichsan R committed Sep 12, 2017
1 parent 2602a54 commit 013cc39
Show file tree
Hide file tree
Showing 16 changed files with 127 additions and 180 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Run the app

And visit

http://localhost:8080/getPlayer/101
http://localhost:8080/getScore/Rafael/vs/Serena


----------
Expand Down
17 changes: 11 additions & 6 deletions controllers/PlayerController.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package controllers
import (
"encoding/json"
"net/http"
"strconv"

"github.com/irahardianto/service-pattern-go/helpers"
"github.com/irahardianto/service-pattern-go/interfaces"
Expand All @@ -16,13 +15,19 @@ type PlayerController struct {
PlayerHelper helpers.PlayerHelper
}

func (controller *PlayerController) GetPlayer(res http.ResponseWriter, req *http.Request) {
func (controller *PlayerController) GetPlayerScore(res http.ResponseWriter, req *http.Request) {

playerId, _ := strconv.Atoi(chi.URLParam(req, "id"))
player := controller.PlayerService.FindById(playerId)
playerVM := controller.PlayerHelper.BuildPlayerVM(player)
player1Name := chi.URLParam(req, "player1")
player2Name := chi.URLParam(req, "player2")

json.NewEncoder(res).Encode(playerVM)
scores, err := controller.PlayerService.GetScores(player1Name, player2Name)
if err != nil {
//Handle error
}

response := controller.PlayerHelper.BuildScoresVM(scores)

json.NewEncoder(res).Encode(response)
}

func (controller *PlayerController) GetPlayerMessage(res http.ResponseWriter, req *http.Request) {
Expand Down
15 changes: 7 additions & 8 deletions controllers/PlayerController_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import (

// TestSomething is an example of how to use our test object to
// make assertions about some target code we are testing.
func TestGetScore(t *testing.T) {
func TestPlayerScore(t *testing.T) {

player := models.PlayerModel{}
player.Id = 101
Expand All @@ -31,25 +31,24 @@ func TestGetScore(t *testing.T) {
playerService := new(mocks.IPlayerService)

// setup expectations
playerService.On("FindById", 101).Return(player)
playerService.On("GetScores", "Rafael", "Serena").Return("Forty-Fifteen", nil)

playerController := PlayerController{}
playerController.PlayerService = playerService

// call the code we are testing
req := httptest.NewRequest("GET", "http://localhost:8080/getPlayer/101", nil)
req := httptest.NewRequest("GET", "http://localhost:8080/getScore/Rafael/vs/Serena", nil)
w := httptest.NewRecorder()

r := chi.NewRouter()
r.HandleFunc("/getPlayer/{id}", playerController.GetPlayer)
r.HandleFunc("/getScore/{player1}/vs/{player2}", playerController.GetPlayerScore)

r.ServeHTTP(w, req)

expectedResult := viewmodels.PlayerVM{}
expectedResult.Name = "Rafael"
expectedResult.Score = 3
expectedResult := viewmodels.ScoresVM{}
expectedResult.Score = "Forty-Fifteen"

actualResult := viewmodels.PlayerVM{}
actualResult := viewmodels.ScoresVM{}

json.NewDecoder(w.Body).Decode(&actualResult)

Expand Down
10 changes: 4 additions & 6 deletions helpers/PlayerHelper.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package helpers

import (
"github.com/irahardianto/service-pattern-go/models"
"github.com/irahardianto/service-pattern-go/viewmodels"
)

type PlayerHelper struct{}

func (helper *PlayerHelper) BuildPlayerVM(model models.PlayerModel) viewmodels.PlayerVM {
func (helper *PlayerHelper) BuildScoresVM(scores string) viewmodels.ScoresVM {

playerVM := viewmodels.PlayerVM{}
playerVM.Name = model.Name
playerVM.Score = model.Score
scoresVM := viewmodels.ScoresVM{}
scoresVM.Score = scores

return playerVM
return scoresVM
}
6 changes: 1 addition & 5 deletions interfaces/IPlayerRepository.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,6 @@ import (
)

type IPlayerRepository interface {
GetAllPlayers() []models.PlayerModel
GetPlayerById(id int) models.PlayerModel
CreatePlayer(player models.PlayerModel) (bool, error)
UpdatePlayer(id int, player models.PlayerModel) (bool, error)
DeletePlayer(id int) (bool, error)
GetPlayerByName(name string) (models.PlayerModel, error)
GetPlayerMessageFromAPI() models.MessageModel
}
2 changes: 1 addition & 1 deletion interfaces/IPlayerService.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ import (
)

type IPlayerService interface {
FindById(playerId int) models.PlayerModel
GetScores(player1Name string, player2Name string) (string, error)
GetPlayerMessage() models.MessageModel
}
90 changes: 9 additions & 81 deletions interfaces/mocks/IPlayerRepository.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 21 additions & 14 deletions interfaces/mocks/IPlayerService.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

50 changes: 18 additions & 32 deletions repositories/PlayerRepository.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package repositories
import (
"encoding/json"

"github.com/afex/hystrix-go/hystrix"
"github.com/irahardianto/service-pattern-go/helpers"
"github.com/irahardianto/service-pattern-go/infrastructures"
"github.com/irahardianto/service-pattern-go/models"
Expand All @@ -15,41 +16,26 @@ type PlayerRepository struct {
SafeAPICall helpers.SafeAPICall
}

// func InitGormDB(conn *gorm.DB) *GormPlayerRepository {
//
// dbHandler := new(GormPlayerRepository)
// dbHandler.db = conn
//
// return dbHandler
// }
func (repository *PlayerRepository) GetPlayerByName(name string) (models.PlayerModel, error) {

func (repository *PlayerRepository) GetAllPlayers() []models.PlayerModel {
//not implemented yet
return nil
}

func (repository *PlayerRepository) GetPlayerById(id int) models.PlayerModel {
conn := repository.Db.GetDB()
player := models.PlayerModel{}
//conn.db.First(&player, id)
conn.First(&player, id)

return player
}

func (repository *PlayerRepository) CreatePlayer(player models.PlayerModel) (bool, error) {
//not implemented yet
return false, nil
}

func (repository *PlayerRepository) UpdatePlayer(id int, player models.PlayerModel) (bool, error) {
//not implemented yet
return false, nil
}

func (repository *PlayerRepository) DeletePlayer(id int) (bool, error) {
//not implemented yet
return false, nil
output := make(chan models.PlayerModel, 1)
errors := hystrix.Go("get_player_by_name", func() error {

player := models.PlayerModel{}
conn.First(&player, "Name = ?", name)
output <- player
return nil
}, nil)

select {
case out := <-output:
return out, nil
case err := <-errors:
println(err)
return models.PlayerModel{}, err
}
}

func (repository *PlayerRepository) GetPlayerMessageFromAPI() models.MessageModel {
Expand Down
2 changes: 1 addition & 1 deletion router.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func (router *router) InitRouter() *chi.Mux {
playerController := ServiceContainer().InjectPlayerController()

r := chi.NewRouter()
r.HandleFunc("/getPlayer/{id}", playerController.GetPlayer)
r.HandleFunc("/getScore/{player1}/vs/{player2}", playerController.GetPlayerScore)
r.HandleFunc("/getMessage", playerController.GetPlayerMessage)

return r
Expand Down
Binary file modified service-pattern-go
Binary file not shown.
Loading

0 comments on commit 013cc39

Please sign in to comment.