Skip to content

Commit

Permalink
Healthcheck testers
Browse files Browse the repository at this point in the history
  • Loading branch information
Joao Miranda committed Apr 10, 2018
1 parent 4645b44 commit 7b62b5d
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 57 deletions.
113 changes: 56 additions & 57 deletions lib/lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,17 @@ func getHTTPClient() *http.Client {

// NewPodium returns a new podium API application
func NewPodium(config *viper.Viper) *Podium {
app := &Podium{
p := &Podium{
httpClient: getHTTPClient(),
Config: config,
URL: config.GetString("podium.url"),
baseLeaderboard: config.GetString("leaderboards.globalLeaderboard"),
localeLeaderboard: config.GetString("leaderboards.localeLeaderboard"),
}
return app
return p
}

func (app *Podium) sendTo(method, url string, payload map[string]interface{}) (int, string, error) {
func (p *Podium) sendTo(method, url string, payload map[string]interface{}) (int, string, error) {
payloadJSON, err := json.Marshal(payload)
if err != nil {
return -1, "", err
Expand All @@ -64,150 +64,149 @@ func (app *Podium) sendTo(method, url string, payload map[string]interface{}) (i
return -1, "", err
}
}

req.Header.Set("Content-Type", "application/json")

resp, err := app.httpClient.Do(req)
defer resp.Body.Close()
resp, err := p.httpClient.Do(req)
if err != nil {
return -1, "", err
}
defer resp.Body.Close()

body, _ := ioutil.ReadAll(resp.Body)

return resp.StatusCode, string(body), nil
}

func (app *Podium) buildURL(pathname string) string {
return fmt.Sprintf("%s%s", app.URL, pathname)
func (p *Podium) buildURL(pathname string) string {
return fmt.Sprintf("%s%s", p.URL, pathname)
}

func (app *Podium) buildDeleteLeaderboardURL(leaderboard string) string {
func (p *Podium) buildDeleteLeaderboardURL(leaderboard string) string {
var pathname = fmt.Sprintf("/l/%s", leaderboard)
return app.buildURL(pathname)
return p.buildURL(pathname)
}

func (app *Podium) buildGetTopPercentURL(leaderboard string, percentage int) string {
func (p *Podium) buildGetTopPercentURL(leaderboard string, percentage int) string {
var pathname = fmt.Sprintf("/l/%s/top-percent/%d", leaderboard, percentage)
return app.buildURL(pathname)
return p.buildURL(pathname)
}

func (app *Podium) buildUpdateScoreURL(leaderboard string, playerID string) string {
func (p *Podium) buildUpdateScoreURL(leaderboard string, playerID string) string {
var pathname = fmt.Sprintf("/l/%s/members/%s/score", leaderboard, playerID)
return app.buildURL(pathname)
return p.buildURL(pathname)
}

func (app *Podium) buildIncrementScoreURL(leaderboard string, playerID string) string {
return app.buildUpdateScoreURL(leaderboard, playerID)
func (p *Podium) buildIncrementScoreURL(leaderboard string, playerID string) string {
return p.buildUpdateScoreURL(leaderboard, playerID)
}

func (app *Podium) buildUpdateScoresURL(playerID string) string {
func (p *Podium) buildUpdateScoresURL(playerID string) string {
var pathname = fmt.Sprintf("/m/%s/scores", playerID)
return app.buildURL(pathname)
return p.buildURL(pathname)
}

func (app *Podium) buildRemoveMemberFromLeaderboardURL(leaderboard string, member string) string {
func (p *Podium) buildRemoveMemberFromLeaderboardURL(leaderboard string, member string) string {
var pathname = fmt.Sprintf("/l/%s/members/%s", leaderboard, member)
return app.buildURL(pathname)
return p.buildURL(pathname)
}

// page is 1-based
func (app *Podium) buildGetTopURL(leaderboard string, page int, pageSize int) string {
func (p *Podium) buildGetTopURL(leaderboard string, page int, pageSize int) string {
var pathname = fmt.Sprintf("/l/%s/top/%d?pageSize=%d", leaderboard, page, pageSize)
return app.buildURL(pathname)
return p.buildURL(pathname)
}

func (app *Podium) buildGetPlayerURL(leaderboard string, playerID string) string {
func (p *Podium) buildGetPlayerURL(leaderboard string, playerID string) string {
var pathname = fmt.Sprintf("/l/%s/members/%s", leaderboard, playerID)
return app.buildURL(pathname)
return p.buildURL(pathname)
}

func (app *Podium) buildHealthcheckURL() string {
func (p *Podium) buildHealthcheckURL() string {
var pathname = "/healthcheck"
return app.buildURL(pathname)
return p.buildURL(pathname)
}

// GetBaseLeaderboards shows the global leaderboard
func (app *Podium) GetBaseLeaderboards() string {
return app.baseLeaderboard
func (p *Podium) GetBaseLeaderboards() string {
return p.baseLeaderboard
}

// GetLocalizedLeaderboard receives a locale and returns its leaderboard
func (app *Podium) GetLocalizedLeaderboard(locale string) string {
localeLeaderboard := app.localeLeaderboard
func (p *Podium) GetLocalizedLeaderboard(locale string) string {
localeLeaderboard := p.localeLeaderboard
result := strings.Replace(localeLeaderboard, "%{locale}", locale, -1)
return result
}

// GetTop returns the top players for this leaderboard. Page is 1-index
func (app *Podium) GetTop(leaderboard string, page int, pageSize int) (int, string, error) {
route := app.buildGetTopURL(leaderboard, page, pageSize)
status, body, err := app.sendTo("GET", route, nil)
func (p *Podium) GetTop(leaderboard string, page int, pageSize int) (int, string, error) {
route := p.buildGetTopURL(leaderboard, page, pageSize)
status, body, err := p.sendTo("GET", route, nil)
return status, body, err
}

// GetTopPercent returns the top x% of players in a leaderboard
func (app *Podium) GetTopPercent(leaderboard string, percentage int) (int, string, error) {
route := app.buildGetTopPercentURL(leaderboard, percentage)
status, body, err := app.sendTo("GET", route, nil)
func (p *Podium) GetTopPercent(leaderboard string, percentage int) (int, string, error) {
route := p.buildGetTopPercentURL(leaderboard, percentage)
status, body, err := p.sendTo("GET", route, nil)
return status, body, err
}

// UpdateScore updates the score of a particular player in a leaderboard
func (app *Podium) UpdateScore(leaderboard string, playerID string, score int) (int, string, error) {
route := app.buildUpdateScoreURL(leaderboard, playerID)
func (p *Podium) UpdateScore(leaderboard string, playerID string, score int) (int, string, error) {
route := p.buildUpdateScoreURL(leaderboard, playerID)
payload := map[string]interface{}{
"score": score,
}
status, body, err := app.sendTo("PUT", route, payload)
status, body, err := p.sendTo("PUT", route, payload)
return status, body, err
}

// IncrementScore increments the score of a particular player in a leaderboard
func (app *Podium) IncrementScore(leaderboard string, playerID string, increment int) (int, string, error) {
route := app.buildIncrementScoreURL(leaderboard, playerID)
func (p *Podium) IncrementScore(leaderboard string, playerID string, increment int) (int, string, error) {
route := p.buildIncrementScoreURL(leaderboard, playerID)
payload := map[string]interface{}{
"increment": increment,
}
status, body, err := app.sendTo("PATCH", route, payload)
status, body, err := p.sendTo("PATCH", route, payload)
return status, body, err
}

// UpdateScores updates the score of a player in more than one leaderboard
func (app *Podium) UpdateScores(leaderboards []string, playerID string, score int) (int, string, error) {
route := app.buildUpdateScoresURL(playerID)
func (p *Podium) UpdateScores(leaderboards []string, playerID string, score int) (int, string, error) {
route := p.buildUpdateScoresURL(playerID)
payload := map[string]interface{}{
"score": score,
"leaderboards": leaderboards,
}
status, body, err := app.sendTo("PUT", route, payload)
status, body, err := p.sendTo("PUT", route, payload)
return status, body, err
}

// RemoveMemberFromLeaderboard removes a player from a leaderboard
func (app *Podium) RemoveMemberFromLeaderboard(leaderboard string, member string) (int, string, error) {
route := app.buildRemoveMemberFromLeaderboardURL(leaderboard, member)
status, body, err := app.sendTo("DELETE", route, nil)
func (p *Podium) RemoveMemberFromLeaderboard(leaderboard string, member string) (int, string, error) {
route := p.buildRemoveMemberFromLeaderboardURL(leaderboard, member)
status, body, err := p.sendTo("DELETE", route, nil)
return status, body, err
}

// GetPlayer shows score and rank of a particular player in a leaderboard
func (app *Podium) GetPlayer(leaderboard string, playerID string) (int, string, error) {
route := app.buildGetPlayerURL(leaderboard, playerID)
status, body, err := app.sendTo("GET", route, nil)
func (p *Podium) GetPlayer(leaderboard string, playerID string) (int, string, error) {
route := p.buildGetPlayerURL(leaderboard, playerID)
status, body, err := p.sendTo("GET", route, nil)
return status, body, err
}

// Healthcheck verifies if podium is still up
func (app *Podium) Healthcheck(leaderboard string, playerID string) (int, string, error) {
route := app.buildHealthcheckURL()
status, body, err := app.sendTo("GET", route, nil)
func (p *Podium) Healthcheck() (int, string, error) {
route := p.buildHealthcheckURL()
status, body, err := p.sendTo("GET", route, nil)
return status, body, err
}

// DeleteLeaderboard deletes the leaderboard from podium
func (app *Podium) DeleteLeaderboard(leaderboard string) (int, string, error) {
route := app.buildDeleteLeaderboardURL(leaderboard)
status, body, err := app.sendTo("DELETE", route, nil)
func (p *Podium) DeleteLeaderboard(leaderboard string) (int, string, error) {
route := p.buildDeleteLeaderboardURL(leaderboard)
status, body, err := p.sendTo("DELETE", route, nil)
return status, body, err
}
73 changes: 73 additions & 0 deletions lib/lib_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package lib_test

import (
"net/http"
"net/http/httptest"

"github.com/labstack/echo/engine/standard"
"github.com/spf13/viper"
"github.com/topfreegames/podium/api"
"github.com/topfreegames/podium/lib"
"github.com/topfreegames/podium/testing"

. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)

var transport *http.Transport

func GetDefaultTestApp() *api.App {
logger := testing.NewMockLogger()
app, err := api.GetApp("0.0.0.0", 8890, "../config/test.yaml", false, false, logger)
Expect(err).NotTo(HaveOccurred())
app.Configure()
return app
}

func initClient() {
if transport == nil {
transport = &http.Transport{DisableKeepAlives: true}
}
}

func InitializeTestServer(app *api.App) *httptest.Server {
initClient()
app.Engine.SetHandler(app.App)
return httptest.NewServer(app.Engine.(*standard.Server))
}

var _ = Describe("Lib", func() {

var ts *httptest.Server
var a *api.App
var config *viper.Viper
var p *lib.Podium

BeforeEach(func() {
a = GetDefaultTestApp()
ts = InitializeTestServer(a)
config = viper.New()
config.Set("podium.url", ts.URL)
p = lib.NewPodium(config)
})

Describe("Healthcheck", func() {
It("Should respond with default WORKING string", func() {
status, body, _ := p.Healthcheck()
Expect(status).To(Equal(http.StatusOK))
Expect(body).To(Equal("WORKING"))
})
It("Should not respond with WORKING if server is down", func() {
config.Set("podium.url", "http://localhost:1")
p = lib.NewPodium(config)
status, _, err := p.Healthcheck()
Expect(err).To(HaveOccurred())
Expect(status).NotTo(Equal(200))
})
})

AfterEach(func() {
defer transport.CloseIdleConnections()
defer ts.Close()
})
})

0 comments on commit 7b62b5d

Please sign in to comment.