blob: fb0be5c5393b073ddbde346571f7590d2ae4f6c9 [file] [log] [blame]
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08001package requests
2
3import (
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08004 "net/http"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08005 "reflect"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08006 "testing"
7
Philipp Schrader8747f1b2022-02-23 23:56:22 -08008 "github.com/frc971/971-Robot-Code/scouting/db"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08009 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/debug"
Emily Markova290147d2023-03-03 22:40:06 -080010 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting"
11 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080012 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
13 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080014 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
15 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080016 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
17 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070018 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Milo Lin1d59f0c2022-06-22 20:30:58 -070019 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
20 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Emily Markova1abe9782023-03-11 19:45:38 -080021 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions"
Filip Kujawa210a03b2022-11-24 14:41:11 -080022 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
Alex Perry81f96ba2022-03-13 18:26:19 -070023 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Milo Lin1d59f0c2022-06-22 20:30:58 -070024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080025 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
26 flatbuffers "github.com/google/flatbuffers/go"
27)
28
29// Validates that an unhandled address results in a 404.
30func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080031 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080032 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080033 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080034 scoutingServer.Start(8080)
35 defer scoutingServer.Stop()
36
37 resp, err := http.Get("http://localhost:8080/requests/foo")
38 if err != nil {
39 t.Fatalf("Failed to get data: %v", err)
40 }
41 if resp.StatusCode != http.StatusNotFound {
42 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
43 }
44}
45
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080046// Validates that we can request the full match list.
47func TestRequestAllMatches(t *testing.T) {
48 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -080049 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080050 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080051 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070052 Alliance: "R", AlliancePosition: 1, TeamNumber: "5",
Emily Markovabf24c9e2023-02-08 20:31:11 -080053 },
54 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080055 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070056 Alliance: "R", AlliancePosition: 2, TeamNumber: "42",
Emily Markovabf24c9e2023-02-08 20:31:11 -080057 },
58 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080059 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070060 Alliance: "R", AlliancePosition: 3, TeamNumber: "600",
Emily Markovabf24c9e2023-02-08 20:31:11 -080061 },
62 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080063 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070064 Alliance: "B", AlliancePosition: 1, TeamNumber: "971",
Emily Markovabf24c9e2023-02-08 20:31:11 -080065 },
66 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080067 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070068 Alliance: "B", AlliancePosition: 2, TeamNumber: "400",
Emily Markovabf24c9e2023-02-08 20:31:11 -080069 },
70 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080071 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070072 Alliance: "B", AlliancePosition: 3, TeamNumber: "200",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080073 },
74 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080075 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070076 Alliance: "R", AlliancePosition: 1, TeamNumber: "6",
Emily Markovabf24c9e2023-02-08 20:31:11 -080077 },
78 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080079 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070080 Alliance: "R", AlliancePosition: 2, TeamNumber: "43",
Emily Markovabf24c9e2023-02-08 20:31:11 -080081 },
82 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080083 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070084 Alliance: "R", AlliancePosition: 3, TeamNumber: "601",
Emily Markovabf24c9e2023-02-08 20:31:11 -080085 },
86 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080087 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070088 Alliance: "B", AlliancePosition: 1, TeamNumber: "972",
Emily Markovabf24c9e2023-02-08 20:31:11 -080089 },
90 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080091 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070092 Alliance: "B", AlliancePosition: 2, TeamNumber: "401",
Emily Markovabf24c9e2023-02-08 20:31:11 -080093 },
94 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080095 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070096 Alliance: "B", AlliancePosition: 3, TeamNumber: "201",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080097 },
98 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080099 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700100 Alliance: "R", AlliancePosition: 1, TeamNumber: "7",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800101 },
102 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800103 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700104 Alliance: "R", AlliancePosition: 2, TeamNumber: "44",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800105 },
106 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800107 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700108 Alliance: "R", AlliancePosition: 3, TeamNumber: "602",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800109 },
110 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800111 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700112 Alliance: "B", AlliancePosition: 1, TeamNumber: "973",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800113 },
114 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800115 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700116 Alliance: "B", AlliancePosition: 2, TeamNumber: "402",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800117 },
118 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800119 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700120 Alliance: "B", AlliancePosition: 3, TeamNumber: "202",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800121 },
122 },
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800123 // Pretend that we have some data scouting data.
124 stats2023: []db.Stats2023{
125 {
126 TeamNumber: "5", MatchNumber: 1, SetNumber: 1,
127 CompLevel: "qm", StartingQuadrant: 3, LowCubesAuto: 10,
128 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
129 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
130 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
131 HighCubes: 2, CubesDropped: 1, LowCones: 1,
132 MiddleCones: 2, HighCones: 0, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700133 AvgCycle: 34, DockedAuto: true, EngagedAuto: true,
134 Docked: false, Engaged: false, CollectedBy: "alex",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800135 },
136 {
137 TeamNumber: "973", MatchNumber: 3, SetNumber: 1,
138 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
139 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
140 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
141 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
142 HighCubes: 1, CubesDropped: 0, LowCones: 0,
143 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700144 AvgCycle: 53, DockedAuto: true, EngagedAuto: false,
145 Docked: false, Engaged: false, CollectedBy: "bob",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800146 },
147 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800148 }
149 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800150 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800151 scoutingServer.Start(8080)
152 defer scoutingServer.Stop()
153
154 builder := flatbuffers.NewBuilder(1024)
155 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
156
157 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
158 if err != nil {
159 t.Fatal("Failed to request all matches: ", err)
160 }
161
162 expected := request_all_matches_response.RequestAllMatchesResponseT{
163 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700164 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800165 // R1, R2, R3, B1, B2, B3
166 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800167 1, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700168 "5", "42", "600", "971", "400", "200",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800169 &request_all_matches_response.ScoutedLevelT{
170 // The R1 team has already been data
171 // scouted.
172 true, false, false, false, false, false,
173 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800174 },
175 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800176 2, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700177 "6", "43", "601", "972", "401", "201",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800178 &request_all_matches_response.ScoutedLevelT{
179 false, false, false, false, false, false,
180 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800181 },
182 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800183 3, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700184 "7", "44", "602", "973", "402", "202",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800185 &request_all_matches_response.ScoutedLevelT{
186 // The B1 team has already been data
187 // scouted.
188 false, false, false, true, false, false,
189 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800190 },
191 },
192 }
193 if len(expected.MatchList) != len(response.MatchList) {
194 t.Fatal("Expected ", expected, ", but got ", *response)
195 }
196 for i, match := range expected.MatchList {
197 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
198 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
199 }
200 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800201
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800202}
203
Emily Markova290147d2023-03-03 22:40:06 -0800204// Validates that we can request the 2023 stats.
205func TestRequest2023DataScouting(t *testing.T) {
206 db := MockDatabase{
207 stats2023: []db.Stats2023{
208 {
209 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
210 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
211 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
212 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
213 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
214 HighCubes: 2, CubesDropped: 1, LowCones: 1,
215 MiddleCones: 2, HighCones: 0, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700216 AvgCycle: 34, DockedAuto: true, EngagedAuto: false,
217 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800218 },
219 {
220 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
221 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
222 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
223 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
224 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
225 HighCubes: 1, CubesDropped: 0, LowCones: 0,
226 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700227 AvgCycle: 53, DockedAuto: false, EngagedAuto: false,
228 Docked: false, Engaged: false, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800229 },
230 },
231 }
232 scoutingServer := server.NewScoutingServer()
233 HandleRequests(&db, scoutingServer)
234 scoutingServer.Start(8080)
235 defer scoutingServer.Stop()
236
237 builder := flatbuffers.NewBuilder(1024)
238 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
239
240 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
241 if err != nil {
242 t.Fatal("Failed to request all matches: ", err)
243 }
244
245 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
246 StatsList: []*request_2023_data_scouting_response.Stats2023T{
247 {
248 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
249 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
250 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
251 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
252 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
253 HighCubes: 2, CubesDropped: 1, LowCones: 1,
254 MiddleCones: 2, HighCones: 0, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700255 AvgCycle: 34, DockedAuto: true, EngagedAuto: false,
256 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800257 },
258 {
259 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
260 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
261 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
262 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
263 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
264 HighCubes: 1, CubesDropped: 0, LowCones: 0,
265 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700266 AvgCycle: 53, DockedAuto: false, EngagedAuto: false,
267 Docked: false, Engaged: false, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800268 },
269 },
270 }
271 if len(expected.StatsList) != len(response.StatsList) {
272 t.Fatal("Expected ", expected, ", but got ", *response)
273 }
274 for i, match := range expected.StatsList {
275 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
276 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
277 }
278 }
279}
280
Emily Markova1abe9782023-03-11 19:45:38 -0800281// Validates that we can request the 2023 stats.
282func TestConvertActionsToStat(t *testing.T) {
283 builder := flatbuffers.NewBuilder(1024)
284 builder.Finish((&submit_actions.SubmitActionsT{
285 TeamNumber: "4244",
286 MatchNumber: 3,
287 SetNumber: 1,
288 CompLevel: "quals",
289 CollectedBy: "katie",
290 ActionsList: []*submit_actions.ActionT{
291 {
292 ActionTaken: &submit_actions.ActionTypeT{
293 Type: submit_actions.ActionTypeStartMatchAction,
294 Value: &submit_actions.StartMatchActionT{
295 Position: 1,
296 },
297 },
298 Timestamp: 0,
299 },
300 {
301 ActionTaken: &submit_actions.ActionTypeT{
302 Type: submit_actions.ActionTypePickupObjectAction,
303 Value: &submit_actions.PickupObjectActionT{
304 ObjectType: submit_actions.ObjectTypekCube,
305 Auto: true,
306 },
307 },
308 Timestamp: 400,
309 },
310 {
311 ActionTaken: &submit_actions.ActionTypeT{
312 Type: submit_actions.ActionTypePickupObjectAction,
313 Value: &submit_actions.PickupObjectActionT{
314 ObjectType: submit_actions.ObjectTypekCube,
315 Auto: true,
316 },
317 },
318 Timestamp: 800,
319 },
320 {
321 ActionTaken: &submit_actions.ActionTypeT{
322 Type: submit_actions.ActionTypePlaceObjectAction,
323 Value: &submit_actions.PlaceObjectActionT{
324 ObjectType: submit_actions.ObjectTypekCube,
325 ScoreLevel: submit_actions.ScoreLevelkLow,
326 Auto: true,
327 },
328 },
329 Timestamp: 2000,
330 },
331 {
332 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700333 Type: submit_actions.ActionTypeAutoBalanceAction,
334 Value: &submit_actions.AutoBalanceActionT{
335 Docked: true,
336 Engaged: true,
337 },
338 },
339 Timestamp: 2400,
340 },
341 {
342 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova1abe9782023-03-11 19:45:38 -0800343 Type: submit_actions.ActionTypePickupObjectAction,
344 Value: &submit_actions.PickupObjectActionT{
345 ObjectType: submit_actions.ObjectTypekCone,
346 Auto: false,
347 },
348 },
349 Timestamp: 2800,
350 },
351 {
352 ActionTaken: &submit_actions.ActionTypeT{
353 Type: submit_actions.ActionTypePlaceObjectAction,
354 Value: &submit_actions.PlaceObjectActionT{
355 ObjectType: submit_actions.ObjectTypekCone,
356 ScoreLevel: submit_actions.ScoreLevelkHigh,
357 Auto: false,
358 },
359 },
360 Timestamp: 3100,
361 },
Emily Markova46a69bf2023-03-22 20:45:52 -0700362 {
363 ActionTaken: &submit_actions.ActionTypeT{
364 Type: submit_actions.ActionTypeEndMatchAction,
365 Value: &submit_actions.EndMatchActionT{
366 Docked: true,
367 Engaged: false,
368 },
369 },
370 Timestamp: 4000,
371 },
Emily Markova1abe9782023-03-11 19:45:38 -0800372 },
373 }).Pack(builder))
374
375 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
376 response, err := ConvertActionsToStat(submitActions)
377
378 if err != nil {
379 t.Fatal("Failed to convert actions to stats: ", err)
380 }
381
382 expected := db.Stats2023{
383 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
384 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
385 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
386 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
387 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
388 HighCubes: 0, CubesDropped: 0, LowCones: 0,
389 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700390 AvgCycle: 1100, DockedAuto: true, EngagedAuto: true,
391 Docked: true, Engaged: false, CollectedBy: "katie",
Emily Markova1abe9782023-03-11 19:45:38 -0800392 }
393
394 if expected != response {
395 t.Fatal("Expected ", expected, ", but got ", response)
396 }
397}
398
Alex Perry81f96ba2022-03-13 18:26:19 -0700399func TestSubmitNotes(t *testing.T) {
400 database := MockDatabase{}
401 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800402 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700403 scoutingServer.Start(8080)
404 defer scoutingServer.Stop()
405
406 builder := flatbuffers.NewBuilder(1024)
407 builder.Finish((&submit_notes.SubmitNotesT{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800408 Team: 971,
409 Notes: "Notes",
410 GoodDriving: true,
411 BadDriving: false,
Filip Kujawa6f7f0b32023-03-30 13:26:08 -0700412 SolidPickup: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800413 SketchyPlacing: false,
414 GoodDefense: true,
415 BadDefense: false,
416 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700417 }).Pack(builder))
418
419 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
420 if err != nil {
421 t.Fatal("Failed to submit notes: ", err)
422 }
423
424 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800425 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800426 TeamNumber: 971,
427 Notes: "Notes",
428 GoodDriving: true,
429 BadDriving: false,
Filip Kujawa6f7f0b32023-03-30 13:26:08 -0700430 SolidPickup: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800431 SketchyPlacing: false,
432 GoodDefense: true,
433 BadDefense: false,
434 EasilyDefended: true,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800435 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700436 }
437
438 if !reflect.DeepEqual(database.notes, expected) {
439 t.Fatal("Submitted notes did not match", expected, database.notes)
440 }
441}
442
443func TestRequestNotes(t *testing.T) {
444 database := MockDatabase{
445 notes: []db.NotesData{{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800446 TeamNumber: 971,
447 Notes: "Notes",
448 GoodDriving: true,
449 BadDriving: false,
Filip Kujawa6f7f0b32023-03-30 13:26:08 -0700450 SolidPickup: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800451 SketchyPlacing: false,
452 GoodDefense: true,
453 BadDefense: false,
454 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700455 }},
456 }
457 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800458 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700459 scoutingServer.Start(8080)
460 defer scoutingServer.Stop()
461
462 builder := flatbuffers.NewBuilder(1024)
463 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
464 Team: 971,
465 }).Pack(builder))
466 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
467 if err != nil {
468 t.Fatal("Failed to submit notes: ", err)
469 }
470
471 if response.Notes[0].Data != "Notes" {
472 t.Fatal("requested notes did not match", response)
473 }
474}
475
Milo Lin1d59f0c2022-06-22 20:30:58 -0700476func TestRequestShiftSchedule(t *testing.T) {
477 db := MockDatabase{
478 shiftSchedule: []db.Shift{
479 {
480 MatchNumber: 1,
481 R1scouter: "Bob",
482 R2scouter: "James",
483 R3scouter: "Robert",
484 B1scouter: "Alice",
485 B2scouter: "Mary",
486 B3scouter: "Patricia",
487 },
488 {
489 MatchNumber: 2,
490 R1scouter: "Liam",
491 R2scouter: "Noah",
492 R3scouter: "Oliver",
493 B1scouter: "Emma",
494 B2scouter: "Charlotte",
495 B3scouter: "Amelia",
496 },
497 },
498 }
499 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800500 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700501 scoutingServer.Start(8080)
502 defer scoutingServer.Stop()
503
504 builder := flatbuffers.NewBuilder(1024)
505 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
506
507 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
508 if err != nil {
509 t.Fatal("Failed to request shift schedule: ", err)
510 }
511
512 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
513 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
514 {
515 MatchNumber: 1,
516 R1scouter: "Bob",
517 R2scouter: "James",
518 R3scouter: "Robert",
519 B1scouter: "Alice",
520 B2scouter: "Mary",
521 B3scouter: "Patricia",
522 },
523 {
524 MatchNumber: 2,
525 R1scouter: "Liam",
526 R2scouter: "Noah",
527 R3scouter: "Oliver",
528 B1scouter: "Emma",
529 B2scouter: "Charlotte",
530 B3scouter: "Amelia",
531 },
532 },
533 }
534 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
535 t.Fatal("Expected ", expected, ", but got ", *response)
536 }
537 for i, match := range expected.ShiftSchedule {
538 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
539 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
540 }
541 }
542}
543
544func TestSubmitShiftSchedule(t *testing.T) {
545 database := MockDatabase{}
546 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800547 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700548 scoutingServer.Start(8080)
549 defer scoutingServer.Stop()
550
551 builder := flatbuffers.NewBuilder(1024)
552 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
553 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
554 {MatchNumber: 1,
555 R1scouter: "Bob",
556 R2scouter: "James",
557 R3scouter: "Robert",
558 B1scouter: "Alice",
559 B2scouter: "Mary",
560 B3scouter: "Patricia"},
561 },
562 }).Pack(builder))
563
564 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
565 if err != nil {
566 t.Fatal("Failed to submit shift schedule: ", err)
567 }
568
569 expected := []db.Shift{
570 {MatchNumber: 1,
571 R1scouter: "Bob",
572 R2scouter: "James",
573 R3scouter: "Robert",
574 B1scouter: "Alice",
575 B2scouter: "Mary",
576 B3scouter: "Patricia"},
577 }
578 if !reflect.DeepEqual(expected, database.shiftSchedule) {
579 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
580 }
581}
582
Filip Kujawa210a03b2022-11-24 14:41:11 -0800583func TestSubmitDriverRanking(t *testing.T) {
584 database := MockDatabase{}
585 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800586 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800587 scoutingServer.Start(8080)
588 defer scoutingServer.Stop()
589
590 builder := flatbuffers.NewBuilder(1024)
591 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
592 MatchNumber: 36,
593 Rank1: 1234,
594 Rank2: 1235,
595 Rank3: 1236,
596 }).Pack(builder))
597
598 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
599 if err != nil {
600 t.Fatal("Failed to submit driver ranking: ", err)
601 }
602
603 expected := []db.DriverRankingData{
604 {MatchNumber: 36, Rank1: 1234, Rank2: 1235, Rank3: 1236},
605 }
606
607 if !reflect.DeepEqual(database.driver_ranking, expected) {
608 t.Fatal("Submitted notes did not match", expected, database.notes)
609 }
610}
611
Filip Kujawaf882e022022-12-14 13:14:08 -0800612// Validates that we can request the driver rankings.
613func TestRequestDriverRankings(t *testing.T) {
614 db := MockDatabase{
615 driver_ranking: []db.DriverRankingData{
616 {
617 MatchNumber: 36,
618 Rank1: 1234,
619 Rank2: 1235,
620 Rank3: 1236,
621 },
622 {
623 MatchNumber: 36,
624 Rank1: 101,
625 Rank2: 202,
626 Rank3: 303,
627 },
628 },
629 }
630 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800631 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800632 scoutingServer.Start(8080)
633 defer scoutingServer.Stop()
634
635 builder := flatbuffers.NewBuilder(1024)
636 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
637
638 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
639 if err != nil {
640 t.Fatal("Failed to request all driver rankings: ", err)
641 }
642
643 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
644 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
645 {
646 MatchNumber: 36,
647 Rank1: 1234,
648 Rank2: 1235,
649 Rank3: 1236,
650 },
651 {
652 MatchNumber: 36,
653 Rank1: 101,
654 Rank2: 202,
655 Rank3: 303,
656 },
657 },
658 }
659 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
660 t.Fatal("Expected ", expected, ", but got ", *response)
661 }
662 for i, match := range expected.DriverRankingList {
663 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
664 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
665 }
666 }
667}
668
669// Validates that we can request all notes.
670func TestRequestAllNotes(t *testing.T) {
671 db := MockDatabase{
672 notes: []db.NotesData{
673 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800674 TeamNumber: 971,
675 Notes: "Notes",
676 GoodDriving: true,
677 BadDriving: false,
Filip Kujawa6f7f0b32023-03-30 13:26:08 -0700678 SolidPickup: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800679 SketchyPlacing: false,
680 GoodDefense: true,
681 BadDefense: false,
682 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800683 },
684 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800685 TeamNumber: 972,
686 Notes: "More Notes",
687 GoodDriving: false,
688 BadDriving: false,
Filip Kujawa6f7f0b32023-03-30 13:26:08 -0700689 SolidPickup: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800690 SketchyPlacing: true,
691 GoodDefense: false,
692 BadDefense: true,
693 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800694 },
695 },
696 }
697 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800698 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800699 scoutingServer.Start(8080)
700 defer scoutingServer.Stop()
701
702 builder := flatbuffers.NewBuilder(1024)
703 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
704
705 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
706 if err != nil {
707 t.Fatal("Failed to request all notes: ", err)
708 }
709
710 expected := request_all_notes_response.RequestAllNotesResponseT{
711 NoteList: []*request_all_notes_response.NoteT{
712 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800713 Team: 971,
714 Notes: "Notes",
715 GoodDriving: true,
716 BadDriving: false,
Filip Kujawa6f7f0b32023-03-30 13:26:08 -0700717 SolidPickup: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800718 SketchyPlacing: false,
719 GoodDefense: true,
720 BadDefense: false,
721 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800722 },
723 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800724 Team: 972,
725 Notes: "More Notes",
726 GoodDriving: false,
727 BadDriving: false,
Filip Kujawa6f7f0b32023-03-30 13:26:08 -0700728 SolidPickup: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800729 SketchyPlacing: true,
730 GoodDefense: false,
731 BadDefense: true,
732 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800733 },
734 },
735 }
736 if len(expected.NoteList) != len(response.NoteList) {
737 t.Fatal("Expected ", expected, ", but got ", *response)
738 }
739 for i, note := range expected.NoteList {
740 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
741 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
742 }
743 }
744}
745
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800746// A mocked database we can use for testing. Add functionality to this as
747// needed for your tests.
748
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800749type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800750 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -0800751 notes []db.NotesData
752 shiftSchedule []db.Shift
753 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -0800754 stats2023 []db.Stats2023
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800755}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800756
Emily Markovabf24c9e2023-02-08 20:31:11 -0800757func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -0800758 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800759 return nil
760}
761
Emily Markova290147d2023-03-03 22:40:06 -0800762func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
763 database.stats2023 = append(database.stats2023, stats2023)
764 return nil
765}
Emily Markovabf24c9e2023-02-08 20:31:11 -0800766func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800767 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800768}
769
Emily Markova290147d2023-03-03 22:40:06 -0800770func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
771 return database.stats2023, nil
772}
773
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800774func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string) ([]db.Stats2023, error) {
775 var results []db.Stats2023
776 for _, stats := range database.stats2023 {
777 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel {
778 results = append(results, stats)
779 }
780 }
781 return results, nil
782}
783
Philipp Schradereecb8962022-06-01 21:02:42 -0700784func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -0700785 var results []string
786 for _, data := range database.notes {
787 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -0700788 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -0700789 }
790 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700791 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -0700792}
793
Filip Kujawaf947cb42022-11-21 10:00:30 -0800794func (database *MockDatabase) AddNotes(data db.NotesData) error {
795 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -0700796 return nil
797}
798
Filip Kujawaf882e022022-12-14 13:14:08 -0800799func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
800 return database.notes, nil
801}
802
Milo Lin1d59f0c2022-06-22 20:30:58 -0700803func (database *MockDatabase) AddToShift(data db.Shift) error {
804 database.shiftSchedule = append(database.shiftSchedule, data)
805 return nil
806}
807
808func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
809 return database.shiftSchedule, nil
810}
811
812func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
813 return []db.Shift{}, nil
814}
815
Filip Kujawa210a03b2022-11-24 14:41:11 -0800816func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
817 database.driver_ranking = append(database.driver_ranking, data)
818 return nil
819}
820
Filip Kujawaf882e022022-12-14 13:14:08 -0800821func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
822 return database.driver_ranking, nil
823}