From a41eeb663178df6e6b3f303f724a48df80c5a9af Mon Sep 17 00:00:00 2001 From: Tobias Lindberg Date: Tue, 23 Sep 2025 01:06:03 +0200 Subject: [PATCH 1/3] chore: refactor TibiaKillstatistics --- src/TibiaKillstatistics.go | 36 +++++----- src/TibiaKillstatistics_test.go | 115 ++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 16 deletions(-) diff --git a/src/TibiaKillstatistics.go b/src/TibiaKillstatistics.go index ebb350f1..10f5f846 100644 --- a/src/TibiaKillstatistics.go +++ b/src/TibiaKillstatistics.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/PuerkitoBio/goquery" + "golang.org/x/net/html" ) // Child of KillStatistics @@ -53,25 +54,17 @@ func TibiaKillstatisticsImpl(world string, BoxContentHTML string, url string) (K // Running query over each div ReaderHTML.Find("#KillStatisticsTable .TableContent tr.Odd,tr.Even").Each(func(index int, s *goquery.Selection) { - DataColumns := s.Find("td").Nodes + // Extract kill statistics from table row + killStats := extractKillStatistics(s.Find("td").Nodes) - KillStatisticsLastDayKilledPlayers := TibiaDataStringToInteger(DataColumns[1].FirstChild.Data) - TotalLastDayKilledPlayers += KillStatisticsLastDayKilledPlayers - KillStatisticsLastDayKilledByPlayers := TibiaDataStringToInteger(DataColumns[2].FirstChild.Data) - TotalLastDayKilledByPlayers += KillStatisticsLastDayKilledByPlayers - KillStatisticsLastWeekKilledPlayers := TibiaDataStringToInteger(DataColumns[3].FirstChild.Data) - TotalLastWeekKilledPlayers += KillStatisticsLastWeekKilledPlayers - KillStatisticsLastWeekKilledByPlayers := TibiaDataStringToInteger(DataColumns[4].FirstChild.Data) - TotalLastWeekKilledByPlayers += KillStatisticsLastWeekKilledByPlayers + // Accumulate totals + TotalLastDayKilledPlayers += killStats.LastDayKilledPlayers + TotalLastDayKilledByPlayers += killStats.LastDayKilledByPlayers + TotalLastWeekKilledPlayers += killStats.LastWeekKilledPlayers + TotalLastWeekKilledByPlayers += killStats.LastWeekKilledByPlayers // Append new Entry item to KillStatisticsData - KillStatisticsData = append(KillStatisticsData, Entry{ - Race: TibiaDataSanitizeEscapedString(DataColumns[0].FirstChild.Data), - LastDayKilledPlayers: KillStatisticsLastDayKilledPlayers, - LastDayKilledByPlayers: KillStatisticsLastDayKilledByPlayers, - LastWeekKilledPlayers: KillStatisticsLastWeekKilledPlayers, - LastWeekKilledByPlayers: KillStatisticsLastWeekKilledByPlayers, - }) + KillStatisticsData = append(KillStatisticsData, killStats) }) // @@ -97,3 +90,14 @@ func TibiaKillstatisticsImpl(world string, BoxContentHTML string, url string) (K }, }, nil } + +// Helper function to extract and convert kill statistics +func extractKillStatistics(dataColumns []*html.Node) Entry { + return Entry{ + Race: TibiaDataSanitizeEscapedString(dataColumns[0].FirstChild.Data), + LastDayKilledPlayers: TibiaDataStringToInteger(dataColumns[1].FirstChild.Data), + LastDayKilledByPlayers: TibiaDataStringToInteger(dataColumns[2].FirstChild.Data), + LastWeekKilledPlayers: TibiaDataStringToInteger(dataColumns[3].FirstChild.Data), + LastWeekKilledByPlayers: TibiaDataStringToInteger(dataColumns[4].FirstChild.Data), + } +} diff --git a/src/TibiaKillstatistics_test.go b/src/TibiaKillstatistics_test.go index f835283b..cee8452a 100644 --- a/src/TibiaKillstatistics_test.go +++ b/src/TibiaKillstatistics_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/tibiadata/tibiadata-api-go/src/static" + "golang.org/x/net/html" ) func TestAntica(t *testing.T) { @@ -73,3 +74,117 @@ func BenchmarkAntica(b *testing.B) { assert.Equal("Antica", anticaJson.KillStatistics.World) } } + +func TestExtractKillStatistics(t *testing.T) { + // Create mock HTML nodes for testing + raceNode := &html.Node{ + FirstChild: &html.Node{ + Data: "Dragon", + }, + } + + lastDayKilledPlayersNode := &html.Node{ + FirstChild: &html.Node{ + Data: "150", + }, + } + + lastDayKilledByPlayersNode := &html.Node{ + FirstChild: &html.Node{ + Data: "25", + }, + } + + lastWeekKilledPlayersNode := &html.Node{ + FirstChild: &html.Node{ + Data: "1200", + }, + } + + lastWeekKilledByPlayersNode := &html.Node{ + FirstChild: &html.Node{ + Data: "85", + }, + } + + // Create dataColumns slice + dataColumns := []*html.Node{ + raceNode, + lastDayKilledPlayersNode, + lastDayKilledByPlayersNode, + lastWeekKilledPlayersNode, + lastWeekKilledByPlayersNode, + } + + // Call the function + result := extractKillStatistics(dataColumns) + + // Define expected values + expected := Entry{ + Race: "Dragon", + LastDayKilledPlayers: 150, + LastDayKilledByPlayers: 25, + LastWeekKilledPlayers: 1200, + LastWeekKilledByPlayers: 85, + } + + // Assert results + if result.Race != expected.Race { + t.Errorf("Race: got %v, want %v", result.Race, expected.Race) + } + + if result.LastDayKilledPlayers != expected.LastDayKilledPlayers { + t.Errorf("LastDayKilledPlayers: got %v, want %v", result.LastDayKilledPlayers, expected.LastDayKilledPlayers) + } + + if result.LastDayKilledByPlayers != expected.LastDayKilledByPlayers { + t.Errorf("LastDayKilledByPlayers: got %v, want %v", result.LastDayKilledByPlayers, expected.LastDayKilledByPlayers) + } + + if result.LastWeekKilledPlayers != expected.LastWeekKilledPlayers { + t.Errorf("LastWeekKilledPlayers: got %v, want %v", result.LastWeekKilledPlayers, expected.LastWeekKilledPlayers) + } + + if result.LastWeekKilledByPlayers != expected.LastWeekKilledByPlayers { + t.Errorf("LastWeekKilledByPlayers: got %v, want %v", result.LastWeekKilledByPlayers, expected.LastWeekKilledByPlayers) + } +} + +// Test with edge cases +func TestExtractKillStatisticsEdgeCases(t *testing.T) { + // Test with empty strings + emptyNode := &html.Node{ + FirstChild: &html.Node{ + Data: "", + }, + } + + // Test with zero values + zeroNode := &html.Node{ + FirstChild: &html.Node{ + Data: "0", + }, + } + + dataColumns := []*html.Node{ + emptyNode, // Race + zeroNode, // LastDayKilledPlayers + zeroNode, // LastDayKilledByPlayers + zeroNode, // LastWeekKilledPlayers + zeroNode, // LastWeekKilledByPlayers + } + + result := extractKillStatistics(dataColumns) + + if result.Race != "" { + t.Errorf("Empty race: got %v, want empty string", result.Race) + } + + if result.LastDayKilledPlayers != 0 { + t.Errorf("Zero last day killed players: got %v, want 0", result.LastDayKilledPlayers) + } + + if result.LastWeekKilledByPlayers != 0 { + t.Errorf("Zero last week killed by players: got %v, want 0", result.LastWeekKilledByPlayers) + } +} From 77fb742401eeb78e88c41838bac70b72ee7be2ae Mon Sep 17 00:00:00 2001 From: Tobias Lindberg Date: Tue, 23 Sep 2025 11:26:52 +0200 Subject: [PATCH 2/3] chore: add suggestion by copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/TibiaKillstatistics_test.go | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/TibiaKillstatistics_test.go b/src/TibiaKillstatistics_test.go index cee8452a..f3597e36 100644 --- a/src/TibiaKillstatistics_test.go +++ b/src/TibiaKillstatistics_test.go @@ -129,25 +129,7 @@ func TestExtractKillStatistics(t *testing.T) { } // Assert results - if result.Race != expected.Race { - t.Errorf("Race: got %v, want %v", result.Race, expected.Race) - } - - if result.LastDayKilledPlayers != expected.LastDayKilledPlayers { - t.Errorf("LastDayKilledPlayers: got %v, want %v", result.LastDayKilledPlayers, expected.LastDayKilledPlayers) - } - - if result.LastDayKilledByPlayers != expected.LastDayKilledByPlayers { - t.Errorf("LastDayKilledByPlayers: got %v, want %v", result.LastDayKilledByPlayers, expected.LastDayKilledByPlayers) - } - - if result.LastWeekKilledPlayers != expected.LastWeekKilledPlayers { - t.Errorf("LastWeekKilledPlayers: got %v, want %v", result.LastWeekKilledPlayers, expected.LastWeekKilledPlayers) - } - - if result.LastWeekKilledByPlayers != expected.LastWeekKilledByPlayers { - t.Errorf("LastWeekKilledByPlayers: got %v, want %v", result.LastWeekKilledByPlayers, expected.LastWeekKilledByPlayers) - } + assert.Equal(t, expected, result) } // Test with edge cases From 716bde26b86d053ca0517b951155e997b075b36e Mon Sep 17 00:00:00 2001 From: Tobias Lindberg Date: Tue, 23 Sep 2025 11:27:08 +0200 Subject: [PATCH 3/3] chore: add suggestion by copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/TibiaKillstatistics.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/TibiaKillstatistics.go b/src/TibiaKillstatistics.go index 10f5f846..569053e6 100644 --- a/src/TibiaKillstatistics.go +++ b/src/TibiaKillstatistics.go @@ -93,6 +93,10 @@ func TibiaKillstatisticsImpl(world string, BoxContentHTML string, url string) (K // Helper function to extract and convert kill statistics func extractKillStatistics(dataColumns []*html.Node) Entry { + if len(dataColumns) < 5 { + // Not enough columns; return zero-value Entry + return Entry{} + } return Entry{ Race: TibiaDataSanitizeEscapedString(dataColumns[0].FirstChild.Data), LastDayKilledPlayers: TibiaDataStringToInteger(dataColumns[1].FirstChild.Data),