blob: ee220222a995e03ebdd26f818f18cdd242ab4070 [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"
Filip Kujawaf882e022022-12-14 13:14:08 -080013 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
14 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080015 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
16 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080017 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
18 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
Philipp Schraderacf96232022-03-01 22:03:30 -080019 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting"
20 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070021 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Milo Lin1d59f0c2022-06-22 20:30:58 -070022 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
23 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting"
Philipp Schrader30005e42022-03-06 13:53:58 -080025 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting_response"
Filip Kujawa210a03b2022-11-24 14:41:11 -080026 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
Alex Perry81f96ba2022-03-13 18:26:19 -070027 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Milo Lin1d59f0c2022-06-22 20:30:58 -070028 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080029 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
30 flatbuffers "github.com/google/flatbuffers/go"
31)
32
33// Validates that an unhandled address results in a 404.
34func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080035 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080036 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080037 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080038 scoutingServer.Start(8080)
39 defer scoutingServer.Stop()
40
41 resp, err := http.Get("http://localhost:8080/requests/foo")
42 if err != nil {
43 t.Fatalf("Failed to get data: %v", err)
44 }
45 if resp.StatusCode != http.StatusNotFound {
46 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
47 }
48}
49
50// Validates that we can submit new data scouting data.
51func TestSubmitDataScoutingError(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080052 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080053 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080054 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080055 scoutingServer.Start(8080)
56 defer scoutingServer.Stop()
57
58 resp, err := http.Post("http://localhost:8080/requests/submit/data_scouting", "application/octet-stream", bytes.NewReader([]byte("")))
59 if err != nil {
60 t.Fatalf("Failed to send request: %v", err)
61 }
62 if resp.StatusCode != http.StatusBadRequest {
63 t.Fatal("Unexpected status code. Got", resp.Status)
64 }
65
66 responseBytes, err := io.ReadAll(resp.Body)
67 if err != nil {
68 t.Fatal("Failed to read response bytes:", err)
69 }
70 errorResponse := error_response.GetRootAsErrorResponse(responseBytes, 0)
71
72 errorMessage := string(errorResponse.ErrorMessage())
73 if errorMessage != "Failed to parse SubmitDataScouting: runtime error: index out of range [3] with length 0" {
74 t.Fatal("Got mismatched error message:", errorMessage)
75 }
76}
77
78// Validates that we can submit new data scouting data.
79func TestSubmitDataScouting(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080080 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080081 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080082 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080083 scoutingServer.Start(8080)
84 defer scoutingServer.Stop()
85
86 builder := flatbuffers.NewBuilder(1024)
87 builder.Finish((&submit_data_scouting.SubmitDataScoutingT{
Philipp Schraderfa45d742022-03-18 19:29:05 -070088 Team: 971,
89 Match: 1,
Philipp Schrader30b4a682022-04-16 14:36:17 -070090 SetNumber: 8,
Philipp Schrader4535b7e2022-04-08 20:27:00 -070091 CompLevel: "quals",
Philipp Schraderfa45d742022-03-18 19:29:05 -070092 StartingQuadrant: 2,
93 AutoBall1: true,
94 AutoBall2: false,
95 AutoBall3: false,
96 AutoBall4: false,
97 AutoBall5: false,
98 MissedShotsAuto: 9971,
99 UpperGoalAuto: 9971,
100 LowerGoalAuto: 9971,
101 MissedShotsTele: 9971,
102 UpperGoalTele: 9971,
103 LowerGoalTele: 9971,
104 DefenseRating: 9971,
105 DefenseReceivedRating: 4,
106 ClimbLevel: submit_data_scouting.ClimbLevelLow,
107 Comment: "this is a comment",
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800108 }).Pack(builder))
109
Philipp Schrader30005e42022-03-06 13:53:58 -0800110 response, err := debug.SubmitDataScouting("http://localhost:8080", builder.FinishedBytes())
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800111 if err != nil {
Philipp Schrader30005e42022-03-06 13:53:58 -0800112 t.Fatal("Failed to submit data scouting: ", err)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800113 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800114
115 // We get an empty response back. Validate that.
116 expected := submit_data_scouting_response.SubmitDataScoutingResponseT{}
117 if !reflect.DeepEqual(expected, *response) {
118 t.Fatal("Expected ", expected, ", but got:", *response)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800119 }
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800120}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800121
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800122// Validates that we can request the full match list.
123func TestRequestAllMatches(t *testing.T) {
124 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -0800125 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800126 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800127 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800128 Alliance: "R", AlliancePosition: 1, TeamNumber: 5,
129 },
130 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800131 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800132 Alliance: "R", AlliancePosition: 2, TeamNumber: 42,
133 },
134 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800135 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800136 Alliance: "R", AlliancePosition: 3, TeamNumber: 600,
137 },
138 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800139 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800140 Alliance: "B", AlliancePosition: 1, TeamNumber: 971,
141 },
142 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800143 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800144 Alliance: "B", AlliancePosition: 2, TeamNumber: 400,
145 },
146 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800147 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800148 Alliance: "B", AlliancePosition: 3, TeamNumber: 200,
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800149 },
150 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800151 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800152 Alliance: "R", AlliancePosition: 1, TeamNumber: 6,
153 },
154 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800155 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800156 Alliance: "R", AlliancePosition: 2, TeamNumber: 43,
157 },
158 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800159 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800160 Alliance: "R", AlliancePosition: 3, TeamNumber: 601,
161 },
162 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800163 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800164 Alliance: "B", AlliancePosition: 1, TeamNumber: 972,
165 },
166 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800167 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800168 Alliance: "B", AlliancePosition: 2, TeamNumber: 401,
169 },
170 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800171 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800172 Alliance: "B", AlliancePosition: 3, TeamNumber: 201,
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800173 },
174 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800175 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800176 Alliance: "R", AlliancePosition: 1, TeamNumber: 7,
177 },
178 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800179 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800180 Alliance: "R", AlliancePosition: 2, TeamNumber: 44,
181 },
182 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800183 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800184 Alliance: "R", AlliancePosition: 3, TeamNumber: 602,
185 },
186 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800187 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800188 Alliance: "B", AlliancePosition: 1, TeamNumber: 973,
189 },
190 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800191 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800192 Alliance: "B", AlliancePosition: 2, TeamNumber: 402,
193 },
194 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800195 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800196 Alliance: "B", AlliancePosition: 3, TeamNumber: 202,
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800197 },
198 },
199 }
200 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800201 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800202 scoutingServer.Start(8080)
203 defer scoutingServer.Stop()
204
205 builder := flatbuffers.NewBuilder(1024)
206 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
207
208 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
209 if err != nil {
210 t.Fatal("Failed to request all matches: ", err)
211 }
212
213 expected := request_all_matches_response.RequestAllMatchesResponseT{
214 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700215 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800216 // R1, R2, R3, B1, B2, B3
217 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800218 1, 1, "qm",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800219 5, 42, 600, 971, 400, 200,
220 },
221 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800222 2, 1, "qm",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800223 6, 43, 601, 972, 401, 201,
224 },
225 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800226 3, 1, "qm",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800227 7, 44, 602, 973, 402, 202,
228 },
229 },
230 }
231 if len(expected.MatchList) != len(response.MatchList) {
232 t.Fatal("Expected ", expected, ", but got ", *response)
233 }
234 for i, match := range expected.MatchList {
235 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
236 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
237 }
238 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800239
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800240}
241
Philipp Schraderacf96232022-03-01 22:03:30 -0800242// Validates that we can request the stats.
243func TestRequestDataScouting(t *testing.T) {
244 db := MockDatabase{
245 stats: []db.Stats{
246 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700247 TeamNumber: 971, MatchNumber: 1, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700248 StartingQuadrant: 1,
249 AutoBallPickedUp: [5]bool{true, false, false, false, true},
250 ShotsMissed: 1, UpperGoalShots: 2, LowerGoalShots: 3,
Philipp Schraderacf96232022-03-01 22:03:30 -0800251 ShotsMissedAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700252 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 2,
253 Comment: "a lovely comment", CollectedBy: "john",
Philipp Schraderacf96232022-03-01 22:03:30 -0800254 },
255 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700256 TeamNumber: 972, MatchNumber: 1, SetNumber: 4, CompLevel: "extra",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700257 StartingQuadrant: 2,
258 AutoBallPickedUp: [5]bool{false, false, true, false, false},
259 ShotsMissed: 2, UpperGoalShots: 3, LowerGoalShots: 4,
Philipp Schraderacf96232022-03-01 22:03:30 -0800260 ShotsMissedAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700261 PlayedDefense: 8, DefenseReceivedScore: 1, Climbing: 4,
262 Comment: "another lovely comment", CollectedBy: "andrea",
Philipp Schraderacf96232022-03-01 22:03:30 -0800263 },
264 },
265 }
266 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800267 HandleRequests(&db, scoutingServer)
Philipp Schraderacf96232022-03-01 22:03:30 -0800268 scoutingServer.Start(8080)
269 defer scoutingServer.Stop()
270
271 builder := flatbuffers.NewBuilder(1024)
272 builder.Finish((&request_data_scouting.RequestDataScoutingT{}).Pack(builder))
273
274 response, err := debug.RequestDataScouting("http://localhost:8080", builder.FinishedBytes())
275 if err != nil {
276 t.Fatal("Failed to request all matches: ", err)
277 }
278
279 expected := request_data_scouting_response.RequestDataScoutingResponseT{
280 StatsList: []*request_data_scouting_response.StatsT{
Philipp Schraderacf96232022-03-01 22:03:30 -0800281 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700282 Team: 971, Match: 1, SetNumber: 2, CompLevel: "quals",
Philipp Schrader36df73a2022-03-17 23:27:24 -0700283 MissedShotsAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
284 MissedShotsTele: 1, UpperGoalTele: 2, LowerGoalTele: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700285 DefenseRating: 7,
286 DefenseReceivedRating: 3,
287 CollectedBy: "john",
288 AutoBall1: true, AutoBall2: false, AutoBall3: false,
Philipp Schrader36df73a2022-03-17 23:27:24 -0700289 AutoBall4: false, AutoBall5: true,
290 StartingQuadrant: 1,
291 ClimbLevel: request_data_scouting_response.ClimbLevelFailedWithPlentyOfTime,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700292 Comment: "a lovely comment",
Philipp Schraderacf96232022-03-01 22:03:30 -0800293 },
294 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700295 Team: 972, Match: 1, SetNumber: 4, CompLevel: "extra",
Philipp Schrader36df73a2022-03-17 23:27:24 -0700296 MissedShotsAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
297 MissedShotsTele: 2, UpperGoalTele: 3, LowerGoalTele: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700298 DefenseRating: 8,
299 DefenseReceivedRating: 1,
300 CollectedBy: "andrea",
301 AutoBall1: false, AutoBall2: false, AutoBall3: true,
Philipp Schrader36df73a2022-03-17 23:27:24 -0700302 AutoBall4: false, AutoBall5: false,
303 StartingQuadrant: 2,
304 ClimbLevel: request_data_scouting_response.ClimbLevelMedium,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700305 Comment: "another lovely comment",
Philipp Schraderacf96232022-03-01 22:03:30 -0800306 },
307 },
308 }
309 if len(expected.StatsList) != len(response.StatsList) {
310 t.Fatal("Expected ", expected, ", but got ", *response)
311 }
312 for i, match := range expected.StatsList {
313 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
314 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
315 }
316 }
317}
318
Alex Perry81f96ba2022-03-13 18:26:19 -0700319func TestSubmitNotes(t *testing.T) {
320 database := MockDatabase{}
321 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800322 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700323 scoutingServer.Start(8080)
324 defer scoutingServer.Stop()
325
326 builder := flatbuffers.NewBuilder(1024)
327 builder.Finish((&submit_notes.SubmitNotesT{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800328 Team: 971,
329 Notes: "Notes",
330 GoodDriving: true,
331 BadDriving: false,
332 SketchyClimb: true,
333 SolidClimb: false,
334 GoodDefense: true,
335 BadDefense: false,
Alex Perry81f96ba2022-03-13 18:26:19 -0700336 }).Pack(builder))
337
338 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
339 if err != nil {
340 t.Fatal("Failed to submit notes: ", err)
341 }
342
343 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800344 {
345 TeamNumber: 971,
346 Notes: "Notes",
347 GoodDriving: true,
348 BadDriving: false,
349 SketchyClimb: true,
350 SolidClimb: false,
351 GoodDefense: true,
352 BadDefense: false,
353 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700354 }
355
356 if !reflect.DeepEqual(database.notes, expected) {
357 t.Fatal("Submitted notes did not match", expected, database.notes)
358 }
359}
360
361func TestRequestNotes(t *testing.T) {
362 database := MockDatabase{
363 notes: []db.NotesData{{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800364 TeamNumber: 971,
365 Notes: "Notes",
366 GoodDriving: true,
367 BadDriving: false,
368 SketchyClimb: true,
369 SolidClimb: false,
370 GoodDefense: true,
371 BadDefense: false,
Alex Perry81f96ba2022-03-13 18:26:19 -0700372 }},
373 }
374 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800375 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700376 scoutingServer.Start(8080)
377 defer scoutingServer.Stop()
378
379 builder := flatbuffers.NewBuilder(1024)
380 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
381 Team: 971,
382 }).Pack(builder))
383 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
384 if err != nil {
385 t.Fatal("Failed to submit notes: ", err)
386 }
387
388 if response.Notes[0].Data != "Notes" {
389 t.Fatal("requested notes did not match", response)
390 }
391}
392
Milo Lin1d59f0c2022-06-22 20:30:58 -0700393func TestRequestShiftSchedule(t *testing.T) {
394 db := MockDatabase{
395 shiftSchedule: []db.Shift{
396 {
397 MatchNumber: 1,
398 R1scouter: "Bob",
399 R2scouter: "James",
400 R3scouter: "Robert",
401 B1scouter: "Alice",
402 B2scouter: "Mary",
403 B3scouter: "Patricia",
404 },
405 {
406 MatchNumber: 2,
407 R1scouter: "Liam",
408 R2scouter: "Noah",
409 R3scouter: "Oliver",
410 B1scouter: "Emma",
411 B2scouter: "Charlotte",
412 B3scouter: "Amelia",
413 },
414 },
415 }
416 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800417 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700418 scoutingServer.Start(8080)
419 defer scoutingServer.Stop()
420
421 builder := flatbuffers.NewBuilder(1024)
422 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
423
424 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
425 if err != nil {
426 t.Fatal("Failed to request shift schedule: ", err)
427 }
428
429 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
430 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
431 {
432 MatchNumber: 1,
433 R1scouter: "Bob",
434 R2scouter: "James",
435 R3scouter: "Robert",
436 B1scouter: "Alice",
437 B2scouter: "Mary",
438 B3scouter: "Patricia",
439 },
440 {
441 MatchNumber: 2,
442 R1scouter: "Liam",
443 R2scouter: "Noah",
444 R3scouter: "Oliver",
445 B1scouter: "Emma",
446 B2scouter: "Charlotte",
447 B3scouter: "Amelia",
448 },
449 },
450 }
451 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
452 t.Fatal("Expected ", expected, ", but got ", *response)
453 }
454 for i, match := range expected.ShiftSchedule {
455 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
456 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
457 }
458 }
459}
460
461func TestSubmitShiftSchedule(t *testing.T) {
462 database := MockDatabase{}
463 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800464 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700465 scoutingServer.Start(8080)
466 defer scoutingServer.Stop()
467
468 builder := flatbuffers.NewBuilder(1024)
469 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
470 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
471 {MatchNumber: 1,
472 R1scouter: "Bob",
473 R2scouter: "James",
474 R3scouter: "Robert",
475 B1scouter: "Alice",
476 B2scouter: "Mary",
477 B3scouter: "Patricia"},
478 },
479 }).Pack(builder))
480
481 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
482 if err != nil {
483 t.Fatal("Failed to submit shift schedule: ", err)
484 }
485
486 expected := []db.Shift{
487 {MatchNumber: 1,
488 R1scouter: "Bob",
489 R2scouter: "James",
490 R3scouter: "Robert",
491 B1scouter: "Alice",
492 B2scouter: "Mary",
493 B3scouter: "Patricia"},
494 }
495 if !reflect.DeepEqual(expected, database.shiftSchedule) {
496 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
497 }
498}
499
Filip Kujawa210a03b2022-11-24 14:41:11 -0800500func TestSubmitDriverRanking(t *testing.T) {
501 database := MockDatabase{}
502 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800503 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800504 scoutingServer.Start(8080)
505 defer scoutingServer.Stop()
506
507 builder := flatbuffers.NewBuilder(1024)
508 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
509 MatchNumber: 36,
510 Rank1: 1234,
511 Rank2: 1235,
512 Rank3: 1236,
513 }).Pack(builder))
514
515 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
516 if err != nil {
517 t.Fatal("Failed to submit driver ranking: ", err)
518 }
519
520 expected := []db.DriverRankingData{
521 {MatchNumber: 36, Rank1: 1234, Rank2: 1235, Rank3: 1236},
522 }
523
524 if !reflect.DeepEqual(database.driver_ranking, expected) {
525 t.Fatal("Submitted notes did not match", expected, database.notes)
526 }
527}
528
Filip Kujawaf882e022022-12-14 13:14:08 -0800529// Validates that we can request the driver rankings.
530func TestRequestDriverRankings(t *testing.T) {
531 db := MockDatabase{
532 driver_ranking: []db.DriverRankingData{
533 {
534 MatchNumber: 36,
535 Rank1: 1234,
536 Rank2: 1235,
537 Rank3: 1236,
538 },
539 {
540 MatchNumber: 36,
541 Rank1: 101,
542 Rank2: 202,
543 Rank3: 303,
544 },
545 },
546 }
547 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800548 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800549 scoutingServer.Start(8080)
550 defer scoutingServer.Stop()
551
552 builder := flatbuffers.NewBuilder(1024)
553 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
554
555 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
556 if err != nil {
557 t.Fatal("Failed to request all driver rankings: ", err)
558 }
559
560 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
561 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
562 {
563 MatchNumber: 36,
564 Rank1: 1234,
565 Rank2: 1235,
566 Rank3: 1236,
567 },
568 {
569 MatchNumber: 36,
570 Rank1: 101,
571 Rank2: 202,
572 Rank3: 303,
573 },
574 },
575 }
576 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
577 t.Fatal("Expected ", expected, ", but got ", *response)
578 }
579 for i, match := range expected.DriverRankingList {
580 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
581 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
582 }
583 }
584}
585
586// Validates that we can request all notes.
587func TestRequestAllNotes(t *testing.T) {
588 db := MockDatabase{
589 notes: []db.NotesData{
590 {
591 TeamNumber: 971,
592 Notes: "Notes",
593 GoodDriving: true,
594 BadDriving: false,
595 SketchyClimb: true,
596 SolidClimb: false,
597 GoodDefense: true,
598 BadDefense: false,
599 },
600 {
601 TeamNumber: 972,
602 Notes: "More Notes",
603 GoodDriving: false,
604 BadDriving: false,
605 SketchyClimb: false,
606 SolidClimb: true,
607 GoodDefense: false,
608 BadDefense: true,
609 },
610 },
611 }
612 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800613 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800614 scoutingServer.Start(8080)
615 defer scoutingServer.Stop()
616
617 builder := flatbuffers.NewBuilder(1024)
618 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
619
620 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
621 if err != nil {
622 t.Fatal("Failed to request all notes: ", err)
623 }
624
625 expected := request_all_notes_response.RequestAllNotesResponseT{
626 NoteList: []*request_all_notes_response.NoteT{
627 {
628 Team: 971,
629 Notes: "Notes",
630 GoodDriving: true,
631 BadDriving: false,
632 SketchyClimb: true,
633 SolidClimb: false,
634 GoodDefense: true,
635 BadDefense: false,
636 },
637 {
638 Team: 972,
639 Notes: "More Notes",
640 GoodDriving: false,
641 BadDriving: false,
642 SketchyClimb: false,
643 SolidClimb: true,
644 GoodDefense: false,
645 BadDefense: true,
646 },
647 },
648 }
649 if len(expected.NoteList) != len(response.NoteList) {
650 t.Fatal("Expected ", expected, ", but got ", *response)
651 }
652 for i, note := range expected.NoteList {
653 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
654 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
655 }
656 }
657}
658
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800659// A mocked database we can use for testing. Add functionality to this as
660// needed for your tests.
661
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800662type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800663 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -0800664 stats []db.Stats
665 notes []db.NotesData
666 shiftSchedule []db.Shift
667 driver_ranking []db.DriverRankingData
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800668}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800669
Emily Markovabf24c9e2023-02-08 20:31:11 -0800670func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -0800671 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800672 return nil
673}
674
Philipp Schrader30005e42022-03-06 13:53:58 -0800675func (database *MockDatabase) AddToStats(stats db.Stats) error {
676 database.stats = append(database.stats, stats)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800677 return nil
678}
679
Emily Markovabf24c9e2023-02-08 20:31:11 -0800680func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800681 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800682}
683
684func (database *MockDatabase) ReturnStats() ([]db.Stats, error) {
Philipp Schraderacf96232022-03-01 22:03:30 -0800685 return database.stats, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800686}
687
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800688func (database *MockDatabase) QueryStats(int) ([]db.Stats, error) {
689 return []db.Stats{}, nil
690}
Philipp Schraderd3fac192022-03-02 20:35:46 -0800691
Philipp Schradereecb8962022-06-01 21:02:42 -0700692func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -0700693 var results []string
694 for _, data := range database.notes {
695 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -0700696 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -0700697 }
698 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700699 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -0700700}
701
Filip Kujawaf947cb42022-11-21 10:00:30 -0800702func (database *MockDatabase) AddNotes(data db.NotesData) error {
703 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -0700704 return nil
705}
706
Filip Kujawaf882e022022-12-14 13:14:08 -0800707func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
708 return database.notes, nil
709}
710
Milo Lin1d59f0c2022-06-22 20:30:58 -0700711func (database *MockDatabase) AddToShift(data db.Shift) error {
712 database.shiftSchedule = append(database.shiftSchedule, data)
713 return nil
714}
715
716func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
717 return database.shiftSchedule, nil
718}
719
720func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
721 return []db.Shift{}, nil
722}
723
Filip Kujawa210a03b2022-11-24 14:41:11 -0800724func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
725 database.driver_ranking = append(database.driver_ranking, data)
726 return nil
727}
728
Filip Kujawaf882e022022-12-14 13:14:08 -0800729func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
730 return database.driver_ranking, nil
731}