blob: eb5e904a909018000ad99a54581f3e9adcd77da5 [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,
140 NotesDropped: 0, Penalties: 01, TrapNote: true, AvgCycle: 233,
141 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,
148 NotesDropped: 0, Penalties: 1, TrapNote: true, AvgCycle: 120,
149 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,
217 NotesDropped: 2, Penalties: 2, TrapNote: true, AvgCycle: 0,
218 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,
225 NotesDropped: 1, Penalties: 0, TrapNote: false, AvgCycle: 0,
226 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,
250 NotesDropped: 2, Penalties: 2, TrapNote: true, AvgCycle: 0,
251 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,
258 NotesDropped: 1, Penalties: 0, TrapNote: false, AvgCycle: 0,
259 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,
462 },
463 },
464 Timestamp: 4200,
465 },
466 },
467 PreScouting: false,
468 }).Pack(builder))
469
470 submit2024Actions := submit_2024_actions.GetRootAsSubmit2024Actions(builder.FinishedBytes(), 0)
471 response, err := ConvertActionsToStat2024(submit2024Actions)
472
473 if err != nil {
474 t.Fatal("Failed to convert actions to stats: ", err)
475 }
476
477 expected := db.Stats2024{
478 PreScouting: false, TeamNumber: "4244",
479 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
480 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
481 Speaker: 0, Amp: 0, SpeakerAmplified: 1, AmpAmplified: 1,
Emily Markovadcadcb62024-02-03 13:07:17 -0800482 NotesDropped: 0, Penalties: 5, TrapNote: false, AvgCycle: 950,
Emily Markova8cb91312024-02-02 12:30:37 -0800483 Park: false, OnStage: false, Harmony: true, CollectedBy: "",
484 }
485
486 if expected != response {
487 t.Fatal("Expected ", expected, ", but got ", response)
488 }
489}
490
Emily Markova1abe9782023-03-11 19:45:38 -0800491// Validates that we can request the 2023 stats.
492func TestConvertActionsToStat(t *testing.T) {
493 builder := flatbuffers.NewBuilder(1024)
494 builder.Finish((&submit_actions.SubmitActionsT{
495 TeamNumber: "4244",
496 MatchNumber: 3,
497 SetNumber: 1,
498 CompLevel: "quals",
Emily Markova1abe9782023-03-11 19:45:38 -0800499 ActionsList: []*submit_actions.ActionT{
500 {
501 ActionTaken: &submit_actions.ActionTypeT{
502 Type: submit_actions.ActionTypeStartMatchAction,
503 Value: &submit_actions.StartMatchActionT{
504 Position: 1,
505 },
506 },
507 Timestamp: 0,
508 },
509 {
510 ActionTaken: &submit_actions.ActionTypeT{
511 Type: submit_actions.ActionTypePickupObjectAction,
512 Value: &submit_actions.PickupObjectActionT{
513 ObjectType: submit_actions.ObjectTypekCube,
514 Auto: true,
515 },
516 },
517 Timestamp: 400,
518 },
519 {
520 ActionTaken: &submit_actions.ActionTypeT{
521 Type: submit_actions.ActionTypePickupObjectAction,
522 Value: &submit_actions.PickupObjectActionT{
523 ObjectType: submit_actions.ObjectTypekCube,
524 Auto: true,
525 },
526 },
527 Timestamp: 800,
528 },
529 {
530 ActionTaken: &submit_actions.ActionTypeT{
531 Type: submit_actions.ActionTypePlaceObjectAction,
532 Value: &submit_actions.PlaceObjectActionT{
533 ObjectType: submit_actions.ObjectTypekCube,
534 ScoreLevel: submit_actions.ScoreLevelkLow,
535 Auto: true,
536 },
537 },
538 Timestamp: 2000,
539 },
540 {
541 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700542 Type: submit_actions.ActionTypeMobilityAction,
543 Value: &submit_actions.MobilityActionT{
544 Mobility: true,
545 },
546 },
547 Timestamp: 2200,
548 },
549 {
550 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700551 Type: submit_actions.ActionTypeAutoBalanceAction,
552 Value: &submit_actions.AutoBalanceActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700553 Docked: true,
554 Engaged: true,
555 BalanceAttempt: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700556 },
557 },
558 Timestamp: 2400,
559 },
560 {
561 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova1abe9782023-03-11 19:45:38 -0800562 Type: submit_actions.ActionTypePickupObjectAction,
563 Value: &submit_actions.PickupObjectActionT{
564 ObjectType: submit_actions.ObjectTypekCone,
565 Auto: false,
566 },
567 },
568 Timestamp: 2800,
569 },
570 {
571 ActionTaken: &submit_actions.ActionTypeT{
572 Type: submit_actions.ActionTypePlaceObjectAction,
573 Value: &submit_actions.PlaceObjectActionT{
574 ObjectType: submit_actions.ObjectTypekCone,
575 ScoreLevel: submit_actions.ScoreLevelkHigh,
576 Auto: false,
577 },
578 },
579 Timestamp: 3100,
580 },
Emily Markova46a69bf2023-03-22 20:45:52 -0700581 {
582 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa7a045e72023-04-13 08:41:09 -0700583 Type: submit_actions.ActionTypePickupObjectAction,
584 Value: &submit_actions.PickupObjectActionT{
585 ObjectType: submit_actions.ObjectTypekCube,
586 Auto: false,
587 },
588 },
589 Timestamp: 3500,
590 },
591 {
592 ActionTaken: &submit_actions.ActionTypeT{
593 Type: submit_actions.ActionTypePlaceObjectAction,
594 Value: &submit_actions.PlaceObjectActionT{
595 ObjectType: submit_actions.ObjectTypekCube,
596 ScoreLevel: submit_actions.ScoreLevelkSupercharged,
597 Auto: false,
598 },
599 },
600 Timestamp: 3900,
601 },
602 {
603 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700604 Type: submit_actions.ActionTypeEndMatchAction,
605 Value: &submit_actions.EndMatchActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700606 Docked: true,
607 Engaged: false,
608 BalanceAttempt: true,
Emily Markova46a69bf2023-03-22 20:45:52 -0700609 },
610 },
Filip Kujawa7a045e72023-04-13 08:41:09 -0700611 Timestamp: 4200,
Emily Markova46a69bf2023-03-22 20:45:52 -0700612 },
Emily Markova1abe9782023-03-11 19:45:38 -0800613 },
Philipp Schrader4b489222023-04-15 16:40:16 -0700614 PreScouting: false,
Emily Markova1abe9782023-03-11 19:45:38 -0800615 }).Pack(builder))
616
617 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
618 response, err := ConvertActionsToStat(submitActions)
619
620 if err != nil {
621 t.Fatal("Failed to convert actions to stats: ", err)
622 }
623
624 expected := db.Stats2023{
Philipp Schrader4b489222023-04-15 16:40:16 -0700625 PreScouting: false,
626 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
Emily Markova1abe9782023-03-11 19:45:38 -0800627 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
628 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
629 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
630 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
631 HighCubes: 0, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700632 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700633 AvgCycle: 950, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700634 BalanceAttemptAuto: false, Docked: true, Engaged: false,
Philipp Schradere11114f2023-04-15 17:04:25 -0700635 BalanceAttempt: true, CollectedBy: "",
Emily Markova1abe9782023-03-11 19:45:38 -0800636 }
637
638 if expected != response {
639 t.Fatal("Expected ", expected, ", but got ", response)
640 }
641}
642
Alex Perry81f96ba2022-03-13 18:26:19 -0700643func TestSubmitNotes(t *testing.T) {
644 database := MockDatabase{}
645 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800646 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700647 scoutingServer.Start(8080)
648 defer scoutingServer.Stop()
649
650 builder := flatbuffers.NewBuilder(1024)
651 builder.Finish((&submit_notes.SubmitNotesT{
Emily Markovae68b7632023-12-30 14:17:55 -0800652 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800653 Notes: "Notes",
654 GoodDriving: true,
655 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700656 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800657 SketchyPlacing: false,
658 GoodDefense: true,
659 BadDefense: false,
660 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700661 }).Pack(builder))
662
663 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
664 if err != nil {
665 t.Fatal("Failed to submit notes: ", err)
666 }
667
668 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800669 {
Emily Markovae68b7632023-12-30 14:17:55 -0800670 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800671 Notes: "Notes",
672 GoodDriving: true,
673 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700674 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800675 SketchyPlacing: false,
676 GoodDefense: true,
677 BadDefense: false,
678 EasilyDefended: true,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800679 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700680 }
681
682 if !reflect.DeepEqual(database.notes, expected) {
683 t.Fatal("Submitted notes did not match", expected, database.notes)
684 }
685}
686
687func TestRequestNotes(t *testing.T) {
688 database := MockDatabase{
689 notes: []db.NotesData{{
Emily Markovae68b7632023-12-30 14:17:55 -0800690 TeamNumber: "971A",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800691 Notes: "Notes",
692 GoodDriving: true,
693 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700694 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800695 SketchyPlacing: false,
696 GoodDefense: true,
697 BadDefense: false,
698 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700699 }},
700 }
701 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800702 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700703 scoutingServer.Start(8080)
704 defer scoutingServer.Stop()
705
706 builder := flatbuffers.NewBuilder(1024)
707 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
Emily Markovae68b7632023-12-30 14:17:55 -0800708 Team: "971A",
Alex Perry81f96ba2022-03-13 18:26:19 -0700709 }).Pack(builder))
710 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
711 if err != nil {
712 t.Fatal("Failed to submit notes: ", err)
713 }
714
715 if response.Notes[0].Data != "Notes" {
716 t.Fatal("requested notes did not match", response)
717 }
718}
719
Emily Markovafaecfe12023-07-01 12:40:03 -0700720func TestSubmitPitImage(t *testing.T) {
721 database := MockDatabase{}
722 scoutingServer := server.NewScoutingServer()
723 HandleRequests(&database, scoutingServer)
724 scoutingServer.Start(8080)
725 defer scoutingServer.Stop()
726
727 builder := flatbuffers.NewBuilder(1024)
728 builder.Finish((&submit_pit_image.SubmitPitImageT{
729 TeamNumber: "483A", ImagePath: "483Arobot.jpg",
730 ImageData: []byte{12, 43, 54, 34, 98},
731 }).Pack(builder))
732
733 _, err := debug.SubmitPitImage("http://localhost:8080", builder.FinishedBytes())
734 if err != nil {
735 t.Fatal("Failed to submit pit image: ", err)
736 }
737
738 expected := []db.PitImage{
739 {
740 TeamNumber: "483A", CheckSum: "177d9dc52bc25f391232e82521259c378964c068832a9178d73448ba4ac5e0b1",
741 ImagePath: "483Arobot.jpg", ImageData: []byte{12, 43, 54, 34, 98},
742 },
743 }
744
745 if !reflect.DeepEqual(database.images, expected) {
746 t.Fatal("Submitted image did not match", expected, database.images)
747 }
748}
749
750func TestRequestPitImages(t *testing.T) {
751 db := MockDatabase{
752 images: []db.PitImage{
753 {
754 TeamNumber: "932", ImagePath: "pitimage.jpg",
755 ImageData: []byte{3, 34, 44, 65}, CheckSum: "abcdf",
756 },
757 {
758 TeamNumber: "234", ImagePath: "234robot.png",
759 ImageData: []byte{64, 54, 21, 21, 76, 32}, CheckSum: "egrfd",
760 },
761 {
762 TeamNumber: "93A", ImagePath: "abcd.jpg",
763 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "rgegfd",
764 },
765 },
766 }
767
768 scoutingServer := server.NewScoutingServer()
769 HandleRequests(&db, scoutingServer)
770 scoutingServer.Start(8080)
771 defer scoutingServer.Stop()
772
773 builder := flatbuffers.NewBuilder(1024)
774 builder.Finish((&request_pit_images.RequestPitImagesT{"932"}).Pack(builder))
775
776 response, err := debug.RequestPitImages("http://localhost:8080", builder.FinishedBytes())
777 if err != nil {
778 t.Fatal("Failed to request pit images: ", err)
779 }
780
781 expected := request_pit_images_response.RequestPitImagesResponseT{
782 PitImageList: []*request_pit_images_response.PitImageT{
783 {
784 TeamNumber: "932", ImagePath: "pitimage.jpg", CheckSum: "abcdf",
785 },
786 },
787 }
788
789 if len(expected.PitImageList) != len(response.PitImageList) {
790 t.Fatal("Expected ", expected, ", but got ", *response)
791 }
792
793 for i, pit_image := range expected.PitImageList {
794 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
795 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
796 }
797 }
798}
799
Emily Markova8e39f452023-12-23 12:17:30 -0800800func TestRequestAllPitImages(t *testing.T) {
801 db := MockDatabase{
802 images: []db.PitImage{
803 {
804 TeamNumber: "32", ImagePath: "pitimage.jpg",
805 ImageData: []byte{3, 43, 44, 32}, CheckSum: "cdhrj",
806 },
807 {
808 TeamNumber: "231", ImagePath: "232robot.png",
809 ImageData: []byte{64, 54, 54, 21, 76, 32}, CheckSum: "rgre",
810 },
811 {
812 TeamNumber: "90", ImagePath: "abcd.jpg",
813 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "erfer",
814 },
815 },
816 }
817
818 scoutingServer := server.NewScoutingServer()
819 HandleRequests(&db, scoutingServer)
820 scoutingServer.Start(8080)
821 defer scoutingServer.Stop()
822
823 builder := flatbuffers.NewBuilder(1024)
824 builder.Finish((&request_all_pit_images.RequestAllPitImagesT{}).Pack(builder))
825
826 response, err := debug.RequestAllPitImages("http://localhost:8080", builder.FinishedBytes())
827 if err != nil {
828 t.Fatal("Failed to request pit images: ", err)
829 }
830
831 expected := request_all_pit_images_response.RequestAllPitImagesResponseT{
832 PitImageList: []*request_all_pit_images_response.PitImageT{
833 {
834 TeamNumber: "32", ImagePath: "pitimage.jpg", CheckSum: "cdhrj",
835 },
836 {
837 TeamNumber: "231", ImagePath: "232robot.png", CheckSum: "rgre",
838 },
839 {
840 TeamNumber: "90", ImagePath: "abcd.jpg", CheckSum: "erfer",
841 },
842 },
843 }
844
845 if len(expected.PitImageList) != len(response.PitImageList) {
846 t.Fatal("Expected ", expected, ", but got ", *response)
847 }
848
849 for i, pit_image := range expected.PitImageList {
850 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
851 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
852 }
853 }
854}
855
Milo Lin1d59f0c2022-06-22 20:30:58 -0700856func TestRequestShiftSchedule(t *testing.T) {
857 db := MockDatabase{
858 shiftSchedule: []db.Shift{
859 {
860 MatchNumber: 1,
861 R1scouter: "Bob",
862 R2scouter: "James",
863 R3scouter: "Robert",
864 B1scouter: "Alice",
865 B2scouter: "Mary",
866 B3scouter: "Patricia",
867 },
868 {
869 MatchNumber: 2,
870 R1scouter: "Liam",
871 R2scouter: "Noah",
872 R3scouter: "Oliver",
873 B1scouter: "Emma",
874 B2scouter: "Charlotte",
875 B3scouter: "Amelia",
876 },
877 },
878 }
879 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800880 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700881 scoutingServer.Start(8080)
882 defer scoutingServer.Stop()
883
884 builder := flatbuffers.NewBuilder(1024)
885 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
886
887 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
888 if err != nil {
889 t.Fatal("Failed to request shift schedule: ", err)
890 }
891
892 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
893 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
894 {
895 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700896 R1Scouter: "Bob",
897 R2Scouter: "James",
898 R3Scouter: "Robert",
899 B1Scouter: "Alice",
900 B2Scouter: "Mary",
901 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700902 },
903 {
904 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700905 R1Scouter: "Liam",
906 R2Scouter: "Noah",
907 R3Scouter: "Oliver",
908 B1Scouter: "Emma",
909 B2Scouter: "Charlotte",
910 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700911 },
912 },
913 }
914 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
915 t.Fatal("Expected ", expected, ", but got ", *response)
916 }
917 for i, match := range expected.ShiftSchedule {
918 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
919 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
920 }
921 }
922}
923
924func TestSubmitShiftSchedule(t *testing.T) {
925 database := MockDatabase{}
926 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800927 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700928 scoutingServer.Start(8080)
929 defer scoutingServer.Stop()
930
931 builder := flatbuffers.NewBuilder(1024)
932 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
933 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
934 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700935 R1Scouter: "Bob",
936 R2Scouter: "James",
937 R3Scouter: "Robert",
938 B1Scouter: "Alice",
939 B2Scouter: "Mary",
940 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700941 },
942 }).Pack(builder))
943
944 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
945 if err != nil {
946 t.Fatal("Failed to submit shift schedule: ", err)
947 }
948
949 expected := []db.Shift{
950 {MatchNumber: 1,
951 R1scouter: "Bob",
952 R2scouter: "James",
953 R3scouter: "Robert",
954 B1scouter: "Alice",
955 B2scouter: "Mary",
956 B3scouter: "Patricia"},
957 }
958 if !reflect.DeepEqual(expected, database.shiftSchedule) {
959 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
960 }
961}
962
Filip Kujawa210a03b2022-11-24 14:41:11 -0800963func TestSubmitDriverRanking(t *testing.T) {
964 database := MockDatabase{}
965 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800966 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800967 scoutingServer.Start(8080)
968 defer scoutingServer.Stop()
969
970 builder := flatbuffers.NewBuilder(1024)
971 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
972 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800973 Rank1: "1234",
974 Rank2: "1235",
975 Rank3: "1236",
Filip Kujawa210a03b2022-11-24 14:41:11 -0800976 }).Pack(builder))
977
978 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
979 if err != nil {
980 t.Fatal("Failed to submit driver ranking: ", err)
981 }
982
983 expected := []db.DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -0800984 {MatchNumber: 36, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -0800985 }
986
987 if !reflect.DeepEqual(database.driver_ranking, expected) {
988 t.Fatal("Submitted notes did not match", expected, database.notes)
989 }
990}
991
Filip Kujawaf882e022022-12-14 13:14:08 -0800992// Validates that we can request the driver rankings.
993func TestRequestDriverRankings(t *testing.T) {
994 db := MockDatabase{
995 driver_ranking: []db.DriverRankingData{
996 {
997 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800998 Rank1: "1234",
999 Rank2: "1235",
1000 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001001 },
1002 {
1003 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001004 Rank1: "101",
1005 Rank2: "202",
1006 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001007 },
1008 },
1009 }
1010 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001011 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -08001012 scoutingServer.Start(8080)
1013 defer scoutingServer.Stop()
1014
1015 builder := flatbuffers.NewBuilder(1024)
1016 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
1017
1018 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
1019 if err != nil {
1020 t.Fatal("Failed to request all driver rankings: ", err)
1021 }
1022
1023 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
1024 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
1025 {
1026 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001027 Rank1: "1234",
1028 Rank2: "1235",
1029 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001030 },
1031 {
1032 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001033 Rank1: "101",
1034 Rank2: "202",
1035 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001036 },
1037 },
1038 }
1039 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
1040 t.Fatal("Expected ", expected, ", but got ", *response)
1041 }
1042 for i, match := range expected.DriverRankingList {
1043 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
1044 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
1045 }
1046 }
1047}
1048
1049// Validates that we can request all notes.
1050func TestRequestAllNotes(t *testing.T) {
1051 db := MockDatabase{
1052 notes: []db.NotesData{
1053 {
Emily Markovae68b7632023-12-30 14:17:55 -08001054 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001055 Notes: "Notes",
1056 GoodDriving: true,
1057 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001058 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001059 SketchyPlacing: false,
1060 GoodDefense: true,
1061 BadDefense: false,
1062 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001063 },
1064 {
Emily Markovae68b7632023-12-30 14:17:55 -08001065 TeamNumber: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001066 Notes: "More Notes",
1067 GoodDriving: false,
1068 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001069 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001070 SketchyPlacing: true,
1071 GoodDefense: false,
1072 BadDefense: true,
1073 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001074 },
1075 },
1076 }
1077 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001078 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -08001079 scoutingServer.Start(8080)
1080 defer scoutingServer.Stop()
1081
1082 builder := flatbuffers.NewBuilder(1024)
1083 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
1084
1085 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
1086 if err != nil {
1087 t.Fatal("Failed to request all notes: ", err)
1088 }
1089
1090 expected := request_all_notes_response.RequestAllNotesResponseT{
1091 NoteList: []*request_all_notes_response.NoteT{
1092 {
Emily Markovae68b7632023-12-30 14:17:55 -08001093 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001094 Notes: "Notes",
1095 GoodDriving: true,
1096 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001097 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001098 SketchyPlacing: false,
1099 GoodDefense: true,
1100 BadDefense: false,
1101 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001102 },
1103 {
Emily Markovae68b7632023-12-30 14:17:55 -08001104 Team: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001105 Notes: "More Notes",
1106 GoodDriving: false,
1107 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001108 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001109 SketchyPlacing: true,
1110 GoodDefense: false,
1111 BadDefense: true,
1112 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -08001113 },
1114 },
1115 }
1116 if len(expected.NoteList) != len(response.NoteList) {
1117 t.Fatal("Expected ", expected, ", but got ", *response)
1118 }
1119 for i, note := range expected.NoteList {
1120 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
1121 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
1122 }
1123 }
1124}
1125
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001126func packAction(action *submit_actions.ActionT) []byte {
1127 builder := flatbuffers.NewBuilder(50 * 1024)
1128 builder.Finish((action).Pack(builder))
1129 return (builder.FinishedBytes())
1130}
1131
Emily Markova8cb91312024-02-02 12:30:37 -08001132func TestAddingActions2024(t *testing.T) {
1133 database := MockDatabase{}
1134 scoutingServer := server.NewScoutingServer()
1135 HandleRequests(&database, scoutingServer)
1136 scoutingServer.Start(8080)
1137 defer scoutingServer.Stop()
1138
1139 builder := flatbuffers.NewBuilder(1024)
1140 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
1141 TeamNumber: "3421",
1142 MatchNumber: 2,
1143 SetNumber: 1,
1144 CompLevel: "quals",
1145 ActionsList: []*submit_2024_actions.ActionT{
1146 {
1147 ActionTaken: &submit_2024_actions.ActionTypeT{
1148 Type: submit_2024_actions.ActionTypePickupNoteAction,
1149 Value: &submit_2024_actions.PickupNoteActionT{
1150 Auto: true,
1151 },
1152 },
1153 Timestamp: 1800,
1154 },
1155 {
1156 ActionTaken: &submit_2024_actions.ActionTypeT{
1157 Type: submit_2024_actions.ActionTypePlaceNoteAction,
1158 Value: &submit_2024_actions.PlaceNoteActionT{
1159 ScoreType: submit_2024_actions.ScoreTypekSPEAKER,
1160 Auto: false,
1161 },
1162 },
1163 Timestamp: 2500,
1164 },
1165 },
1166 PreScouting: true,
1167 }).Pack(builder))
1168
1169 _, err := debug.Submit2024Actions("http://localhost:8080", builder.FinishedBytes())
1170 if err != nil {
1171 t.Fatal("Failed to submit actions: ", err)
1172 }
1173
1174 expectedActions := []db.Action{
1175 {
1176 PreScouting: true,
1177 TeamNumber: "3421",
1178 MatchNumber: 2,
1179 SetNumber: 1,
1180 CompLevel: "quals",
1181 CollectedBy: "debug_cli",
1182 CompletedAction: []byte{},
1183 Timestamp: 1800,
1184 },
1185 {
1186 PreScouting: true,
1187 TeamNumber: "3421",
1188 MatchNumber: 2,
1189 SetNumber: 1,
1190 CompLevel: "quals",
1191 CollectedBy: "debug_cli",
1192 CompletedAction: []byte{},
1193 Timestamp: 2500,
1194 },
1195 }
1196
1197 expectedStats := []db.Stats2024{
1198 db.Stats2024{
1199 PreScouting: true, TeamNumber: "3421",
1200 MatchNumber: 2, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 0,
1201 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1202 Speaker: 1, Amp: 0, SpeakerAmplified: 0, AmpAmplified: 0,
1203 NotesDropped: 0, Penalties: 0, TrapNote: false, AvgCycle: 0,
1204 Park: false, OnStage: false, Harmony: false, CollectedBy: "debug_cli",
1205 },
1206 }
1207
1208 if !reflect.DeepEqual(expectedActions, database.actions) {
1209 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1210 }
1211 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1212 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1213 }
1214}
1215
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001216func TestAddingActions(t *testing.T) {
1217 database := MockDatabase{}
1218 scoutingServer := server.NewScoutingServer()
1219 HandleRequests(&database, scoutingServer)
1220 scoutingServer.Start(8080)
1221 defer scoutingServer.Stop()
1222
1223 builder := flatbuffers.NewBuilder(1024)
1224 builder.Finish((&submit_actions.SubmitActionsT{
1225 TeamNumber: "1234",
1226 MatchNumber: 4,
1227 SetNumber: 1,
1228 CompLevel: "qual",
1229 ActionsList: []*submit_actions.ActionT{
1230 {
1231 ActionTaken: &submit_actions.ActionTypeT{
1232 Type: submit_actions.ActionTypePickupObjectAction,
1233 Value: &submit_actions.PickupObjectActionT{
1234 ObjectType: submit_actions.ObjectTypekCube,
1235 Auto: true,
1236 },
1237 },
1238 Timestamp: 2400,
1239 },
1240 {
1241 ActionTaken: &submit_actions.ActionTypeT{
1242 Type: submit_actions.ActionTypePlaceObjectAction,
1243 Value: &submit_actions.PlaceObjectActionT{
1244 ObjectType: submit_actions.ObjectTypekCube,
1245 ScoreLevel: submit_actions.ScoreLevelkLow,
1246 Auto: false,
1247 },
1248 },
1249 Timestamp: 1009,
1250 },
1251 },
Philipp Schrader4b489222023-04-15 16:40:16 -07001252 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001253 }).Pack(builder))
1254
1255 _, err := debug.SubmitActions("http://localhost:8080", builder.FinishedBytes())
1256 if err != nil {
1257 t.Fatal("Failed to submit actions: ", err)
1258 }
1259
1260 // Make sure that the data made it into the database.
1261 // TODO: Add this back when we figure out how to add the serialized action into the database.
1262
1263 /* expectedActionsT := []*submit_actions.ActionT{
1264 {
1265 ActionTaken: &submit_actions.ActionTypeT{
1266 Type: submit_actions.ActionTypePickupObjectAction,
1267 Value: &submit_actions.PickupObjectActionT{
1268 ObjectType: submit_actions.ObjectTypekCube,
1269 Auto: true,
1270 },
1271 },
1272 Timestamp: 2400,
1273 },
1274 {
1275 ActionTaken: &submit_actions.ActionTypeT{
1276 Type: submit_actions.ActionTypePlaceObjectAction,
1277 Value: &submit_actions.PlaceObjectActionT{
1278 ObjectType: submit_actions.ObjectTypekCube,
1279 ScoreLevel: submit_actions.ScoreLevelkLow,
1280 Auto: false,
1281 },
1282 },
1283 Timestamp: 1009,
1284 },
1285 } */
1286
1287 expectedActions := []db.Action{
1288 {
Philipp Schrader4b489222023-04-15 16:40:16 -07001289 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001290 TeamNumber: "1234",
1291 MatchNumber: 4,
1292 SetNumber: 1,
1293 CompLevel: "qual",
1294 CollectedBy: "debug_cli",
1295 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -07001296 Timestamp: 2400,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001297 },
1298 {
Philipp Schrader4b489222023-04-15 16:40:16 -07001299 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001300 TeamNumber: "1234",
1301 MatchNumber: 4,
1302 SetNumber: 1,
1303 CompLevel: "qual",
1304 CollectedBy: "debug_cli",
1305 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -07001306 Timestamp: 1009,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001307 },
1308 }
1309
Philipp Schradere11114f2023-04-15 17:04:25 -07001310 expectedStats := []db.Stats2023{
1311 db.Stats2023{
1312 PreScouting: true,
1313 TeamNumber: "1234", MatchNumber: 4, SetNumber: 1,
1314 CompLevel: "qual", StartingQuadrant: 0, LowCubesAuto: 0,
1315 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
1316 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1317 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 0,
1318 HighCubes: 0, CubesDropped: 0, LowCones: 0,
1319 MiddleCones: 0, HighCones: 0, ConesDropped: 0, SuperchargedPieces: 0,
1320 AvgCycle: 0, Mobility: false, DockedAuto: false, EngagedAuto: false,
1321 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1322 BalanceAttempt: false, CollectedBy: "debug_cli",
1323 },
1324 }
1325
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001326 if !reflect.DeepEqual(expectedActions, database.actions) {
1327 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1328 }
Philipp Schradere11114f2023-04-15 17:04:25 -07001329 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1330 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1331 }
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001332}
1333
Filip Kujawac1ded372023-05-27 14:33:43 -07001334// Validates that we can delete stats.
1335func TestDeleteFromStats(t *testing.T) {
1336 database := MockDatabase{
1337 stats2023: []db.Stats2023{
1338 {
1339 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1340 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1341 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1342 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1343 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1344 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1345 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1346 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1347 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1348 BalanceAttempt: true, CollectedBy: "isaac",
1349 },
1350 {
1351 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
1352 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
1353 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
1354 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1355 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
1356 HighCubes: 1, CubesDropped: 0, LowCones: 0,
1357 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
1358 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
1359 BalanceAttemptAuto: true, Docked: false, Engaged: false,
1360 BalanceAttempt: true, CollectedBy: "unknown",
1361 },
1362 },
1363 actions: []db.Action{
1364 {
1365 PreScouting: true,
1366 TeamNumber: "3634",
1367 MatchNumber: 1,
1368 SetNumber: 2,
1369 CompLevel: "quals",
1370 CollectedBy: "debug_cli",
1371 CompletedAction: []byte{},
1372 Timestamp: 2400,
1373 },
1374 {
1375 PreScouting: true,
1376 TeamNumber: "2343",
1377 MatchNumber: 1,
1378 SetNumber: 2,
1379 CompLevel: "quals",
1380 CollectedBy: "debug_cli",
1381 CompletedAction: []byte{},
1382 Timestamp: 1009,
1383 },
1384 },
1385 }
1386 scoutingServer := server.NewScoutingServer()
1387 HandleRequests(&database, scoutingServer)
1388 scoutingServer.Start(8080)
1389 defer scoutingServer.Stop()
1390
1391 builder := flatbuffers.NewBuilder(1024)
1392 builder.Finish((&delete_2023_data_scouting.Delete2023DataScoutingT{
1393 CompLevel: "quals",
1394 MatchNumber: 1,
1395 SetNumber: 2,
1396 TeamNumber: "2343",
1397 }).Pack(builder))
1398
1399 _, err := debug.Delete2023DataScouting("http://localhost:8080", builder.FinishedBytes())
1400 if err != nil {
1401 t.Fatal("Failed to delete from data scouting ", err)
1402 }
1403
1404 expectedActions := []db.Action{
1405 {
1406 PreScouting: true,
1407 TeamNumber: "3634",
1408 MatchNumber: 1,
1409 SetNumber: 2,
1410 CompLevel: "quals",
1411 CollectedBy: "debug_cli",
1412 CompletedAction: []byte{},
1413 Timestamp: 2400,
1414 },
1415 }
1416
1417 expectedStats := []db.Stats2023{
1418 {
1419 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1420 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1421 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1422 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1423 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1424 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1425 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1426 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1427 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1428 BalanceAttempt: true, CollectedBy: "isaac",
1429 },
1430 }
1431
1432 if !reflect.DeepEqual(expectedActions, database.actions) {
1433 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1434 }
1435 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1436 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1437 }
1438}
1439
Emily Markova8cb91312024-02-02 12:30:37 -08001440// Validates that we can delete 2024 stats.
1441func TestDeleteFromStats2024(t *testing.T) {
1442 database := MockDatabase{
1443 stats2024: []db.Stats2024{
1444 {
1445 PreScouting: false, TeamNumber: "746",
1446 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1447 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
1448 Speaker: 0, Amp: 1, SpeakerAmplified: 1, AmpAmplified: 1,
1449 NotesDropped: 0, Penalties: 1, TrapNote: true, AvgCycle: 233,
1450 Park: false, OnStage: false, Harmony: true, CollectedBy: "alek",
1451 },
1452 {
1453 PreScouting: false, TeamNumber: "244",
1454 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1455 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1456 Speaker: 0, Amp: 0, SpeakerAmplified: 3, AmpAmplified: 1,
1457 NotesDropped: 0, Penalties: 1, TrapNote: false, AvgCycle: 120,
1458 Park: false, OnStage: true, Harmony: false, CollectedBy: "kacey",
1459 },
1460 },
1461 actions: []db.Action{
1462 {
1463 PreScouting: true,
1464 TeamNumber: "746",
1465 MatchNumber: 3,
1466 SetNumber: 1,
1467 CompLevel: "quals",
1468 CollectedBy: "debug_cli",
1469 CompletedAction: []byte{},
1470 Timestamp: 2400,
1471 },
1472 {
1473 PreScouting: true,
1474 TeamNumber: "244",
1475 MatchNumber: 5,
1476 SetNumber: 3,
1477 CompLevel: "quals",
1478 CollectedBy: "debug_cli",
1479 CompletedAction: []byte{},
1480 Timestamp: 1009,
1481 },
1482 },
1483 }
1484 scoutingServer := server.NewScoutingServer()
1485 HandleRequests(&database, scoutingServer)
1486 scoutingServer.Start(8080)
1487 defer scoutingServer.Stop()
1488
1489 builder := flatbuffers.NewBuilder(1024)
1490 builder.Finish((&delete_2024_data_scouting.Delete2024DataScoutingT{
1491 CompLevel: "quals",
1492 MatchNumber: 3,
1493 SetNumber: 1,
1494 TeamNumber: "746",
1495 }).Pack(builder))
1496
1497 _, err := debug.Delete2024DataScouting("http://localhost:8080", builder.FinishedBytes())
1498 if err != nil {
1499 t.Fatal("Failed to delete from data scouting 2024", err)
1500 }
1501
1502 expectedActions := []db.Action{
1503 {
1504 PreScouting: true,
1505 TeamNumber: "244",
1506 MatchNumber: 5,
1507 SetNumber: 3,
1508 CompLevel: "quals",
1509 CollectedBy: "debug_cli",
1510 CompletedAction: []byte{},
1511 Timestamp: 1009,
1512 },
1513 }
1514
1515 expectedStats := []db.Stats2024{
1516 {
1517 PreScouting: false, TeamNumber: "244",
1518 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1519 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1520 Speaker: 0, Amp: 0, SpeakerAmplified: 3, AmpAmplified: 1,
1521 NotesDropped: 0, Penalties: 1, TrapNote: false, AvgCycle: 120,
1522 Park: false, OnStage: true, Harmony: false, CollectedBy: "kacey",
1523 },
1524 }
1525
1526 if !reflect.DeepEqual(expectedActions, database.actions) {
1527 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1528 }
1529 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1530 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1531 }
1532}
1533
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001534// A mocked database we can use for testing. Add functionality to this as
1535// needed for your tests.
1536
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001537type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001538 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -08001539 notes []db.NotesData
1540 shiftSchedule []db.Shift
1541 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -08001542 stats2023 []db.Stats2023
Emily Markova8cb91312024-02-02 12:30:37 -08001543 stats2024 []db.Stats2024
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001544 actions []db.Action
Emily Markovafaecfe12023-07-01 12:40:03 -07001545 images []db.PitImage
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001546}
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001547
Emily Markovabf24c9e2023-02-08 20:31:11 -08001548func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -08001549 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001550 return nil
1551}
1552
Emily Markova290147d2023-03-03 22:40:06 -08001553func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
1554 database.stats2023 = append(database.stats2023, stats2023)
1555 return nil
1556}
Emily Markova8cb91312024-02-02 12:30:37 -08001557
1558func (database *MockDatabase) AddToStats2024(stats2024 db.Stats2024) error {
1559 database.stats2024 = append(database.stats2024, stats2024)
1560 return nil
1561}
Emily Markovabf24c9e2023-02-08 20:31:11 -08001562func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001563 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001564}
1565
Emily Markova290147d2023-03-03 22:40:06 -08001566func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
1567 return database.stats2023, nil
1568}
1569
Emily Markova8cb91312024-02-02 12:30:37 -08001570func (database *MockDatabase) ReturnStats2024() ([]db.Stats2024, error) {
1571 return database.stats2024, nil
1572}
1573
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001574func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error) {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001575 var results []db.Stats2023
1576 for _, stats := range database.stats2023 {
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001577 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001578 results = append(results, stats)
1579 }
1580 }
1581 return results, nil
1582}
1583
Emily Markova8cb91312024-02-02 12:30:37 -08001584func (database *MockDatabase) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2024, error) {
1585 var results []db.Stats2024
1586 for _, stats := range database.stats2024 {
1587 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
1588 results = append(results, stats)
1589 }
1590 }
1591 return results, nil
1592}
1593
Emily Markovae68b7632023-12-30 14:17:55 -08001594func (database *MockDatabase) QueryNotes(requestedTeam string) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -07001595 var results []string
1596 for _, data := range database.notes {
1597 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -07001598 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -07001599 }
1600 }
Philipp Schradereecb8962022-06-01 21:02:42 -07001601 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -07001602}
1603
Filip Kujawaf947cb42022-11-21 10:00:30 -08001604func (database *MockDatabase) AddNotes(data db.NotesData) error {
1605 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -07001606 return nil
1607}
1608
Filip Kujawaf882e022022-12-14 13:14:08 -08001609func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
1610 return database.notes, nil
1611}
1612
Milo Lin1d59f0c2022-06-22 20:30:58 -07001613func (database *MockDatabase) AddToShift(data db.Shift) error {
1614 database.shiftSchedule = append(database.shiftSchedule, data)
1615 return nil
1616}
1617
1618func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
1619 return database.shiftSchedule, nil
1620}
1621
1622func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
1623 return []db.Shift{}, nil
1624}
1625
Emily Markovafaecfe12023-07-01 12:40:03 -07001626func (database *MockDatabase) QueryPitImages(requestedTeam string) ([]db.RequestedPitImage, error) {
1627 var results []db.RequestedPitImage
1628 for _, data := range database.images {
1629 if data.TeamNumber == requestedTeam {
1630 results = append(results, db.RequestedPitImage{
1631 TeamNumber: data.TeamNumber,
1632 ImagePath: data.ImagePath,
1633 CheckSum: data.CheckSum,
1634 })
1635 }
1636 }
1637 return results, nil
1638}
1639
Filip Kujawa210a03b2022-11-24 14:41:11 -08001640func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
1641 database.driver_ranking = append(database.driver_ranking, data)
1642 return nil
1643}
1644
Filip Kujawaf882e022022-12-14 13:14:08 -08001645func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
1646 return database.driver_ranking, nil
1647}
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001648
1649func (database *MockDatabase) AddAction(action db.Action) error {
1650 database.actions = append(database.actions, action)
1651 return nil
1652}
1653
Emily Markovafaecfe12023-07-01 12:40:03 -07001654func (database *MockDatabase) AddPitImage(pitImage db.PitImage) error {
1655 database.images = append(database.images, pitImage)
1656 return nil
1657}
1658
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001659func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
1660 return database.actions, nil
1661}
Filip Kujawac1ded372023-05-27 14:33:43 -07001662
Emily Markova8e39f452023-12-23 12:17:30 -08001663func (database *MockDatabase) ReturnPitImages() ([]db.PitImage, error) {
1664 return database.images, nil
1665}
1666
Filip Kujawac1ded372023-05-27 14:33:43 -07001667func (database *MockDatabase) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1668 for i, stat := range database.stats2023 {
1669 if stat.CompLevel == compLevel_ &&
1670 stat.MatchNumber == matchNumber_ &&
1671 stat.SetNumber == setNumber_ &&
1672 stat.TeamNumber == teamNumber_ {
1673 // Match found, remove the element from the array.
1674 database.stats2023 = append(database.stats2023[:i], database.stats2023[i+1:]...)
1675 }
1676 }
1677 return nil
1678}
1679
Emily Markova8cb91312024-02-02 12:30:37 -08001680func (database *MockDatabase) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1681 for i, stat := range database.stats2024 {
1682 if stat.CompLevel == compLevel_ &&
1683 stat.MatchNumber == matchNumber_ &&
1684 stat.SetNumber == setNumber_ &&
1685 stat.TeamNumber == teamNumber_ {
1686 // Match found, remove the element from the array.
1687 database.stats2024 = append(database.stats2024[:i], database.stats2024[i+1:]...)
1688 }
1689 }
1690 return nil
1691}
1692
Filip Kujawac1ded372023-05-27 14:33:43 -07001693func (database *MockDatabase) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1694 for i, action := range database.actions {
1695 if action.CompLevel == compLevel_ &&
1696 action.MatchNumber == matchNumber_ &&
1697 action.SetNumber == setNumber_ &&
1698 action.TeamNumber == teamNumber_ {
1699 // Match found, remove the element from the array.
1700 database.actions = append(database.actions[:i], database.actions[i+1:]...)
1701 }
1702 }
1703 return nil
1704}