Scouting App: Add View data webserver

Add methods to return all Notes, Stats, and Driver Rankings.

Signed-off-by: Filip Kujawa <filip.j.kujawa@gmail.com>
Change-Id: I0cc8531c9aa34e8dbccf08cada9957272537024f
diff --git a/scouting/webserver/requests/requests_test.go b/scouting/webserver/requests/requests_test.go
index 55b789b..ed8a3b5 100644
--- a/scouting/webserver/requests/requests_test.go
+++ b/scouting/webserver/requests/requests_test.go
@@ -13,8 +13,12 @@
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/error_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/refresh_match_list"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/refresh_match_list_response"
+	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
+	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
+	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
+	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_matches_for_team"
@@ -590,6 +594,136 @@
 	}
 }
 
+// Validates that we can request the driver rankings.
+func TestRequestDriverRankings(t *testing.T) {
+	db := MockDatabase{
+		driver_ranking: []db.DriverRankingData{
+			{
+				MatchNumber: 36,
+				Rank1:       1234,
+				Rank2:       1235,
+				Rank3:       1236,
+			},
+			{
+				MatchNumber: 36,
+				Rank1:       101,
+				Rank2:       202,
+				Rank3:       303,
+			},
+		},
+	}
+	scoutingServer := server.NewScoutingServer()
+	HandleRequests(&db, scrapeEmtpyMatchList, scoutingServer)
+	scoutingServer.Start(8080)
+	defer scoutingServer.Stop()
+
+	builder := flatbuffers.NewBuilder(1024)
+	builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
+
+	response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
+	if err != nil {
+		t.Fatal("Failed to request all driver rankings: ", err)
+	}
+
+	expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
+		DriverRankingList: []*request_all_driver_rankings_response.RankingT{
+			{
+				MatchNumber: 36,
+				Rank1:       1234,
+				Rank2:       1235,
+				Rank3:       1236,
+			},
+			{
+				MatchNumber: 36,
+				Rank1:       101,
+				Rank2:       202,
+				Rank3:       303,
+			},
+		},
+	}
+	if len(expected.DriverRankingList) != len(response.DriverRankingList) {
+		t.Fatal("Expected ", expected, ", but got ", *response)
+	}
+	for i, match := range expected.DriverRankingList {
+		if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
+			t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
+		}
+	}
+}
+
+// Validates that we can request all notes.
+func TestRequestAllNotes(t *testing.T) {
+	db := MockDatabase{
+		notes: []db.NotesData{
+			{
+				TeamNumber:   971,
+				Notes:        "Notes",
+				GoodDriving:  true,
+				BadDriving:   false,
+				SketchyClimb: true,
+				SolidClimb:   false,
+				GoodDefense:  true,
+				BadDefense:   false,
+			},
+			{
+				TeamNumber:   972,
+				Notes:        "More Notes",
+				GoodDriving:  false,
+				BadDriving:   false,
+				SketchyClimb: false,
+				SolidClimb:   true,
+				GoodDefense:  false,
+				BadDefense:   true,
+			},
+		},
+	}
+	scoutingServer := server.NewScoutingServer()
+	HandleRequests(&db, scrapeEmtpyMatchList, scoutingServer)
+	scoutingServer.Start(8080)
+	defer scoutingServer.Stop()
+
+	builder := flatbuffers.NewBuilder(1024)
+	builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
+
+	response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
+	if err != nil {
+		t.Fatal("Failed to request all notes: ", err)
+	}
+
+	expected := request_all_notes_response.RequestAllNotesResponseT{
+		NoteList: []*request_all_notes_response.NoteT{
+			{
+				Team:         971,
+				Notes:        "Notes",
+				GoodDriving:  true,
+				BadDriving:   false,
+				SketchyClimb: true,
+				SolidClimb:   false,
+				GoodDefense:  true,
+				BadDefense:   false,
+			},
+			{
+				Team:         972,
+				Notes:        "More Notes",
+				GoodDriving:  false,
+				BadDriving:   false,
+				SketchyClimb: false,
+				SolidClimb:   true,
+				GoodDefense:  false,
+				BadDefense:   true,
+			},
+		},
+	}
+	if len(expected.NoteList) != len(response.NoteList) {
+		t.Fatal("Expected ", expected, ", but got ", *response)
+	}
+	for i, note := range expected.NoteList {
+		if !reflect.DeepEqual(*note, *response.NoteList[i]) {
+			t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
+		}
+	}
+}
+
 // A mocked database we can use for testing. Add functionality to this as
 // needed for your tests.
 
@@ -651,6 +785,10 @@
 	return nil
 }
 
+func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
+	return database.notes, nil
+}
+
 func (database *MockDatabase) AddToShift(data db.Shift) error {
 	database.shiftSchedule = append(database.shiftSchedule, data)
 	return nil
@@ -669,6 +807,10 @@
 	return nil
 }
 
+func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
+	return database.driver_ranking, nil
+}
+
 // Returns an empty match list from the fake The Blue Alliance scraping.
 func scrapeEmtpyMatchList(int32, string) ([]scraping.Match, error) {
 	return nil, nil