Skip to content

Commit 39c0a6d

Browse files
authored
Add unit tests to Kill Statistics API, move to goquery (#57)
1 parent 78e658b commit 39c0a6d

File tree

3 files changed

+928
-77
lines changed

3 files changed

+928
-77
lines changed

src/TibiaKillstatisticsV3.go

Lines changed: 58 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -3,54 +3,48 @@ package main
33
import (
44
"log"
55
"net/http"
6-
"regexp"
76
"strings"
87

98
"github.com/PuerkitoBio/goquery"
109
"github.com/gin-gonic/gin"
1110
)
1211

13-
var (
14-
KillStatisticInformationRegex = regexp.MustCompile(`<td>(.*)<\/td><td.*>([0-9]+).*<\/td><td.*>([0-9]+).*<\/td><td.*>([0-9]+).*<\/td><td.*>([0-9]+).*<\/td>`)
15-
)
12+
// Child of KillStatistics
13+
type Entry struct {
14+
Race string `json:"race"`
15+
LastDayKilledPlayers int `json:"last_day_players_killed"`
16+
LastDayKilledByPlayers int `json:"last_day_killed"`
17+
LastWeekKilledPlayers int `json:"last_week_players_killed"`
18+
LastWeekKilledByPlayers int `json:"last_week_killed"`
19+
}
20+
21+
// Child of KillStatistics
22+
type Total struct {
23+
LastDayKilledPlayers int `json:"last_day_players_killed"`
24+
LastDayKilledByPlayers int `json:"last_day_killed"`
25+
LastWeekKilledPlayers int `json:"last_week_players_killed"`
26+
LastWeekKilledByPlayers int `json:"last_week_killed"`
27+
}
28+
29+
// Child of JSONData
30+
type KillStatistics struct {
31+
World string `json:"world"`
32+
Entries []Entry `json:"entries"`
33+
Total Total `json:"total"`
34+
}
35+
36+
//
37+
// The base includes two levels: KillStatistics and Information
38+
type KillStatisticsResponse struct {
39+
KillStatistics KillStatistics `json:"killstatistics"`
40+
Information Information `json:"information"`
41+
}
1642

1743
// TibiaKillstatisticsV3 func
1844
func TibiaKillstatisticsV3(c *gin.Context) {
19-
2045
// getting params from URL
2146
world := c.Param("world")
2247

23-
// Child of KillStatistics
24-
type Entry struct {
25-
Race string `json:"race"`
26-
LastDayKilledPlayers int `json:"last_day_players_killed"`
27-
LastDayKilledByPlayers int `json:"last_day_killed"`
28-
LastWeekKilledPlayers int `json:"last_week_players_killed"`
29-
LastWeekKilledByPlayers int `json:"last_week_killed"`
30-
}
31-
32-
// Child of KillStatistics
33-
type Total struct {
34-
LastDayKilledPlayers int `json:"last_day_players_killed"`
35-
LastDayKilledByPlayers int `json:"last_day_killed"`
36-
LastWeekKilledPlayers int `json:"last_week_players_killed"`
37-
LastWeekKilledByPlayers int `json:"last_week_killed"`
38-
}
39-
40-
// Child of JSONData
41-
type KillStatistics struct {
42-
World string `json:"world"`
43-
Entries []Entry `json:"entries"`
44-
Total Total `json:"total"`
45-
}
46-
47-
//
48-
// The base includes two levels: KillStatistics and Information
49-
type JSONData struct {
50-
KillStatistics KillStatistics `json:"killstatistics"`
51-
Information Information `json:"information"`
52-
}
53-
5448
// Adding fix for First letter to be upper and rest lower
5549
world = TibiadataStringWorldFormatToTitleV3(world)
5650

@@ -64,6 +58,13 @@ func TibiaKillstatisticsV3(c *gin.Context) {
6458
return
6559
}
6660

61+
jsonData := TibiaKillstatisticsV3Impl(world, BoxContentHTML)
62+
63+
// return jsonData
64+
TibiaDataAPIHandleSuccessResponse(c, "TibiaKillstatisticsV3", jsonData)
65+
}
66+
67+
func TibiaKillstatisticsV3Impl(world string, BoxContentHTML string) KillStatisticsResponse {
6768
// Loading HTML data into ReaderHTML for goquery with NewReader
6869
ReaderHTML, err := goquery.NewDocumentFromReader(strings.NewReader(BoxContentHTML))
6970
if err != nil {
@@ -77,47 +78,31 @@ func TibiaKillstatisticsV3(c *gin.Context) {
7778
)
7879

7980
// Running query over each div
80-
ReaderHTML.Find("#KillStatisticsTable .TableContent tr").Each(func(index int, s *goquery.Selection) {
81-
82-
// Storing HTML into CreatureDivHTML
83-
KillStatisticsDivHTML, err := s.Html()
84-
if err != nil {
85-
log.Fatal(err)
86-
}
87-
88-
subma1 := KillStatisticInformationRegex.FindAllStringSubmatch(KillStatisticsDivHTML, -1)
89-
90-
if len(subma1) > 0 {
91-
92-
if strings.TrimSpace(subma1[0][1]) == "Total" {
93-
// we don't want to include the Total row
94-
} else {
95-
96-
// Store the values..
97-
KillStatisticsLastDayKilledPlayers := TibiadataStringToIntegerV3(subma1[0][2])
98-
TotalLastDayKilledPlayers += KillStatisticsLastDayKilledPlayers
99-
KillStatisticsLastDayKilledByPlayers := TibiadataStringToIntegerV3(subma1[0][3])
100-
TotalLastDayKilledByPlayers += KillStatisticsLastDayKilledByPlayers
101-
KillStatisticsLastWeekKilledPlayers := TibiadataStringToIntegerV3(subma1[0][4])
102-
TotalLastWeekKilledPlayers += KillStatisticsLastWeekKilledPlayers
103-
KillStatisticsLastWeekKilledByPlayers := TibiadataStringToIntegerV3(subma1[0][5])
104-
TotalLastWeekKilledByPlayers += KillStatisticsLastWeekKilledByPlayers
105-
106-
// Append new Entry item to KillStatisticsData
107-
KillStatisticsData = append(KillStatisticsData, Entry{
108-
Race: TibiaDataSanitizeEscapedString(subma1[0][1]),
109-
LastDayKilledPlayers: KillStatisticsLastDayKilledPlayers,
110-
LastDayKilledByPlayers: KillStatisticsLastDayKilledByPlayers,
111-
LastWeekKilledPlayers: KillStatisticsLastWeekKilledPlayers,
112-
LastWeekKilledByPlayers: KillStatisticsLastWeekKilledByPlayers,
113-
})
114-
}
115-
}
81+
ReaderHTML.Find("#KillStatisticsTable .TableContent tr.Odd,tr.Even").Each(func(index int, s *goquery.Selection) {
82+
DataColumns := s.Find("td").Nodes
83+
84+
KillStatisticsLastDayKilledPlayers := TibiadataStringToIntegerV3(DataColumns[1].FirstChild.Data)
85+
TotalLastDayKilledPlayers += KillStatisticsLastDayKilledPlayers
86+
KillStatisticsLastDayKilledByPlayers := TibiadataStringToIntegerV3(DataColumns[2].FirstChild.Data)
87+
TotalLastDayKilledByPlayers += KillStatisticsLastDayKilledByPlayers
88+
KillStatisticsLastWeekKilledPlayers := TibiadataStringToIntegerV3(DataColumns[3].FirstChild.Data)
89+
TotalLastWeekKilledPlayers += KillStatisticsLastWeekKilledPlayers
90+
KillStatisticsLastWeekKilledByPlayers := TibiadataStringToIntegerV3(DataColumns[4].FirstChild.Data)
91+
TotalLastWeekKilledByPlayers += KillStatisticsLastWeekKilledByPlayers
92+
93+
// Append new Entry item to KillStatisticsData
94+
KillStatisticsData = append(KillStatisticsData, Entry{
95+
Race: TibiaDataSanitizeEscapedString(DataColumns[0].FirstChild.Data),
96+
LastDayKilledPlayers: KillStatisticsLastDayKilledPlayers,
97+
LastDayKilledByPlayers: KillStatisticsLastDayKilledByPlayers,
98+
LastWeekKilledPlayers: KillStatisticsLastWeekKilledPlayers,
99+
LastWeekKilledByPlayers: KillStatisticsLastWeekKilledByPlayers,
100+
})
116101
})
117102

118103
//
119104
// Build the data-blob
120-
jsonData := JSONData{
105+
return KillStatisticsResponse{
121106
KillStatistics{
122107
World: world,
123108
Entries: KillStatisticsData,
@@ -133,8 +118,4 @@ func TibiaKillstatisticsV3(c *gin.Context) {
133118
Timestamp: TibiadataDatetimeV3(""),
134119
},
135120
}
136-
137-
// return jsonData
138-
TibiaDataAPIHandleSuccessResponse(c, "TibiaKillstatisticsV3", jsonData)
139-
140121
}

src/TibiaKillstatisticsV3_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package main
2+
3+
import (
4+
"io/ioutil"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestAntica(t *testing.T) {
11+
data, err := ioutil.ReadFile("../testdata/killstatistics/Antica.html")
12+
if err != nil {
13+
t.Errorf("File reading error: %s", err)
14+
return
15+
}
16+
17+
anticaJson := TibiaKillstatisticsV3Impl("Antica", string(data))
18+
assert := assert.New(t)
19+
20+
assert.Equal("Antica", anticaJson.KillStatistics.World)
21+
assert.Equal(1159, len(anticaJson.KillStatistics.Entries))
22+
23+
elementalForces := anticaJson.KillStatistics.Entries[0]
24+
assert.Equal("(elemental forces)", elementalForces.Race)
25+
assert.Equal(6, elementalForces.LastDayKilledPlayers)
26+
assert.Equal(0, elementalForces.LastDayKilledByPlayers)
27+
assert.Equal(103, elementalForces.LastWeekKilledPlayers)
28+
assert.Equal(0, elementalForces.LastWeekKilledByPlayers)
29+
30+
caveRats := anticaJson.KillStatistics.Entries[386]
31+
assert.Equal("cave rats", caveRats.Race)
32+
assert.Equal(2, caveRats.LastDayKilledPlayers)
33+
assert.Equal(1618, caveRats.LastDayKilledByPlayers)
34+
assert.Equal(78, caveRats.LastWeekKilledPlayers)
35+
assert.Equal(12876, caveRats.LastWeekKilledByPlayers)
36+
}
37+
38+
func BenchmarkAntica(b *testing.B) {
39+
data, err := ioutil.ReadFile("../testdata/killstatistics/Antica.html")
40+
if err != nil {
41+
b.Errorf("File reading error: %s", err)
42+
return
43+
}
44+
45+
b.ReportAllocs()
46+
47+
assert := assert.New(b)
48+
49+
for i := 0; i < b.N; i++ {
50+
anticaJson := TibiaKillstatisticsV3Impl("Antica", string(data))
51+
52+
assert.Equal("Antica", anticaJson.KillStatistics.World)
53+
}
54+
}

0 commit comments

Comments
 (0)