blob: 67244d3b4fc3a2dd5732b85458319130ce8058bf [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"
Filip Kujawac1ded372023-05-27 14:33:43 -070010 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/delete_2023_data_scouting"
Emily Markova8cb91312024-02-02 12:30:37 -080011 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/delete_2024_data_scouting"
Emily Markova290147d2023-03-03 22:40:06 -080012 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting"
13 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting_response"
Emily Markova8cb91312024-02-02 12:30:37 -080014 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2024_data_scouting"
15 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2024_data_scouting_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080016 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
17 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080018 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
19 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080020 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
21 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
Emily Markova8e39f452023-12-23 12:17:30 -080022 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images"
23 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Emily Markovafaecfe12023-07-01 12:40:03 -070025 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images"
26 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images_response"
Milo Lin1d59f0c2022-06-22 20:30:58 -070027 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
28 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Emily Markova8cb91312024-02-02 12:30:37 -080029 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_2024_actions"
Emily Markova1abe9782023-03-11 19:45:38 -080030 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions"
Filip Kujawa210a03b2022-11-24 14:41:11 -080031 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
Alex Perry81f96ba2022-03-13 18:26:19 -070032 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Emily Markovafaecfe12023-07-01 12:40:03 -070033 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_pit_image"
Milo Lin1d59f0c2022-06-22 20:30:58 -070034 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080035 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
36 flatbuffers "github.com/google/flatbuffers/go"
37)
38
39// Validates that an unhandled address results in a 404.
40func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080041 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080042 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080043 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080044 scoutingServer.Start(8080)
45 defer scoutingServer.Stop()
46
47 resp, err := http.Get("http://localhost:8080/requests/foo")
48 if err != nil {
49 t.Fatalf("Failed to get data: %v", err)
50 }
51 if resp.StatusCode != http.StatusNotFound {
52 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
53 }
54}
55
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080056// Validates that we can request the full match list.
57func TestRequestAllMatches(t *testing.T) {
58 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -080059 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080060 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080061 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070062 Alliance: "R", AlliancePosition: 1, TeamNumber: "5",
Emily Markovabf24c9e2023-02-08 20:31:11 -080063 },
64 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080065 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070066 Alliance: "R", AlliancePosition: 2, TeamNumber: "42",
Emily Markovabf24c9e2023-02-08 20:31:11 -080067 },
68 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080069 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070070 Alliance: "R", AlliancePosition: 3, TeamNumber: "600",
Emily Markovabf24c9e2023-02-08 20:31:11 -080071 },
72 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080073 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070074 Alliance: "B", AlliancePosition: 1, TeamNumber: "971",
Emily Markovabf24c9e2023-02-08 20:31:11 -080075 },
76 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080077 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070078 Alliance: "B", AlliancePosition: 2, TeamNumber: "400",
Emily Markovabf24c9e2023-02-08 20:31:11 -080079 },
80 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080081 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070082 Alliance: "B", AlliancePosition: 3, TeamNumber: "200",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080083 },
84 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080085 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070086 Alliance: "R", AlliancePosition: 1, TeamNumber: "6",
Emily Markovabf24c9e2023-02-08 20:31:11 -080087 },
88 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080089 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070090 Alliance: "R", AlliancePosition: 2, TeamNumber: "43",
Emily Markovabf24c9e2023-02-08 20:31:11 -080091 },
92 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080093 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070094 Alliance: "R", AlliancePosition: 3, TeamNumber: "601",
Emily Markovabf24c9e2023-02-08 20:31:11 -080095 },
96 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080097 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070098 Alliance: "B", AlliancePosition: 1, TeamNumber: "972",
Emily Markovabf24c9e2023-02-08 20:31:11 -080099 },
100 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800101 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700102 Alliance: "B", AlliancePosition: 2, TeamNumber: "401",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800103 },
104 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800105 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700106 Alliance: "B", AlliancePosition: 3, TeamNumber: "201",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800107 },
108 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800109 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700110 Alliance: "R", AlliancePosition: 1, TeamNumber: "7",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800111 },
112 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800113 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700114 Alliance: "R", AlliancePosition: 2, TeamNumber: "44",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800115 },
116 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800117 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700118 Alliance: "R", AlliancePosition: 3, TeamNumber: "602",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800119 },
120 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800121 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700122 Alliance: "B", AlliancePosition: 1, TeamNumber: "973",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800123 },
124 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800125 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700126 Alliance: "B", AlliancePosition: 2, TeamNumber: "402",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800127 },
128 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800129 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700130 Alliance: "B", AlliancePosition: 3, TeamNumber: "202",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800131 },
132 },
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800133 // Pretend that we have some data scouting data.
134 stats2023: []db.Stats2023{
135 {
136 TeamNumber: "5", MatchNumber: 1, SetNumber: 1,
137 CompLevel: "qm", StartingQuadrant: 3, LowCubesAuto: 10,
138 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
139 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
140 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
141 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700142 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700143 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700144 BalanceAttemptAuto: false, Docked: false, Engaged: false,
145 BalanceAttempt: false, CollectedBy: "alex",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800146 },
147 {
148 TeamNumber: "973", MatchNumber: 3, SetNumber: 1,
149 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
150 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
151 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
152 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
153 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700154 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700155 AvgCycle: 53, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700156 BalanceAttemptAuto: false, Docked: false, Engaged: false,
157 BalanceAttempt: true, CollectedBy: "bob",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800158 },
159 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800160 }
161 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800162 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800163 scoutingServer.Start(8080)
164 defer scoutingServer.Stop()
165
166 builder := flatbuffers.NewBuilder(1024)
167 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
168
169 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
170 if err != nil {
171 t.Fatal("Failed to request all matches: ", err)
172 }
173
174 expected := request_all_matches_response.RequestAllMatchesResponseT{
175 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700176 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800177 // R1, R2, R3, B1, B2, B3
178 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800179 1, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700180 "5", "42", "600", "971", "400", "200",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800181 &request_all_matches_response.ScoutedLevelT{
182 // The R1 team has already been data
183 // scouted.
184 true, false, false, false, false, false,
185 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800186 },
187 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800188 2, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700189 "6", "43", "601", "972", "401", "201",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800190 &request_all_matches_response.ScoutedLevelT{
191 false, false, false, false, false, false,
192 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800193 },
194 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800195 3, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700196 "7", "44", "602", "973", "402", "202",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800197 &request_all_matches_response.ScoutedLevelT{
198 // The B1 team has already been data
199 // scouted.
200 false, false, false, true, false, false,
201 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800202 },
203 },
204 }
205 if len(expected.MatchList) != len(response.MatchList) {
206 t.Fatal("Expected ", expected, ", but got ", *response)
207 }
208 for i, match := range expected.MatchList {
209 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
210 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
211 }
212 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800213
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800214}
215
Emily Markova8cb91312024-02-02 12:30:37 -0800216// Validates that we can request the 2024 stats.
217func TestRequest2024DataScouting(t *testing.T) {
218 db := MockDatabase{
219 stats2024: []db.Stats2024{
220 {
221 PreScouting: false, TeamNumber: "342",
222 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
223 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
224 Speaker: 4, Amp: 2, SpeakerAmplified: 1, AmpAmplified: 0,
225 NotesDropped: 2, Penalties: 2, TrapNote: true, AvgCycle: 0,
226 Park: true, OnStage: false, Harmony: false, CollectedBy: "alex",
227 },
228 {
229 PreScouting: false, TeamNumber: "982",
230 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
231 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
232 Speaker: 0, Amp: 2, SpeakerAmplified: 3, AmpAmplified: 2,
233 NotesDropped: 1, Penalties: 0, TrapNote: false, AvgCycle: 0,
234 Park: false, OnStage: true, Harmony: false, CollectedBy: "george",
235 },
236 },
237 }
238 scoutingServer := server.NewScoutingServer()
239 HandleRequests(&db, scoutingServer)
240 scoutingServer.Start(8080)
241 defer scoutingServer.Stop()
242
243 builder := flatbuffers.NewBuilder(1024)
244 builder.Finish((&request_2024_data_scouting.Request2024DataScoutingT{}).Pack(builder))
245
246 response, err := debug.Request2024DataScouting("http://localhost:8080", builder.FinishedBytes())
247 if err != nil {
248 t.Fatal("Failed to request all matches: ", err)
249 }
250
251 expected := request_2024_data_scouting_response.Request2024DataScoutingResponseT{
252 StatsList: []*request_2024_data_scouting_response.Stats2024T{
253 {
254 PreScouting: false, TeamNumber: "342",
255 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
256 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
257 Speaker: 4, Amp: 2, SpeakerAmplified: 1, AmpAmplified: 0,
258 NotesDropped: 2, Penalties: 2, TrapNote: true, AvgCycle: 0,
259 Park: true, OnStage: false, Harmony: false, CollectedBy: "alex",
260 },
261 {
262 PreScouting: false, TeamNumber: "982",
263 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
264 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
265 Speaker: 0, Amp: 2, SpeakerAmplified: 3, AmpAmplified: 2,
266 NotesDropped: 1, Penalties: 0, TrapNote: false, AvgCycle: 0,
267 Park: false, OnStage: true, Harmony: false, CollectedBy: "george",
268 },
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 Markova290147d2023-03-03 22:40:06 -0800281// Validates that we can request the 2023 stats.
282func TestRequest2023DataScouting(t *testing.T) {
283 db := MockDatabase{
284 stats2023: []db.Stats2023{
285 {
286 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
287 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
288 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
289 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
290 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
291 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700292 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700293 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700294 BalanceAttemptAuto: false, Docked: false, Engaged: false,
295 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800296 },
297 {
298 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
299 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
300 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
301 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
302 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
303 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700304 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700305 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700306 BalanceAttemptAuto: true, Docked: false, Engaged: false,
307 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800308 },
309 },
310 }
311 scoutingServer := server.NewScoutingServer()
312 HandleRequests(&db, scoutingServer)
313 scoutingServer.Start(8080)
314 defer scoutingServer.Stop()
315
316 builder := flatbuffers.NewBuilder(1024)
317 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
318
319 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
320 if err != nil {
321 t.Fatal("Failed to request all matches: ", err)
322 }
323
324 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
325 StatsList: []*request_2023_data_scouting_response.Stats2023T{
326 {
327 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
328 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
329 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
330 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
331 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
332 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700333 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700334 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700335 BalanceAttemptAuto: false, Docked: false, Engaged: false,
336 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800337 },
338 {
339 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
340 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
341 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
342 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
343 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
344 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700345 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700346 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700347 BalanceAttemptAuto: true, Docked: false, Engaged: false,
348 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800349 },
350 },
351 }
352 if len(expected.StatsList) != len(response.StatsList) {
353 t.Fatal("Expected ", expected, ", but got ", *response)
354 }
355 for i, match := range expected.StatsList {
356 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
357 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
358 }
359 }
360}
361
Emily Markova8cb91312024-02-02 12:30:37 -0800362// Validates that we can request the 2024 stats.
363func TestConvertActionsToStat2024(t *testing.T) {
364 builder := flatbuffers.NewBuilder(1024)
365 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
366 TeamNumber: "4244",
367 MatchNumber: 3,
368 SetNumber: 1,
369 CompLevel: "quals",
370 ActionsList: []*submit_2024_actions.ActionT{
371 {
372 ActionTaken: &submit_2024_actions.ActionTypeT{
373 Type: submit_2024_actions.ActionTypeStartMatchAction,
374 Value: &submit_2024_actions.StartMatchActionT{
375 Position: 2,
376 },
377 },
378 Timestamp: 0,
379 },
380 {
381 ActionTaken: &submit_2024_actions.ActionTypeT{
382 Type: submit_2024_actions.ActionTypePickupNoteAction,
383 Value: &submit_2024_actions.PickupNoteActionT{
384 Auto: true,
385 },
386 },
387 Timestamp: 400,
388 },
389 {
390 ActionTaken: &submit_2024_actions.ActionTypeT{
391 Type: submit_2024_actions.ActionTypePickupNoteAction,
392 Value: &submit_2024_actions.PickupNoteActionT{
393 Auto: true,
394 },
395 },
396 Timestamp: 800,
397 },
398 {
399 ActionTaken: &submit_2024_actions.ActionTypeT{
400 Type: submit_2024_actions.ActionTypePlaceNoteAction,
401 Value: &submit_2024_actions.PlaceNoteActionT{
402 ScoreType: submit_2024_actions.ScoreTypekAMP,
403 Auto: true,
404 },
405 },
406 Timestamp: 2000,
407 },
408 {
409 ActionTaken: &submit_2024_actions.ActionTypeT{
410 Type: submit_2024_actions.ActionTypeMobilityAction,
411 Value: &submit_2024_actions.MobilityActionT{
412 Mobility: true,
413 },
414 },
415 Timestamp: 2200,
416 },
417 {
418 ActionTaken: &submit_2024_actions.ActionTypeT{
419 Type: submit_2024_actions.ActionTypePenaltyAction,
420 Value: &submit_2024_actions.PenaltyActionT{},
421 },
422 Timestamp: 2400,
423 },
424 {
425 ActionTaken: &submit_2024_actions.ActionTypeT{
426 Type: submit_2024_actions.ActionTypePickupNoteAction,
427 Value: &submit_2024_actions.PickupNoteActionT{
428 Auto: false,
429 },
430 },
431 Timestamp: 2800,
432 },
433 {
434 ActionTaken: &submit_2024_actions.ActionTypeT{
435 Type: submit_2024_actions.ActionTypePlaceNoteAction,
436 Value: &submit_2024_actions.PlaceNoteActionT{
437 ScoreType: submit_2024_actions.ScoreTypekAMP_AMPLIFIED,
438 Auto: false,
439 },
440 },
441 Timestamp: 3100,
442 },
443 {
444 ActionTaken: &submit_2024_actions.ActionTypeT{
445 Type: submit_2024_actions.ActionTypePickupNoteAction,
446 Value: &submit_2024_actions.PickupNoteActionT{
447 Auto: false,
448 },
449 },
450 Timestamp: 3500,
451 },
452 {
453 ActionTaken: &submit_2024_actions.ActionTypeT{
454 Type: submit_2024_actions.ActionTypePlaceNoteAction,
455 Value: &submit_2024_actions.PlaceNoteActionT{
456 ScoreType: submit_2024_actions.ScoreTypekSPEAKER_AMPLIFIED,
457 Auto: false,
458 },
459 },
460 Timestamp: 3900,
461 },
462 {
463 ActionTaken: &submit_2024_actions.ActionTypeT{
464 Type: submit_2024_actions.ActionTypeEndMatchAction,
465 Value: &submit_2024_actions.EndMatchActionT{
466 StageType: submit_2024_actions.StageTypekHARMONY,
467 TrapNote: false,
468 },
469 },
470 Timestamp: 4200,
471 },
472 },
473 PreScouting: false,
474 }).Pack(builder))
475
476 submit2024Actions := submit_2024_actions.GetRootAsSubmit2024Actions(builder.FinishedBytes(), 0)
477 response, err := ConvertActionsToStat2024(submit2024Actions)
478
479 if err != nil {
480 t.Fatal("Failed to convert actions to stats: ", err)
481 }
482
483 expected := db.Stats2024{
484 PreScouting: false, TeamNumber: "4244",
485 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
486 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
487 Speaker: 0, Amp: 0, SpeakerAmplified: 1, AmpAmplified: 1,
488 NotesDropped: 0, Penalties: 1, TrapNote: false, AvgCycle: 950,
489 Park: false, OnStage: false, Harmony: true, CollectedBy: "",
490 }
491
492 if expected != response {
493 t.Fatal("Expected ", expected, ", but got ", response)
494 }
495}
496
Emily Markova1abe9782023-03-11 19:45:38 -0800497// Validates that we can request the 2023 stats.
498func TestConvertActionsToStat(t *testing.T) {
499 builder := flatbuffers.NewBuilder(1024)
500 builder.Finish((&submit_actions.SubmitActionsT{
501 TeamNumber: "4244",
502 MatchNumber: 3,
503 SetNumber: 1,
504 CompLevel: "quals",
Emily Markova1abe9782023-03-11 19:45:38 -0800505 ActionsList: []*submit_actions.ActionT{
506 {
507 ActionTaken: &submit_actions.ActionTypeT{
508 Type: submit_actions.ActionTypeStartMatchAction,
509 Value: &submit_actions.StartMatchActionT{
510 Position: 1,
511 },
512 },
513 Timestamp: 0,
514 },
515 {
516 ActionTaken: &submit_actions.ActionTypeT{
517 Type: submit_actions.ActionTypePickupObjectAction,
518 Value: &submit_actions.PickupObjectActionT{
519 ObjectType: submit_actions.ObjectTypekCube,
520 Auto: true,
521 },
522 },
523 Timestamp: 400,
524 },
525 {
526 ActionTaken: &submit_actions.ActionTypeT{
527 Type: submit_actions.ActionTypePickupObjectAction,
528 Value: &submit_actions.PickupObjectActionT{
529 ObjectType: submit_actions.ObjectTypekCube,
530 Auto: true,
531 },
532 },
533 Timestamp: 800,
534 },
535 {
536 ActionTaken: &submit_actions.ActionTypeT{
537 Type: submit_actions.ActionTypePlaceObjectAction,
538 Value: &submit_actions.PlaceObjectActionT{
539 ObjectType: submit_actions.ObjectTypekCube,
540 ScoreLevel: submit_actions.ScoreLevelkLow,
541 Auto: true,
542 },
543 },
544 Timestamp: 2000,
545 },
546 {
547 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700548 Type: submit_actions.ActionTypeMobilityAction,
549 Value: &submit_actions.MobilityActionT{
550 Mobility: true,
551 },
552 },
553 Timestamp: 2200,
554 },
555 {
556 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700557 Type: submit_actions.ActionTypeAutoBalanceAction,
558 Value: &submit_actions.AutoBalanceActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700559 Docked: true,
560 Engaged: true,
561 BalanceAttempt: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700562 },
563 },
564 Timestamp: 2400,
565 },
566 {
567 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova1abe9782023-03-11 19:45:38 -0800568 Type: submit_actions.ActionTypePickupObjectAction,
569 Value: &submit_actions.PickupObjectActionT{
570 ObjectType: submit_actions.ObjectTypekCone,
571 Auto: false,
572 },
573 },
574 Timestamp: 2800,
575 },
576 {
577 ActionTaken: &submit_actions.ActionTypeT{
578 Type: submit_actions.ActionTypePlaceObjectAction,
579 Value: &submit_actions.PlaceObjectActionT{
580 ObjectType: submit_actions.ObjectTypekCone,
581 ScoreLevel: submit_actions.ScoreLevelkHigh,
582 Auto: false,
583 },
584 },
585 Timestamp: 3100,
586 },
Emily Markova46a69bf2023-03-22 20:45:52 -0700587 {
588 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa7a045e72023-04-13 08:41:09 -0700589 Type: submit_actions.ActionTypePickupObjectAction,
590 Value: &submit_actions.PickupObjectActionT{
591 ObjectType: submit_actions.ObjectTypekCube,
592 Auto: false,
593 },
594 },
595 Timestamp: 3500,
596 },
597 {
598 ActionTaken: &submit_actions.ActionTypeT{
599 Type: submit_actions.ActionTypePlaceObjectAction,
600 Value: &submit_actions.PlaceObjectActionT{
601 ObjectType: submit_actions.ObjectTypekCube,
602 ScoreLevel: submit_actions.ScoreLevelkSupercharged,
603 Auto: false,
604 },
605 },
606 Timestamp: 3900,
607 },
608 {
609 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700610 Type: submit_actions.ActionTypeEndMatchAction,
611 Value: &submit_actions.EndMatchActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700612 Docked: true,
613 Engaged: false,
614 BalanceAttempt: true,
Emily Markova46a69bf2023-03-22 20:45:52 -0700615 },
616 },
Filip Kujawa7a045e72023-04-13 08:41:09 -0700617 Timestamp: 4200,
Emily Markova46a69bf2023-03-22 20:45:52 -0700618 },
Emily Markova1abe9782023-03-11 19:45:38 -0800619 },
Philipp Schrader4b489222023-04-15 16:40:16 -0700620 PreScouting: false,
Emily Markova1abe9782023-03-11 19:45:38 -0800621 }).Pack(builder))
622
623 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
624 response, err := ConvertActionsToStat(submitActions)
625
626 if err != nil {
627 t.Fatal("Failed to convert actions to stats: ", err)
628 }
629
630 expected := db.Stats2023{
Philipp Schrader4b489222023-04-15 16:40:16 -0700631 PreScouting: false,
632 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
Emily Markova1abe9782023-03-11 19:45:38 -0800633 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
634 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
635 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
636 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
637 HighCubes: 0, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700638 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700639 AvgCycle: 950, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700640 BalanceAttemptAuto: false, Docked: true, Engaged: false,
Philipp Schradere11114f2023-04-15 17:04:25 -0700641 BalanceAttempt: true, CollectedBy: "",
Emily Markova1abe9782023-03-11 19:45:38 -0800642 }
643
644 if expected != response {
645 t.Fatal("Expected ", expected, ", but got ", response)
646 }
647}
648
Alex Perry81f96ba2022-03-13 18:26:19 -0700649func TestSubmitNotes(t *testing.T) {
650 database := MockDatabase{}
651 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800652 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700653 scoutingServer.Start(8080)
654 defer scoutingServer.Stop()
655
656 builder := flatbuffers.NewBuilder(1024)
657 builder.Finish((&submit_notes.SubmitNotesT{
Emily Markovae68b7632023-12-30 14:17:55 -0800658 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800659 Notes: "Notes",
660 GoodDriving: true,
661 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700662 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800663 SketchyPlacing: false,
664 GoodDefense: true,
665 BadDefense: false,
666 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700667 }).Pack(builder))
668
669 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
670 if err != nil {
671 t.Fatal("Failed to submit notes: ", err)
672 }
673
674 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800675 {
Emily Markovae68b7632023-12-30 14:17:55 -0800676 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800677 Notes: "Notes",
678 GoodDriving: true,
679 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700680 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800681 SketchyPlacing: false,
682 GoodDefense: true,
683 BadDefense: false,
684 EasilyDefended: true,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800685 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700686 }
687
688 if !reflect.DeepEqual(database.notes, expected) {
689 t.Fatal("Submitted notes did not match", expected, database.notes)
690 }
691}
692
693func TestRequestNotes(t *testing.T) {
694 database := MockDatabase{
695 notes: []db.NotesData{{
Emily Markovae68b7632023-12-30 14:17:55 -0800696 TeamNumber: "971A",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800697 Notes: "Notes",
698 GoodDriving: true,
699 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700700 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800701 SketchyPlacing: false,
702 GoodDefense: true,
703 BadDefense: false,
704 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700705 }},
706 }
707 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800708 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700709 scoutingServer.Start(8080)
710 defer scoutingServer.Stop()
711
712 builder := flatbuffers.NewBuilder(1024)
713 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
Emily Markovae68b7632023-12-30 14:17:55 -0800714 Team: "971A",
Alex Perry81f96ba2022-03-13 18:26:19 -0700715 }).Pack(builder))
716 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
717 if err != nil {
718 t.Fatal("Failed to submit notes: ", err)
719 }
720
721 if response.Notes[0].Data != "Notes" {
722 t.Fatal("requested notes did not match", response)
723 }
724}
725
Emily Markovafaecfe12023-07-01 12:40:03 -0700726func TestSubmitPitImage(t *testing.T) {
727 database := MockDatabase{}
728 scoutingServer := server.NewScoutingServer()
729 HandleRequests(&database, scoutingServer)
730 scoutingServer.Start(8080)
731 defer scoutingServer.Stop()
732
733 builder := flatbuffers.NewBuilder(1024)
734 builder.Finish((&submit_pit_image.SubmitPitImageT{
735 TeamNumber: "483A", ImagePath: "483Arobot.jpg",
736 ImageData: []byte{12, 43, 54, 34, 98},
737 }).Pack(builder))
738
739 _, err := debug.SubmitPitImage("http://localhost:8080", builder.FinishedBytes())
740 if err != nil {
741 t.Fatal("Failed to submit pit image: ", err)
742 }
743
744 expected := []db.PitImage{
745 {
746 TeamNumber: "483A", CheckSum: "177d9dc52bc25f391232e82521259c378964c068832a9178d73448ba4ac5e0b1",
747 ImagePath: "483Arobot.jpg", ImageData: []byte{12, 43, 54, 34, 98},
748 },
749 }
750
751 if !reflect.DeepEqual(database.images, expected) {
752 t.Fatal("Submitted image did not match", expected, database.images)
753 }
754}
755
756func TestRequestPitImages(t *testing.T) {
757 db := MockDatabase{
758 images: []db.PitImage{
759 {
760 TeamNumber: "932", ImagePath: "pitimage.jpg",
761 ImageData: []byte{3, 34, 44, 65}, CheckSum: "abcdf",
762 },
763 {
764 TeamNumber: "234", ImagePath: "234robot.png",
765 ImageData: []byte{64, 54, 21, 21, 76, 32}, CheckSum: "egrfd",
766 },
767 {
768 TeamNumber: "93A", ImagePath: "abcd.jpg",
769 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "rgegfd",
770 },
771 },
772 }
773
774 scoutingServer := server.NewScoutingServer()
775 HandleRequests(&db, scoutingServer)
776 scoutingServer.Start(8080)
777 defer scoutingServer.Stop()
778
779 builder := flatbuffers.NewBuilder(1024)
780 builder.Finish((&request_pit_images.RequestPitImagesT{"932"}).Pack(builder))
781
782 response, err := debug.RequestPitImages("http://localhost:8080", builder.FinishedBytes())
783 if err != nil {
784 t.Fatal("Failed to request pit images: ", err)
785 }
786
787 expected := request_pit_images_response.RequestPitImagesResponseT{
788 PitImageList: []*request_pit_images_response.PitImageT{
789 {
790 TeamNumber: "932", ImagePath: "pitimage.jpg", CheckSum: "abcdf",
791 },
792 },
793 }
794
795 if len(expected.PitImageList) != len(response.PitImageList) {
796 t.Fatal("Expected ", expected, ", but got ", *response)
797 }
798
799 for i, pit_image := range expected.PitImageList {
800 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
801 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
802 }
803 }
804}
805
Emily Markova8e39f452023-12-23 12:17:30 -0800806func TestRequestAllPitImages(t *testing.T) {
807 db := MockDatabase{
808 images: []db.PitImage{
809 {
810 TeamNumber: "32", ImagePath: "pitimage.jpg",
811 ImageData: []byte{3, 43, 44, 32}, CheckSum: "cdhrj",
812 },
813 {
814 TeamNumber: "231", ImagePath: "232robot.png",
815 ImageData: []byte{64, 54, 54, 21, 76, 32}, CheckSum: "rgre",
816 },
817 {
818 TeamNumber: "90", ImagePath: "abcd.jpg",
819 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "erfer",
820 },
821 },
822 }
823
824 scoutingServer := server.NewScoutingServer()
825 HandleRequests(&db, scoutingServer)
826 scoutingServer.Start(8080)
827 defer scoutingServer.Stop()
828
829 builder := flatbuffers.NewBuilder(1024)
830 builder.Finish((&request_all_pit_images.RequestAllPitImagesT{}).Pack(builder))
831
832 response, err := debug.RequestAllPitImages("http://localhost:8080", builder.FinishedBytes())
833 if err != nil {
834 t.Fatal("Failed to request pit images: ", err)
835 }
836
837 expected := request_all_pit_images_response.RequestAllPitImagesResponseT{
838 PitImageList: []*request_all_pit_images_response.PitImageT{
839 {
840 TeamNumber: "32", ImagePath: "pitimage.jpg", CheckSum: "cdhrj",
841 },
842 {
843 TeamNumber: "231", ImagePath: "232robot.png", CheckSum: "rgre",
844 },
845 {
846 TeamNumber: "90", ImagePath: "abcd.jpg", CheckSum: "erfer",
847 },
848 },
849 }
850
851 if len(expected.PitImageList) != len(response.PitImageList) {
852 t.Fatal("Expected ", expected, ", but got ", *response)
853 }
854
855 for i, pit_image := range expected.PitImageList {
856 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
857 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
858 }
859 }
860}
861
Milo Lin1d59f0c2022-06-22 20:30:58 -0700862func TestRequestShiftSchedule(t *testing.T) {
863 db := MockDatabase{
864 shiftSchedule: []db.Shift{
865 {
866 MatchNumber: 1,
867 R1scouter: "Bob",
868 R2scouter: "James",
869 R3scouter: "Robert",
870 B1scouter: "Alice",
871 B2scouter: "Mary",
872 B3scouter: "Patricia",
873 },
874 {
875 MatchNumber: 2,
876 R1scouter: "Liam",
877 R2scouter: "Noah",
878 R3scouter: "Oliver",
879 B1scouter: "Emma",
880 B2scouter: "Charlotte",
881 B3scouter: "Amelia",
882 },
883 },
884 }
885 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800886 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700887 scoutingServer.Start(8080)
888 defer scoutingServer.Stop()
889
890 builder := flatbuffers.NewBuilder(1024)
891 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
892
893 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
894 if err != nil {
895 t.Fatal("Failed to request shift schedule: ", err)
896 }
897
898 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
899 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
900 {
901 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700902 R1Scouter: "Bob",
903 R2Scouter: "James",
904 R3Scouter: "Robert",
905 B1Scouter: "Alice",
906 B2Scouter: "Mary",
907 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700908 },
909 {
910 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700911 R1Scouter: "Liam",
912 R2Scouter: "Noah",
913 R3Scouter: "Oliver",
914 B1Scouter: "Emma",
915 B2Scouter: "Charlotte",
916 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700917 },
918 },
919 }
920 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
921 t.Fatal("Expected ", expected, ", but got ", *response)
922 }
923 for i, match := range expected.ShiftSchedule {
924 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
925 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
926 }
927 }
928}
929
930func TestSubmitShiftSchedule(t *testing.T) {
931 database := MockDatabase{}
932 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800933 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700934 scoutingServer.Start(8080)
935 defer scoutingServer.Stop()
936
937 builder := flatbuffers.NewBuilder(1024)
938 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
939 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
940 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700941 R1Scouter: "Bob",
942 R2Scouter: "James",
943 R3Scouter: "Robert",
944 B1Scouter: "Alice",
945 B2Scouter: "Mary",
946 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700947 },
948 }).Pack(builder))
949
950 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
951 if err != nil {
952 t.Fatal("Failed to submit shift schedule: ", err)
953 }
954
955 expected := []db.Shift{
956 {MatchNumber: 1,
957 R1scouter: "Bob",
958 R2scouter: "James",
959 R3scouter: "Robert",
960 B1scouter: "Alice",
961 B2scouter: "Mary",
962 B3scouter: "Patricia"},
963 }
964 if !reflect.DeepEqual(expected, database.shiftSchedule) {
965 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
966 }
967}
968
Filip Kujawa210a03b2022-11-24 14:41:11 -0800969func TestSubmitDriverRanking(t *testing.T) {
970 database := MockDatabase{}
971 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800972 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800973 scoutingServer.Start(8080)
974 defer scoutingServer.Stop()
975
976 builder := flatbuffers.NewBuilder(1024)
977 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
978 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800979 Rank1: "1234",
980 Rank2: "1235",
981 Rank3: "1236",
Filip Kujawa210a03b2022-11-24 14:41:11 -0800982 }).Pack(builder))
983
984 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
985 if err != nil {
986 t.Fatal("Failed to submit driver ranking: ", err)
987 }
988
989 expected := []db.DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -0800990 {MatchNumber: 36, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -0800991 }
992
993 if !reflect.DeepEqual(database.driver_ranking, expected) {
994 t.Fatal("Submitted notes did not match", expected, database.notes)
995 }
996}
997
Filip Kujawaf882e022022-12-14 13:14:08 -0800998// Validates that we can request the driver rankings.
999func TestRequestDriverRankings(t *testing.T) {
1000 db := MockDatabase{
1001 driver_ranking: []db.DriverRankingData{
1002 {
1003 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001004 Rank1: "1234",
1005 Rank2: "1235",
1006 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001007 },
1008 {
1009 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001010 Rank1: "101",
1011 Rank2: "202",
1012 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001013 },
1014 },
1015 }
1016 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001017 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -08001018 scoutingServer.Start(8080)
1019 defer scoutingServer.Stop()
1020
1021 builder := flatbuffers.NewBuilder(1024)
1022 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
1023
1024 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
1025 if err != nil {
1026 t.Fatal("Failed to request all driver rankings: ", err)
1027 }
1028
1029 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
1030 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
1031 {
1032 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001033 Rank1: "1234",
1034 Rank2: "1235",
1035 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001036 },
1037 {
1038 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001039 Rank1: "101",
1040 Rank2: "202",
1041 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001042 },
1043 },
1044 }
1045 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
1046 t.Fatal("Expected ", expected, ", but got ", *response)
1047 }
1048 for i, match := range expected.DriverRankingList {
1049 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
1050 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
1051 }
1052 }
1053}
1054
1055// Validates that we can request all notes.
1056func TestRequestAllNotes(t *testing.T) {
1057 db := MockDatabase{
1058 notes: []db.NotesData{
1059 {
Emily Markovae68b7632023-12-30 14:17:55 -08001060 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001061 Notes: "Notes",
1062 GoodDriving: true,
1063 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001064 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001065 SketchyPlacing: false,
1066 GoodDefense: true,
1067 BadDefense: false,
1068 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001069 },
1070 {
Emily Markovae68b7632023-12-30 14:17:55 -08001071 TeamNumber: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001072 Notes: "More Notes",
1073 GoodDriving: false,
1074 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001075 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001076 SketchyPlacing: true,
1077 GoodDefense: false,
1078 BadDefense: true,
1079 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001080 },
1081 },
1082 }
1083 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001084 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -08001085 scoutingServer.Start(8080)
1086 defer scoutingServer.Stop()
1087
1088 builder := flatbuffers.NewBuilder(1024)
1089 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
1090
1091 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
1092 if err != nil {
1093 t.Fatal("Failed to request all notes: ", err)
1094 }
1095
1096 expected := request_all_notes_response.RequestAllNotesResponseT{
1097 NoteList: []*request_all_notes_response.NoteT{
1098 {
Emily Markovae68b7632023-12-30 14:17:55 -08001099 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001100 Notes: "Notes",
1101 GoodDriving: true,
1102 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001103 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001104 SketchyPlacing: false,
1105 GoodDefense: true,
1106 BadDefense: false,
1107 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001108 },
1109 {
Emily Markovae68b7632023-12-30 14:17:55 -08001110 Team: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001111 Notes: "More Notes",
1112 GoodDriving: false,
1113 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001114 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001115 SketchyPlacing: true,
1116 GoodDefense: false,
1117 BadDefense: true,
1118 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001119 },
1120 },
1121 }
1122 if len(expected.NoteList) != len(response.NoteList) {
1123 t.Fatal("Expected ", expected, ", but got ", *response)
1124 }
1125 for i, note := range expected.NoteList {
1126 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
1127 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
1128 }
1129 }
1130}
1131
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001132func packAction(action *submit_actions.ActionT) []byte {
1133 builder := flatbuffers.NewBuilder(50 * 1024)
1134 builder.Finish((action).Pack(builder))
1135 return (builder.FinishedBytes())
1136}
1137
Emily Markova8cb91312024-02-02 12:30:37 -08001138func TestAddingActions2024(t *testing.T) {
1139 database := MockDatabase{}
1140 scoutingServer := server.NewScoutingServer()
1141 HandleRequests(&database, scoutingServer)
1142 scoutingServer.Start(8080)
1143 defer scoutingServer.Stop()
1144
1145 builder := flatbuffers.NewBuilder(1024)
1146 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
1147 TeamNumber: "3421",
1148 MatchNumber: 2,
1149 SetNumber: 1,
1150 CompLevel: "quals",
1151 ActionsList: []*submit_2024_actions.ActionT{
1152 {
1153 ActionTaken: &submit_2024_actions.ActionTypeT{
1154 Type: submit_2024_actions.ActionTypePickupNoteAction,
1155 Value: &submit_2024_actions.PickupNoteActionT{
1156 Auto: true,
1157 },
1158 },
1159 Timestamp: 1800,
1160 },
1161 {
1162 ActionTaken: &submit_2024_actions.ActionTypeT{
1163 Type: submit_2024_actions.ActionTypePlaceNoteAction,
1164 Value: &submit_2024_actions.PlaceNoteActionT{
1165 ScoreType: submit_2024_actions.ScoreTypekSPEAKER,
1166 Auto: false,
1167 },
1168 },
1169 Timestamp: 2500,
1170 },
1171 },
1172 PreScouting: true,
1173 }).Pack(builder))
1174
1175 _, err := debug.Submit2024Actions("http://localhost:8080", builder.FinishedBytes())
1176 if err != nil {
1177 t.Fatal("Failed to submit actions: ", err)
1178 }
1179
1180 expectedActions := []db.Action{
1181 {
1182 PreScouting: true,
1183 TeamNumber: "3421",
1184 MatchNumber: 2,
1185 SetNumber: 1,
1186 CompLevel: "quals",
1187 CollectedBy: "debug_cli",
1188 CompletedAction: []byte{},
1189 Timestamp: 1800,
1190 },
1191 {
1192 PreScouting: true,
1193 TeamNumber: "3421",
1194 MatchNumber: 2,
1195 SetNumber: 1,
1196 CompLevel: "quals",
1197 CollectedBy: "debug_cli",
1198 CompletedAction: []byte{},
1199 Timestamp: 2500,
1200 },
1201 }
1202
1203 expectedStats := []db.Stats2024{
1204 db.Stats2024{
1205 PreScouting: true, TeamNumber: "3421",
1206 MatchNumber: 2, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 0,
1207 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1208 Speaker: 1, Amp: 0, SpeakerAmplified: 0, AmpAmplified: 0,
1209 NotesDropped: 0, Penalties: 0, TrapNote: false, AvgCycle: 0,
1210 Park: false, OnStage: false, Harmony: false, CollectedBy: "debug_cli",
1211 },
1212 }
1213
1214 if !reflect.DeepEqual(expectedActions, database.actions) {
1215 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1216 }
1217 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1218 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1219 }
1220}
1221
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001222func TestAddingActions(t *testing.T) {
1223 database := MockDatabase{}
1224 scoutingServer := server.NewScoutingServer()
1225 HandleRequests(&database, scoutingServer)
1226 scoutingServer.Start(8080)
1227 defer scoutingServer.Stop()
1228
1229 builder := flatbuffers.NewBuilder(1024)
1230 builder.Finish((&submit_actions.SubmitActionsT{
1231 TeamNumber: "1234",
1232 MatchNumber: 4,
1233 SetNumber: 1,
1234 CompLevel: "qual",
1235 ActionsList: []*submit_actions.ActionT{
1236 {
1237 ActionTaken: &submit_actions.ActionTypeT{
1238 Type: submit_actions.ActionTypePickupObjectAction,
1239 Value: &submit_actions.PickupObjectActionT{
1240 ObjectType: submit_actions.ObjectTypekCube,
1241 Auto: true,
1242 },
1243 },
1244 Timestamp: 2400,
1245 },
1246 {
1247 ActionTaken: &submit_actions.ActionTypeT{
1248 Type: submit_actions.ActionTypePlaceObjectAction,
1249 Value: &submit_actions.PlaceObjectActionT{
1250 ObjectType: submit_actions.ObjectTypekCube,
1251 ScoreLevel: submit_actions.ScoreLevelkLow,
1252 Auto: false,
1253 },
1254 },
1255 Timestamp: 1009,
1256 },
1257 },
Philipp Schrader4b489222023-04-15 16:40:16 -07001258 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001259 }).Pack(builder))
1260
1261 _, err := debug.SubmitActions("http://localhost:8080", builder.FinishedBytes())
1262 if err != nil {
1263 t.Fatal("Failed to submit actions: ", err)
1264 }
1265
1266 // Make sure that the data made it into the database.
1267 // TODO: Add this back when we figure out how to add the serialized action into the database.
1268
1269 /* expectedActionsT := []*submit_actions.ActionT{
1270 {
1271 ActionTaken: &submit_actions.ActionTypeT{
1272 Type: submit_actions.ActionTypePickupObjectAction,
1273 Value: &submit_actions.PickupObjectActionT{
1274 ObjectType: submit_actions.ObjectTypekCube,
1275 Auto: true,
1276 },
1277 },
1278 Timestamp: 2400,
1279 },
1280 {
1281 ActionTaken: &submit_actions.ActionTypeT{
1282 Type: submit_actions.ActionTypePlaceObjectAction,
1283 Value: &submit_actions.PlaceObjectActionT{
1284 ObjectType: submit_actions.ObjectTypekCube,
1285 ScoreLevel: submit_actions.ScoreLevelkLow,
1286 Auto: false,
1287 },
1288 },
1289 Timestamp: 1009,
1290 },
1291 } */
1292
1293 expectedActions := []db.Action{
1294 {
Philipp Schrader4b489222023-04-15 16:40:16 -07001295 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001296 TeamNumber: "1234",
1297 MatchNumber: 4,
1298 SetNumber: 1,
1299 CompLevel: "qual",
1300 CollectedBy: "debug_cli",
1301 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -07001302 Timestamp: 2400,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001303 },
1304 {
Philipp Schrader4b489222023-04-15 16:40:16 -07001305 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001306 TeamNumber: "1234",
1307 MatchNumber: 4,
1308 SetNumber: 1,
1309 CompLevel: "qual",
1310 CollectedBy: "debug_cli",
1311 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -07001312 Timestamp: 1009,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001313 },
1314 }
1315
Philipp Schradere11114f2023-04-15 17:04:25 -07001316 expectedStats := []db.Stats2023{
1317 db.Stats2023{
1318 PreScouting: true,
1319 TeamNumber: "1234", MatchNumber: 4, SetNumber: 1,
1320 CompLevel: "qual", StartingQuadrant: 0, LowCubesAuto: 0,
1321 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
1322 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1323 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 0,
1324 HighCubes: 0, CubesDropped: 0, LowCones: 0,
1325 MiddleCones: 0, HighCones: 0, ConesDropped: 0, SuperchargedPieces: 0,
1326 AvgCycle: 0, Mobility: false, DockedAuto: false, EngagedAuto: false,
1327 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1328 BalanceAttempt: false, CollectedBy: "debug_cli",
1329 },
1330 }
1331
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001332 if !reflect.DeepEqual(expectedActions, database.actions) {
1333 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1334 }
Philipp Schradere11114f2023-04-15 17:04:25 -07001335 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1336 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1337 }
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001338}
1339
Filip Kujawac1ded372023-05-27 14:33:43 -07001340// Validates that we can delete stats.
1341func TestDeleteFromStats(t *testing.T) {
1342 database := MockDatabase{
1343 stats2023: []db.Stats2023{
1344 {
1345 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1346 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1347 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1348 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1349 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1350 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1351 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1352 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1353 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1354 BalanceAttempt: true, CollectedBy: "isaac",
1355 },
1356 {
1357 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
1358 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
1359 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
1360 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1361 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
1362 HighCubes: 1, CubesDropped: 0, LowCones: 0,
1363 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
1364 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
1365 BalanceAttemptAuto: true, Docked: false, Engaged: false,
1366 BalanceAttempt: true, CollectedBy: "unknown",
1367 },
1368 },
1369 actions: []db.Action{
1370 {
1371 PreScouting: true,
1372 TeamNumber: "3634",
1373 MatchNumber: 1,
1374 SetNumber: 2,
1375 CompLevel: "quals",
1376 CollectedBy: "debug_cli",
1377 CompletedAction: []byte{},
1378 Timestamp: 2400,
1379 },
1380 {
1381 PreScouting: true,
1382 TeamNumber: "2343",
1383 MatchNumber: 1,
1384 SetNumber: 2,
1385 CompLevel: "quals",
1386 CollectedBy: "debug_cli",
1387 CompletedAction: []byte{},
1388 Timestamp: 1009,
1389 },
1390 },
1391 }
1392 scoutingServer := server.NewScoutingServer()
1393 HandleRequests(&database, scoutingServer)
1394 scoutingServer.Start(8080)
1395 defer scoutingServer.Stop()
1396
1397 builder := flatbuffers.NewBuilder(1024)
1398 builder.Finish((&delete_2023_data_scouting.Delete2023DataScoutingT{
1399 CompLevel: "quals",
1400 MatchNumber: 1,
1401 SetNumber: 2,
1402 TeamNumber: "2343",
1403 }).Pack(builder))
1404
1405 _, err := debug.Delete2023DataScouting("http://localhost:8080", builder.FinishedBytes())
1406 if err != nil {
1407 t.Fatal("Failed to delete from data scouting ", err)
1408 }
1409
1410 expectedActions := []db.Action{
1411 {
1412 PreScouting: true,
1413 TeamNumber: "3634",
1414 MatchNumber: 1,
1415 SetNumber: 2,
1416 CompLevel: "quals",
1417 CollectedBy: "debug_cli",
1418 CompletedAction: []byte{},
1419 Timestamp: 2400,
1420 },
1421 }
1422
1423 expectedStats := []db.Stats2023{
1424 {
1425 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1426 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1427 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1428 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1429 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1430 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1431 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1432 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1433 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1434 BalanceAttempt: true, CollectedBy: "isaac",
1435 },
1436 }
1437
1438 if !reflect.DeepEqual(expectedActions, database.actions) {
1439 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1440 }
1441 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1442 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1443 }
1444}
1445
Emily Markova8cb91312024-02-02 12:30:37 -08001446// Validates that we can delete 2024 stats.
1447func TestDeleteFromStats2024(t *testing.T) {
1448 database := MockDatabase{
1449 stats2024: []db.Stats2024{
1450 {
1451 PreScouting: false, TeamNumber: "746",
1452 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1453 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
1454 Speaker: 0, Amp: 1, SpeakerAmplified: 1, AmpAmplified: 1,
1455 NotesDropped: 0, Penalties: 1, TrapNote: true, AvgCycle: 233,
1456 Park: false, OnStage: false, Harmony: true, CollectedBy: "alek",
1457 },
1458 {
1459 PreScouting: false, TeamNumber: "244",
1460 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1461 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1462 Speaker: 0, Amp: 0, SpeakerAmplified: 3, AmpAmplified: 1,
1463 NotesDropped: 0, Penalties: 1, TrapNote: false, AvgCycle: 120,
1464 Park: false, OnStage: true, Harmony: false, CollectedBy: "kacey",
1465 },
1466 },
1467 actions: []db.Action{
1468 {
1469 PreScouting: true,
1470 TeamNumber: "746",
1471 MatchNumber: 3,
1472 SetNumber: 1,
1473 CompLevel: "quals",
1474 CollectedBy: "debug_cli",
1475 CompletedAction: []byte{},
1476 Timestamp: 2400,
1477 },
1478 {
1479 PreScouting: true,
1480 TeamNumber: "244",
1481 MatchNumber: 5,
1482 SetNumber: 3,
1483 CompLevel: "quals",
1484 CollectedBy: "debug_cli",
1485 CompletedAction: []byte{},
1486 Timestamp: 1009,
1487 },
1488 },
1489 }
1490 scoutingServer := server.NewScoutingServer()
1491 HandleRequests(&database, scoutingServer)
1492 scoutingServer.Start(8080)
1493 defer scoutingServer.Stop()
1494
1495 builder := flatbuffers.NewBuilder(1024)
1496 builder.Finish((&delete_2024_data_scouting.Delete2024DataScoutingT{
1497 CompLevel: "quals",
1498 MatchNumber: 3,
1499 SetNumber: 1,
1500 TeamNumber: "746",
1501 }).Pack(builder))
1502
1503 _, err := debug.Delete2024DataScouting("http://localhost:8080", builder.FinishedBytes())
1504 if err != nil {
1505 t.Fatal("Failed to delete from data scouting 2024", err)
1506 }
1507
1508 expectedActions := []db.Action{
1509 {
1510 PreScouting: true,
1511 TeamNumber: "244",
1512 MatchNumber: 5,
1513 SetNumber: 3,
1514 CompLevel: "quals",
1515 CollectedBy: "debug_cli",
1516 CompletedAction: []byte{},
1517 Timestamp: 1009,
1518 },
1519 }
1520
1521 expectedStats := []db.Stats2024{
1522 {
1523 PreScouting: false, TeamNumber: "244",
1524 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1525 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1526 Speaker: 0, Amp: 0, SpeakerAmplified: 3, AmpAmplified: 1,
1527 NotesDropped: 0, Penalties: 1, TrapNote: false, AvgCycle: 120,
1528 Park: false, OnStage: true, Harmony: false, CollectedBy: "kacey",
1529 },
1530 }
1531
1532 if !reflect.DeepEqual(expectedActions, database.actions) {
1533 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1534 }
1535 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1536 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1537 }
1538}
1539
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001540// A mocked database we can use for testing. Add functionality to this as
1541// needed for your tests.
1542
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001543type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001544 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -08001545 notes []db.NotesData
1546 shiftSchedule []db.Shift
1547 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -08001548 stats2023 []db.Stats2023
Emily Markova8cb91312024-02-02 12:30:37 -08001549 stats2024 []db.Stats2024
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001550 actions []db.Action
Emily Markovafaecfe12023-07-01 12:40:03 -07001551 images []db.PitImage
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001552}
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001553
Emily Markovabf24c9e2023-02-08 20:31:11 -08001554func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -08001555 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001556 return nil
1557}
1558
Emily Markova290147d2023-03-03 22:40:06 -08001559func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
1560 database.stats2023 = append(database.stats2023, stats2023)
1561 return nil
1562}
Emily Markova8cb91312024-02-02 12:30:37 -08001563
1564func (database *MockDatabase) AddToStats2024(stats2024 db.Stats2024) error {
1565 database.stats2024 = append(database.stats2024, stats2024)
1566 return nil
1567}
Emily Markovabf24c9e2023-02-08 20:31:11 -08001568func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001569 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001570}
1571
Emily Markova290147d2023-03-03 22:40:06 -08001572func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
1573 return database.stats2023, nil
1574}
1575
Emily Markova8cb91312024-02-02 12:30:37 -08001576func (database *MockDatabase) ReturnStats2024() ([]db.Stats2024, error) {
1577 return database.stats2024, nil
1578}
1579
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001580func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error) {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001581 var results []db.Stats2023
1582 for _, stats := range database.stats2023 {
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001583 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001584 results = append(results, stats)
1585 }
1586 }
1587 return results, nil
1588}
1589
Emily Markova8cb91312024-02-02 12:30:37 -08001590func (database *MockDatabase) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2024, error) {
1591 var results []db.Stats2024
1592 for _, stats := range database.stats2024 {
1593 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
1594 results = append(results, stats)
1595 }
1596 }
1597 return results, nil
1598}
1599
Emily Markovae68b7632023-12-30 14:17:55 -08001600func (database *MockDatabase) QueryNotes(requestedTeam string) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -07001601 var results []string
1602 for _, data := range database.notes {
1603 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -07001604 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -07001605 }
1606 }
Philipp Schradereecb8962022-06-01 21:02:42 -07001607 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -07001608}
1609
Filip Kujawaf947cb42022-11-21 10:00:30 -08001610func (database *MockDatabase) AddNotes(data db.NotesData) error {
1611 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -07001612 return nil
1613}
1614
Filip Kujawaf882e022022-12-14 13:14:08 -08001615func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
1616 return database.notes, nil
1617}
1618
Milo Lin1d59f0c2022-06-22 20:30:58 -07001619func (database *MockDatabase) AddToShift(data db.Shift) error {
1620 database.shiftSchedule = append(database.shiftSchedule, data)
1621 return nil
1622}
1623
1624func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
1625 return database.shiftSchedule, nil
1626}
1627
1628func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
1629 return []db.Shift{}, nil
1630}
1631
Emily Markovafaecfe12023-07-01 12:40:03 -07001632func (database *MockDatabase) QueryPitImages(requestedTeam string) ([]db.RequestedPitImage, error) {
1633 var results []db.RequestedPitImage
1634 for _, data := range database.images {
1635 if data.TeamNumber == requestedTeam {
1636 results = append(results, db.RequestedPitImage{
1637 TeamNumber: data.TeamNumber,
1638 ImagePath: data.ImagePath,
1639 CheckSum: data.CheckSum,
1640 })
1641 }
1642 }
1643 return results, nil
1644}
1645
Filip Kujawa210a03b2022-11-24 14:41:11 -08001646func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
1647 database.driver_ranking = append(database.driver_ranking, data)
1648 return nil
1649}
1650
Filip Kujawaf882e022022-12-14 13:14:08 -08001651func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
1652 return database.driver_ranking, nil
1653}
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001654
1655func (database *MockDatabase) AddAction(action db.Action) error {
1656 database.actions = append(database.actions, action)
1657 return nil
1658}
1659
Emily Markovafaecfe12023-07-01 12:40:03 -07001660func (database *MockDatabase) AddPitImage(pitImage db.PitImage) error {
1661 database.images = append(database.images, pitImage)
1662 return nil
1663}
1664
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001665func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
1666 return database.actions, nil
1667}
Filip Kujawac1ded372023-05-27 14:33:43 -07001668
Emily Markova8e39f452023-12-23 12:17:30 -08001669func (database *MockDatabase) ReturnPitImages() ([]db.PitImage, error) {
1670 return database.images, nil
1671}
1672
Filip Kujawac1ded372023-05-27 14:33:43 -07001673func (database *MockDatabase) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1674 for i, stat := range database.stats2023 {
1675 if stat.CompLevel == compLevel_ &&
1676 stat.MatchNumber == matchNumber_ &&
1677 stat.SetNumber == setNumber_ &&
1678 stat.TeamNumber == teamNumber_ {
1679 // Match found, remove the element from the array.
1680 database.stats2023 = append(database.stats2023[:i], database.stats2023[i+1:]...)
1681 }
1682 }
1683 return nil
1684}
1685
Emily Markova8cb91312024-02-02 12:30:37 -08001686func (database *MockDatabase) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1687 for i, stat := range database.stats2024 {
1688 if stat.CompLevel == compLevel_ &&
1689 stat.MatchNumber == matchNumber_ &&
1690 stat.SetNumber == setNumber_ &&
1691 stat.TeamNumber == teamNumber_ {
1692 // Match found, remove the element from the array.
1693 database.stats2024 = append(database.stats2024[:i], database.stats2024[i+1:]...)
1694 }
1695 }
1696 return nil
1697}
1698
Filip Kujawac1ded372023-05-27 14:33:43 -07001699func (database *MockDatabase) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1700 for i, action := range database.actions {
1701 if action.CompLevel == compLevel_ &&
1702 action.MatchNumber == matchNumber_ &&
1703 action.SetNumber == setNumber_ &&
1704 action.TeamNumber == teamNumber_ {
1705 // Match found, remove the element from the array.
1706 database.actions = append(database.actions[:i], database.actions[i+1:]...)
1707 }
1708 }
1709 return nil
1710}