blob: 6968346ee7706ae5f5f0430c954527150e7ffae9 [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 Markova040123c2024-02-27 09:48:37 -0800140 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
141 Park: false, OnStage: true, Harmony: false, RobotDied: 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 Markova040123c2024-02-27 09:48:37 -0800149 Park: true, OnStage: false, Harmony: false, RobotDied: true, 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 Markova040123c2024-02-27 09:48:37 -0800218 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "alex",
Emily Markova8cb91312024-02-02 12:30:37 -0800219 },
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 Markova040123c2024-02-27 09:48:37 -0800226 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "george",
Emily Markova8cb91312024-02-02 12:30:37 -0800227 },
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 Markova040123c2024-02-27 09:48:37 -0800251 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "alex",
Emily Markova8cb91312024-02-02 12:30:37 -0800252 },
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 Markova040123c2024-02-27 09:48:37 -0800259 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "george",
Emily Markova8cb91312024-02-02 12:30:37 -0800260 },
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 },
Emily Markova040123c2024-02-27 09:48:37 -0800444 Timestamp: 3200,
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.ScoreTypekDROPPED,
451 Auto: false,
452 },
453 },
454 Timestamp: 3300,
455 },
456 {
457 ActionTaken: &submit_2024_actions.ActionTypeT{
458 Type: submit_2024_actions.ActionTypeRobotDeathAction,
459 Value: &submit_2024_actions.RobotDeathActionT{
460 RobotDead: true,
461 },
462 },
463 Timestamp: 3400,
464 },
465 {
466 ActionTaken: &submit_2024_actions.ActionTypeT{
467 Type: submit_2024_actions.ActionTypeRobotDeathAction,
468 Value: &submit_2024_actions.RobotDeathActionT{
469 RobotDead: false,
470 },
471 },
472 Timestamp: 3450,
473 },
474 {
475 ActionTaken: &submit_2024_actions.ActionTypeT{
476 Type: submit_2024_actions.ActionTypePickupNoteAction,
477 Value: &submit_2024_actions.PickupNoteActionT{
478 Auto: false,
479 },
480 },
Emily Markova8cb91312024-02-02 12:30:37 -0800481 Timestamp: 3500,
482 },
483 {
484 ActionTaken: &submit_2024_actions.ActionTypeT{
485 Type: submit_2024_actions.ActionTypePlaceNoteAction,
486 Value: &submit_2024_actions.PlaceNoteActionT{
487 ScoreType: submit_2024_actions.ScoreTypekSPEAKER_AMPLIFIED,
488 Auto: false,
489 },
490 },
491 Timestamp: 3900,
492 },
493 {
494 ActionTaken: &submit_2024_actions.ActionTypeT{
495 Type: submit_2024_actions.ActionTypeEndMatchAction,
496 Value: &submit_2024_actions.EndMatchActionT{
497 StageType: submit_2024_actions.StageTypekHARMONY,
498 TrapNote: false,
Emily Markova6079e2f2024-02-17 13:17:24 -0800499 Spotlight: false,
Emily Markova8cb91312024-02-02 12:30:37 -0800500 },
501 },
502 Timestamp: 4200,
503 },
504 },
505 PreScouting: false,
506 }).Pack(builder))
507
508 submit2024Actions := submit_2024_actions.GetRootAsSubmit2024Actions(builder.FinishedBytes(), 0)
509 response, err := ConvertActionsToStat2024(submit2024Actions)
510
511 if err != nil {
512 t.Fatal("Failed to convert actions to stats: ", err)
513 }
514
515 expected := db.Stats2024{
516 PreScouting: false, TeamNumber: "4244",
517 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
Emily Markova040123c2024-02-27 09:48:37 -0800518 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markova8cb91312024-02-02 12:30:37 -0800519 Speaker: 0, Amp: 0, SpeakerAmplified: 1, AmpAmplified: 1,
Emily Markova040123c2024-02-27 09:48:37 -0800520 NotesDropped: 1, Penalties: 5, TrapNote: false, Spotlight: false, AvgCycle: 633,
521 Park: false, OnStage: false, Harmony: true, RobotDied: true, CollectedBy: "",
Emily Markova8cb91312024-02-02 12:30:37 -0800522 }
523
524 if expected != response {
525 t.Fatal("Expected ", expected, ", but got ", response)
526 }
527}
528
Emily Markova1abe9782023-03-11 19:45:38 -0800529// Validates that we can request the 2023 stats.
530func TestConvertActionsToStat(t *testing.T) {
531 builder := flatbuffers.NewBuilder(1024)
532 builder.Finish((&submit_actions.SubmitActionsT{
533 TeamNumber: "4244",
534 MatchNumber: 3,
535 SetNumber: 1,
536 CompLevel: "quals",
Emily Markova1abe9782023-03-11 19:45:38 -0800537 ActionsList: []*submit_actions.ActionT{
538 {
539 ActionTaken: &submit_actions.ActionTypeT{
540 Type: submit_actions.ActionTypeStartMatchAction,
541 Value: &submit_actions.StartMatchActionT{
542 Position: 1,
543 },
544 },
545 Timestamp: 0,
546 },
547 {
548 ActionTaken: &submit_actions.ActionTypeT{
549 Type: submit_actions.ActionTypePickupObjectAction,
550 Value: &submit_actions.PickupObjectActionT{
551 ObjectType: submit_actions.ObjectTypekCube,
552 Auto: true,
553 },
554 },
555 Timestamp: 400,
556 },
557 {
558 ActionTaken: &submit_actions.ActionTypeT{
559 Type: submit_actions.ActionTypePickupObjectAction,
560 Value: &submit_actions.PickupObjectActionT{
561 ObjectType: submit_actions.ObjectTypekCube,
562 Auto: true,
563 },
564 },
565 Timestamp: 800,
566 },
567 {
568 ActionTaken: &submit_actions.ActionTypeT{
569 Type: submit_actions.ActionTypePlaceObjectAction,
570 Value: &submit_actions.PlaceObjectActionT{
571 ObjectType: submit_actions.ObjectTypekCube,
572 ScoreLevel: submit_actions.ScoreLevelkLow,
573 Auto: true,
574 },
575 },
576 Timestamp: 2000,
577 },
578 {
579 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700580 Type: submit_actions.ActionTypeMobilityAction,
581 Value: &submit_actions.MobilityActionT{
582 Mobility: true,
583 },
584 },
585 Timestamp: 2200,
586 },
587 {
588 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700589 Type: submit_actions.ActionTypeAutoBalanceAction,
590 Value: &submit_actions.AutoBalanceActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700591 Docked: true,
592 Engaged: true,
593 BalanceAttempt: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700594 },
595 },
596 Timestamp: 2400,
597 },
598 {
599 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova1abe9782023-03-11 19:45:38 -0800600 Type: submit_actions.ActionTypePickupObjectAction,
601 Value: &submit_actions.PickupObjectActionT{
602 ObjectType: submit_actions.ObjectTypekCone,
603 Auto: false,
604 },
605 },
606 Timestamp: 2800,
607 },
608 {
609 ActionTaken: &submit_actions.ActionTypeT{
610 Type: submit_actions.ActionTypePlaceObjectAction,
611 Value: &submit_actions.PlaceObjectActionT{
612 ObjectType: submit_actions.ObjectTypekCone,
613 ScoreLevel: submit_actions.ScoreLevelkHigh,
614 Auto: false,
615 },
616 },
617 Timestamp: 3100,
618 },
Emily Markova46a69bf2023-03-22 20:45:52 -0700619 {
620 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa7a045e72023-04-13 08:41:09 -0700621 Type: submit_actions.ActionTypePickupObjectAction,
622 Value: &submit_actions.PickupObjectActionT{
623 ObjectType: submit_actions.ObjectTypekCube,
624 Auto: false,
625 },
626 },
627 Timestamp: 3500,
628 },
629 {
630 ActionTaken: &submit_actions.ActionTypeT{
631 Type: submit_actions.ActionTypePlaceObjectAction,
632 Value: &submit_actions.PlaceObjectActionT{
633 ObjectType: submit_actions.ObjectTypekCube,
634 ScoreLevel: submit_actions.ScoreLevelkSupercharged,
635 Auto: false,
636 },
637 },
638 Timestamp: 3900,
639 },
640 {
641 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700642 Type: submit_actions.ActionTypeEndMatchAction,
643 Value: &submit_actions.EndMatchActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700644 Docked: true,
645 Engaged: false,
646 BalanceAttempt: true,
Emily Markova46a69bf2023-03-22 20:45:52 -0700647 },
648 },
Filip Kujawa7a045e72023-04-13 08:41:09 -0700649 Timestamp: 4200,
Emily Markova46a69bf2023-03-22 20:45:52 -0700650 },
Emily Markova1abe9782023-03-11 19:45:38 -0800651 },
Philipp Schrader4b489222023-04-15 16:40:16 -0700652 PreScouting: false,
Emily Markova1abe9782023-03-11 19:45:38 -0800653 }).Pack(builder))
654
655 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
656 response, err := ConvertActionsToStat(submitActions)
657
658 if err != nil {
659 t.Fatal("Failed to convert actions to stats: ", err)
660 }
661
662 expected := db.Stats2023{
Philipp Schrader4b489222023-04-15 16:40:16 -0700663 PreScouting: false,
664 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
Emily Markova1abe9782023-03-11 19:45:38 -0800665 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
666 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
667 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
668 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
669 HighCubes: 0, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700670 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700671 AvgCycle: 950, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700672 BalanceAttemptAuto: false, Docked: true, Engaged: false,
Philipp Schradere11114f2023-04-15 17:04:25 -0700673 BalanceAttempt: true, CollectedBy: "",
Emily Markova1abe9782023-03-11 19:45:38 -0800674 }
675
676 if expected != response {
677 t.Fatal("Expected ", expected, ", but got ", response)
678 }
679}
680
Alex Perry81f96ba2022-03-13 18:26:19 -0700681func TestSubmitNotes(t *testing.T) {
682 database := MockDatabase{}
683 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800684 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700685 scoutingServer.Start(8080)
686 defer scoutingServer.Stop()
687
688 builder := flatbuffers.NewBuilder(1024)
689 builder.Finish((&submit_notes.SubmitNotesT{
Emily Markovae68b7632023-12-30 14:17:55 -0800690 Team: "971",
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,
Emily Markovacf893f42024-03-13 19:03:10 -0700699 NoShow: false,
700 MatchNumber: 4,
701 CompLevel: "qm",
702 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700703 }).Pack(builder))
704
705 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
706 if err != nil {
707 t.Fatal("Failed to submit notes: ", err)
708 }
709
710 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800711 {
Emily Markovae68b7632023-12-30 14:17:55 -0800712 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800713 Notes: "Notes",
714 GoodDriving: true,
715 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700716 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800717 SketchyPlacing: false,
718 GoodDefense: true,
719 BadDefense: false,
720 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700721 NoShow: false,
722 MatchNumber: 4,
723 CompLevel: "qm",
724 SetNumber: 1,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800725 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700726 }
727
728 if !reflect.DeepEqual(database.notes, expected) {
729 t.Fatal("Submitted notes did not match", expected, database.notes)
730 }
731}
732
733func TestRequestNotes(t *testing.T) {
734 database := MockDatabase{
735 notes: []db.NotesData{{
Emily Markovae68b7632023-12-30 14:17:55 -0800736 TeamNumber: "971A",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800737 Notes: "Notes",
738 GoodDriving: true,
739 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700740 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800741 SketchyPlacing: false,
742 GoodDefense: true,
743 BadDefense: false,
744 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700745 NoShow: false,
746 MatchNumber: 4,
747 CompLevel: "qm",
748 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700749 }},
750 }
751 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800752 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700753 scoutingServer.Start(8080)
754 defer scoutingServer.Stop()
755
756 builder := flatbuffers.NewBuilder(1024)
757 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
Emily Markovae68b7632023-12-30 14:17:55 -0800758 Team: "971A",
Alex Perry81f96ba2022-03-13 18:26:19 -0700759 }).Pack(builder))
760 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
761 if err != nil {
762 t.Fatal("Failed to submit notes: ", err)
763 }
764
765 if response.Notes[0].Data != "Notes" {
766 t.Fatal("requested notes did not match", response)
767 }
768}
769
Emily Markovafaecfe12023-07-01 12:40:03 -0700770func TestSubmitPitImage(t *testing.T) {
771 database := MockDatabase{}
772 scoutingServer := server.NewScoutingServer()
773 HandleRequests(&database, scoutingServer)
774 scoutingServer.Start(8080)
775 defer scoutingServer.Stop()
776
777 builder := flatbuffers.NewBuilder(1024)
778 builder.Finish((&submit_pit_image.SubmitPitImageT{
779 TeamNumber: "483A", ImagePath: "483Arobot.jpg",
780 ImageData: []byte{12, 43, 54, 34, 98},
781 }).Pack(builder))
782
783 _, err := debug.SubmitPitImage("http://localhost:8080", builder.FinishedBytes())
784 if err != nil {
785 t.Fatal("Failed to submit pit image: ", err)
786 }
787
788 expected := []db.PitImage{
789 {
790 TeamNumber: "483A", CheckSum: "177d9dc52bc25f391232e82521259c378964c068832a9178d73448ba4ac5e0b1",
791 ImagePath: "483Arobot.jpg", ImageData: []byte{12, 43, 54, 34, 98},
792 },
793 }
794
795 if !reflect.DeepEqual(database.images, expected) {
796 t.Fatal("Submitted image did not match", expected, database.images)
797 }
798}
799
800func TestRequestPitImages(t *testing.T) {
801 db := MockDatabase{
802 images: []db.PitImage{
803 {
804 TeamNumber: "932", ImagePath: "pitimage.jpg",
805 ImageData: []byte{3, 34, 44, 65}, CheckSum: "abcdf",
806 },
807 {
808 TeamNumber: "234", ImagePath: "234robot.png",
809 ImageData: []byte{64, 54, 21, 21, 76, 32}, CheckSum: "egrfd",
810 },
811 {
812 TeamNumber: "93A", ImagePath: "abcd.jpg",
813 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "rgegfd",
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_pit_images.RequestPitImagesT{"932"}).Pack(builder))
825
826 response, err := debug.RequestPitImages("http://localhost:8080", builder.FinishedBytes())
827 if err != nil {
828 t.Fatal("Failed to request pit images: ", err)
829 }
830
831 expected := request_pit_images_response.RequestPitImagesResponseT{
832 PitImageList: []*request_pit_images_response.PitImageT{
833 {
834 TeamNumber: "932", ImagePath: "pitimage.jpg", CheckSum: "abcdf",
835 },
836 },
837 }
838
839 if len(expected.PitImageList) != len(response.PitImageList) {
840 t.Fatal("Expected ", expected, ", but got ", *response)
841 }
842
843 for i, pit_image := range expected.PitImageList {
844 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
845 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
846 }
847 }
848}
849
Emily Markova8e39f452023-12-23 12:17:30 -0800850func TestRequestAllPitImages(t *testing.T) {
851 db := MockDatabase{
852 images: []db.PitImage{
853 {
854 TeamNumber: "32", ImagePath: "pitimage.jpg",
855 ImageData: []byte{3, 43, 44, 32}, CheckSum: "cdhrj",
856 },
857 {
858 TeamNumber: "231", ImagePath: "232robot.png",
859 ImageData: []byte{64, 54, 54, 21, 76, 32}, CheckSum: "rgre",
860 },
861 {
862 TeamNumber: "90", ImagePath: "abcd.jpg",
863 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "erfer",
864 },
865 },
866 }
867
868 scoutingServer := server.NewScoutingServer()
869 HandleRequests(&db, scoutingServer)
870 scoutingServer.Start(8080)
871 defer scoutingServer.Stop()
872
873 builder := flatbuffers.NewBuilder(1024)
874 builder.Finish((&request_all_pit_images.RequestAllPitImagesT{}).Pack(builder))
875
876 response, err := debug.RequestAllPitImages("http://localhost:8080", builder.FinishedBytes())
877 if err != nil {
878 t.Fatal("Failed to request pit images: ", err)
879 }
880
881 expected := request_all_pit_images_response.RequestAllPitImagesResponseT{
882 PitImageList: []*request_all_pit_images_response.PitImageT{
883 {
884 TeamNumber: "32", ImagePath: "pitimage.jpg", CheckSum: "cdhrj",
885 },
886 {
887 TeamNumber: "231", ImagePath: "232robot.png", CheckSum: "rgre",
888 },
889 {
890 TeamNumber: "90", ImagePath: "abcd.jpg", CheckSum: "erfer",
891 },
892 },
893 }
894
895 if len(expected.PitImageList) != len(response.PitImageList) {
896 t.Fatal("Expected ", expected, ", but got ", *response)
897 }
898
899 for i, pit_image := range expected.PitImageList {
900 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
901 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
902 }
903 }
904}
905
Milo Lin1d59f0c2022-06-22 20:30:58 -0700906func TestRequestShiftSchedule(t *testing.T) {
907 db := MockDatabase{
908 shiftSchedule: []db.Shift{
909 {
910 MatchNumber: 1,
911 R1scouter: "Bob",
912 R2scouter: "James",
913 R3scouter: "Robert",
914 B1scouter: "Alice",
915 B2scouter: "Mary",
916 B3scouter: "Patricia",
917 },
918 {
919 MatchNumber: 2,
920 R1scouter: "Liam",
921 R2scouter: "Noah",
922 R3scouter: "Oliver",
923 B1scouter: "Emma",
924 B2scouter: "Charlotte",
925 B3scouter: "Amelia",
926 },
927 },
928 }
929 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800930 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700931 scoutingServer.Start(8080)
932 defer scoutingServer.Stop()
933
934 builder := flatbuffers.NewBuilder(1024)
935 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
936
937 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
938 if err != nil {
939 t.Fatal("Failed to request shift schedule: ", err)
940 }
941
942 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
943 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
944 {
945 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700946 R1Scouter: "Bob",
947 R2Scouter: "James",
948 R3Scouter: "Robert",
949 B1Scouter: "Alice",
950 B2Scouter: "Mary",
951 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700952 },
953 {
954 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700955 R1Scouter: "Liam",
956 R2Scouter: "Noah",
957 R3Scouter: "Oliver",
958 B1Scouter: "Emma",
959 B2Scouter: "Charlotte",
960 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700961 },
962 },
963 }
964 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
965 t.Fatal("Expected ", expected, ", but got ", *response)
966 }
967 for i, match := range expected.ShiftSchedule {
968 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
969 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
970 }
971 }
972}
973
974func TestSubmitShiftSchedule(t *testing.T) {
975 database := MockDatabase{}
976 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800977 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700978 scoutingServer.Start(8080)
979 defer scoutingServer.Stop()
980
981 builder := flatbuffers.NewBuilder(1024)
982 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
983 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
984 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700985 R1Scouter: "Bob",
986 R2Scouter: "James",
987 R3Scouter: "Robert",
988 B1Scouter: "Alice",
989 B2Scouter: "Mary",
990 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700991 },
992 }).Pack(builder))
993
994 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
995 if err != nil {
996 t.Fatal("Failed to submit shift schedule: ", err)
997 }
998
999 expected := []db.Shift{
1000 {MatchNumber: 1,
1001 R1scouter: "Bob",
1002 R2scouter: "James",
1003 R3scouter: "Robert",
1004 B1scouter: "Alice",
1005 B2scouter: "Mary",
1006 B3scouter: "Patricia"},
1007 }
1008 if !reflect.DeepEqual(expected, database.shiftSchedule) {
1009 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
1010 }
1011}
1012
Filip Kujawa210a03b2022-11-24 14:41:11 -08001013func TestSubmitDriverRanking(t *testing.T) {
1014 database := MockDatabase{}
1015 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001016 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -08001017 scoutingServer.Start(8080)
1018 defer scoutingServer.Stop()
1019
1020 builder := flatbuffers.NewBuilder(1024)
1021 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
1022 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001023 Rank1: "1234",
1024 Rank2: "1235",
1025 Rank3: "1236",
Filip Kujawa210a03b2022-11-24 14:41:11 -08001026 }).Pack(builder))
1027
1028 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
1029 if err != nil {
1030 t.Fatal("Failed to submit driver ranking: ", err)
1031 }
1032
1033 expected := []db.DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -08001034 {MatchNumber: 36, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001035 }
1036
1037 if !reflect.DeepEqual(database.driver_ranking, expected) {
1038 t.Fatal("Submitted notes did not match", expected, database.notes)
1039 }
1040}
1041
Filip Kujawaf882e022022-12-14 13:14:08 -08001042// Validates that we can request the driver rankings.
1043func TestRequestDriverRankings(t *testing.T) {
1044 db := MockDatabase{
1045 driver_ranking: []db.DriverRankingData{
1046 {
1047 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001048 Rank1: "1234",
1049 Rank2: "1235",
1050 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001051 },
1052 {
1053 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001054 Rank1: "101",
1055 Rank2: "202",
1056 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001057 },
1058 },
1059 }
1060 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001061 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -08001062 scoutingServer.Start(8080)
1063 defer scoutingServer.Stop()
1064
1065 builder := flatbuffers.NewBuilder(1024)
1066 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
1067
1068 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
1069 if err != nil {
1070 t.Fatal("Failed to request all driver rankings: ", err)
1071 }
1072
1073 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
1074 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
1075 {
1076 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001077 Rank1: "1234",
1078 Rank2: "1235",
1079 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001080 },
1081 {
1082 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001083 Rank1: "101",
1084 Rank2: "202",
1085 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001086 },
1087 },
1088 }
1089 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
1090 t.Fatal("Expected ", expected, ", but got ", *response)
1091 }
1092 for i, match := range expected.DriverRankingList {
1093 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
1094 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
1095 }
1096 }
1097}
1098
1099// Validates that we can request all notes.
1100func TestRequestAllNotes(t *testing.T) {
1101 db := MockDatabase{
1102 notes: []db.NotesData{
1103 {
Emily Markovae68b7632023-12-30 14:17:55 -08001104 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001105 Notes: "Notes",
1106 GoodDriving: true,
1107 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001108 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001109 SketchyPlacing: false,
1110 GoodDefense: true,
1111 BadDefense: false,
1112 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001113 NoShow: false,
1114 MatchNumber: 4,
1115 CompLevel: "qm",
1116 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -08001117 },
1118 {
Emily Markovae68b7632023-12-30 14:17:55 -08001119 TeamNumber: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001120 Notes: "More Notes",
1121 GoodDriving: false,
1122 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001123 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001124 SketchyPlacing: true,
1125 GoodDefense: false,
1126 BadDefense: true,
1127 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001128 NoShow: false,
1129 MatchNumber: 1,
1130 CompLevel: "qm",
1131 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -08001132 },
1133 },
1134 }
1135 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001136 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -08001137 scoutingServer.Start(8080)
1138 defer scoutingServer.Stop()
1139
1140 builder := flatbuffers.NewBuilder(1024)
1141 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
1142
1143 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
1144 if err != nil {
1145 t.Fatal("Failed to request all notes: ", err)
1146 }
1147
1148 expected := request_all_notes_response.RequestAllNotesResponseT{
1149 NoteList: []*request_all_notes_response.NoteT{
1150 {
Emily Markovae68b7632023-12-30 14:17:55 -08001151 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001152 Notes: "Notes",
1153 GoodDriving: true,
1154 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001155 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001156 SketchyPlacing: false,
1157 GoodDefense: true,
1158 BadDefense: false,
1159 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001160 NoShow: false,
1161 MatchNumber: 4,
1162 CompLevel: "qm",
1163 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -08001164 },
1165 {
Emily Markovae68b7632023-12-30 14:17:55 -08001166 Team: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001167 Notes: "More Notes",
1168 GoodDriving: false,
1169 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001170 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001171 SketchyPlacing: true,
1172 GoodDefense: false,
1173 BadDefense: true,
1174 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001175 NoShow: false,
1176 MatchNumber: 1,
1177 CompLevel: "qm",
1178 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -08001179 },
1180 },
1181 }
1182 if len(expected.NoteList) != len(response.NoteList) {
1183 t.Fatal("Expected ", expected, ", but got ", *response)
1184 }
1185 for i, note := range expected.NoteList {
1186 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
1187 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
1188 }
1189 }
1190}
1191
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001192func packAction(action *submit_actions.ActionT) []byte {
1193 builder := flatbuffers.NewBuilder(50 * 1024)
1194 builder.Finish((action).Pack(builder))
1195 return (builder.FinishedBytes())
1196}
1197
Emily Markova8cb91312024-02-02 12:30:37 -08001198func TestAddingActions2024(t *testing.T) {
1199 database := MockDatabase{}
1200 scoutingServer := server.NewScoutingServer()
1201 HandleRequests(&database, scoutingServer)
1202 scoutingServer.Start(8080)
1203 defer scoutingServer.Stop()
1204
1205 builder := flatbuffers.NewBuilder(1024)
1206 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
1207 TeamNumber: "3421",
1208 MatchNumber: 2,
1209 SetNumber: 1,
1210 CompLevel: "quals",
1211 ActionsList: []*submit_2024_actions.ActionT{
1212 {
1213 ActionTaken: &submit_2024_actions.ActionTypeT{
1214 Type: submit_2024_actions.ActionTypePickupNoteAction,
1215 Value: &submit_2024_actions.PickupNoteActionT{
1216 Auto: true,
1217 },
1218 },
1219 Timestamp: 1800,
1220 },
1221 {
1222 ActionTaken: &submit_2024_actions.ActionTypeT{
1223 Type: submit_2024_actions.ActionTypePlaceNoteAction,
1224 Value: &submit_2024_actions.PlaceNoteActionT{
1225 ScoreType: submit_2024_actions.ScoreTypekSPEAKER,
1226 Auto: false,
1227 },
1228 },
1229 Timestamp: 2500,
1230 },
1231 },
1232 PreScouting: true,
1233 }).Pack(builder))
1234
1235 _, err := debug.Submit2024Actions("http://localhost:8080", builder.FinishedBytes())
1236 if err != nil {
1237 t.Fatal("Failed to submit actions: ", err)
1238 }
1239
1240 expectedActions := []db.Action{
1241 {
1242 PreScouting: true,
1243 TeamNumber: "3421",
1244 MatchNumber: 2,
1245 SetNumber: 1,
1246 CompLevel: "quals",
1247 CollectedBy: "debug_cli",
1248 CompletedAction: []byte{},
1249 Timestamp: 1800,
1250 },
1251 {
1252 PreScouting: true,
1253 TeamNumber: "3421",
1254 MatchNumber: 2,
1255 SetNumber: 1,
1256 CompLevel: "quals",
1257 CollectedBy: "debug_cli",
1258 CompletedAction: []byte{},
1259 Timestamp: 2500,
1260 },
1261 }
1262
1263 expectedStats := []db.Stats2024{
1264 db.Stats2024{
1265 PreScouting: true, TeamNumber: "3421",
1266 MatchNumber: 2, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 0,
1267 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1268 Speaker: 1, Amp: 0, SpeakerAmplified: 0, AmpAmplified: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001269 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -08001270 Park: false, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "debug_cli",
Emily Markova8cb91312024-02-02 12:30:37 -08001271 },
1272 }
1273
1274 if !reflect.DeepEqual(expectedActions, database.actions) {
1275 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1276 }
1277 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1278 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1279 }
1280}
1281
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001282func TestAddingActions(t *testing.T) {
1283 database := MockDatabase{}
1284 scoutingServer := server.NewScoutingServer()
1285 HandleRequests(&database, scoutingServer)
1286 scoutingServer.Start(8080)
1287 defer scoutingServer.Stop()
1288
1289 builder := flatbuffers.NewBuilder(1024)
1290 builder.Finish((&submit_actions.SubmitActionsT{
1291 TeamNumber: "1234",
1292 MatchNumber: 4,
1293 SetNumber: 1,
1294 CompLevel: "qual",
1295 ActionsList: []*submit_actions.ActionT{
1296 {
1297 ActionTaken: &submit_actions.ActionTypeT{
1298 Type: submit_actions.ActionTypePickupObjectAction,
1299 Value: &submit_actions.PickupObjectActionT{
1300 ObjectType: submit_actions.ObjectTypekCube,
1301 Auto: true,
1302 },
1303 },
1304 Timestamp: 2400,
1305 },
1306 {
1307 ActionTaken: &submit_actions.ActionTypeT{
1308 Type: submit_actions.ActionTypePlaceObjectAction,
1309 Value: &submit_actions.PlaceObjectActionT{
1310 ObjectType: submit_actions.ObjectTypekCube,
1311 ScoreLevel: submit_actions.ScoreLevelkLow,
1312 Auto: false,
1313 },
1314 },
1315 Timestamp: 1009,
1316 },
1317 },
Philipp Schrader4b489222023-04-15 16:40:16 -07001318 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001319 }).Pack(builder))
1320
1321 _, err := debug.SubmitActions("http://localhost:8080", builder.FinishedBytes())
1322 if err != nil {
1323 t.Fatal("Failed to submit actions: ", err)
1324 }
1325
1326 // Make sure that the data made it into the database.
1327 // TODO: Add this back when we figure out how to add the serialized action into the database.
1328
1329 /* expectedActionsT := []*submit_actions.ActionT{
1330 {
1331 ActionTaken: &submit_actions.ActionTypeT{
1332 Type: submit_actions.ActionTypePickupObjectAction,
1333 Value: &submit_actions.PickupObjectActionT{
1334 ObjectType: submit_actions.ObjectTypekCube,
1335 Auto: true,
1336 },
1337 },
1338 Timestamp: 2400,
1339 },
1340 {
1341 ActionTaken: &submit_actions.ActionTypeT{
1342 Type: submit_actions.ActionTypePlaceObjectAction,
1343 Value: &submit_actions.PlaceObjectActionT{
1344 ObjectType: submit_actions.ObjectTypekCube,
1345 ScoreLevel: submit_actions.ScoreLevelkLow,
1346 Auto: false,
1347 },
1348 },
1349 Timestamp: 1009,
1350 },
1351 } */
1352
1353 expectedActions := []db.Action{
1354 {
Philipp Schrader4b489222023-04-15 16:40:16 -07001355 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001356 TeamNumber: "1234",
1357 MatchNumber: 4,
1358 SetNumber: 1,
1359 CompLevel: "qual",
1360 CollectedBy: "debug_cli",
1361 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -07001362 Timestamp: 2400,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001363 },
1364 {
Philipp Schrader4b489222023-04-15 16:40:16 -07001365 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001366 TeamNumber: "1234",
1367 MatchNumber: 4,
1368 SetNumber: 1,
1369 CompLevel: "qual",
1370 CollectedBy: "debug_cli",
1371 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -07001372 Timestamp: 1009,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001373 },
1374 }
1375
Philipp Schradere11114f2023-04-15 17:04:25 -07001376 expectedStats := []db.Stats2023{
1377 db.Stats2023{
1378 PreScouting: true,
1379 TeamNumber: "1234", MatchNumber: 4, SetNumber: 1,
1380 CompLevel: "qual", StartingQuadrant: 0, LowCubesAuto: 0,
1381 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
1382 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1383 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 0,
1384 HighCubes: 0, CubesDropped: 0, LowCones: 0,
1385 MiddleCones: 0, HighCones: 0, ConesDropped: 0, SuperchargedPieces: 0,
1386 AvgCycle: 0, Mobility: false, DockedAuto: false, EngagedAuto: false,
1387 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1388 BalanceAttempt: false, CollectedBy: "debug_cli",
1389 },
1390 }
1391
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001392 if !reflect.DeepEqual(expectedActions, database.actions) {
1393 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1394 }
Philipp Schradere11114f2023-04-15 17:04:25 -07001395 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1396 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1397 }
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001398}
1399
Filip Kujawac1ded372023-05-27 14:33:43 -07001400// Validates that we can delete stats.
1401func TestDeleteFromStats(t *testing.T) {
1402 database := MockDatabase{
1403 stats2023: []db.Stats2023{
1404 {
1405 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1406 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1407 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1408 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1409 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1410 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1411 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1412 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1413 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1414 BalanceAttempt: true, CollectedBy: "isaac",
1415 },
1416 {
1417 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
1418 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
1419 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
1420 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1421 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
1422 HighCubes: 1, CubesDropped: 0, LowCones: 0,
1423 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
1424 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
1425 BalanceAttemptAuto: true, Docked: false, Engaged: false,
1426 BalanceAttempt: true, CollectedBy: "unknown",
1427 },
1428 },
1429 actions: []db.Action{
1430 {
1431 PreScouting: true,
1432 TeamNumber: "3634",
1433 MatchNumber: 1,
1434 SetNumber: 2,
1435 CompLevel: "quals",
1436 CollectedBy: "debug_cli",
1437 CompletedAction: []byte{},
1438 Timestamp: 2400,
1439 },
1440 {
1441 PreScouting: true,
1442 TeamNumber: "2343",
1443 MatchNumber: 1,
1444 SetNumber: 2,
1445 CompLevel: "quals",
1446 CollectedBy: "debug_cli",
1447 CompletedAction: []byte{},
1448 Timestamp: 1009,
1449 },
1450 },
1451 }
1452 scoutingServer := server.NewScoutingServer()
1453 HandleRequests(&database, scoutingServer)
1454 scoutingServer.Start(8080)
1455 defer scoutingServer.Stop()
1456
1457 builder := flatbuffers.NewBuilder(1024)
1458 builder.Finish((&delete_2023_data_scouting.Delete2023DataScoutingT{
1459 CompLevel: "quals",
1460 MatchNumber: 1,
1461 SetNumber: 2,
1462 TeamNumber: "2343",
1463 }).Pack(builder))
1464
1465 _, err := debug.Delete2023DataScouting("http://localhost:8080", builder.FinishedBytes())
1466 if err != nil {
1467 t.Fatal("Failed to delete from data scouting ", err)
1468 }
1469
1470 expectedActions := []db.Action{
1471 {
1472 PreScouting: true,
1473 TeamNumber: "3634",
1474 MatchNumber: 1,
1475 SetNumber: 2,
1476 CompLevel: "quals",
1477 CollectedBy: "debug_cli",
1478 CompletedAction: []byte{},
1479 Timestamp: 2400,
1480 },
1481 }
1482
1483 expectedStats := []db.Stats2023{
1484 {
1485 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1486 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1487 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1488 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1489 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1490 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1491 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1492 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1493 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1494 BalanceAttempt: true, CollectedBy: "isaac",
1495 },
1496 }
1497
1498 if !reflect.DeepEqual(expectedActions, database.actions) {
1499 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1500 }
1501 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1502 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1503 }
1504}
1505
Emily Markova8cb91312024-02-02 12:30:37 -08001506// Validates that we can delete 2024 stats.
1507func TestDeleteFromStats2024(t *testing.T) {
1508 database := MockDatabase{
1509 stats2024: []db.Stats2024{
1510 {
1511 PreScouting: false, TeamNumber: "746",
1512 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1513 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
1514 Speaker: 0, Amp: 1, SpeakerAmplified: 1, AmpAmplified: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -08001515 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markova040123c2024-02-27 09:48:37 -08001516 Park: false, OnStage: false, Harmony: true, RobotDied: false, CollectedBy: "alek",
Emily Markova8cb91312024-02-02 12:30:37 -08001517 },
1518 {
1519 PreScouting: false, TeamNumber: "244",
1520 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1521 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1522 Speaker: 0, Amp: 0, SpeakerAmplified: 3, AmpAmplified: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -08001523 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markova040123c2024-02-27 09:48:37 -08001524 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001525 },
1526 },
1527 actions: []db.Action{
1528 {
1529 PreScouting: true,
1530 TeamNumber: "746",
1531 MatchNumber: 3,
1532 SetNumber: 1,
1533 CompLevel: "quals",
1534 CollectedBy: "debug_cli",
1535 CompletedAction: []byte{},
1536 Timestamp: 2400,
1537 },
1538 {
1539 PreScouting: true,
1540 TeamNumber: "244",
1541 MatchNumber: 5,
1542 SetNumber: 3,
1543 CompLevel: "quals",
1544 CollectedBy: "debug_cli",
1545 CompletedAction: []byte{},
1546 Timestamp: 1009,
1547 },
1548 },
1549 }
1550 scoutingServer := server.NewScoutingServer()
1551 HandleRequests(&database, scoutingServer)
1552 scoutingServer.Start(8080)
1553 defer scoutingServer.Stop()
1554
1555 builder := flatbuffers.NewBuilder(1024)
1556 builder.Finish((&delete_2024_data_scouting.Delete2024DataScoutingT{
1557 CompLevel: "quals",
1558 MatchNumber: 3,
1559 SetNumber: 1,
1560 TeamNumber: "746",
1561 }).Pack(builder))
1562
1563 _, err := debug.Delete2024DataScouting("http://localhost:8080", builder.FinishedBytes())
1564 if err != nil {
1565 t.Fatal("Failed to delete from data scouting 2024", err)
1566 }
1567
1568 expectedActions := []db.Action{
1569 {
1570 PreScouting: true,
1571 TeamNumber: "244",
1572 MatchNumber: 5,
1573 SetNumber: 3,
1574 CompLevel: "quals",
1575 CollectedBy: "debug_cli",
1576 CompletedAction: []byte{},
1577 Timestamp: 1009,
1578 },
1579 }
1580
1581 expectedStats := []db.Stats2024{
1582 {
1583 PreScouting: false, TeamNumber: "244",
1584 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1585 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
1586 Speaker: 0, Amp: 0, SpeakerAmplified: 3, AmpAmplified: 1,
Emily Markova6079e2f2024-02-17 13:17:24 -08001587 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markova040123c2024-02-27 09:48:37 -08001588 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001589 },
1590 }
1591
1592 if !reflect.DeepEqual(expectedActions, database.actions) {
1593 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1594 }
1595 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1596 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1597 }
1598}
1599
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001600// A mocked database we can use for testing. Add functionality to this as
1601// needed for your tests.
1602
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001603type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001604 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -08001605 notes []db.NotesData
1606 shiftSchedule []db.Shift
1607 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -08001608 stats2023 []db.Stats2023
Emily Markova8cb91312024-02-02 12:30:37 -08001609 stats2024 []db.Stats2024
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001610 actions []db.Action
Emily Markovafaecfe12023-07-01 12:40:03 -07001611 images []db.PitImage
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001612}
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001613
Emily Markovabf24c9e2023-02-08 20:31:11 -08001614func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -08001615 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001616 return nil
1617}
1618
Emily Markova290147d2023-03-03 22:40:06 -08001619func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
1620 database.stats2023 = append(database.stats2023, stats2023)
1621 return nil
1622}
Emily Markova8cb91312024-02-02 12:30:37 -08001623
1624func (database *MockDatabase) AddToStats2024(stats2024 db.Stats2024) error {
1625 database.stats2024 = append(database.stats2024, stats2024)
1626 return nil
1627}
Emily Markovabf24c9e2023-02-08 20:31:11 -08001628func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001629 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001630}
1631
Emily Markova290147d2023-03-03 22:40:06 -08001632func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
1633 return database.stats2023, nil
1634}
1635
Emily Markova8cb91312024-02-02 12:30:37 -08001636func (database *MockDatabase) ReturnStats2024() ([]db.Stats2024, error) {
1637 return database.stats2024, nil
1638}
1639
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001640func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error) {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001641 var results []db.Stats2023
1642 for _, stats := range database.stats2023 {
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001643 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001644 results = append(results, stats)
1645 }
1646 }
1647 return results, nil
1648}
1649
Emily Markova8cb91312024-02-02 12:30:37 -08001650func (database *MockDatabase) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2024, error) {
1651 var results []db.Stats2024
1652 for _, stats := range database.stats2024 {
1653 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
1654 results = append(results, stats)
1655 }
1656 }
1657 return results, nil
1658}
1659
Emily Markovae68b7632023-12-30 14:17:55 -08001660func (database *MockDatabase) QueryNotes(requestedTeam string) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -07001661 var results []string
1662 for _, data := range database.notes {
1663 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -07001664 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -07001665 }
1666 }
Philipp Schradereecb8962022-06-01 21:02:42 -07001667 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -07001668}
1669
Filip Kujawaf947cb42022-11-21 10:00:30 -08001670func (database *MockDatabase) AddNotes(data db.NotesData) error {
1671 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -07001672 return nil
1673}
1674
Filip Kujawaf882e022022-12-14 13:14:08 -08001675func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
1676 return database.notes, nil
1677}
1678
Milo Lin1d59f0c2022-06-22 20:30:58 -07001679func (database *MockDatabase) AddToShift(data db.Shift) error {
1680 database.shiftSchedule = append(database.shiftSchedule, data)
1681 return nil
1682}
1683
1684func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
1685 return database.shiftSchedule, nil
1686}
1687
1688func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
1689 return []db.Shift{}, nil
1690}
1691
Emily Markovafaecfe12023-07-01 12:40:03 -07001692func (database *MockDatabase) QueryPitImages(requestedTeam string) ([]db.RequestedPitImage, error) {
1693 var results []db.RequestedPitImage
1694 for _, data := range database.images {
1695 if data.TeamNumber == requestedTeam {
1696 results = append(results, db.RequestedPitImage{
1697 TeamNumber: data.TeamNumber,
1698 ImagePath: data.ImagePath,
1699 CheckSum: data.CheckSum,
1700 })
1701 }
1702 }
1703 return results, nil
1704}
1705
Filip Kujawa210a03b2022-11-24 14:41:11 -08001706func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
1707 database.driver_ranking = append(database.driver_ranking, data)
1708 return nil
1709}
1710
Filip Kujawaf882e022022-12-14 13:14:08 -08001711func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
1712 return database.driver_ranking, nil
1713}
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001714
1715func (database *MockDatabase) AddAction(action db.Action) error {
1716 database.actions = append(database.actions, action)
1717 return nil
1718}
1719
Emily Markovafaecfe12023-07-01 12:40:03 -07001720func (database *MockDatabase) AddPitImage(pitImage db.PitImage) error {
1721 database.images = append(database.images, pitImage)
1722 return nil
1723}
1724
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001725func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
1726 return database.actions, nil
1727}
Filip Kujawac1ded372023-05-27 14:33:43 -07001728
Emily Markova8e39f452023-12-23 12:17:30 -08001729func (database *MockDatabase) ReturnPitImages() ([]db.PitImage, error) {
1730 return database.images, nil
1731}
1732
Filip Kujawac1ded372023-05-27 14:33:43 -07001733func (database *MockDatabase) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1734 for i, stat := range database.stats2023 {
1735 if stat.CompLevel == compLevel_ &&
1736 stat.MatchNumber == matchNumber_ &&
1737 stat.SetNumber == setNumber_ &&
1738 stat.TeamNumber == teamNumber_ {
1739 // Match found, remove the element from the array.
1740 database.stats2023 = append(database.stats2023[:i], database.stats2023[i+1:]...)
1741 }
1742 }
1743 return nil
1744}
1745
Emily Markova8cb91312024-02-02 12:30:37 -08001746func (database *MockDatabase) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1747 for i, stat := range database.stats2024 {
1748 if stat.CompLevel == compLevel_ &&
1749 stat.MatchNumber == matchNumber_ &&
1750 stat.SetNumber == setNumber_ &&
1751 stat.TeamNumber == teamNumber_ {
1752 // Match found, remove the element from the array.
1753 database.stats2024 = append(database.stats2024[:i], database.stats2024[i+1:]...)
1754 }
1755 }
1756 return nil
1757}
1758
Filip Kujawac1ded372023-05-27 14:33:43 -07001759func (database *MockDatabase) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1760 for i, action := range database.actions {
1761 if action.CompLevel == compLevel_ &&
1762 action.MatchNumber == matchNumber_ &&
1763 action.SetNumber == setNumber_ &&
1764 action.TeamNumber == teamNumber_ {
1765 // Match found, remove the element from the array.
1766 database.actions = append(database.actions[:i], database.actions[i+1:]...)
1767 }
1768 }
1769 return nil
1770}