blob: efd770b6822a647b098ef164638bbfc4ad4e8352 [file] [log] [blame]
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08001package requests
2
3import (
4 "bytes"
5 "io"
6 "net/http"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08007 "reflect"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08008 "testing"
9
Philipp Schrader8747f1b2022-02-23 23:56:22 -080010 "github.com/frc971/971-Robot-Code/scouting/db"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080011 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/debug"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080012 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/error_response"
Emily Markova290147d2023-03-03 22:40:06 -080013 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting"
14 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080015 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
16 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080017 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
18 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080019 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
20 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
Philipp Schraderacf96232022-03-01 22:03:30 -080021 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting"
22 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070023 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Milo Lin1d59f0c2022-06-22 20:30:58 -070024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
25 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080026 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting"
Philipp Schrader30005e42022-03-06 13:53:58 -080027 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting_response"
Filip Kujawa210a03b2022-11-24 14:41:11 -080028 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
Alex Perry81f96ba2022-03-13 18:26:19 -070029 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Milo Lin1d59f0c2022-06-22 20:30:58 -070030 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080031 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
32 flatbuffers "github.com/google/flatbuffers/go"
33)
34
35// Validates that an unhandled address results in a 404.
36func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080037 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080038 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080039 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080040 scoutingServer.Start(8080)
41 defer scoutingServer.Stop()
42
43 resp, err := http.Get("http://localhost:8080/requests/foo")
44 if err != nil {
45 t.Fatalf("Failed to get data: %v", err)
46 }
47 if resp.StatusCode != http.StatusNotFound {
48 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
49 }
50}
51
52// Validates that we can submit new data scouting data.
53func TestSubmitDataScoutingError(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080054 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080055 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080056 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080057 scoutingServer.Start(8080)
58 defer scoutingServer.Stop()
59
60 resp, err := http.Post("http://localhost:8080/requests/submit/data_scouting", "application/octet-stream", bytes.NewReader([]byte("")))
61 if err != nil {
62 t.Fatalf("Failed to send request: %v", err)
63 }
64 if resp.StatusCode != http.StatusBadRequest {
65 t.Fatal("Unexpected status code. Got", resp.Status)
66 }
67
68 responseBytes, err := io.ReadAll(resp.Body)
69 if err != nil {
70 t.Fatal("Failed to read response bytes:", err)
71 }
72 errorResponse := error_response.GetRootAsErrorResponse(responseBytes, 0)
73
74 errorMessage := string(errorResponse.ErrorMessage())
75 if errorMessage != "Failed to parse SubmitDataScouting: runtime error: index out of range [3] with length 0" {
76 t.Fatal("Got mismatched error message:", errorMessage)
77 }
78}
79
80// Validates that we can submit new data scouting data.
81func TestSubmitDataScouting(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080082 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080083 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080084 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080085 scoutingServer.Start(8080)
86 defer scoutingServer.Stop()
87
88 builder := flatbuffers.NewBuilder(1024)
89 builder.Finish((&submit_data_scouting.SubmitDataScoutingT{
Philipp Schraderfa45d742022-03-18 19:29:05 -070090 Team: 971,
91 Match: 1,
Philipp Schrader30b4a682022-04-16 14:36:17 -070092 SetNumber: 8,
Philipp Schrader4535b7e2022-04-08 20:27:00 -070093 CompLevel: "quals",
Philipp Schraderfa45d742022-03-18 19:29:05 -070094 StartingQuadrant: 2,
95 AutoBall1: true,
96 AutoBall2: false,
97 AutoBall3: false,
98 AutoBall4: false,
99 AutoBall5: false,
100 MissedShotsAuto: 9971,
101 UpperGoalAuto: 9971,
102 LowerGoalAuto: 9971,
103 MissedShotsTele: 9971,
104 UpperGoalTele: 9971,
105 LowerGoalTele: 9971,
106 DefenseRating: 9971,
107 DefenseReceivedRating: 4,
108 ClimbLevel: submit_data_scouting.ClimbLevelLow,
109 Comment: "this is a comment",
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800110 }).Pack(builder))
111
Philipp Schrader30005e42022-03-06 13:53:58 -0800112 response, err := debug.SubmitDataScouting("http://localhost:8080", builder.FinishedBytes())
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800113 if err != nil {
Philipp Schrader30005e42022-03-06 13:53:58 -0800114 t.Fatal("Failed to submit data scouting: ", err)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800115 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800116
117 // We get an empty response back. Validate that.
118 expected := submit_data_scouting_response.SubmitDataScoutingResponseT{}
119 if !reflect.DeepEqual(expected, *response) {
120 t.Fatal("Expected ", expected, ", but got:", *response)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800121 }
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800122}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800123
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800124// Validates that we can request the full match list.
125func TestRequestAllMatches(t *testing.T) {
126 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -0800127 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800128 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800129 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800130 Alliance: "R", AlliancePosition: 1, TeamNumber: 5,
131 },
132 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800133 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800134 Alliance: "R", AlliancePosition: 2, TeamNumber: 42,
135 },
136 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800137 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800138 Alliance: "R", AlliancePosition: 3, TeamNumber: 600,
139 },
140 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800141 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800142 Alliance: "B", AlliancePosition: 1, TeamNumber: 971,
143 },
144 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800145 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800146 Alliance: "B", AlliancePosition: 2, TeamNumber: 400,
147 },
148 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800149 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800150 Alliance: "B", AlliancePosition: 3, TeamNumber: 200,
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800151 },
152 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800153 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800154 Alliance: "R", AlliancePosition: 1, TeamNumber: 6,
155 },
156 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800157 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800158 Alliance: "R", AlliancePosition: 2, TeamNumber: 43,
159 },
160 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800161 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800162 Alliance: "R", AlliancePosition: 3, TeamNumber: 601,
163 },
164 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800165 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800166 Alliance: "B", AlliancePosition: 1, TeamNumber: 972,
167 },
168 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800169 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800170 Alliance: "B", AlliancePosition: 2, TeamNumber: 401,
171 },
172 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800173 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800174 Alliance: "B", AlliancePosition: 3, TeamNumber: 201,
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800175 },
176 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800177 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800178 Alliance: "R", AlliancePosition: 1, TeamNumber: 7,
179 },
180 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800181 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800182 Alliance: "R", AlliancePosition: 2, TeamNumber: 44,
183 },
184 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800185 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800186 Alliance: "R", AlliancePosition: 3, TeamNumber: 602,
187 },
188 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800189 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800190 Alliance: "B", AlliancePosition: 1, TeamNumber: 973,
191 },
192 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800193 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800194 Alliance: "B", AlliancePosition: 2, TeamNumber: 402,
195 },
196 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800197 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800198 Alliance: "B", AlliancePosition: 3, TeamNumber: 202,
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800199 },
200 },
201 }
202 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800203 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800204 scoutingServer.Start(8080)
205 defer scoutingServer.Stop()
206
207 builder := flatbuffers.NewBuilder(1024)
208 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
209
210 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
211 if err != nil {
212 t.Fatal("Failed to request all matches: ", err)
213 }
214
215 expected := request_all_matches_response.RequestAllMatchesResponseT{
216 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700217 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800218 // R1, R2, R3, B1, B2, B3
219 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800220 1, 1, "qm",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800221 5, 42, 600, 971, 400, 200,
222 },
223 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800224 2, 1, "qm",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800225 6, 43, 601, 972, 401, 201,
226 },
227 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800228 3, 1, "qm",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800229 7, 44, 602, 973, 402, 202,
230 },
231 },
232 }
233 if len(expected.MatchList) != len(response.MatchList) {
234 t.Fatal("Expected ", expected, ", but got ", *response)
235 }
236 for i, match := range expected.MatchList {
237 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
238 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
239 }
240 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800241
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800242}
243
Philipp Schraderacf96232022-03-01 22:03:30 -0800244// Validates that we can request the stats.
245func TestRequestDataScouting(t *testing.T) {
246 db := MockDatabase{
247 stats: []db.Stats{
248 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700249 TeamNumber: 971, MatchNumber: 1, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700250 StartingQuadrant: 1,
251 AutoBallPickedUp: [5]bool{true, false, false, false, true},
252 ShotsMissed: 1, UpperGoalShots: 2, LowerGoalShots: 3,
Philipp Schraderacf96232022-03-01 22:03:30 -0800253 ShotsMissedAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700254 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 2,
255 Comment: "a lovely comment", CollectedBy: "john",
Philipp Schraderacf96232022-03-01 22:03:30 -0800256 },
257 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700258 TeamNumber: 972, MatchNumber: 1, SetNumber: 4, CompLevel: "extra",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700259 StartingQuadrant: 2,
260 AutoBallPickedUp: [5]bool{false, false, true, false, false},
261 ShotsMissed: 2, UpperGoalShots: 3, LowerGoalShots: 4,
Philipp Schraderacf96232022-03-01 22:03:30 -0800262 ShotsMissedAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700263 PlayedDefense: 8, DefenseReceivedScore: 1, Climbing: 4,
264 Comment: "another lovely comment", CollectedBy: "andrea",
Philipp Schraderacf96232022-03-01 22:03:30 -0800265 },
266 },
267 }
268 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800269 HandleRequests(&db, scoutingServer)
Philipp Schraderacf96232022-03-01 22:03:30 -0800270 scoutingServer.Start(8080)
271 defer scoutingServer.Stop()
272
273 builder := flatbuffers.NewBuilder(1024)
274 builder.Finish((&request_data_scouting.RequestDataScoutingT{}).Pack(builder))
275
276 response, err := debug.RequestDataScouting("http://localhost:8080", builder.FinishedBytes())
277 if err != nil {
278 t.Fatal("Failed to request all matches: ", err)
279 }
280
281 expected := request_data_scouting_response.RequestDataScoutingResponseT{
282 StatsList: []*request_data_scouting_response.StatsT{
Philipp Schraderacf96232022-03-01 22:03:30 -0800283 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700284 Team: 971, Match: 1, SetNumber: 2, CompLevel: "quals",
Philipp Schrader36df73a2022-03-17 23:27:24 -0700285 MissedShotsAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
286 MissedShotsTele: 1, UpperGoalTele: 2, LowerGoalTele: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700287 DefenseRating: 7,
288 DefenseReceivedRating: 3,
289 CollectedBy: "john",
290 AutoBall1: true, AutoBall2: false, AutoBall3: false,
Philipp Schrader36df73a2022-03-17 23:27:24 -0700291 AutoBall4: false, AutoBall5: true,
292 StartingQuadrant: 1,
293 ClimbLevel: request_data_scouting_response.ClimbLevelFailedWithPlentyOfTime,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700294 Comment: "a lovely comment",
Philipp Schraderacf96232022-03-01 22:03:30 -0800295 },
296 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700297 Team: 972, Match: 1, SetNumber: 4, CompLevel: "extra",
Philipp Schrader36df73a2022-03-17 23:27:24 -0700298 MissedShotsAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
299 MissedShotsTele: 2, UpperGoalTele: 3, LowerGoalTele: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700300 DefenseRating: 8,
301 DefenseReceivedRating: 1,
302 CollectedBy: "andrea",
303 AutoBall1: false, AutoBall2: false, AutoBall3: true,
Philipp Schrader36df73a2022-03-17 23:27:24 -0700304 AutoBall4: false, AutoBall5: false,
305 StartingQuadrant: 2,
306 ClimbLevel: request_data_scouting_response.ClimbLevelMedium,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700307 Comment: "another lovely comment",
Philipp Schraderacf96232022-03-01 22:03:30 -0800308 },
309 },
310 }
311 if len(expected.StatsList) != len(response.StatsList) {
312 t.Fatal("Expected ", expected, ", but got ", *response)
313 }
314 for i, match := range expected.StatsList {
315 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
316 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
317 }
318 }
319}
320
Emily Markova290147d2023-03-03 22:40:06 -0800321// Validates that we can request the 2023 stats.
322func TestRequest2023DataScouting(t *testing.T) {
323 db := MockDatabase{
324 stats2023: []db.Stats2023{
325 {
326 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
327 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
328 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
329 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
330 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
331 HighCubes: 2, CubesDropped: 1, LowCones: 1,
332 MiddleCones: 2, HighCones: 0, ConesDropped: 1,
333 AvgCycle: 34, CollectedBy: "isaac",
334 },
335 {
336 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
337 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
338 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
339 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
340 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
341 HighCubes: 1, CubesDropped: 0, LowCones: 0,
342 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
343 AvgCycle: 53, CollectedBy: "unknown",
344 },
345 },
346 }
347 scoutingServer := server.NewScoutingServer()
348 HandleRequests(&db, scoutingServer)
349 scoutingServer.Start(8080)
350 defer scoutingServer.Stop()
351
352 builder := flatbuffers.NewBuilder(1024)
353 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
354
355 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
356 if err != nil {
357 t.Fatal("Failed to request all matches: ", err)
358 }
359
360 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
361 StatsList: []*request_2023_data_scouting_response.Stats2023T{
362 {
363 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
364 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
365 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
366 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
367 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
368 HighCubes: 2, CubesDropped: 1, LowCones: 1,
369 MiddleCones: 2, HighCones: 0, ConesDropped: 1,
370 AvgCycle: 34, CollectedBy: "isaac",
371 },
372 {
373 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
374 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
375 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
376 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
377 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
378 HighCubes: 1, CubesDropped: 0, LowCones: 0,
379 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
380 AvgCycle: 53, CollectedBy: "unknown",
381 },
382 },
383 }
384 if len(expected.StatsList) != len(response.StatsList) {
385 t.Fatal("Expected ", expected, ", but got ", *response)
386 }
387 for i, match := range expected.StatsList {
388 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
389 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
390 }
391 }
392}
393
Alex Perry81f96ba2022-03-13 18:26:19 -0700394func TestSubmitNotes(t *testing.T) {
395 database := MockDatabase{}
396 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800397 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700398 scoutingServer.Start(8080)
399 defer scoutingServer.Stop()
400
401 builder := flatbuffers.NewBuilder(1024)
402 builder.Finish((&submit_notes.SubmitNotesT{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800403 Team: 971,
404 Notes: "Notes",
405 GoodDriving: true,
406 BadDriving: false,
407 SketchyPickup: true,
408 SketchyPlacing: false,
409 GoodDefense: true,
410 BadDefense: false,
411 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700412 }).Pack(builder))
413
414 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
415 if err != nil {
416 t.Fatal("Failed to submit notes: ", err)
417 }
418
419 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800420 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800421 TeamNumber: 971,
422 Notes: "Notes",
423 GoodDriving: true,
424 BadDriving: false,
425 SketchyPickup: true,
426 SketchyPlacing: false,
427 GoodDefense: true,
428 BadDefense: false,
429 EasilyDefended: true,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800430 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700431 }
432
433 if !reflect.DeepEqual(database.notes, expected) {
434 t.Fatal("Submitted notes did not match", expected, database.notes)
435 }
436}
437
438func TestRequestNotes(t *testing.T) {
439 database := MockDatabase{
440 notes: []db.NotesData{{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800441 TeamNumber: 971,
442 Notes: "Notes",
443 GoodDriving: true,
444 BadDriving: false,
445 SketchyPickup: true,
446 SketchyPlacing: false,
447 GoodDefense: true,
448 BadDefense: false,
449 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700450 }},
451 }
452 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800453 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700454 scoutingServer.Start(8080)
455 defer scoutingServer.Stop()
456
457 builder := flatbuffers.NewBuilder(1024)
458 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
459 Team: 971,
460 }).Pack(builder))
461 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
462 if err != nil {
463 t.Fatal("Failed to submit notes: ", err)
464 }
465
466 if response.Notes[0].Data != "Notes" {
467 t.Fatal("requested notes did not match", response)
468 }
469}
470
Milo Lin1d59f0c2022-06-22 20:30:58 -0700471func TestRequestShiftSchedule(t *testing.T) {
472 db := MockDatabase{
473 shiftSchedule: []db.Shift{
474 {
475 MatchNumber: 1,
476 R1scouter: "Bob",
477 R2scouter: "James",
478 R3scouter: "Robert",
479 B1scouter: "Alice",
480 B2scouter: "Mary",
481 B3scouter: "Patricia",
482 },
483 {
484 MatchNumber: 2,
485 R1scouter: "Liam",
486 R2scouter: "Noah",
487 R3scouter: "Oliver",
488 B1scouter: "Emma",
489 B2scouter: "Charlotte",
490 B3scouter: "Amelia",
491 },
492 },
493 }
494 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800495 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700496 scoutingServer.Start(8080)
497 defer scoutingServer.Stop()
498
499 builder := flatbuffers.NewBuilder(1024)
500 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
501
502 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
503 if err != nil {
504 t.Fatal("Failed to request shift schedule: ", err)
505 }
506
507 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
508 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
509 {
510 MatchNumber: 1,
511 R1scouter: "Bob",
512 R2scouter: "James",
513 R3scouter: "Robert",
514 B1scouter: "Alice",
515 B2scouter: "Mary",
516 B3scouter: "Patricia",
517 },
518 {
519 MatchNumber: 2,
520 R1scouter: "Liam",
521 R2scouter: "Noah",
522 R3scouter: "Oliver",
523 B1scouter: "Emma",
524 B2scouter: "Charlotte",
525 B3scouter: "Amelia",
526 },
527 },
528 }
529 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
530 t.Fatal("Expected ", expected, ", but got ", *response)
531 }
532 for i, match := range expected.ShiftSchedule {
533 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
534 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
535 }
536 }
537}
538
539func TestSubmitShiftSchedule(t *testing.T) {
540 database := MockDatabase{}
541 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800542 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700543 scoutingServer.Start(8080)
544 defer scoutingServer.Stop()
545
546 builder := flatbuffers.NewBuilder(1024)
547 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
548 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
549 {MatchNumber: 1,
550 R1scouter: "Bob",
551 R2scouter: "James",
552 R3scouter: "Robert",
553 B1scouter: "Alice",
554 B2scouter: "Mary",
555 B3scouter: "Patricia"},
556 },
557 }).Pack(builder))
558
559 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
560 if err != nil {
561 t.Fatal("Failed to submit shift schedule: ", err)
562 }
563
564 expected := []db.Shift{
565 {MatchNumber: 1,
566 R1scouter: "Bob",
567 R2scouter: "James",
568 R3scouter: "Robert",
569 B1scouter: "Alice",
570 B2scouter: "Mary",
571 B3scouter: "Patricia"},
572 }
573 if !reflect.DeepEqual(expected, database.shiftSchedule) {
574 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
575 }
576}
577
Filip Kujawa210a03b2022-11-24 14:41:11 -0800578func TestSubmitDriverRanking(t *testing.T) {
579 database := MockDatabase{}
580 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800581 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800582 scoutingServer.Start(8080)
583 defer scoutingServer.Stop()
584
585 builder := flatbuffers.NewBuilder(1024)
586 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
587 MatchNumber: 36,
588 Rank1: 1234,
589 Rank2: 1235,
590 Rank3: 1236,
591 }).Pack(builder))
592
593 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
594 if err != nil {
595 t.Fatal("Failed to submit driver ranking: ", err)
596 }
597
598 expected := []db.DriverRankingData{
599 {MatchNumber: 36, Rank1: 1234, Rank2: 1235, Rank3: 1236},
600 }
601
602 if !reflect.DeepEqual(database.driver_ranking, expected) {
603 t.Fatal("Submitted notes did not match", expected, database.notes)
604 }
605}
606
Filip Kujawaf882e022022-12-14 13:14:08 -0800607// Validates that we can request the driver rankings.
608func TestRequestDriverRankings(t *testing.T) {
609 db := MockDatabase{
610 driver_ranking: []db.DriverRankingData{
611 {
612 MatchNumber: 36,
613 Rank1: 1234,
614 Rank2: 1235,
615 Rank3: 1236,
616 },
617 {
618 MatchNumber: 36,
619 Rank1: 101,
620 Rank2: 202,
621 Rank3: 303,
622 },
623 },
624 }
625 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800626 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800627 scoutingServer.Start(8080)
628 defer scoutingServer.Stop()
629
630 builder := flatbuffers.NewBuilder(1024)
631 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
632
633 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
634 if err != nil {
635 t.Fatal("Failed to request all driver rankings: ", err)
636 }
637
638 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
639 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
640 {
641 MatchNumber: 36,
642 Rank1: 1234,
643 Rank2: 1235,
644 Rank3: 1236,
645 },
646 {
647 MatchNumber: 36,
648 Rank1: 101,
649 Rank2: 202,
650 Rank3: 303,
651 },
652 },
653 }
654 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
655 t.Fatal("Expected ", expected, ", but got ", *response)
656 }
657 for i, match := range expected.DriverRankingList {
658 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
659 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
660 }
661 }
662}
663
664// Validates that we can request all notes.
665func TestRequestAllNotes(t *testing.T) {
666 db := MockDatabase{
667 notes: []db.NotesData{
668 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800669 TeamNumber: 971,
670 Notes: "Notes",
671 GoodDriving: true,
672 BadDriving: false,
673 SketchyPickup: true,
674 SketchyPlacing: false,
675 GoodDefense: true,
676 BadDefense: false,
677 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800678 },
679 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800680 TeamNumber: 972,
681 Notes: "More Notes",
682 GoodDriving: false,
683 BadDriving: false,
684 SketchyPickup: false,
685 SketchyPlacing: true,
686 GoodDefense: false,
687 BadDefense: true,
688 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800689 },
690 },
691 }
692 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800693 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800694 scoutingServer.Start(8080)
695 defer scoutingServer.Stop()
696
697 builder := flatbuffers.NewBuilder(1024)
698 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
699
700 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
701 if err != nil {
702 t.Fatal("Failed to request all notes: ", err)
703 }
704
705 expected := request_all_notes_response.RequestAllNotesResponseT{
706 NoteList: []*request_all_notes_response.NoteT{
707 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800708 Team: 971,
709 Notes: "Notes",
710 GoodDriving: true,
711 BadDriving: false,
712 SketchyPickup: true,
713 SketchyPlacing: false,
714 GoodDefense: true,
715 BadDefense: false,
716 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800717 },
718 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800719 Team: 972,
720 Notes: "More Notes",
721 GoodDriving: false,
722 BadDriving: false,
723 SketchyPickup: false,
724 SketchyPlacing: true,
725 GoodDefense: false,
726 BadDefense: true,
727 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800728 },
729 },
730 }
731 if len(expected.NoteList) != len(response.NoteList) {
732 t.Fatal("Expected ", expected, ", but got ", *response)
733 }
734 for i, note := range expected.NoteList {
735 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
736 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
737 }
738 }
739}
740
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800741// A mocked database we can use for testing. Add functionality to this as
742// needed for your tests.
743
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800744type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800745 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -0800746 stats []db.Stats
747 notes []db.NotesData
748 shiftSchedule []db.Shift
749 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -0800750 stats2023 []db.Stats2023
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800751}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800752
Emily Markovabf24c9e2023-02-08 20:31:11 -0800753func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -0800754 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800755 return nil
756}
757
Philipp Schrader30005e42022-03-06 13:53:58 -0800758func (database *MockDatabase) AddToStats(stats db.Stats) error {
759 database.stats = append(database.stats, stats)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800760 return nil
761}
762
Emily Markova290147d2023-03-03 22:40:06 -0800763func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
764 database.stats2023 = append(database.stats2023, stats2023)
765 return nil
766}
Emily Markovabf24c9e2023-02-08 20:31:11 -0800767func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800768 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800769}
770
771func (database *MockDatabase) ReturnStats() ([]db.Stats, error) {
Philipp Schraderacf96232022-03-01 22:03:30 -0800772 return database.stats, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800773}
774
Emily Markova290147d2023-03-03 22:40:06 -0800775func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
776 return database.stats2023, nil
777}
778
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800779func (database *MockDatabase) QueryStats(int) ([]db.Stats, error) {
780 return []db.Stats{}, nil
781}
Philipp Schraderd3fac192022-03-02 20:35:46 -0800782
Philipp Schradereecb8962022-06-01 21:02:42 -0700783func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -0700784 var results []string
785 for _, data := range database.notes {
786 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -0700787 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -0700788 }
789 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700790 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -0700791}
792
Filip Kujawaf947cb42022-11-21 10:00:30 -0800793func (database *MockDatabase) AddNotes(data db.NotesData) error {
794 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -0700795 return nil
796}
797
Filip Kujawaf882e022022-12-14 13:14:08 -0800798func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
799 return database.notes, nil
800}
801
Milo Lin1d59f0c2022-06-22 20:30:58 -0700802func (database *MockDatabase) AddToShift(data db.Shift) error {
803 database.shiftSchedule = append(database.shiftSchedule, data)
804 return nil
805}
806
807func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
808 return database.shiftSchedule, nil
809}
810
811func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
812 return []db.Shift{}, nil
813}
814
Filip Kujawa210a03b2022-11-24 14:41:11 -0800815func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
816 database.driver_ranking = append(database.driver_ranking, data)
817 return nil
818}
819
Filip Kujawaf882e022022-12-14 13:14:08 -0800820func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
821 return database.driver_ranking, nil
822}