blob: fae542c4cf77f63dba071a00c2642a60ef3adf02 [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,
Emily Markovacd156942024-04-07 19:32:28 -0700139 Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 1, OutOfField: 2,
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,
Emily Markovacd156942024-04-07 19:32:28 -0700147 Speaker: 0, Amp: 4, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
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,
Emily Markovacd156942024-04-07 19:32:28 -0700216 Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
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,
Emily Markovacd156942024-04-07 19:32:28 -0700224 Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
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,
Emily Markovacd156942024-04-07 19:32:28 -0700249 Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
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,
Emily Markovacd156942024-04-07 19:32:28 -0700257 Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
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 },
Emily Markova8cb91312024-02-02 12:30:37 -0800379 Timestamp: 800,
380 },
381 {
382 ActionTaken: &submit_2024_actions.ActionTypeT{
383 Type: submit_2024_actions.ActionTypePlaceNoteAction,
384 Value: &submit_2024_actions.PlaceNoteActionT{
385 ScoreType: submit_2024_actions.ScoreTypekAMP,
386 Auto: true,
387 },
388 },
389 Timestamp: 2000,
390 },
391 {
392 ActionTaken: &submit_2024_actions.ActionTypeT{
393 Type: submit_2024_actions.ActionTypeMobilityAction,
394 Value: &submit_2024_actions.MobilityActionT{
395 Mobility: true,
396 },
397 },
398 Timestamp: 2200,
399 },
400 {
401 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markovadcadcb62024-02-03 13:07:17 -0800402 Type: submit_2024_actions.ActionTypePenaltyAction,
403 Value: &submit_2024_actions.PenaltyActionT{
404 Penalties: 5,
405 },
Emily Markova8cb91312024-02-02 12:30:37 -0800406 },
407 Timestamp: 2400,
408 },
409 {
410 ActionTaken: &submit_2024_actions.ActionTypeT{
411 Type: submit_2024_actions.ActionTypePickupNoteAction,
412 Value: &submit_2024_actions.PickupNoteActionT{
413 Auto: false,
414 },
415 },
416 Timestamp: 2800,
417 },
418 {
419 ActionTaken: &submit_2024_actions.ActionTypeT{
420 Type: submit_2024_actions.ActionTypePlaceNoteAction,
421 Value: &submit_2024_actions.PlaceNoteActionT{
Emily Markovacd156942024-04-07 19:32:28 -0700422 ScoreType: submit_2024_actions.ScoreTypekSHUTTLED,
Emily Markova8cb91312024-02-02 12:30:37 -0800423 Auto: false,
424 },
425 },
426 Timestamp: 3100,
427 },
428 {
429 ActionTaken: &submit_2024_actions.ActionTypeT{
430 Type: submit_2024_actions.ActionTypePickupNoteAction,
431 Value: &submit_2024_actions.PickupNoteActionT{
432 Auto: false,
433 },
434 },
Emily Markova040123c2024-02-27 09:48:37 -0800435 Timestamp: 3200,
436 },
437 {
438 ActionTaken: &submit_2024_actions.ActionTypeT{
439 Type: submit_2024_actions.ActionTypePlaceNoteAction,
440 Value: &submit_2024_actions.PlaceNoteActionT{
441 ScoreType: submit_2024_actions.ScoreTypekDROPPED,
442 Auto: false,
443 },
444 },
445 Timestamp: 3300,
446 },
447 {
448 ActionTaken: &submit_2024_actions.ActionTypeT{
449 Type: submit_2024_actions.ActionTypeRobotDeathAction,
450 Value: &submit_2024_actions.RobotDeathActionT{
451 RobotDead: true,
452 },
453 },
454 Timestamp: 3400,
455 },
456 {
457 ActionTaken: &submit_2024_actions.ActionTypeT{
458 Type: submit_2024_actions.ActionTypeRobotDeathAction,
459 Value: &submit_2024_actions.RobotDeathActionT{
460 RobotDead: false,
461 },
462 },
463 Timestamp: 3450,
464 },
465 {
466 ActionTaken: &submit_2024_actions.ActionTypeT{
467 Type: submit_2024_actions.ActionTypePickupNoteAction,
468 Value: &submit_2024_actions.PickupNoteActionT{
469 Auto: false,
470 },
471 },
Emily Markova8cb91312024-02-02 12:30:37 -0800472 Timestamp: 3500,
473 },
474 {
475 ActionTaken: &submit_2024_actions.ActionTypeT{
476 Type: submit_2024_actions.ActionTypePlaceNoteAction,
477 Value: &submit_2024_actions.PlaceNoteActionT{
478 ScoreType: submit_2024_actions.ScoreTypekSPEAKER_AMPLIFIED,
479 Auto: false,
480 },
481 },
482 Timestamp: 3900,
483 },
484 {
485 ActionTaken: &submit_2024_actions.ActionTypeT{
486 Type: submit_2024_actions.ActionTypeEndMatchAction,
487 Value: &submit_2024_actions.EndMatchActionT{
488 StageType: submit_2024_actions.StageTypekHARMONY,
489 TrapNote: false,
Emily Markova6079e2f2024-02-17 13:17:24 -0800490 Spotlight: false,
Emily Markova8cb91312024-02-02 12:30:37 -0800491 },
492 },
493 Timestamp: 4200,
494 },
495 },
496 PreScouting: false,
497 }).Pack(builder))
498
499 submit2024Actions := submit_2024_actions.GetRootAsSubmit2024Actions(builder.FinishedBytes(), 0)
500 response, err := ConvertActionsToStat2024(submit2024Actions)
501
502 if err != nil {
503 t.Fatal("Failed to convert actions to stats: ", err)
504 }
505
506 expected := db.Stats2024{
507 PreScouting: false, TeamNumber: "4244",
508 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
Emily Markova040123c2024-02-27 09:48:37 -0800509 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700510 Speaker: 0, Amp: 0, SpeakerAmplified: 1, Shuttled: 1, OutOfField: 0,
511 NotesDropped: 1, Penalties: 5, TrapNote: false, Spotlight: false, AvgCycle: 950,
Emily Markova040123c2024-02-27 09:48:37 -0800512 Park: false, OnStage: false, Harmony: true, RobotDied: true, CollectedBy: "",
Emily Markova8cb91312024-02-02 12:30:37 -0800513 }
514
515 if expected != response {
516 t.Fatal("Expected ", expected, ", but got ", response)
517 }
518}
519
Emily Markova1abe9782023-03-11 19:45:38 -0800520// Validates that we can request the 2023 stats.
521func TestConvertActionsToStat(t *testing.T) {
522 builder := flatbuffers.NewBuilder(1024)
523 builder.Finish((&submit_actions.SubmitActionsT{
524 TeamNumber: "4244",
525 MatchNumber: 3,
526 SetNumber: 1,
527 CompLevel: "quals",
Emily Markova1abe9782023-03-11 19:45:38 -0800528 ActionsList: []*submit_actions.ActionT{
529 {
530 ActionTaken: &submit_actions.ActionTypeT{
531 Type: submit_actions.ActionTypeStartMatchAction,
532 Value: &submit_actions.StartMatchActionT{
533 Position: 1,
534 },
535 },
536 Timestamp: 0,
537 },
538 {
539 ActionTaken: &submit_actions.ActionTypeT{
540 Type: submit_actions.ActionTypePickupObjectAction,
541 Value: &submit_actions.PickupObjectActionT{
542 ObjectType: submit_actions.ObjectTypekCube,
543 Auto: true,
544 },
545 },
546 Timestamp: 400,
547 },
548 {
549 ActionTaken: &submit_actions.ActionTypeT{
550 Type: submit_actions.ActionTypePickupObjectAction,
551 Value: &submit_actions.PickupObjectActionT{
552 ObjectType: submit_actions.ObjectTypekCube,
553 Auto: true,
554 },
555 },
556 Timestamp: 800,
557 },
558 {
559 ActionTaken: &submit_actions.ActionTypeT{
560 Type: submit_actions.ActionTypePlaceObjectAction,
561 Value: &submit_actions.PlaceObjectActionT{
562 ObjectType: submit_actions.ObjectTypekCube,
563 ScoreLevel: submit_actions.ScoreLevelkLow,
564 Auto: true,
565 },
566 },
567 Timestamp: 2000,
568 },
569 {
570 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700571 Type: submit_actions.ActionTypeMobilityAction,
572 Value: &submit_actions.MobilityActionT{
573 Mobility: true,
574 },
575 },
576 Timestamp: 2200,
577 },
578 {
579 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700580 Type: submit_actions.ActionTypeAutoBalanceAction,
581 Value: &submit_actions.AutoBalanceActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700582 Docked: true,
583 Engaged: true,
584 BalanceAttempt: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700585 },
586 },
587 Timestamp: 2400,
588 },
589 {
590 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova1abe9782023-03-11 19:45:38 -0800591 Type: submit_actions.ActionTypePickupObjectAction,
592 Value: &submit_actions.PickupObjectActionT{
593 ObjectType: submit_actions.ObjectTypekCone,
594 Auto: false,
595 },
596 },
597 Timestamp: 2800,
598 },
599 {
600 ActionTaken: &submit_actions.ActionTypeT{
601 Type: submit_actions.ActionTypePlaceObjectAction,
602 Value: &submit_actions.PlaceObjectActionT{
603 ObjectType: submit_actions.ObjectTypekCone,
604 ScoreLevel: submit_actions.ScoreLevelkHigh,
605 Auto: false,
606 },
607 },
608 Timestamp: 3100,
609 },
Emily Markova46a69bf2023-03-22 20:45:52 -0700610 {
611 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa7a045e72023-04-13 08:41:09 -0700612 Type: submit_actions.ActionTypePickupObjectAction,
613 Value: &submit_actions.PickupObjectActionT{
614 ObjectType: submit_actions.ObjectTypekCube,
615 Auto: false,
616 },
617 },
618 Timestamp: 3500,
619 },
620 {
621 ActionTaken: &submit_actions.ActionTypeT{
622 Type: submit_actions.ActionTypePlaceObjectAction,
623 Value: &submit_actions.PlaceObjectActionT{
624 ObjectType: submit_actions.ObjectTypekCube,
625 ScoreLevel: submit_actions.ScoreLevelkSupercharged,
626 Auto: false,
627 },
628 },
629 Timestamp: 3900,
630 },
631 {
632 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700633 Type: submit_actions.ActionTypeEndMatchAction,
634 Value: &submit_actions.EndMatchActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700635 Docked: true,
636 Engaged: false,
637 BalanceAttempt: true,
Emily Markova46a69bf2023-03-22 20:45:52 -0700638 },
639 },
Filip Kujawa7a045e72023-04-13 08:41:09 -0700640 Timestamp: 4200,
Emily Markova46a69bf2023-03-22 20:45:52 -0700641 },
Emily Markova1abe9782023-03-11 19:45:38 -0800642 },
Philipp Schrader4b489222023-04-15 16:40:16 -0700643 PreScouting: false,
Emily Markova1abe9782023-03-11 19:45:38 -0800644 }).Pack(builder))
645
646 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
647 response, err := ConvertActionsToStat(submitActions)
648
649 if err != nil {
650 t.Fatal("Failed to convert actions to stats: ", err)
651 }
652
653 expected := db.Stats2023{
Philipp Schrader4b489222023-04-15 16:40:16 -0700654 PreScouting: false,
655 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
Emily Markova1abe9782023-03-11 19:45:38 -0800656 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
657 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
658 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
659 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
660 HighCubes: 0, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700661 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700662 AvgCycle: 950, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700663 BalanceAttemptAuto: false, Docked: true, Engaged: false,
Philipp Schradere11114f2023-04-15 17:04:25 -0700664 BalanceAttempt: true, CollectedBy: "",
Emily Markova1abe9782023-03-11 19:45:38 -0800665 }
666
667 if expected != response {
668 t.Fatal("Expected ", expected, ", but got ", response)
669 }
670}
671
Alex Perry81f96ba2022-03-13 18:26:19 -0700672func TestSubmitNotes(t *testing.T) {
673 database := MockDatabase{}
674 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800675 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700676 scoutingServer.Start(8080)
677 defer scoutingServer.Stop()
678
679 builder := flatbuffers.NewBuilder(1024)
680 builder.Finish((&submit_notes.SubmitNotesT{
Emily Markovae68b7632023-12-30 14:17:55 -0800681 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800682 Notes: "Notes",
683 GoodDriving: true,
684 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700685 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800686 SketchyPlacing: false,
687 GoodDefense: true,
688 BadDefense: false,
689 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700690 NoShow: false,
691 MatchNumber: 4,
692 CompLevel: "qm",
693 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700694 }).Pack(builder))
695
696 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
697 if err != nil {
698 t.Fatal("Failed to submit notes: ", err)
699 }
700
701 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800702 {
Emily Markovae68b7632023-12-30 14:17:55 -0800703 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800704 Notes: "Notes",
705 GoodDriving: true,
706 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700707 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800708 SketchyPlacing: false,
709 GoodDefense: true,
710 BadDefense: false,
711 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700712 NoShow: false,
713 MatchNumber: 4,
714 CompLevel: "qm",
715 SetNumber: 1,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800716 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700717 }
718
719 if !reflect.DeepEqual(database.notes, expected) {
720 t.Fatal("Submitted notes did not match", expected, database.notes)
721 }
722}
723
724func TestRequestNotes(t *testing.T) {
725 database := MockDatabase{
726 notes: []db.NotesData{{
Emily Markovae68b7632023-12-30 14:17:55 -0800727 TeamNumber: "971A",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800728 Notes: "Notes",
729 GoodDriving: true,
730 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700731 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800732 SketchyPlacing: false,
733 GoodDefense: true,
734 BadDefense: false,
735 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700736 NoShow: false,
737 MatchNumber: 4,
738 CompLevel: "qm",
739 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700740 }},
741 }
742 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800743 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700744 scoutingServer.Start(8080)
745 defer scoutingServer.Stop()
746
747 builder := flatbuffers.NewBuilder(1024)
748 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
Emily Markovae68b7632023-12-30 14:17:55 -0800749 Team: "971A",
Alex Perry81f96ba2022-03-13 18:26:19 -0700750 }).Pack(builder))
751 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
752 if err != nil {
753 t.Fatal("Failed to submit notes: ", err)
754 }
755
756 if response.Notes[0].Data != "Notes" {
757 t.Fatal("requested notes did not match", response)
758 }
759}
760
Emily Markovafaecfe12023-07-01 12:40:03 -0700761func TestSubmitPitImage(t *testing.T) {
762 database := MockDatabase{}
763 scoutingServer := server.NewScoutingServer()
764 HandleRequests(&database, scoutingServer)
765 scoutingServer.Start(8080)
766 defer scoutingServer.Stop()
767
768 builder := flatbuffers.NewBuilder(1024)
769 builder.Finish((&submit_pit_image.SubmitPitImageT{
770 TeamNumber: "483A", ImagePath: "483Arobot.jpg",
771 ImageData: []byte{12, 43, 54, 34, 98},
772 }).Pack(builder))
773
774 _, err := debug.SubmitPitImage("http://localhost:8080", builder.FinishedBytes())
775 if err != nil {
776 t.Fatal("Failed to submit pit image: ", err)
777 }
778
779 expected := []db.PitImage{
780 {
781 TeamNumber: "483A", CheckSum: "177d9dc52bc25f391232e82521259c378964c068832a9178d73448ba4ac5e0b1",
782 ImagePath: "483Arobot.jpg", ImageData: []byte{12, 43, 54, 34, 98},
783 },
784 }
785
786 if !reflect.DeepEqual(database.images, expected) {
787 t.Fatal("Submitted image did not match", expected, database.images)
788 }
789}
790
791func TestRequestPitImages(t *testing.T) {
792 db := MockDatabase{
793 images: []db.PitImage{
794 {
795 TeamNumber: "932", ImagePath: "pitimage.jpg",
796 ImageData: []byte{3, 34, 44, 65}, CheckSum: "abcdf",
797 },
798 {
799 TeamNumber: "234", ImagePath: "234robot.png",
800 ImageData: []byte{64, 54, 21, 21, 76, 32}, CheckSum: "egrfd",
801 },
802 {
803 TeamNumber: "93A", ImagePath: "abcd.jpg",
804 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "rgegfd",
805 },
806 },
807 }
808
809 scoutingServer := server.NewScoutingServer()
810 HandleRequests(&db, scoutingServer)
811 scoutingServer.Start(8080)
812 defer scoutingServer.Stop()
813
814 builder := flatbuffers.NewBuilder(1024)
815 builder.Finish((&request_pit_images.RequestPitImagesT{"932"}).Pack(builder))
816
817 response, err := debug.RequestPitImages("http://localhost:8080", builder.FinishedBytes())
818 if err != nil {
819 t.Fatal("Failed to request pit images: ", err)
820 }
821
822 expected := request_pit_images_response.RequestPitImagesResponseT{
823 PitImageList: []*request_pit_images_response.PitImageT{
824 {
825 TeamNumber: "932", ImagePath: "pitimage.jpg", CheckSum: "abcdf",
826 },
827 },
828 }
829
830 if len(expected.PitImageList) != len(response.PitImageList) {
831 t.Fatal("Expected ", expected, ", but got ", *response)
832 }
833
834 for i, pit_image := range expected.PitImageList {
835 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
836 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
837 }
838 }
839}
840
Emily Markova8e39f452023-12-23 12:17:30 -0800841func TestRequestAllPitImages(t *testing.T) {
842 db := MockDatabase{
843 images: []db.PitImage{
844 {
845 TeamNumber: "32", ImagePath: "pitimage.jpg",
846 ImageData: []byte{3, 43, 44, 32}, CheckSum: "cdhrj",
847 },
848 {
849 TeamNumber: "231", ImagePath: "232robot.png",
850 ImageData: []byte{64, 54, 54, 21, 76, 32}, CheckSum: "rgre",
851 },
852 {
853 TeamNumber: "90", ImagePath: "abcd.jpg",
854 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "erfer",
855 },
856 },
857 }
858
859 scoutingServer := server.NewScoutingServer()
860 HandleRequests(&db, scoutingServer)
861 scoutingServer.Start(8080)
862 defer scoutingServer.Stop()
863
864 builder := flatbuffers.NewBuilder(1024)
865 builder.Finish((&request_all_pit_images.RequestAllPitImagesT{}).Pack(builder))
866
867 response, err := debug.RequestAllPitImages("http://localhost:8080", builder.FinishedBytes())
868 if err != nil {
869 t.Fatal("Failed to request pit images: ", err)
870 }
871
872 expected := request_all_pit_images_response.RequestAllPitImagesResponseT{
873 PitImageList: []*request_all_pit_images_response.PitImageT{
874 {
875 TeamNumber: "32", ImagePath: "pitimage.jpg", CheckSum: "cdhrj",
876 },
877 {
878 TeamNumber: "231", ImagePath: "232robot.png", CheckSum: "rgre",
879 },
880 {
881 TeamNumber: "90", ImagePath: "abcd.jpg", CheckSum: "erfer",
882 },
883 },
884 }
885
886 if len(expected.PitImageList) != len(response.PitImageList) {
887 t.Fatal("Expected ", expected, ", but got ", *response)
888 }
889
890 for i, pit_image := range expected.PitImageList {
891 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
892 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
893 }
894 }
895}
896
Milo Lin1d59f0c2022-06-22 20:30:58 -0700897func TestRequestShiftSchedule(t *testing.T) {
898 db := MockDatabase{
899 shiftSchedule: []db.Shift{
900 {
901 MatchNumber: 1,
902 R1scouter: "Bob",
903 R2scouter: "James",
904 R3scouter: "Robert",
905 B1scouter: "Alice",
906 B2scouter: "Mary",
907 B3scouter: "Patricia",
908 },
909 {
910 MatchNumber: 2,
911 R1scouter: "Liam",
912 R2scouter: "Noah",
913 R3scouter: "Oliver",
914 B1scouter: "Emma",
915 B2scouter: "Charlotte",
916 B3scouter: "Amelia",
917 },
918 },
919 }
920 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800921 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700922 scoutingServer.Start(8080)
923 defer scoutingServer.Stop()
924
925 builder := flatbuffers.NewBuilder(1024)
926 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
927
928 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
929 if err != nil {
930 t.Fatal("Failed to request shift schedule: ", err)
931 }
932
933 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
934 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
935 {
936 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700937 R1Scouter: "Bob",
938 R2Scouter: "James",
939 R3Scouter: "Robert",
940 B1Scouter: "Alice",
941 B2Scouter: "Mary",
942 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700943 },
944 {
945 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700946 R1Scouter: "Liam",
947 R2Scouter: "Noah",
948 R3Scouter: "Oliver",
949 B1Scouter: "Emma",
950 B2Scouter: "Charlotte",
951 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700952 },
953 },
954 }
955 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
956 t.Fatal("Expected ", expected, ", but got ", *response)
957 }
958 for i, match := range expected.ShiftSchedule {
959 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
960 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
961 }
962 }
963}
964
965func TestSubmitShiftSchedule(t *testing.T) {
966 database := MockDatabase{}
967 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800968 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700969 scoutingServer.Start(8080)
970 defer scoutingServer.Stop()
971
972 builder := flatbuffers.NewBuilder(1024)
973 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
974 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
975 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700976 R1Scouter: "Bob",
977 R2Scouter: "James",
978 R3Scouter: "Robert",
979 B1Scouter: "Alice",
980 B2Scouter: "Mary",
981 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700982 },
983 }).Pack(builder))
984
985 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
986 if err != nil {
987 t.Fatal("Failed to submit shift schedule: ", err)
988 }
989
990 expected := []db.Shift{
991 {MatchNumber: 1,
992 R1scouter: "Bob",
993 R2scouter: "James",
994 R3scouter: "Robert",
995 B1scouter: "Alice",
996 B2scouter: "Mary",
997 B3scouter: "Patricia"},
998 }
999 if !reflect.DeepEqual(expected, database.shiftSchedule) {
1000 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
1001 }
1002}
1003
Filip Kujawa210a03b2022-11-24 14:41:11 -08001004func TestSubmitDriverRanking(t *testing.T) {
1005 database := MockDatabase{}
1006 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001007 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -08001008 scoutingServer.Start(8080)
1009 defer scoutingServer.Stop()
1010
1011 builder := flatbuffers.NewBuilder(1024)
1012 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
1013 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001014 Rank1: "1234",
1015 Rank2: "1235",
1016 Rank3: "1236",
Filip Kujawa210a03b2022-11-24 14:41:11 -08001017 }).Pack(builder))
1018
1019 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
1020 if err != nil {
1021 t.Fatal("Failed to submit driver ranking: ", err)
1022 }
1023
1024 expected := []db.DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -08001025 {MatchNumber: 36, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -08001026 }
1027
1028 if !reflect.DeepEqual(database.driver_ranking, expected) {
1029 t.Fatal("Submitted notes did not match", expected, database.notes)
1030 }
1031}
1032
Filip Kujawaf882e022022-12-14 13:14:08 -08001033// Validates that we can request the driver rankings.
1034func TestRequestDriverRankings(t *testing.T) {
1035 db := MockDatabase{
1036 driver_ranking: []db.DriverRankingData{
1037 {
1038 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001039 Rank1: "1234",
1040 Rank2: "1235",
1041 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001042 },
1043 {
1044 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001045 Rank1: "101",
1046 Rank2: "202",
1047 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001048 },
1049 },
1050 }
1051 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001052 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -08001053 scoutingServer.Start(8080)
1054 defer scoutingServer.Stop()
1055
1056 builder := flatbuffers.NewBuilder(1024)
1057 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
1058
1059 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
1060 if err != nil {
1061 t.Fatal("Failed to request all driver rankings: ", err)
1062 }
1063
1064 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
1065 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
1066 {
1067 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001068 Rank1: "1234",
1069 Rank2: "1235",
1070 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001071 },
1072 {
1073 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001074 Rank1: "101",
1075 Rank2: "202",
1076 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001077 },
1078 },
1079 }
1080 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
1081 t.Fatal("Expected ", expected, ", but got ", *response)
1082 }
1083 for i, match := range expected.DriverRankingList {
1084 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
1085 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
1086 }
1087 }
1088}
1089
1090// Validates that we can request all notes.
1091func TestRequestAllNotes(t *testing.T) {
1092 db := MockDatabase{
1093 notes: []db.NotesData{
1094 {
Emily Markovae68b7632023-12-30 14:17:55 -08001095 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001096 Notes: "Notes",
1097 GoodDriving: true,
1098 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001099 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001100 SketchyPlacing: false,
1101 GoodDefense: true,
1102 BadDefense: false,
1103 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001104 NoShow: false,
1105 MatchNumber: 4,
1106 CompLevel: "qm",
1107 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -08001108 },
1109 {
Emily Markovae68b7632023-12-30 14:17:55 -08001110 TeamNumber: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001111 Notes: "More Notes",
1112 GoodDriving: false,
1113 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001114 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001115 SketchyPlacing: true,
1116 GoodDefense: false,
1117 BadDefense: true,
1118 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001119 NoShow: false,
1120 MatchNumber: 1,
1121 CompLevel: "qm",
1122 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -08001123 },
1124 },
1125 }
1126 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -08001127 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -08001128 scoutingServer.Start(8080)
1129 defer scoutingServer.Stop()
1130
1131 builder := flatbuffers.NewBuilder(1024)
1132 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
1133
1134 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
1135 if err != nil {
1136 t.Fatal("Failed to request all notes: ", err)
1137 }
1138
1139 expected := request_all_notes_response.RequestAllNotesResponseT{
1140 NoteList: []*request_all_notes_response.NoteT{
1141 {
Emily Markovae68b7632023-12-30 14:17:55 -08001142 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001143 Notes: "Notes",
1144 GoodDriving: true,
1145 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001146 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001147 SketchyPlacing: false,
1148 GoodDefense: true,
1149 BadDefense: false,
1150 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001151 NoShow: false,
1152 MatchNumber: 4,
1153 CompLevel: "qm",
1154 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -08001155 },
1156 {
Emily Markovae68b7632023-12-30 14:17:55 -08001157 Team: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001158 Notes: "More Notes",
1159 GoodDriving: false,
1160 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001161 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001162 SketchyPlacing: true,
1163 GoodDefense: false,
1164 BadDefense: true,
1165 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001166 NoShow: false,
1167 MatchNumber: 1,
1168 CompLevel: "qm",
1169 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -08001170 },
1171 },
1172 }
1173 if len(expected.NoteList) != len(response.NoteList) {
1174 t.Fatal("Expected ", expected, ", but got ", *response)
1175 }
1176 for i, note := range expected.NoteList {
1177 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
1178 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
1179 }
1180 }
1181}
1182
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001183func packAction(action *submit_actions.ActionT) []byte {
1184 builder := flatbuffers.NewBuilder(50 * 1024)
1185 builder.Finish((action).Pack(builder))
1186 return (builder.FinishedBytes())
1187}
1188
Emily Markova8cb91312024-02-02 12:30:37 -08001189func TestAddingActions2024(t *testing.T) {
1190 database := MockDatabase{}
1191 scoutingServer := server.NewScoutingServer()
1192 HandleRequests(&database, scoutingServer)
1193 scoutingServer.Start(8080)
1194 defer scoutingServer.Stop()
1195
1196 builder := flatbuffers.NewBuilder(1024)
1197 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
1198 TeamNumber: "3421",
1199 MatchNumber: 2,
1200 SetNumber: 1,
1201 CompLevel: "quals",
1202 ActionsList: []*submit_2024_actions.ActionT{
1203 {
1204 ActionTaken: &submit_2024_actions.ActionTypeT{
1205 Type: submit_2024_actions.ActionTypePickupNoteAction,
1206 Value: &submit_2024_actions.PickupNoteActionT{
1207 Auto: true,
1208 },
1209 },
1210 Timestamp: 1800,
1211 },
1212 {
1213 ActionTaken: &submit_2024_actions.ActionTypeT{
1214 Type: submit_2024_actions.ActionTypePlaceNoteAction,
1215 Value: &submit_2024_actions.PlaceNoteActionT{
1216 ScoreType: submit_2024_actions.ScoreTypekSPEAKER,
1217 Auto: false,
1218 },
1219 },
1220 Timestamp: 2500,
1221 },
1222 },
1223 PreScouting: true,
1224 }).Pack(builder))
1225
1226 _, err := debug.Submit2024Actions("http://localhost:8080", builder.FinishedBytes())
1227 if err != nil {
1228 t.Fatal("Failed to submit actions: ", err)
1229 }
1230
1231 expectedActions := []db.Action{
1232 {
1233 PreScouting: true,
1234 TeamNumber: "3421",
1235 MatchNumber: 2,
1236 SetNumber: 1,
1237 CompLevel: "quals",
1238 CollectedBy: "debug_cli",
1239 CompletedAction: []byte{},
1240 Timestamp: 1800,
1241 },
1242 {
1243 PreScouting: true,
1244 TeamNumber: "3421",
1245 MatchNumber: 2,
1246 SetNumber: 1,
1247 CompLevel: "quals",
1248 CollectedBy: "debug_cli",
1249 CompletedAction: []byte{},
1250 Timestamp: 2500,
1251 },
1252 }
1253
1254 expectedStats := []db.Stats2024{
1255 db.Stats2024{
1256 PreScouting: true, TeamNumber: "3421",
1257 MatchNumber: 2, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 0,
1258 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001259 Speaker: 1, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001260 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -08001261 Park: false, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "debug_cli",
Emily Markova8cb91312024-02-02 12:30:37 -08001262 },
1263 }
1264
1265 if !reflect.DeepEqual(expectedActions, database.actions) {
1266 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1267 }
1268 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1269 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1270 }
1271}
1272
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001273func TestAddingActions(t *testing.T) {
1274 database := MockDatabase{}
1275 scoutingServer := server.NewScoutingServer()
1276 HandleRequests(&database, scoutingServer)
1277 scoutingServer.Start(8080)
1278 defer scoutingServer.Stop()
1279
1280 builder := flatbuffers.NewBuilder(1024)
1281 builder.Finish((&submit_actions.SubmitActionsT{
1282 TeamNumber: "1234",
1283 MatchNumber: 4,
1284 SetNumber: 1,
1285 CompLevel: "qual",
1286 ActionsList: []*submit_actions.ActionT{
1287 {
1288 ActionTaken: &submit_actions.ActionTypeT{
1289 Type: submit_actions.ActionTypePickupObjectAction,
1290 Value: &submit_actions.PickupObjectActionT{
1291 ObjectType: submit_actions.ObjectTypekCube,
1292 Auto: true,
1293 },
1294 },
1295 Timestamp: 2400,
1296 },
1297 {
1298 ActionTaken: &submit_actions.ActionTypeT{
1299 Type: submit_actions.ActionTypePlaceObjectAction,
1300 Value: &submit_actions.PlaceObjectActionT{
1301 ObjectType: submit_actions.ObjectTypekCube,
1302 ScoreLevel: submit_actions.ScoreLevelkLow,
1303 Auto: false,
1304 },
1305 },
1306 Timestamp: 1009,
1307 },
1308 },
Philipp Schrader4b489222023-04-15 16:40:16 -07001309 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001310 }).Pack(builder))
1311
1312 _, err := debug.SubmitActions("http://localhost:8080", builder.FinishedBytes())
1313 if err != nil {
1314 t.Fatal("Failed to submit actions: ", err)
1315 }
1316
1317 // Make sure that the data made it into the database.
1318 // TODO: Add this back when we figure out how to add the serialized action into the database.
1319
1320 /* expectedActionsT := []*submit_actions.ActionT{
1321 {
1322 ActionTaken: &submit_actions.ActionTypeT{
1323 Type: submit_actions.ActionTypePickupObjectAction,
1324 Value: &submit_actions.PickupObjectActionT{
1325 ObjectType: submit_actions.ObjectTypekCube,
1326 Auto: true,
1327 },
1328 },
1329 Timestamp: 2400,
1330 },
1331 {
1332 ActionTaken: &submit_actions.ActionTypeT{
1333 Type: submit_actions.ActionTypePlaceObjectAction,
1334 Value: &submit_actions.PlaceObjectActionT{
1335 ObjectType: submit_actions.ObjectTypekCube,
1336 ScoreLevel: submit_actions.ScoreLevelkLow,
1337 Auto: false,
1338 },
1339 },
1340 Timestamp: 1009,
1341 },
1342 } */
1343
1344 expectedActions := []db.Action{
1345 {
Philipp Schrader4b489222023-04-15 16:40:16 -07001346 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001347 TeamNumber: "1234",
1348 MatchNumber: 4,
1349 SetNumber: 1,
1350 CompLevel: "qual",
1351 CollectedBy: "debug_cli",
1352 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -07001353 Timestamp: 2400,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001354 },
1355 {
Philipp Schrader4b489222023-04-15 16:40:16 -07001356 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001357 TeamNumber: "1234",
1358 MatchNumber: 4,
1359 SetNumber: 1,
1360 CompLevel: "qual",
1361 CollectedBy: "debug_cli",
1362 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -07001363 Timestamp: 1009,
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001364 },
1365 }
1366
Philipp Schradere11114f2023-04-15 17:04:25 -07001367 expectedStats := []db.Stats2023{
1368 db.Stats2023{
1369 PreScouting: true,
1370 TeamNumber: "1234", MatchNumber: 4, SetNumber: 1,
1371 CompLevel: "qual", StartingQuadrant: 0, LowCubesAuto: 0,
1372 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
1373 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1374 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 0,
1375 HighCubes: 0, CubesDropped: 0, LowCones: 0,
1376 MiddleCones: 0, HighCones: 0, ConesDropped: 0, SuperchargedPieces: 0,
1377 AvgCycle: 0, Mobility: false, DockedAuto: false, EngagedAuto: false,
1378 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1379 BalanceAttempt: false, CollectedBy: "debug_cli",
1380 },
1381 }
1382
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001383 if !reflect.DeepEqual(expectedActions, database.actions) {
1384 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1385 }
Philipp Schradere11114f2023-04-15 17:04:25 -07001386 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1387 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1388 }
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001389}
1390
Filip Kujawac1ded372023-05-27 14:33:43 -07001391// Validates that we can delete stats.
1392func TestDeleteFromStats(t *testing.T) {
1393 database := MockDatabase{
1394 stats2023: []db.Stats2023{
1395 {
1396 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1397 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1398 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1399 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1400 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1401 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1402 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1403 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1404 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1405 BalanceAttempt: true, CollectedBy: "isaac",
1406 },
1407 {
1408 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
1409 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
1410 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
1411 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1412 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
1413 HighCubes: 1, CubesDropped: 0, LowCones: 0,
1414 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
1415 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
1416 BalanceAttemptAuto: true, Docked: false, Engaged: false,
1417 BalanceAttempt: true, CollectedBy: "unknown",
1418 },
1419 },
1420 actions: []db.Action{
1421 {
1422 PreScouting: true,
1423 TeamNumber: "3634",
1424 MatchNumber: 1,
1425 SetNumber: 2,
1426 CompLevel: "quals",
1427 CollectedBy: "debug_cli",
1428 CompletedAction: []byte{},
1429 Timestamp: 2400,
1430 },
1431 {
1432 PreScouting: true,
1433 TeamNumber: "2343",
1434 MatchNumber: 1,
1435 SetNumber: 2,
1436 CompLevel: "quals",
1437 CollectedBy: "debug_cli",
1438 CompletedAction: []byte{},
1439 Timestamp: 1009,
1440 },
1441 },
1442 }
1443 scoutingServer := server.NewScoutingServer()
1444 HandleRequests(&database, scoutingServer)
1445 scoutingServer.Start(8080)
1446 defer scoutingServer.Stop()
1447
1448 builder := flatbuffers.NewBuilder(1024)
1449 builder.Finish((&delete_2023_data_scouting.Delete2023DataScoutingT{
1450 CompLevel: "quals",
1451 MatchNumber: 1,
1452 SetNumber: 2,
1453 TeamNumber: "2343",
1454 }).Pack(builder))
1455
1456 _, err := debug.Delete2023DataScouting("http://localhost:8080", builder.FinishedBytes())
1457 if err != nil {
1458 t.Fatal("Failed to delete from data scouting ", err)
1459 }
1460
1461 expectedActions := []db.Action{
1462 {
1463 PreScouting: true,
1464 TeamNumber: "3634",
1465 MatchNumber: 1,
1466 SetNumber: 2,
1467 CompLevel: "quals",
1468 CollectedBy: "debug_cli",
1469 CompletedAction: []byte{},
1470 Timestamp: 2400,
1471 },
1472 }
1473
1474 expectedStats := []db.Stats2023{
1475 {
1476 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1477 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1478 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1479 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1480 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1481 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1482 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1483 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1484 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1485 BalanceAttempt: true, CollectedBy: "isaac",
1486 },
1487 }
1488
1489 if !reflect.DeepEqual(expectedActions, database.actions) {
1490 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1491 }
1492 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1493 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1494 }
1495}
1496
Emily Markova8cb91312024-02-02 12:30:37 -08001497// Validates that we can delete 2024 stats.
1498func TestDeleteFromStats2024(t *testing.T) {
1499 database := MockDatabase{
1500 stats2024: []db.Stats2024{
1501 {
1502 PreScouting: false, TeamNumber: "746",
1503 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1504 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001505 Speaker: 0, Amp: 1, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -08001506 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markova040123c2024-02-27 09:48:37 -08001507 Park: false, OnStage: false, Harmony: true, RobotDied: false, CollectedBy: "alek",
Emily Markova8cb91312024-02-02 12:30:37 -08001508 },
1509 {
1510 PreScouting: false, TeamNumber: "244",
1511 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1512 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001513 Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001514 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markova040123c2024-02-27 09:48:37 -08001515 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001516 },
1517 },
1518 actions: []db.Action{
1519 {
1520 PreScouting: true,
1521 TeamNumber: "746",
1522 MatchNumber: 3,
1523 SetNumber: 1,
1524 CompLevel: "quals",
1525 CollectedBy: "debug_cli",
1526 CompletedAction: []byte{},
1527 Timestamp: 2400,
1528 },
1529 {
1530 PreScouting: true,
1531 TeamNumber: "244",
1532 MatchNumber: 5,
1533 SetNumber: 3,
1534 CompLevel: "quals",
1535 CollectedBy: "debug_cli",
1536 CompletedAction: []byte{},
1537 Timestamp: 1009,
1538 },
1539 },
1540 }
1541 scoutingServer := server.NewScoutingServer()
1542 HandleRequests(&database, scoutingServer)
1543 scoutingServer.Start(8080)
1544 defer scoutingServer.Stop()
1545
1546 builder := flatbuffers.NewBuilder(1024)
1547 builder.Finish((&delete_2024_data_scouting.Delete2024DataScoutingT{
1548 CompLevel: "quals",
1549 MatchNumber: 3,
1550 SetNumber: 1,
1551 TeamNumber: "746",
1552 }).Pack(builder))
1553
1554 _, err := debug.Delete2024DataScouting("http://localhost:8080", builder.FinishedBytes())
1555 if err != nil {
1556 t.Fatal("Failed to delete from data scouting 2024", err)
1557 }
1558
1559 expectedActions := []db.Action{
1560 {
1561 PreScouting: true,
1562 TeamNumber: "244",
1563 MatchNumber: 5,
1564 SetNumber: 3,
1565 CompLevel: "quals",
1566 CollectedBy: "debug_cli",
1567 CompletedAction: []byte{},
1568 Timestamp: 1009,
1569 },
1570 }
1571
1572 expectedStats := []db.Stats2024{
1573 {
1574 PreScouting: false, TeamNumber: "244",
1575 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1576 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001577 Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001578 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markova040123c2024-02-27 09:48:37 -08001579 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001580 },
1581 }
1582
1583 if !reflect.DeepEqual(expectedActions, database.actions) {
1584 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1585 }
1586 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1587 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1588 }
1589}
1590
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001591// A mocked database we can use for testing. Add functionality to this as
1592// needed for your tests.
1593
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001594type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001595 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -08001596 notes []db.NotesData
1597 shiftSchedule []db.Shift
1598 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -08001599 stats2023 []db.Stats2023
Emily Markova8cb91312024-02-02 12:30:37 -08001600 stats2024 []db.Stats2024
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001601 actions []db.Action
Emily Markovafaecfe12023-07-01 12:40:03 -07001602 images []db.PitImage
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001603}
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001604
Emily Markovabf24c9e2023-02-08 20:31:11 -08001605func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -08001606 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001607 return nil
1608}
1609
Emily Markova290147d2023-03-03 22:40:06 -08001610func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
1611 database.stats2023 = append(database.stats2023, stats2023)
1612 return nil
1613}
Emily Markova8cb91312024-02-02 12:30:37 -08001614
1615func (database *MockDatabase) AddToStats2024(stats2024 db.Stats2024) error {
1616 database.stats2024 = append(database.stats2024, stats2024)
1617 return nil
1618}
Emily Markovabf24c9e2023-02-08 20:31:11 -08001619func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001620 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001621}
1622
Emily Markova290147d2023-03-03 22:40:06 -08001623func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
1624 return database.stats2023, nil
1625}
1626
Emily Markova8cb91312024-02-02 12:30:37 -08001627func (database *MockDatabase) ReturnStats2024() ([]db.Stats2024, error) {
1628 return database.stats2024, nil
1629}
1630
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001631func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error) {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001632 var results []db.Stats2023
1633 for _, stats := range database.stats2023 {
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001634 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001635 results = append(results, stats)
1636 }
1637 }
1638 return results, nil
1639}
1640
Emily Markova8cb91312024-02-02 12:30:37 -08001641func (database *MockDatabase) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2024, error) {
1642 var results []db.Stats2024
1643 for _, stats := range database.stats2024 {
1644 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
1645 results = append(results, stats)
1646 }
1647 }
1648 return results, nil
1649}
1650
Emily Markovae68b7632023-12-30 14:17:55 -08001651func (database *MockDatabase) QueryNotes(requestedTeam string) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -07001652 var results []string
1653 for _, data := range database.notes {
1654 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -07001655 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -07001656 }
1657 }
Philipp Schradereecb8962022-06-01 21:02:42 -07001658 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -07001659}
1660
Filip Kujawaf947cb42022-11-21 10:00:30 -08001661func (database *MockDatabase) AddNotes(data db.NotesData) error {
1662 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -07001663 return nil
1664}
1665
Filip Kujawaf882e022022-12-14 13:14:08 -08001666func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
1667 return database.notes, nil
1668}
1669
Milo Lin1d59f0c2022-06-22 20:30:58 -07001670func (database *MockDatabase) AddToShift(data db.Shift) error {
1671 database.shiftSchedule = append(database.shiftSchedule, data)
1672 return nil
1673}
1674
1675func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
1676 return database.shiftSchedule, nil
1677}
1678
1679func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
1680 return []db.Shift{}, nil
1681}
1682
Emily Markovafaecfe12023-07-01 12:40:03 -07001683func (database *MockDatabase) QueryPitImages(requestedTeam string) ([]db.RequestedPitImage, error) {
1684 var results []db.RequestedPitImage
1685 for _, data := range database.images {
1686 if data.TeamNumber == requestedTeam {
1687 results = append(results, db.RequestedPitImage{
1688 TeamNumber: data.TeamNumber,
1689 ImagePath: data.ImagePath,
1690 CheckSum: data.CheckSum,
1691 })
1692 }
1693 }
1694 return results, nil
1695}
1696
Filip Kujawa210a03b2022-11-24 14:41:11 -08001697func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
1698 database.driver_ranking = append(database.driver_ranking, data)
1699 return nil
1700}
1701
Filip Kujawaf882e022022-12-14 13:14:08 -08001702func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
1703 return database.driver_ranking, nil
1704}
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001705
1706func (database *MockDatabase) AddAction(action db.Action) error {
1707 database.actions = append(database.actions, action)
1708 return nil
1709}
1710
Emily Markovafaecfe12023-07-01 12:40:03 -07001711func (database *MockDatabase) AddPitImage(pitImage db.PitImage) error {
1712 database.images = append(database.images, pitImage)
1713 return nil
1714}
1715
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001716func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
1717 return database.actions, nil
1718}
Filip Kujawac1ded372023-05-27 14:33:43 -07001719
Emily Markova8e39f452023-12-23 12:17:30 -08001720func (database *MockDatabase) ReturnPitImages() ([]db.PitImage, error) {
1721 return database.images, nil
1722}
1723
Filip Kujawac1ded372023-05-27 14:33:43 -07001724func (database *MockDatabase) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1725 for i, stat := range database.stats2023 {
1726 if stat.CompLevel == compLevel_ &&
1727 stat.MatchNumber == matchNumber_ &&
1728 stat.SetNumber == setNumber_ &&
1729 stat.TeamNumber == teamNumber_ {
1730 // Match found, remove the element from the array.
1731 database.stats2023 = append(database.stats2023[:i], database.stats2023[i+1:]...)
1732 }
1733 }
1734 return nil
1735}
1736
Emily Markova8cb91312024-02-02 12:30:37 -08001737func (database *MockDatabase) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1738 for i, stat := range database.stats2024 {
1739 if stat.CompLevel == compLevel_ &&
1740 stat.MatchNumber == matchNumber_ &&
1741 stat.SetNumber == setNumber_ &&
1742 stat.TeamNumber == teamNumber_ {
1743 // Match found, remove the element from the array.
1744 database.stats2024 = append(database.stats2024[:i], database.stats2024[i+1:]...)
1745 }
1746 }
1747 return nil
1748}
1749
Filip Kujawac1ded372023-05-27 14:33:43 -07001750func (database *MockDatabase) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1751 for i, action := range database.actions {
1752 if action.CompLevel == compLevel_ &&
1753 action.MatchNumber == matchNumber_ &&
1754 action.SetNumber == setNumber_ &&
1755 action.TeamNumber == teamNumber_ {
1756 // Match found, remove the element from the array.
1757 database.actions = append(database.actions[:i], database.actions[i+1:]...)
1758 }
1759 }
1760 return nil
1761}