scouting: Scrape rankings and add to db

Signed-off-by: Yash Chainani <yashchainani28@gmail.com>
Change-Id: I9e84feeaaee640e98ba72919b022379de39f9d29
diff --git a/scouting/webserver/rankings/rankings_test.go b/scouting/webserver/rankings/rankings_test.go
new file mode 100644
index 0000000..f47c0a2
--- /dev/null
+++ b/scouting/webserver/rankings/rankings_test.go
@@ -0,0 +1,69 @@
+package rankings
+
+import (
+	"github.com/frc971/971-Robot-Code/scouting/db"
+	"github.com/frc971/971-Robot-Code/scouting/webserver/server"
+	"net/http"
+	"reflect"
+	"testing"
+	"time"
+)
+
+type MockDatabase struct {
+	rankings []db.Ranking
+}
+
+func (database *MockDatabase) AddOrUpdateRankings(data db.Ranking) error {
+	database.rankings = append(database.rankings, data)
+	return nil
+}
+
+func ServeRankings(h http.Handler) http.Handler {
+	fn := func(w http.ResponseWriter, r *http.Request) {
+		r.URL.Path = "scraping/test_data/2016_nytr_rankings.json"
+
+		h.ServeHTTP(w, r)
+	}
+
+	return http.HandlerFunc(fn)
+}
+
+func TestGetRankings(t *testing.T) {
+	database := MockDatabase{}
+	scraper := rankingScraper{}
+	tbaServer := server.NewScoutingServer()
+	tbaServer.Handle("/", ServeRankings(http.FileServer(http.Dir("../../"))))
+	tbaServer.Start(8000)
+	defer tbaServer.Stop()
+
+	scraper.Start(&database, 2016, "nytr", "scouting_test_config.json")
+	defer scraper.Stop()
+
+	for {
+		if len(database.rankings) > 0 {
+			break
+		}
+
+		time.Sleep(time.Second)
+	}
+
+	beginningThreeExpected := []db.Ranking{
+		{TeamNumber: 359, Losses: 1, Wins: 11, Ties: 0, Rank: 1, Dq: 0},
+		{TeamNumber: 5254, Losses: 1, Wins: 11, Ties: 0, Rank: 2, Dq: 0},
+		{TeamNumber: 3990, Losses: 1, Wins: 11, Ties: 0, Rank: 3, Dq: 0},
+	}
+
+	endThreeExpected := []db.Ranking{
+		{TeamNumber: 5943, Losses: 10, Wins: 2, Ties: 0, Rank: 34, Dq: 0},
+		{TeamNumber: 4203, Losses: 10, Wins: 2, Ties: 0, Rank: 35, Dq: 0},
+		{TeamNumber: 5149, Losses: 10, Wins: 2, Ties: 0, Rank: 36, Dq: 0},
+	}
+
+	if !reflect.DeepEqual(beginningThreeExpected, database.rankings[0:3]) {
+		t.Fatal("Got %#v, but expected %#v.", database.rankings[0:3], beginningThreeExpected)
+	}
+
+	if !reflect.DeepEqual(endThreeExpected, database.rankings[33:]) {
+		t.Fatal("Got %#v, but expected %#v.", database.rankings[33:], beginningThreeExpected)
+	}
+}