blob: ebe73f38f4cfd13619921c61889dd8b29b636b61 [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.
Emily Markovadcadcb62024-02-03 13:07:17 -0800134 stats2024: []db.Stats2024{
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800135 {
Emily Markovadcadcb62024-02-03 13:07:17 -0800136 PreScouting: false, TeamNumber: "5",
137 MatchNumber: 1, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 3,
138 SpeakerAuto: 2, AmpAuto: 4, NotesDroppedAuto: 1, MobilityAuto: true,
139 Speaker: 0, Amp: 1, SpeakerAmplified: 2, AmpAmplified: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -0800140 NotesDropped: 0, Penalties: 01, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markovadcadcb62024-02-03 13:07:17 -0800141 Park: false, OnStage: true, Harmony: false, CollectedBy: "alex",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800142 },
143 {
Emily Markovadcadcb62024-02-03 13:07:17 -0800144 PreScouting: false, TeamNumber: "973",
145 MatchNumber: 3, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 1,
146 SpeakerAuto: 0, AmpAuto: 2, NotesDroppedAuto: 0, MobilityAuto: false,
147 Speaker: 0, Amp: 4, SpeakerAmplified: 3, AmpAmplified: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -0800148 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 120,
Emily Markovadcadcb62024-02-03 13:07:17 -0800149 Park: true, OnStage: false, Harmony: false, CollectedBy: "bob",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800150 },
151 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800152 }
153 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800154 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800155 scoutingServer.Start(8080)
156 defer scoutingServer.Stop()
157
158 builder := flatbuffers.NewBuilder(1024)
159 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
160
161 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
162 if err != nil {
163 t.Fatal("Failed to request all matches: ", err)
164 }
165
166 expected := request_all_matches_response.RequestAllMatchesResponseT{
167 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700168 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800169 // R1, R2, R3, B1, B2, B3
170 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800171 1, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700172 "5", "42", "600", "971", "400", "200",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800173 &request_all_matches_response.ScoutedLevelT{
174 // The R1 team has already been data
175 // scouted.
176 true, false, false, false, false, false,
177 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800178 },
179 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800180 2, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700181 "6", "43", "601", "972", "401", "201",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800182 &request_all_matches_response.ScoutedLevelT{
183 false, false, false, false, false, false,
184 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800185 },
186 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800187 3, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700188 "7", "44", "602", "973", "402", "202",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800189 &request_all_matches_response.ScoutedLevelT{
190 // The B1 team has already been data
191 // scouted.
192 false, false, false, true, false, false,
193 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800194 },
195 },
196 }
197 if len(expected.MatchList) != len(response.MatchList) {
198 t.Fatal("Expected ", expected, ", but got ", *response)
199 }
200 for i, match := range expected.MatchList {
201 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
202 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
203 }
204 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800205
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800206}
207
Emily Markova8cb91312024-02-02 12:30:37 -0800208// Validates that we can request the 2024 stats.
209func TestRequest2024DataScouting(t *testing.T) {
210 db := MockDatabase{
211 stats2024: []db.Stats2024{
212 {
213 PreScouting: false, TeamNumber: "342",
214 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
215 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
216 Speaker: 4, Amp: 2, SpeakerAmplified: 1, AmpAmplified: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800217 NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markova8cb91312024-02-02 12:30:37 -0800218 Park: true, OnStage: false, Harmony: false, CollectedBy: "alex",
219 },
220 {
221 PreScouting: false, TeamNumber: "982",
222 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
223 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
224 Speaker: 0, Amp: 2, SpeakerAmplified: 3, AmpAmplified: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800225 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markova8cb91312024-02-02 12:30:37 -0800226 Park: false, OnStage: true, Harmony: false, CollectedBy: "george",
227 },
228 },
229 }
230 scoutingServer := server.NewScoutingServer()
231 HandleRequests(&db, scoutingServer)
232 scoutingServer.Start(8080)
233 defer scoutingServer.Stop()
234
235 builder := flatbuffers.NewBuilder(1024)
236 builder.Finish((&request_2024_data_scouting.Request2024DataScoutingT{}).Pack(builder))
237
238 response, err := debug.Request2024DataScouting("http://localhost:8080", builder.FinishedBytes())
239 if err != nil {
240 t.Fatal("Failed to request all matches: ", err)
241 }
242
243 expected := request_2024_data_scouting_response.Request2024DataScoutingResponseT{
244 StatsList: []*request_2024_data_scouting_response.Stats2024T{
245 {
246 PreScouting: false, TeamNumber: "342",
247 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
248 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
249 Speaker: 4, Amp: 2, SpeakerAmplified: 1, AmpAmplified: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800250 NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markova8cb91312024-02-02 12:30:37 -0800251 Park: true, OnStage: false, Harmony: false, CollectedBy: "alex",
252 },
253 {
254 PreScouting: false, TeamNumber: "982",
255 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
256 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
257 Speaker: 0, Amp: 2, SpeakerAmplified: 3, AmpAmplified: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800258 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markova8cb91312024-02-02 12:30:37 -0800259 Park: false, OnStage: true, Harmony: false, CollectedBy: "george",
260 },
261 },
262 }
263 if len(expected.StatsList) != len(response.StatsList) {
264 t.Fatal("Expected ", expected, ", but got ", *response)
265 }
266 for i, match := range expected.StatsList {
267 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
268 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
269 }
270 }
271}
272
Emily Markova290147d2023-03-03 22:40:06 -0800273// Validates that we can request the 2023 stats.
274func TestRequest2023DataScouting(t *testing.T) {
275 db := MockDatabase{
276 stats2023: []db.Stats2023{
277 {
278 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
279 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
280 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
281 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
282 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
283 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700284 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700285 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700286 BalanceAttemptAuto: false, Docked: false, Engaged: false,
287 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800288 },
289 {
290 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
291 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
292 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
293 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
294 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
295 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700296 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700297 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700298 BalanceAttemptAuto: true, Docked: false, Engaged: false,
299 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800300 },
301 },
302 }
303 scoutingServer := server.NewScoutingServer()
304 HandleRequests(&db, scoutingServer)
305 scoutingServer.Start(8080)
306 defer scoutingServer.Stop()
307
308 builder := flatbuffers.NewBuilder(1024)
309 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
310
311 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
312 if err != nil {
313 t.Fatal("Failed to request all matches: ", err)
314 }
315
316 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
317 StatsList: []*request_2023_data_scouting_response.Stats2023T{
318 {
319 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
320 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
321 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
322 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
323 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
324 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700325 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700326 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700327 BalanceAttemptAuto: false, Docked: false, Engaged: false,
328 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800329 },
330 {
331 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
332 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
333 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
334 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
335 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
336 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700337 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700338 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700339 BalanceAttemptAuto: true, Docked: false, Engaged: false,
340 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800341 },
342 },
343 }
344 if len(expected.StatsList) != len(response.StatsList) {
345 t.Fatal("Expected ", expected, ", but got ", *response)
346 }
347 for i, match := range expected.StatsList {
348 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
349 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
350 }
351 }
352}
353
Emily Markova8cb91312024-02-02 12:30:37 -0800354// Validates that we can request the 2024 stats.
355func TestConvertActionsToStat2024(t *testing.T) {
356 builder := flatbuffers.NewBuilder(1024)
357 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
358 TeamNumber: "4244",
359 MatchNumber: 3,
360 SetNumber: 1,
361 CompLevel: "quals",
362 ActionsList: []*submit_2024_actions.ActionT{
363 {
364 ActionTaken: &submit_2024_actions.ActionTypeT{
365 Type: submit_2024_actions.ActionTypeStartMatchAction,
366 Value: &submit_2024_actions.StartMatchActionT{
367 Position: 2,
368 },
369 },
370 Timestamp: 0,
371 },
372 {
373 ActionTaken: &submit_2024_actions.ActionTypeT{
374 Type: submit_2024_actions.ActionTypePickupNoteAction,
375 Value: &submit_2024_actions.PickupNoteActionT{
376 Auto: true,
377 },
378 },
379 Timestamp: 400,
380 },
381 {
382 ActionTaken: &submit_2024_actions.ActionTypeT{
383 Type: submit_2024_actions.ActionTypePickupNoteAction,
384 Value: &submit_2024_actions.PickupNoteActionT{
385 Auto: true,
386 },
387 },
388 Timestamp: 800,
389 },
390 {
391 ActionTaken: &submit_2024_actions.ActionTypeT{
392 Type: submit_2024_actions.ActionTypePlaceNoteAction,
393 Value: &submit_2024_actions.PlaceNoteActionT{
394 ScoreType: submit_2024_actions.ScoreTypekAMP,
395 Auto: true,
396 },
397 },
398 Timestamp: 2000,
399 },
400 {
401 ActionTaken: &submit_2024_actions.ActionTypeT{
402 Type: submit_2024_actions.ActionTypeMobilityAction,
403 Value: &submit_2024_actions.MobilityActionT{
404 Mobility: true,
405 },
406 },
407 Timestamp: 2200,
408 },
409 {
410 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markovadcadcb62024-02-03 13:07:17 -0800411 Type: submit_2024_actions.ActionTypePenaltyAction,
412 Value: &submit_2024_actions.PenaltyActionT{
413 Penalties: 5,
414 },
Emily Markova8cb91312024-02-02 12:30:37 -0800415 },
416 Timestamp: 2400,
417 },
418 {
419 ActionTaken: &submit_2024_actions.ActionTypeT{
420 Type: submit_2024_actions.ActionTypePickupNoteAction,
421 Value: &submit_2024_actions.PickupNoteActionT{
422 Auto: false,
423 },
424 },
425 Timestamp: 2800,
426 },
427 {
428 ActionTaken: &submit_2024_actions.ActionTypeT{
429 Type: submit_2024_actions.ActionTypePlaceNoteAction,
430 Value: &submit_2024_actions.PlaceNoteActionT{
431 ScoreType: submit_2024_actions.ScoreTypekAMP_AMPLIFIED,
432 Auto: false,
433 },
434 },
435 Timestamp: 3100,
436 },
437 {
438 ActionTaken: &submit_2024_actions.ActionTypeT{
439 Type: submit_2024_actions.ActionTypePickupNoteAction,
440 Value: &submit_2024_actions.PickupNoteActionT{
441 Auto: false,
442 },
443 },
444 Timestamp: 3500,
445 },
446 {
447 ActionTaken: &submit_2024_actions.ActionTypeT{
448 Type: submit_2024_actions.ActionTypePlaceNoteAction,
449 Value: &submit_2024_actions.PlaceNoteActionT{
450 ScoreType: submit_2024_actions.ScoreTypekSPEAKER_AMPLIFIED,
451 Auto: false,
452 },
453 },
454 Timestamp: 3900,
455 },
456 {
457 ActionTaken: &submit_2024_actions.ActionTypeT{
458 Type: submit_2024_actions.ActionTypeEndMatchAction,
459 Value: &submit_2024_actions.EndMatchActionT{
460 StageType: submit_2024_actions.StageTypekHARMONY,
461 TrapNote: false,
Emily Markova6079e2f2024-02-17 13:17:24 -0800462 Spotlight: false,
Emily Markova8cb91312024-02-02 12:30:37 -0800463 },
464 },
465 Timestamp: 4200,
466 },
467 },
468 PreScouting: false,
469 }).Pack(builder))
470
471 submit2024Actions := submit_2024_actions.GetRootAsSubmit2024Actions(builder.FinishedBytes(), 0)
472 response, err := ConvertActionsToStat2024(submit2024Actions)
473
474 if err != nil {
475 t.Fatal("Failed to convert actions to stats: ", err)
476 }
477
478 expected := db.Stats2024{
479 PreScouting: false, TeamNumber: "4244",
480 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
481 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
482 Speaker: 0, Amp: 0, SpeakerAmplified: 1, AmpAmplified: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -0800483 NotesDropped: 0, Penalties: 5, TrapNote: false, Spotlight: false, AvgCycle: 950,
Emily Markova8cb91312024-02-02 12:30:37 -0800484 Park: false, OnStage: false, Harmony: true, CollectedBy: "",
485 }
486
487 if expected != response {
488 t.Fatal("Expected ", expected, ", but got ", response)
489 }
490}
491
Emily Markova1abe9782023-03-11 19:45:38 -0800492// Validates that we can request the 2023 stats.
493func TestConvertActionsToStat(t *testing.T) {
494 builder := flatbuffers.NewBuilder(1024)
495 builder.Finish((&submit_actions.SubmitActionsT{
496 TeamNumber: "4244",
497 MatchNumber: 3,
498 SetNumber: 1,
499 CompLevel: "quals",
Emily Markova1abe9782023-03-11 19:45:38 -0800500 ActionsList: []*submit_actions.ActionT{
501 {
502 ActionTaken: &submit_actions.ActionTypeT{
503 Type: submit_actions.ActionTypeStartMatchAction,
504 Value: &submit_actions.StartMatchActionT{
505 Position: 1,
506 },
507 },
508 Timestamp: 0,
509 },
510 {
511 ActionTaken: &submit_actions.ActionTypeT{
512 Type: submit_actions.ActionTypePickupObjectAction,
513 Value: &submit_actions.PickupObjectActionT{
514 ObjectType: submit_actions.ObjectTypekCube,
515 Auto: true,
516 },
517 },
518 Timestamp: 400,
519 },
520 {
521 ActionTaken: &submit_actions.ActionTypeT{
522 Type: submit_actions.ActionTypePickupObjectAction,
523 Value: &submit_actions.PickupObjectActionT{
524 ObjectType: submit_actions.ObjectTypekCube,
525 Auto: true,
526 },
527 },
528 Timestamp: 800,
529 },
530 {
531 ActionTaken: &submit_actions.ActionTypeT{
532 Type: submit_actions.ActionTypePlaceObjectAction,
533 Value: &submit_actions.PlaceObjectActionT{
534 ObjectType: submit_actions.ObjectTypekCube,
535 ScoreLevel: submit_actions.ScoreLevelkLow,
536 Auto: true,
537 },
538 },
539 Timestamp: 2000,
540 },
541 {
542 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700543 Type: submit_actions.ActionTypeMobilityAction,
544 Value: &submit_actions.MobilityActionT{
545 Mobility: true,
546 },
547 },
548 Timestamp: 2200,
549 },
550 {
551 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700552 Type: submit_actions.ActionTypeAutoBalanceAction,
553 Value: &submit_actions.AutoBalanceActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700554 Docked: true,
555 Engaged: true,
556 BalanceAttempt: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700557 },
558 },
559 Timestamp: 2400,
560 },
561 {
562 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova1abe9782023-03-11 19:45:38 -0800563 Type: submit_actions.ActionTypePickupObjectAction,
564 Value: &submit_actions.PickupObjectActionT{
565 ObjectType: submit_actions.ObjectTypekCone,
566 Auto: false,
567 },
568 },
569 Timestamp: 2800,
570 },
571 {
572 ActionTaken: &submit_actions.ActionTypeT{
573 Type: submit_actions.ActionTypePlaceObjectAction,
574 Value: &submit_actions.PlaceObjectActionT{
575 ObjectType: submit_actions.ObjectTypekCone,
576 ScoreLevel: submit_actions.ScoreLevelkHigh,
577 Auto: false,
578 },
579 },
580 Timestamp: 3100,
581 },
Emily Markova46a69bf2023-03-22 20:45:52 -0700582 {
583 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa7a045e72023-04-13 08:41:09 -0700584 Type: submit_actions.ActionTypePickupObjectAction,
585 Value: &submit_actions.PickupObjectActionT{
586 ObjectType: submit_actions.ObjectTypekCube,
587 Auto: false,
588 },
589 },
590 Timestamp: 3500,
591 },
592 {
593 ActionTaken: &submit_actions.ActionTypeT{
594 Type: submit_actions.ActionTypePlaceObjectAction,
595 Value: &submit_actions.PlaceObjectActionT{
596 ObjectType: submit_actions.ObjectTypekCube,
597 ScoreLevel: submit_actions.ScoreLevelkSupercharged,
598 Auto: false,
599 },
600 },
601 Timestamp: 3900,
602 },
603 {
604 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700605 Type: submit_actions.ActionTypeEndMatchAction,
606 Value: &submit_actions.EndMatchActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700607 Docked: true,
608 Engaged: false,
609 BalanceAttempt: true,
Emily Markova46a69bf2023-03-22 20:45:52 -0700610 },
611 },
Filip Kujawa7a045e72023-04-13 08:41:09 -0700612 Timestamp: 4200,
Emily Markova46a69bf2023-03-22 20:45:52 -0700613 },
Emily Markova1abe9782023-03-11 19:45:38 -0800614 },
Philipp Schrader4b489222023-04-15 16:40:16 -0700615 PreScouting: false,
Emily Markova1abe9782023-03-11 19:45:38 -0800616 }).Pack(builder))
617
618 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
619 response, err := ConvertActionsToStat(submitActions)
620
621 if err != nil {
622 t.Fatal("Failed to convert actions to stats: ", err)
623 }
624
625 expected := db.Stats2023{
Philipp Schrader4b489222023-04-15 16:40:16 -0700626 PreScouting: false,
627 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
Emily Markova1abe9782023-03-11 19:45:38 -0800628 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
629 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
630 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
631 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
632 HighCubes: 0, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700633 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700634 AvgCycle: 950, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700635 BalanceAttemptAuto: false, Docked: true, Engaged: false,
Philipp Schradere11114f2023-04-15 17:04:25 -0700636 BalanceAttempt: true, CollectedBy: "",
Emily Markova1abe9782023-03-11 19:45:38 -0800637 }
638
639 if expected != response {
640 t.Fatal("Expected ", expected, ", but got ", response)
641 }
642}
643
Alex Perry81f96ba2022-03-13 18:26:19 -0700644func TestSubmitNotes(t *testing.T) {
645 database := MockDatabase{}
646 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800647 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700648 scoutingServer.Start(8080)
649 defer scoutingServer.Stop()
650
651 builder := flatbuffers.NewBuilder(1024)
652 builder.Finish((&submit_notes.SubmitNotesT{
Emily Markovae68b7632023-12-30 14:17:55 -0800653 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800654 Notes: "Notes",
655 GoodDriving: true,
656 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700657 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800658 SketchyPlacing: false,
659 GoodDefense: true,
660 BadDefense: false,
661 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700662 }).Pack(builder))
663
664 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
665 if err != nil {
666 t.Fatal("Failed to submit notes: ", err)
667 }
668
669 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800670 {
Emily Markovae68b7632023-12-30 14:17:55 -0800671 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800672 Notes: "Notes",
673 GoodDriving: true,
674 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700675 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800676 SketchyPlacing: false,
677 GoodDefense: true,
678 BadDefense: false,
679 EasilyDefended: true,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800680 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700681 }
682
683 if !reflect.DeepEqual(database.notes, expected) {
684 t.Fatal("Submitted notes did not match", expected, database.notes)
685 }
686}
687
688func TestRequestNotes(t *testing.T) {
689 database := MockDatabase{
690 notes: []db.NotesData{{
Emily Markovae68b7632023-12-30 14:17:55 -0800691 TeamNumber: "971A",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800692 Notes: "Notes",
693 GoodDriving: true,
694 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700695 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800696 SketchyPlacing: false,
697 GoodDefense: true,
698 BadDefense: false,
699 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700700 }},
701 }
702 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800703 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700704 scoutingServer.Start(8080)
705 defer scoutingServer.Stop()
706
707 builder := flatbuffers.NewBuilder(1024)
708 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
Emily Markovae68b7632023-12-30 14:17:55 -0800709 Team: "971A",
Alex Perry81f96ba2022-03-13 18:26:19 -0700710 }).Pack(builder))
711 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
712 if err != nil {
713 t.Fatal("Failed to submit notes: ", err)
714 }
715
716 if response.Notes[0].Data != "Notes" {
717 t.Fatal("requested notes did not match", response)
718 }
719}
720
Emily Markovafaecfe12023-07-01 12:40:03 -0700721func TestSubmitPitImage(t *testing.T) {
722 database := MockDatabase{}
723 scoutingServer := server.NewScoutingServer()
724 HandleRequests(&database, scoutingServer)
725 scoutingServer.Start(8080)
726 defer scoutingServer.Stop()
727
728 builder := flatbuffers.NewBuilder(1024)
729 builder.Finish((&submit_pit_image.SubmitPitImageT{
730 TeamNumber: "483A", ImagePath: "483Arobot.jpg",
731 ImageData: []byte{12, 43, 54, 34, 98},
732 }).Pack(builder))
733
734 _, err := debug.SubmitPitImage("http://localhost:8080", builder.FinishedBytes())
735 if err != nil {
736 t.Fatal("Failed to submit pit image: ", err)
737 }
738
739 expected := []db.PitImage{
740 {
741 TeamNumber: "483A", CheckSum: "177d9dc52bc25f391232e82521259c378964c068832a9178d73448ba4ac5e0b1",
742 ImagePath: "483Arobot.jpg", ImageData: []byte{12, 43, 54, 34, 98},
743 },
744 }
745
746 if !reflect.DeepEqual(database.images, expected) {
747 t.Fatal("Submitted image did not match", expected, database.images)
748 }
749}
750
751func TestRequestPitImages(t *testing.T) {
752 db := MockDatabase{
753 images: []db.PitImage{
754 {
755 TeamNumber: "932", ImagePath: "pitimage.jpg",
756 ImageData: []byte{3, 34, 44, 65}, CheckSum: "abcdf",
757 },
758 {
759 TeamNumber: "234", ImagePath: "234robot.png",
760 ImageData: []byte{64, 54, 21, 21, 76, 32}, CheckSum: "egrfd",
761 },
762 {
763 TeamNumber: "93A", ImagePath: "abcd.jpg",
764 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "rgegfd",
765 },
766 },
767 }
768
769 scoutingServer := server.NewScoutingServer()
770 HandleRequests(&db, scoutingServer)
771 scoutingServer.Start(8080)
772 defer scoutingServer.Stop()
773
774 builder := flatbuffers.NewBuilder(1024)
775 builder.Finish((&request_pit_images.RequestPitImagesT{"932"}).Pack(builder))
776
777 response, err := debug.RequestPitImages("http://localhost:8080", builder.FinishedBytes())
778 if err != nil {
779 t.Fatal("Failed to request pit images: ", err)
780 }
781
782 expected := request_pit_images_response.RequestPitImagesResponseT{
783 PitImageList: []*request_pit_images_response.PitImageT{
784 {
785 TeamNumber: "932", ImagePath: "pitimage.jpg", CheckSum: "abcdf",
786 },
787 },
788 }
789
790 if len(expected.PitImageList) != len(response.PitImageList) {
791 t.Fatal("Expected ", expected, ", but got ", *response)
792 }
793
794 for i, pit_image := range expected.PitImageList {
795 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
796 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
797 }
798 }
799}
800
Emily Markova8e39f452023-12-23 12:17:30 -0800801func TestRequestAllPitImages(t *testing.T) {
802 db := MockDatabase{
803 images: []db.PitImage{
804 {
805 TeamNumber: "32", ImagePath: "pitimage.jpg",
806 ImageData: []byte{3, 43, 44, 32}, CheckSum: "cdhrj",
807 },
808 {
809 TeamNumber: "231", ImagePath: "232robot.png",
810 ImageData: []byte{64, 54, 54, 21, 76, 32}, CheckSum: "rgre",
811 },
812 {
813 TeamNumber: "90", ImagePath: "abcd.jpg",
814 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "erfer",
815 },
816 },
817 }
818
819 scoutingServer := server.NewScoutingServer()
820 HandleRequests(&db, scoutingServer)
821 scoutingServer.Start(8080)
822 defer scoutingServer.Stop()
823
824 builder := flatbuffers.NewBuilder(1024)
825 builder.Finish((&request_all_pit_images.RequestAllPitImagesT{}).Pack(builder))
826
827 response, err := debug.RequestAllPitImages("http://localhost:8080", builder.FinishedBytes())
828 if err != nil {
829 t.Fatal("Failed to request pit images: ", err)
830 }
831
832 expected := request_all_pit_images_response.RequestAllPitImagesResponseT{
833 PitImageList: []*request_all_pit_images_response.PitImageT{
834 {
835 TeamNumber: "32", ImagePath: "pitimage.jpg", CheckSum: "cdhrj",
836 },
837 {
838 TeamNumber: "231", ImagePath: "232robot.png", CheckSum: "rgre",
839 },
840 {
841 TeamNumber: "90", ImagePath: "abcd.jpg", CheckSum: "erfer",
842 },
843 },
844 }
845
846 if len(expected.PitImageList) != len(response.PitImageList) {
847 t.Fatal("Expected ", expected, ", but got ", *response)
848 }
849
850 for i, pit_image := range expected.PitImageList {
851 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
852 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
853 }
854 }
855}
856
Milo Lin1d59f0c2022-06-22 20:30:58 -0700857func TestRequestShiftSchedule(t *testing.T) {
858 db := MockDatabase{
859 shiftSchedule: []db.Shift{
860 {
861 MatchNumber: 1,
862 R1scouter: "Bob",
863 R2scouter: "James",
864 R3scouter: "Robert",
865 B1scouter: "Alice",
866 B2scouter: "Mary",
867 B3scouter: "Patricia",
868 },
869 {
870 MatchNumber: 2,
871 R1scouter: "Liam",
872 R2scouter: "Noah",
873 R3scouter: "Oliver",
874 B1scouter: "Emma",
875 B2scouter: "Charlotte",
876 B3scouter: "Amelia",
877 },
878 },
879 }
880 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800881 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700882 scoutingServer.Start(8080)
883 defer scoutingServer.Stop()
884
885 builder := flatbuffers.NewBuilder(1024)
886 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
887
888 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
889 if err != nil {
890 t.Fatal("Failed to request shift schedule: ", err)
891 }
892
893 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
894 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
895 {
896 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700897 R1Scouter: "Bob",
898 R2Scouter: "James",
899 R3Scouter: "Robert",
900 B1Scouter: "Alice",
901 B2Scouter: "Mary",
902 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700903 },
904 {
905 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700906 R1Scouter: "Liam",
907 R2Scouter: "Noah",
908 R3Scouter: "Oliver",
909 B1Scouter: "Emma",
910 B2Scouter: "Charlotte",
911 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700912 },
913 },
914 }
915 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
916 t.Fatal("Expected ", expected, ", but got ", *response)
917 }
918 for i, match := range expected.ShiftSchedule {
919 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
920 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
921 }
922 }
923}
924
925func TestSubmitShiftSchedule(t *testing.T) {
926 database := MockDatabase{}
927 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800928 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700929 scoutingServer.Start(8080)
930 defer scoutingServer.Stop()
931
932 builder := flatbuffers.NewBuilder(1024)
933 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
934 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
935 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700936 R1Scouter: "Bob",
937 R2Scouter: "James",
938 R3Scouter: "Robert",
939 B1Scouter: "Alice",
940 B2Scouter: "Mary",
941 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700942 },
943 }).Pack(builder))
944
945 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
946 if err != nil {
947 t.Fatal("Failed to submit shift schedule: ", err)
948 }
949
950 expected := []db.Shift{
951 {MatchNumber: 1,
952 R1scouter: "Bob",
953 R2scouter: "James",
954 R3scouter: "Robert",
955 B1scouter: "Alice",
956 B2scouter: "Mary",
957 B3scouter: "Patricia"},
958 }
959 if !reflect.DeepEqual(expected, database.shiftSchedule) {
960 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
961 }
962}
963
Filip Kujawa210a03b2022-11-24 14:41:11 -0800964func TestSubmitDriverRanking(t *testing.T) {
965 database := MockDatabase{}
966 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800967 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800968 scoutingServer.Start(8080)
969 defer scoutingServer.Stop()
970
971 builder := flatbuffers.NewBuilder(1024)
972 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
973 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800974 Rank1: "1234",
975 Rank2: "1235",
976 Rank3: "1236",
Filip Kujawa210a03b2022-11-24 14:41:11 -0800977 }).Pack(builder))
978
979 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
980 if err != nil {
981 t.Fatal("Failed to submit driver ranking: ", err)
982 }
983
984 expected := []db.DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -0800985 {MatchNumber: 36, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -0800986 }
987
988 if !reflect.DeepEqual(database.driver_ranking, expected) {
989 t.Fatal("Submitted notes did not match", expected, database.notes)
990 }
991}
992
Filip Kujawaf882e022022-12-14 13:14:08 -0800993// Validates that we can request the driver rankings.
994func TestRequestDriverRankings(t *testing.T) {
995 db := MockDatabase{
996 driver_ranking: []db.DriverRankingData{
997 {
998 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800999 Rank1: "1234",
1000 Rank2: "1235",
1001 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001002 },
1003 {
1004 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001005 Rank1: "101",
1006 Rank2: "202",
1007 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001008 },
1009 },
1010 }
1011 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001012 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -08001013 scoutingServer.Start(8080)
1014 defer scoutingServer.Stop()
1015
1016 builder := flatbuffers.NewBuilder(1024)
1017 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
1018
1019 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
1020 if err != nil {
1021 t.Fatal("Failed to request all driver rankings: ", err)
1022 }
1023
1024 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
1025 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
1026 {
1027 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001028 Rank1: "1234",
1029 Rank2: "1235",
1030 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001031 },
1032 {
1033 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001034 Rank1: "101",
1035 Rank2: "202",
1036 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001037 },
1038 },
1039 }
1040 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
1041 t.Fatal("Expected ", expected, ", but got ", *response)
1042 }
1043 for i, match := range expected.DriverRankingList {
1044 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
1045 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
1046 }
1047 }
1048}
1049
1050// Validates that we can request all notes.
1051func TestRequestAllNotes(t *testing.T) {
1052 db := MockDatabase{
1053 notes: []db.NotesData{
1054 {
Emily Markovae68b7632023-12-30 14:17:55 -08001055 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001056 Notes: "Notes",
1057 GoodDriving: true,
1058 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001059 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001060 SketchyPlacing: false,
1061 GoodDefense: true,
1062 BadDefense: false,
1063 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001064 },
1065 {
Emily Markovae68b7632023-12-30 14:17:55 -08001066 TeamNumber: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001067 Notes: "More Notes",
1068 GoodDriving: false,
1069 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001070 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001071 SketchyPlacing: true,
1072 GoodDefense: false,
1073 BadDefense: true,
1074 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001075 },
1076 },
1077 }
1078 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001079 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -08001080 scoutingServer.Start(8080)
1081 defer scoutingServer.Stop()
1082
1083 builder := flatbuffers.NewBuilder(1024)
1084 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
1085
1086 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
1087 if err != nil {
1088 t.Fatal("Failed to request all notes: ", err)
1089 }
1090
1091 expected := request_all_notes_response.RequestAllNotesResponseT{
1092 NoteList: []*request_all_notes_response.NoteT{
1093 {
Emily Markovae68b7632023-12-30 14:17:55 -08001094 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001095 Notes: "Notes",
1096 GoodDriving: true,
1097 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001098 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001099 SketchyPlacing: false,
1100 GoodDefense: true,
1101 BadDefense: false,
1102 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001103 },
1104 {
Emily Markovae68b7632023-12-30 14:17:55 -08001105 Team: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001106 Notes: "More Notes",
1107 GoodDriving: false,
1108 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001109 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001110 SketchyPlacing: true,
1111 GoodDefense: false,
1112 BadDefense: true,
1113 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001114 },
1115 },
1116 }
1117 if len(expected.NoteList) != len(response.NoteList) {
1118 t.Fatal("Expected ", expected, ", but got ", *response)
1119 }
1120 for i, note := range expected.NoteList {
1121 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
1122 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
1123 }
1124 }
1125}
1126
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001127func packAction(action *submit_actions.ActionT) []byte {
1128 builder := flatbuffers.NewBuilder(50 * 1024)
1129 builder.Finish((action).Pack(builder))
1130 return (builder.FinishedBytes())
1131}
1132
Emily Markova8cb91312024-02-02 12:30:37 -08001133func TestAddingActions2024(t *testing.T) {
1134 database := MockDatabase{}
1135 scoutingServer := server.NewScoutingServer()
1136 HandleRequests(&database, scoutingServer)
1137 scoutingServer.Start(8080)
1138 defer scoutingServer.Stop()
1139
1140 builder := flatbuffers.NewBuilder(1024)
1141 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
1142 TeamNumber: "3421",
1143 MatchNumber: 2,
1144 SetNumber: 1,
1145 CompLevel: "quals",
1146 ActionsList: []*submit_2024_actions.ActionT{
1147 {
1148 ActionTaken: &submit_2024_actions.ActionTypeT{
1149 Type: submit_2024_actions.ActionTypePickupNoteAction,
1150 Value: &submit_2024_actions.PickupNoteActionT{
1151 Auto: true,
1152 },
1153 },
1154 Timestamp: 1800,
1155 },
1156 {
1157 ActionTaken: &submit_2024_actions.ActionTypeT{
1158 Type: submit_2024_actions.ActionTypePlaceNoteAction,
1159 Value: &submit_2024_actions.PlaceNoteActionT{
1160 ScoreType: submit_2024_actions.ScoreTypekSPEAKER,
1161 Auto: false,
1162 },
1163 },
1164 Timestamp: 2500,
1165 },
1166 },
1167 PreScouting: true,
1168 }).Pack(builder))
1169
1170 _, err := debug.Submit2024Actions("http://localhost:8080", builder.FinishedBytes())
1171 if err != nil {
1172 t.Fatal("Failed to submit actions: ", err)
1173 }
1174
1175 expectedActions := []db.Action{
1176 {
1177 PreScouting: true,
1178 TeamNumber: "3421",
1179 MatchNumber: 2,
1180 SetNumber: 1,
1181 CompLevel: "quals",
1182 CollectedBy: "debug_cli",
1183 CompletedAction: []byte{},
1184 Timestamp: 1800,
1185 },
1186 {
1187 PreScouting: true,
1188 TeamNumber: "3421",
1189 MatchNumber: 2,
1190 SetNumber: 1,
1191 CompLevel: "quals",
1192 CollectedBy: "debug_cli",
1193 CompletedAction: []byte{},
1194 Timestamp: 2500,
1195 },
1196 }
1197
1198 expectedStats := []db.Stats2024{
1199 db.Stats2024{
1200 PreScouting: true, TeamNumber: "3421",
1201 MatchNumber: 2, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 0,
1202 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1203 Speaker: 1, Amp: 0, SpeakerAmplified: 0, AmpAmplified: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001204 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markova8cb91312024-02-02 12:30:37 -08001205 Park: false, OnStage: false, Harmony: false, CollectedBy: "debug_cli",
1206 },
1207 }
1208
1209 if !reflect.DeepEqual(expectedActions, database.actions) {
1210 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1211 }
1212 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1213 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1214 }
1215}
1216
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001217func TestAddingActions(t *testing.T) {
1218 database := MockDatabase{}
1219 scoutingServer := server.NewScoutingServer()
1220 HandleRequests(&database, scoutingServer)
1221 scoutingServer.Start(8080)
1222 defer scoutingServer.Stop()
1223
1224 builder := flatbuffers.NewBuilder(1024)
1225 builder.Finish((&submit_actions.SubmitActionsT{
1226 TeamNumber: "1234",
1227 MatchNumber: 4,
1228 SetNumber: 1,
1229 CompLevel: "qual",
1230 ActionsList: []*submit_actions.ActionT{
1231 {
1232 ActionTaken: &submit_actions.ActionTypeT{
1233 Type: submit_actions.ActionTypePickupObjectAction,
1234 Value: &submit_actions.PickupObjectActionT{
1235 ObjectType: submit_actions.ObjectTypekCube,
1236 Auto: true,
1237 },
1238 },
1239 Timestamp: 2400,
1240 },
1241 {
1242 ActionTaken: &submit_actions.ActionTypeT{
1243 Type: submit_actions.ActionTypePlaceObjectAction,
1244 Value: &submit_actions.PlaceObjectActionT{
1245 ObjectType: submit_actions.ObjectTypekCube,
1246 ScoreLevel: submit_actions.ScoreLevelkLow,
1247 Auto: false,
1248 },
1249 },
1250 Timestamp: 1009,
1251 },
1252 },
Philipp Schrader4b489222023-04-15 16:40:16 -07001253 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001254 }).Pack(builder))
1255
1256 _, err := debug.SubmitActions("http://localhost:8080", builder.FinishedBytes())
1257 if err != nil {
1258 t.Fatal("Failed to submit actions: ", err)
1259 }
1260
1261 // Make sure that the data made it into the database.
1262 // TODO: Add this back when we figure out how to add the serialized action into the database.
1263
1264 /* expectedActionsT := []*submit_actions.ActionT{
1265 {
1266 ActionTaken: &submit_actions.ActionTypeT{
1267 Type: submit_actions.ActionTypePickupObjectAction,
1268 Value: &submit_actions.PickupObjectActionT{
1269 ObjectType: submit_actions.ObjectTypekCube,
1270 Auto: true,
1271 },
1272 },
1273 Timestamp: 2400,
1274 },
1275 {
1276 ActionTaken: &submit_actions.ActionTypeT{
1277 Type: submit_actions.ActionTypePlaceObjectAction,
1278 Value: &submit_actions.PlaceObjectActionT{
1279 ObjectType: submit_actions.ObjectTypekCube,
1280 ScoreLevel: submit_actions.ScoreLevelkLow,
1281 Auto: false,
1282 },
1283 },
1284 Timestamp: 1009,
1285 },
1286 } */
1287
1288 expectedActions := []db.Action{
1289 {
Philipp Schrader4b489222023-04-15 16:40:16 -07001290 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001291 TeamNumber: "1234",
1292 MatchNumber: 4,
1293 SetNumber: 1,
1294 CompLevel: "qual",
1295 CollectedBy: "debug_cli",
1296 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -07001297 Timestamp: 2400,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001298 },
1299 {
Philipp Schrader4b489222023-04-15 16:40:16 -07001300 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001301 TeamNumber: "1234",
1302 MatchNumber: 4,
1303 SetNumber: 1,
1304 CompLevel: "qual",
1305 CollectedBy: "debug_cli",
1306 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -07001307 Timestamp: 1009,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001308 },
1309 }
1310
Philipp Schradere11114f2023-04-15 17:04:25 -07001311 expectedStats := []db.Stats2023{
1312 db.Stats2023{
1313 PreScouting: true,
1314 TeamNumber: "1234", MatchNumber: 4, SetNumber: 1,
1315 CompLevel: "qual", StartingQuadrant: 0, LowCubesAuto: 0,
1316 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
1317 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1318 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 0,
1319 HighCubes: 0, CubesDropped: 0, LowCones: 0,
1320 MiddleCones: 0, HighCones: 0, ConesDropped: 0, SuperchargedPieces: 0,
1321 AvgCycle: 0, Mobility: false, DockedAuto: false, EngagedAuto: false,
1322 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1323 BalanceAttempt: false, CollectedBy: "debug_cli",
1324 },
1325 }
1326
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001327 if !reflect.DeepEqual(expectedActions, database.actions) {
1328 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1329 }
Philipp Schradere11114f2023-04-15 17:04:25 -07001330 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1331 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1332 }
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001333}
1334
Filip Kujawac1ded372023-05-27 14:33:43 -07001335// Validates that we can delete stats.
1336func TestDeleteFromStats(t *testing.T) {
1337 database := MockDatabase{
1338 stats2023: []db.Stats2023{
1339 {
1340 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1341 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1342 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1343 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1344 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1345 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1346 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1347 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1348 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1349 BalanceAttempt: true, CollectedBy: "isaac",
1350 },
1351 {
1352 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
1353 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
1354 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
1355 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1356 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
1357 HighCubes: 1, CubesDropped: 0, LowCones: 0,
1358 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
1359 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
1360 BalanceAttemptAuto: true, Docked: false, Engaged: false,
1361 BalanceAttempt: true, CollectedBy: "unknown",
1362 },
1363 },
1364 actions: []db.Action{
1365 {
1366 PreScouting: true,
1367 TeamNumber: "3634",
1368 MatchNumber: 1,
1369 SetNumber: 2,
1370 CompLevel: "quals",
1371 CollectedBy: "debug_cli",
1372 CompletedAction: []byte{},
1373 Timestamp: 2400,
1374 },
1375 {
1376 PreScouting: true,
1377 TeamNumber: "2343",
1378 MatchNumber: 1,
1379 SetNumber: 2,
1380 CompLevel: "quals",
1381 CollectedBy: "debug_cli",
1382 CompletedAction: []byte{},
1383 Timestamp: 1009,
1384 },
1385 },
1386 }
1387 scoutingServer := server.NewScoutingServer()
1388 HandleRequests(&database, scoutingServer)
1389 scoutingServer.Start(8080)
1390 defer scoutingServer.Stop()
1391
1392 builder := flatbuffers.NewBuilder(1024)
1393 builder.Finish((&delete_2023_data_scouting.Delete2023DataScoutingT{
1394 CompLevel: "quals",
1395 MatchNumber: 1,
1396 SetNumber: 2,
1397 TeamNumber: "2343",
1398 }).Pack(builder))
1399
1400 _, err := debug.Delete2023DataScouting("http://localhost:8080", builder.FinishedBytes())
1401 if err != nil {
1402 t.Fatal("Failed to delete from data scouting ", err)
1403 }
1404
1405 expectedActions := []db.Action{
1406 {
1407 PreScouting: true,
1408 TeamNumber: "3634",
1409 MatchNumber: 1,
1410 SetNumber: 2,
1411 CompLevel: "quals",
1412 CollectedBy: "debug_cli",
1413 CompletedAction: []byte{},
1414 Timestamp: 2400,
1415 },
1416 }
1417
1418 expectedStats := []db.Stats2023{
1419 {
1420 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1421 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1422 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1423 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1424 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1425 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1426 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1427 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1428 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1429 BalanceAttempt: true, CollectedBy: "isaac",
1430 },
1431 }
1432
1433 if !reflect.DeepEqual(expectedActions, database.actions) {
1434 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1435 }
1436 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1437 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1438 }
1439}
1440
Emily Markova8cb91312024-02-02 12:30:37 -08001441// Validates that we can delete 2024 stats.
1442func TestDeleteFromStats2024(t *testing.T) {
1443 database := MockDatabase{
1444 stats2024: []db.Stats2024{
1445 {
1446 PreScouting: false, TeamNumber: "746",
1447 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1448 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
1449 Speaker: 0, Amp: 1, SpeakerAmplified: 1, AmpAmplified: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -08001450 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markova8cb91312024-02-02 12:30:37 -08001451 Park: false, OnStage: false, Harmony: true, CollectedBy: "alek",
1452 },
1453 {
1454 PreScouting: false, TeamNumber: "244",
1455 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1456 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1457 Speaker: 0, Amp: 0, SpeakerAmplified: 3, AmpAmplified: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -08001458 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markova8cb91312024-02-02 12:30:37 -08001459 Park: false, OnStage: true, Harmony: false, CollectedBy: "kacey",
1460 },
1461 },
1462 actions: []db.Action{
1463 {
1464 PreScouting: true,
1465 TeamNumber: "746",
1466 MatchNumber: 3,
1467 SetNumber: 1,
1468 CompLevel: "quals",
1469 CollectedBy: "debug_cli",
1470 CompletedAction: []byte{},
1471 Timestamp: 2400,
1472 },
1473 {
1474 PreScouting: true,
1475 TeamNumber: "244",
1476 MatchNumber: 5,
1477 SetNumber: 3,
1478 CompLevel: "quals",
1479 CollectedBy: "debug_cli",
1480 CompletedAction: []byte{},
1481 Timestamp: 1009,
1482 },
1483 },
1484 }
1485 scoutingServer := server.NewScoutingServer()
1486 HandleRequests(&database, scoutingServer)
1487 scoutingServer.Start(8080)
1488 defer scoutingServer.Stop()
1489
1490 builder := flatbuffers.NewBuilder(1024)
1491 builder.Finish((&delete_2024_data_scouting.Delete2024DataScoutingT{
1492 CompLevel: "quals",
1493 MatchNumber: 3,
1494 SetNumber: 1,
1495 TeamNumber: "746",
1496 }).Pack(builder))
1497
1498 _, err := debug.Delete2024DataScouting("http://localhost:8080", builder.FinishedBytes())
1499 if err != nil {
1500 t.Fatal("Failed to delete from data scouting 2024", err)
1501 }
1502
1503 expectedActions := []db.Action{
1504 {
1505 PreScouting: true,
1506 TeamNumber: "244",
1507 MatchNumber: 5,
1508 SetNumber: 3,
1509 CompLevel: "quals",
1510 CollectedBy: "debug_cli",
1511 CompletedAction: []byte{},
1512 Timestamp: 1009,
1513 },
1514 }
1515
1516 expectedStats := []db.Stats2024{
1517 {
1518 PreScouting: false, TeamNumber: "244",
1519 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1520 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1521 Speaker: 0, Amp: 0, SpeakerAmplified: 3, AmpAmplified: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -08001522 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markova8cb91312024-02-02 12:30:37 -08001523 Park: false, OnStage: true, Harmony: false, CollectedBy: "kacey",
1524 },
1525 }
1526
1527 if !reflect.DeepEqual(expectedActions, database.actions) {
1528 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1529 }
1530 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1531 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1532 }
1533}
1534
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001535// A mocked database we can use for testing. Add functionality to this as
1536// needed for your tests.
1537
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001538type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001539 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -08001540 notes []db.NotesData
1541 shiftSchedule []db.Shift
1542 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -08001543 stats2023 []db.Stats2023
Emily Markova8cb91312024-02-02 12:30:37 -08001544 stats2024 []db.Stats2024
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001545 actions []db.Action
Emily Markovafaecfe12023-07-01 12:40:03 -07001546 images []db.PitImage
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001547}
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001548
Emily Markovabf24c9e2023-02-08 20:31:11 -08001549func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -08001550 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001551 return nil
1552}
1553
Emily Markova290147d2023-03-03 22:40:06 -08001554func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
1555 database.stats2023 = append(database.stats2023, stats2023)
1556 return nil
1557}
Emily Markova8cb91312024-02-02 12:30:37 -08001558
1559func (database *MockDatabase) AddToStats2024(stats2024 db.Stats2024) error {
1560 database.stats2024 = append(database.stats2024, stats2024)
1561 return nil
1562}
Emily Markovabf24c9e2023-02-08 20:31:11 -08001563func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001564 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001565}
1566
Emily Markova290147d2023-03-03 22:40:06 -08001567func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
1568 return database.stats2023, nil
1569}
1570
Emily Markova8cb91312024-02-02 12:30:37 -08001571func (database *MockDatabase) ReturnStats2024() ([]db.Stats2024, error) {
1572 return database.stats2024, nil
1573}
1574
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001575func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error) {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001576 var results []db.Stats2023
1577 for _, stats := range database.stats2023 {
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001578 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001579 results = append(results, stats)
1580 }
1581 }
1582 return results, nil
1583}
1584
Emily Markova8cb91312024-02-02 12:30:37 -08001585func (database *MockDatabase) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2024, error) {
1586 var results []db.Stats2024
1587 for _, stats := range database.stats2024 {
1588 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
1589 results = append(results, stats)
1590 }
1591 }
1592 return results, nil
1593}
1594
Emily Markovae68b7632023-12-30 14:17:55 -08001595func (database *MockDatabase) QueryNotes(requestedTeam string) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -07001596 var results []string
1597 for _, data := range database.notes {
1598 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -07001599 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -07001600 }
1601 }
Philipp Schradereecb8962022-06-01 21:02:42 -07001602 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -07001603}
1604
Filip Kujawaf947cb42022-11-21 10:00:30 -08001605func (database *MockDatabase) AddNotes(data db.NotesData) error {
1606 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -07001607 return nil
1608}
1609
Filip Kujawaf882e022022-12-14 13:14:08 -08001610func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
1611 return database.notes, nil
1612}
1613
Milo Lin1d59f0c2022-06-22 20:30:58 -07001614func (database *MockDatabase) AddToShift(data db.Shift) error {
1615 database.shiftSchedule = append(database.shiftSchedule, data)
1616 return nil
1617}
1618
1619func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
1620 return database.shiftSchedule, nil
1621}
1622
1623func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
1624 return []db.Shift{}, nil
1625}
1626
Emily Markovafaecfe12023-07-01 12:40:03 -07001627func (database *MockDatabase) QueryPitImages(requestedTeam string) ([]db.RequestedPitImage, error) {
1628 var results []db.RequestedPitImage
1629 for _, data := range database.images {
1630 if data.TeamNumber == requestedTeam {
1631 results = append(results, db.RequestedPitImage{
1632 TeamNumber: data.TeamNumber,
1633 ImagePath: data.ImagePath,
1634 CheckSum: data.CheckSum,
1635 })
1636 }
1637 }
1638 return results, nil
1639}
1640
Filip Kujawa210a03b2022-11-24 14:41:11 -08001641func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
1642 database.driver_ranking = append(database.driver_ranking, data)
1643 return nil
1644}
1645
Filip Kujawaf882e022022-12-14 13:14:08 -08001646func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
1647 return database.driver_ranking, nil
1648}
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001649
1650func (database *MockDatabase) AddAction(action db.Action) error {
1651 database.actions = append(database.actions, action)
1652 return nil
1653}
1654
Emily Markovafaecfe12023-07-01 12:40:03 -07001655func (database *MockDatabase) AddPitImage(pitImage db.PitImage) error {
1656 database.images = append(database.images, pitImage)
1657 return nil
1658}
1659
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001660func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
1661 return database.actions, nil
1662}
Filip Kujawac1ded372023-05-27 14:33:43 -07001663
Emily Markova8e39f452023-12-23 12:17:30 -08001664func (database *MockDatabase) ReturnPitImages() ([]db.PitImage, error) {
1665 return database.images, nil
1666}
1667
Filip Kujawac1ded372023-05-27 14:33:43 -07001668func (database *MockDatabase) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1669 for i, stat := range database.stats2023 {
1670 if stat.CompLevel == compLevel_ &&
1671 stat.MatchNumber == matchNumber_ &&
1672 stat.SetNumber == setNumber_ &&
1673 stat.TeamNumber == teamNumber_ {
1674 // Match found, remove the element from the array.
1675 database.stats2023 = append(database.stats2023[:i], database.stats2023[i+1:]...)
1676 }
1677 }
1678 return nil
1679}
1680
Emily Markova8cb91312024-02-02 12:30:37 -08001681func (database *MockDatabase) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1682 for i, stat := range database.stats2024 {
1683 if stat.CompLevel == compLevel_ &&
1684 stat.MatchNumber == matchNumber_ &&
1685 stat.SetNumber == setNumber_ &&
1686 stat.TeamNumber == teamNumber_ {
1687 // Match found, remove the element from the array.
1688 database.stats2024 = append(database.stats2024[:i], database.stats2024[i+1:]...)
1689 }
1690 }
1691 return nil
1692}
1693
Filip Kujawac1ded372023-05-27 14:33:43 -07001694func (database *MockDatabase) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1695 for i, action := range database.actions {
1696 if action.CompLevel == compLevel_ &&
1697 action.MatchNumber == matchNumber_ &&
1698 action.SetNumber == setNumber_ &&
1699 action.TeamNumber == teamNumber_ {
1700 // Match found, remove the element from the array.
1701 database.actions = append(database.actions[:i], database.actions[i+1:]...)
1702 }
1703 }
1704 return nil
1705}