blob: 19bcae4144a8f1b690d3d9a8facc00b459b12b6d [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"
Emily Markova521725a2024-03-21 18:46:04 -07007 "time"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08008
Philipp Schrader8747f1b2022-02-23 23:56:22 -08009 "github.com/frc971/971-Robot-Code/scouting/db"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080010 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/debug"
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"
Emily Markova521725a2024-03-21 18:46:04 -070024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_current_scouting"
25 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_current_scouting_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070026 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Emily Markovafaecfe12023-07-01 12:40:03 -070027 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images"
28 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images_response"
Milo Lin1d59f0c2022-06-22 20:30:58 -070029 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
30 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Emily Markova8cb91312024-02-02 12:30:37 -080031 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_2024_actions"
Emily Markova1abe9782023-03-11 19:45:38 -080032 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions"
Filip Kujawa210a03b2022-11-24 14:41:11 -080033 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
Alex Perry81f96ba2022-03-13 18:26:19 -070034 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Emily Markovafaecfe12023-07-01 12:40:03 -070035 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_pit_image"
Milo Lin1d59f0c2022-06-22 20:30:58 -070036 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080037 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
38 flatbuffers "github.com/google/flatbuffers/go"
39)
40
Emily Markova521725a2024-03-21 18:46:04 -070041type MockClock struct {
42 now time.Time
43}
44
45func (mockClock MockClock) Now() time.Time {
46 return mockClock.now
47}
48
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080049// Validates that an unhandled address results in a 404.
50func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080051 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080052 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -070053 mockClock := MockClock{now: time.Now()}
54 HandleRequests(&db, scoutingServer, &mockClock)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080055 scoutingServer.Start(8080)
56 defer scoutingServer.Stop()
57
58 resp, err := http.Get("http://localhost:8080/requests/foo")
59 if err != nil {
60 t.Fatalf("Failed to get data: %v", err)
61 }
62 if resp.StatusCode != http.StatusNotFound {
63 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
64 }
65}
66
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080067// Validates that we can request the full match list.
68func TestRequestAllMatches(t *testing.T) {
69 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -080070 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080071 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080072 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070073 Alliance: "R", AlliancePosition: 1, TeamNumber: "5",
Emily Markovabf24c9e2023-02-08 20:31:11 -080074 },
75 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080076 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070077 Alliance: "R", AlliancePosition: 2, TeamNumber: "42",
Emily Markovabf24c9e2023-02-08 20:31:11 -080078 },
79 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080080 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070081 Alliance: "R", AlliancePosition: 3, TeamNumber: "600",
Emily Markovabf24c9e2023-02-08 20:31:11 -080082 },
83 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080084 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070085 Alliance: "B", AlliancePosition: 1, TeamNumber: "971",
Emily Markovabf24c9e2023-02-08 20:31:11 -080086 },
87 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080088 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070089 Alliance: "B", AlliancePosition: 2, TeamNumber: "400",
Emily Markovabf24c9e2023-02-08 20:31:11 -080090 },
91 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080092 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070093 Alliance: "B", AlliancePosition: 3, TeamNumber: "200",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080094 },
95 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080096 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070097 Alliance: "R", AlliancePosition: 1, TeamNumber: "6",
Emily Markovabf24c9e2023-02-08 20:31:11 -080098 },
99 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800100 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700101 Alliance: "R", AlliancePosition: 2, TeamNumber: "43",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800102 },
103 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800104 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700105 Alliance: "R", AlliancePosition: 3, TeamNumber: "601",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800106 },
107 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800108 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700109 Alliance: "B", AlliancePosition: 1, TeamNumber: "972",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800110 },
111 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800112 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700113 Alliance: "B", AlliancePosition: 2, TeamNumber: "401",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800114 },
115 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800116 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700117 Alliance: "B", AlliancePosition: 3, TeamNumber: "201",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800118 },
119 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800120 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700121 Alliance: "R", AlliancePosition: 1, TeamNumber: "7",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800122 },
123 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800124 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700125 Alliance: "R", AlliancePosition: 2, TeamNumber: "44",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800126 },
127 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800128 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700129 Alliance: "R", AlliancePosition: 3, TeamNumber: "602",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800130 },
131 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800132 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700133 Alliance: "B", AlliancePosition: 1, TeamNumber: "973",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800134 },
135 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800136 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700137 Alliance: "B", AlliancePosition: 2, TeamNumber: "402",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800138 },
139 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800140 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700141 Alliance: "B", AlliancePosition: 3, TeamNumber: "202",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800142 },
143 },
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800144 // Pretend that we have some data scouting data.
Emily Markovadcadcb62024-02-03 13:07:17 -0800145 stats2024: []db.Stats2024{
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800146 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700147 CompType: "Regular", TeamNumber: "5",
Emily Markovadcadcb62024-02-03 13:07:17 -0800148 MatchNumber: 1, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 3,
149 SpeakerAuto: 2, AmpAuto: 4, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700150 Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 1, OutOfField: 2,
Emily Markova040123c2024-02-27 09:48:37 -0800151 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markovaf17f2812024-04-03 20:55:12 -0700152 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800153 },
154 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700155 CompType: "Regular", TeamNumber: "973",
Emily Markovadcadcb62024-02-03 13:07:17 -0800156 MatchNumber: 3, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 1,
157 SpeakerAuto: 0, AmpAuto: 2, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700158 Speaker: 0, Amp: 4, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800159 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 120,
Emily Markovaf17f2812024-04-03 20:55:12 -0700160 Park: true, OnStage: false, Harmony: false, RobotDied: true, NoShow: false, CollectedBy: "bob",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800161 },
162 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800163 }
164 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700165 mockClock := MockClock{now: time.Now()}
166 HandleRequests(&db, scoutingServer, mockClock)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800167 scoutingServer.Start(8080)
168 defer scoutingServer.Stop()
169
170 builder := flatbuffers.NewBuilder(1024)
171 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
172
173 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
174 if err != nil {
175 t.Fatal("Failed to request all matches: ", err)
176 }
177
178 expected := request_all_matches_response.RequestAllMatchesResponseT{
179 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700180 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800181 // R1, R2, R3, B1, B2, B3
182 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800183 1, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700184 "5", "42", "600", "971", "400", "200",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800185 &request_all_matches_response.ScoutedLevelT{
186 // The R1 team has already been data
187 // scouted.
188 true, false, false, false, false, false,
189 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800190 },
191 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800192 2, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700193 "6", "43", "601", "972", "401", "201",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800194 &request_all_matches_response.ScoutedLevelT{
195 false, false, false, false, false, false,
196 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800197 },
198 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800199 3, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700200 "7", "44", "602", "973", "402", "202",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800201 &request_all_matches_response.ScoutedLevelT{
202 // The B1 team has already been data
203 // scouted.
204 false, false, false, true, false, false,
205 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800206 },
207 },
208 }
209 if len(expected.MatchList) != len(response.MatchList) {
210 t.Fatal("Expected ", expected, ", but got ", *response)
211 }
212 for i, match := range expected.MatchList {
213 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
214 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
215 }
216 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800217
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800218}
219
Emily Markova8cb91312024-02-02 12:30:37 -0800220// Validates that we can request the 2024 stats.
221func TestRequest2024DataScouting(t *testing.T) {
222 db := MockDatabase{
223 stats2024: []db.Stats2024{
224 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700225 CompType: "Regular", TeamNumber: "342",
Emily Markova8cb91312024-02-02 12:30:37 -0800226 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
227 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700228 Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800229 NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700230 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
231 },
232 {
233 CompType: "Regular", TeamNumber: "132",
234 MatchNumber: 4, SetNumber: 2, CompLevel: "quals", StartingQuadrant: 0,
235 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
236 Speaker: 0, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 1,
237 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
238 Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "jeff",
Emily Markova8cb91312024-02-02 12:30:37 -0800239 },
240 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700241 CompType: "Regular", TeamNumber: "982",
Emily Markova8cb91312024-02-02 12:30:37 -0800242 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
243 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700244 Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800245 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700246 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "george",
Emily Markova8cb91312024-02-02 12:30:37 -0800247 },
248 },
249 }
250 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700251 mockClock := MockClock{now: time.Now()}
252 HandleRequests(&db, scoutingServer, mockClock)
Emily Markova8cb91312024-02-02 12:30:37 -0800253 scoutingServer.Start(8080)
254 defer scoutingServer.Stop()
255
256 builder := flatbuffers.NewBuilder(1024)
257 builder.Finish((&request_2024_data_scouting.Request2024DataScoutingT{}).Pack(builder))
258
259 response, err := debug.Request2024DataScouting("http://localhost:8080", builder.FinishedBytes())
260 if err != nil {
261 t.Fatal("Failed to request all matches: ", err)
262 }
263
264 expected := request_2024_data_scouting_response.Request2024DataScoutingResponseT{
265 StatsList: []*request_2024_data_scouting_response.Stats2024T{
266 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700267 CompType: "Regular", TeamNumber: "342",
Emily Markova8cb91312024-02-02 12:30:37 -0800268 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
269 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700270 Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800271 NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700272 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
273 },
274 {
275 CompType: "Regular", TeamNumber: "132",
276 MatchNumber: 4, SetNumber: 2, CompLevel: "quals", StartingQuadrant: 0,
277 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
278 Speaker: 0, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 1,
279 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
280 Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "jeff",
Emily Markova8cb91312024-02-02 12:30:37 -0800281 },
282 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700283 CompType: "Regular", TeamNumber: "982",
Emily Markova8cb91312024-02-02 12:30:37 -0800284 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
285 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700286 Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800287 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700288 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "george",
Emily Markova8cb91312024-02-02 12:30:37 -0800289 },
290 },
291 }
292 if len(expected.StatsList) != len(response.StatsList) {
293 t.Fatal("Expected ", expected, ", but got ", *response)
294 }
295 for i, match := range expected.StatsList {
296 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
297 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
298 }
299 }
300}
301
Emily Markova290147d2023-03-03 22:40:06 -0800302// Validates that we can request the 2023 stats.
303func TestRequest2023DataScouting(t *testing.T) {
304 db := MockDatabase{
305 stats2023: []db.Stats2023{
306 {
307 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
308 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
309 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
310 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
311 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
312 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700313 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700314 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700315 BalanceAttemptAuto: false, Docked: false, Engaged: false,
316 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800317 },
318 {
319 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
320 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
321 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
322 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
323 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
324 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700325 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700326 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700327 BalanceAttemptAuto: true, Docked: false, Engaged: false,
328 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800329 },
330 },
331 }
332 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700333 mockClock := MockClock{now: time.Now()}
334 HandleRequests(&db, scoutingServer, mockClock)
Emily Markova290147d2023-03-03 22:40:06 -0800335 scoutingServer.Start(8080)
336 defer scoutingServer.Stop()
337
338 builder := flatbuffers.NewBuilder(1024)
339 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
340
341 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
342 if err != nil {
343 t.Fatal("Failed to request all matches: ", err)
344 }
345
346 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
347 StatsList: []*request_2023_data_scouting_response.Stats2023T{
348 {
349 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
350 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
351 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
352 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
353 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
354 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700355 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700356 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700357 BalanceAttemptAuto: false, Docked: false, Engaged: false,
358 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800359 },
360 {
361 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
362 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
363 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
364 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
365 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
366 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700367 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700368 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700369 BalanceAttemptAuto: true, Docked: false, Engaged: false,
370 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800371 },
372 },
373 }
374 if len(expected.StatsList) != len(response.StatsList) {
375 t.Fatal("Expected ", expected, ", but got ", *response)
376 }
377 for i, match := range expected.StatsList {
378 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
379 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
380 }
381 }
382}
383
Emily Markova8cb91312024-02-02 12:30:37 -0800384// Validates that we can request the 2024 stats.
385func TestConvertActionsToStat2024(t *testing.T) {
386 builder := flatbuffers.NewBuilder(1024)
387 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
388 TeamNumber: "4244",
389 MatchNumber: 3,
390 SetNumber: 1,
391 CompLevel: "quals",
392 ActionsList: []*submit_2024_actions.ActionT{
393 {
394 ActionTaken: &submit_2024_actions.ActionTypeT{
395 Type: submit_2024_actions.ActionTypeStartMatchAction,
396 Value: &submit_2024_actions.StartMatchActionT{
397 Position: 2,
398 },
399 },
400 Timestamp: 0,
401 },
402 {
403 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markovaf17f2812024-04-03 20:55:12 -0700404 Type: submit_2024_actions.ActionTypeNoShowAction,
405 Value: &submit_2024_actions.NoShowActionT{},
406 },
407 Timestamp: 200,
408 },
409 {
410 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markova8cb91312024-02-02 12:30:37 -0800411 Type: submit_2024_actions.ActionTypePickupNoteAction,
412 Value: &submit_2024_actions.PickupNoteActionT{
413 Auto: true,
414 },
415 },
Emily Markova8cb91312024-02-02 12:30:37 -0800416 Timestamp: 800,
417 },
418 {
419 ActionTaken: &submit_2024_actions.ActionTypeT{
420 Type: submit_2024_actions.ActionTypePlaceNoteAction,
421 Value: &submit_2024_actions.PlaceNoteActionT{
422 ScoreType: submit_2024_actions.ScoreTypekAMP,
423 Auto: true,
424 },
425 },
426 Timestamp: 2000,
427 },
428 {
429 ActionTaken: &submit_2024_actions.ActionTypeT{
430 Type: submit_2024_actions.ActionTypeMobilityAction,
431 Value: &submit_2024_actions.MobilityActionT{
432 Mobility: true,
433 },
434 },
435 Timestamp: 2200,
436 },
437 {
438 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markovadcadcb62024-02-03 13:07:17 -0800439 Type: submit_2024_actions.ActionTypePenaltyAction,
440 Value: &submit_2024_actions.PenaltyActionT{
441 Penalties: 5,
442 },
Emily Markova8cb91312024-02-02 12:30:37 -0800443 },
444 Timestamp: 2400,
445 },
446 {
447 ActionTaken: &submit_2024_actions.ActionTypeT{
448 Type: submit_2024_actions.ActionTypePickupNoteAction,
449 Value: &submit_2024_actions.PickupNoteActionT{
450 Auto: false,
451 },
452 },
453 Timestamp: 2800,
454 },
455 {
456 ActionTaken: &submit_2024_actions.ActionTypeT{
457 Type: submit_2024_actions.ActionTypePlaceNoteAction,
458 Value: &submit_2024_actions.PlaceNoteActionT{
Emily Markovacd156942024-04-07 19:32:28 -0700459 ScoreType: submit_2024_actions.ScoreTypekSHUTTLED,
Emily Markova8cb91312024-02-02 12:30:37 -0800460 Auto: false,
461 },
462 },
463 Timestamp: 3100,
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 Markova040123c2024-02-27 09:48:37 -0800472 Timestamp: 3200,
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.ScoreTypekDROPPED,
479 Auto: false,
480 },
481 },
482 Timestamp: 3300,
483 },
484 {
485 ActionTaken: &submit_2024_actions.ActionTypeT{
486 Type: submit_2024_actions.ActionTypeRobotDeathAction,
487 Value: &submit_2024_actions.RobotDeathActionT{
488 RobotDead: true,
489 },
490 },
491 Timestamp: 3400,
492 },
493 {
494 ActionTaken: &submit_2024_actions.ActionTypeT{
495 Type: submit_2024_actions.ActionTypeRobotDeathAction,
496 Value: &submit_2024_actions.RobotDeathActionT{
497 RobotDead: false,
498 },
499 },
500 Timestamp: 3450,
501 },
502 {
503 ActionTaken: &submit_2024_actions.ActionTypeT{
504 Type: submit_2024_actions.ActionTypePickupNoteAction,
505 Value: &submit_2024_actions.PickupNoteActionT{
506 Auto: false,
507 },
508 },
Emily Markova8cb91312024-02-02 12:30:37 -0800509 Timestamp: 3500,
510 },
511 {
512 ActionTaken: &submit_2024_actions.ActionTypeT{
513 Type: submit_2024_actions.ActionTypePlaceNoteAction,
514 Value: &submit_2024_actions.PlaceNoteActionT{
515 ScoreType: submit_2024_actions.ScoreTypekSPEAKER_AMPLIFIED,
516 Auto: false,
517 },
518 },
519 Timestamp: 3900,
520 },
521 {
522 ActionTaken: &submit_2024_actions.ActionTypeT{
523 Type: submit_2024_actions.ActionTypeEndMatchAction,
524 Value: &submit_2024_actions.EndMatchActionT{
525 StageType: submit_2024_actions.StageTypekHARMONY,
526 TrapNote: false,
Emily Markova6079e2f2024-02-17 13:17:24 -0800527 Spotlight: false,
Emily Markova8cb91312024-02-02 12:30:37 -0800528 },
529 },
530 Timestamp: 4200,
531 },
532 },
Emily Markova9c18e9c2024-04-03 20:06:27 -0700533 CompType: "Regular",
Emily Markova8cb91312024-02-02 12:30:37 -0800534 }).Pack(builder))
535
536 submit2024Actions := submit_2024_actions.GetRootAsSubmit2024Actions(builder.FinishedBytes(), 0)
537 response, err := ConvertActionsToStat2024(submit2024Actions)
538
539 if err != nil {
540 t.Fatal("Failed to convert actions to stats: ", err)
541 }
542
543 expected := db.Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700544 CompType: "Regular", TeamNumber: "4244",
Emily Markova8cb91312024-02-02 12:30:37 -0800545 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
Emily Markova040123c2024-02-27 09:48:37 -0800546 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700547 Speaker: 0, Amp: 0, SpeakerAmplified: 1, Shuttled: 1, OutOfField: 0,
548 NotesDropped: 1, Penalties: 5, TrapNote: false, Spotlight: false, AvgCycle: 950,
Emily Markovaf17f2812024-04-03 20:55:12 -0700549 Park: false, OnStage: false, Harmony: true, RobotDied: true, NoShow: true, CollectedBy: "",
Emily Markova8cb91312024-02-02 12:30:37 -0800550 }
551
552 if expected != response {
553 t.Fatal("Expected ", expected, ", but got ", response)
554 }
555}
556
Alex Perry81f96ba2022-03-13 18:26:19 -0700557func TestSubmitNotes(t *testing.T) {
558 database := MockDatabase{}
559 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700560 mockClock := MockClock{now: time.Now()}
561 HandleRequests(&database, scoutingServer, mockClock)
Alex Perry81f96ba2022-03-13 18:26:19 -0700562 scoutingServer.Start(8080)
563 defer scoutingServer.Stop()
564
565 builder := flatbuffers.NewBuilder(1024)
566 builder.Finish((&submit_notes.SubmitNotesT{
Emily Markovae68b7632023-12-30 14:17:55 -0800567 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800568 Notes: "Notes",
569 GoodDriving: true,
570 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700571 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800572 SketchyPlacing: false,
573 GoodDefense: true,
574 BadDefense: false,
575 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700576 NoShow: false,
577 MatchNumber: 4,
578 CompLevel: "qm",
579 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700580 }).Pack(builder))
581
582 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
583 if err != nil {
584 t.Fatal("Failed to submit notes: ", err)
585 }
586
587 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800588 {
Emily Markovae68b7632023-12-30 14:17:55 -0800589 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800590 Notes: "Notes",
591 GoodDriving: true,
592 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700593 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800594 SketchyPlacing: false,
595 GoodDefense: true,
596 BadDefense: false,
597 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700598 NoShow: false,
599 MatchNumber: 4,
600 CompLevel: "qm",
601 SetNumber: 1,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800602 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700603 }
604
605 if !reflect.DeepEqual(database.notes, expected) {
606 t.Fatal("Submitted notes did not match", expected, database.notes)
607 }
608}
609
Emily Markova521725a2024-03-21 18:46:04 -0700610// Validates that we can request names of peoples who are currently scouting the same team.
611func TestRequestCurrentScouting(t *testing.T) {
612 database := MockDatabase{}
613 scoutingServer := server.NewScoutingServer()
614 mockClock := MockClock{now: time.Now()}
615 HandleRequests(&database, scoutingServer, mockClock)
616 scoutingServer.Start(8080)
617 defer scoutingServer.Stop()
618
619 builder := flatbuffers.NewBuilder(1024)
620 builder.Finish((&request_current_scouting.RequestCurrentScoutingT{
621 TeamNumber: "971",
622 }).Pack(builder))
623 response, err := debug.RequestCurrentScouting("http://localhost:8080", builder.FinishedBytes())
624 if err != nil {
625 t.Fatal("Failed to request current scouting: ", err)
626 }
627
628 expected := request_current_scouting_response.RequestCurrentScoutingResponseT{
629 CollectedBy: []*request_current_scouting_response.CollectedByT{},
630 }
631
632 if len(expected.CollectedBy) != len(response.CollectedBy) {
633 t.Fatal("Expected ", expected, ", but got ", *response)
634 }
635 for i, collectRecord := range expected.CollectedBy {
636 if !reflect.DeepEqual(*collectRecord, *response.CollectedBy[i]) {
637 t.Fatal("Expected for collected by ", i, ":", *collectRecord, ", but got:", *response.CollectedBy[i])
638 }
639 }
640
641 debug.Username = "george"
642 builder.Finish((&request_current_scouting.RequestCurrentScoutingT{
643 TeamNumber: "971",
644 }).Pack(builder))
645 response, err = debug.RequestCurrentScouting("http://localhost:8080", builder.FinishedBytes())
646 if err != nil {
647 t.Fatal("Failed to request current scouting: ", err)
648 }
649
650 expected = request_current_scouting_response.RequestCurrentScoutingResponseT{
651 CollectedBy: []*request_current_scouting_response.CollectedByT{
652 {"debug_cli"},
653 },
654 }
655
656 if len(expected.CollectedBy) != len(response.CollectedBy) {
657 t.Fatal("Expected ", expected, ", but got ", *response)
658 }
659
660 for i, collectRecord := range expected.CollectedBy {
661 if !reflect.DeepEqual(*collectRecord, *response.CollectedBy[i]) {
662 t.Fatal("Expected for collected by ", i, ":", *collectRecord, ", but got:", *response.CollectedBy[i])
663 }
664 }
665
666 // After skipping 10 seconds ahead, the previous request from "debug_cli" should no longer appear.
667 mockClock.now = mockClock.now.Add(time.Second * 10)
668
669 builder.Finish((&request_current_scouting.RequestCurrentScoutingT{
670 TeamNumber: "971",
671 }).Pack(builder))
672 response, err = debug.RequestCurrentScouting("http://localhost:8080", builder.FinishedBytes())
673 if err != nil {
674 t.Fatal("Failed to request current scouting: ", err)
675 }
676
677 expected = request_current_scouting_response.RequestCurrentScoutingResponseT{
678 CollectedBy: []*request_current_scouting_response.CollectedByT{},
679 }
680
681 // Reset username for other tests.
682 debug.Username = "debug_cli"
683}
684
Alex Perry81f96ba2022-03-13 18:26:19 -0700685func TestRequestNotes(t *testing.T) {
686 database := MockDatabase{
687 notes: []db.NotesData{{
Emily Markovae68b7632023-12-30 14:17:55 -0800688 TeamNumber: "971A",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800689 Notes: "Notes",
690 GoodDriving: true,
691 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700692 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800693 SketchyPlacing: false,
694 GoodDefense: true,
695 BadDefense: false,
696 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700697 NoShow: false,
698 MatchNumber: 4,
699 CompLevel: "qm",
700 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700701 }},
702 }
703 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700704 mockClock := MockClock{now: time.Now()}
705 HandleRequests(&database, scoutingServer, mockClock)
Alex Perry81f96ba2022-03-13 18:26:19 -0700706 scoutingServer.Start(8080)
707 defer scoutingServer.Stop()
708
709 builder := flatbuffers.NewBuilder(1024)
710 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
Emily Markovae68b7632023-12-30 14:17:55 -0800711 Team: "971A",
Alex Perry81f96ba2022-03-13 18:26:19 -0700712 }).Pack(builder))
713 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
714 if err != nil {
715 t.Fatal("Failed to submit notes: ", err)
716 }
717
718 if response.Notes[0].Data != "Notes" {
719 t.Fatal("requested notes did not match", response)
720 }
721}
722
Emily Markovafaecfe12023-07-01 12:40:03 -0700723func TestSubmitPitImage(t *testing.T) {
724 database := MockDatabase{}
725 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700726 mockClock := MockClock{now: time.Now()}
727 HandleRequests(&database, scoutingServer, mockClock)
Emily Markovafaecfe12023-07-01 12:40:03 -0700728 scoutingServer.Start(8080)
729 defer scoutingServer.Stop()
730
731 builder := flatbuffers.NewBuilder(1024)
732 builder.Finish((&submit_pit_image.SubmitPitImageT{
733 TeamNumber: "483A", ImagePath: "483Arobot.jpg",
734 ImageData: []byte{12, 43, 54, 34, 98},
735 }).Pack(builder))
736
737 _, err := debug.SubmitPitImage("http://localhost:8080", builder.FinishedBytes())
738 if err != nil {
739 t.Fatal("Failed to submit pit image: ", err)
740 }
741
742 expected := []db.PitImage{
743 {
744 TeamNumber: "483A", CheckSum: "177d9dc52bc25f391232e82521259c378964c068832a9178d73448ba4ac5e0b1",
745 ImagePath: "483Arobot.jpg", ImageData: []byte{12, 43, 54, 34, 98},
746 },
747 }
748
749 if !reflect.DeepEqual(database.images, expected) {
750 t.Fatal("Submitted image did not match", expected, database.images)
751 }
752}
753
754func TestRequestPitImages(t *testing.T) {
755 db := MockDatabase{
756 images: []db.PitImage{
757 {
758 TeamNumber: "932", ImagePath: "pitimage.jpg",
759 ImageData: []byte{3, 34, 44, 65}, CheckSum: "abcdf",
760 },
761 {
762 TeamNumber: "234", ImagePath: "234robot.png",
763 ImageData: []byte{64, 54, 21, 21, 76, 32}, CheckSum: "egrfd",
764 },
765 {
766 TeamNumber: "93A", ImagePath: "abcd.jpg",
767 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "rgegfd",
768 },
769 },
770 }
771
772 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700773 mockClock := MockClock{now: time.Now()}
774 HandleRequests(&db, scoutingServer, mockClock)
Emily Markovafaecfe12023-07-01 12:40:03 -0700775 scoutingServer.Start(8080)
776 defer scoutingServer.Stop()
777
778 builder := flatbuffers.NewBuilder(1024)
779 builder.Finish((&request_pit_images.RequestPitImagesT{"932"}).Pack(builder))
780
781 response, err := debug.RequestPitImages("http://localhost:8080", builder.FinishedBytes())
782 if err != nil {
783 t.Fatal("Failed to request pit images: ", err)
784 }
785
786 expected := request_pit_images_response.RequestPitImagesResponseT{
787 PitImageList: []*request_pit_images_response.PitImageT{
788 {
789 TeamNumber: "932", ImagePath: "pitimage.jpg", CheckSum: "abcdf",
790 },
791 },
792 }
793
794 if len(expected.PitImageList) != len(response.PitImageList) {
795 t.Fatal("Expected ", expected, ", but got ", *response)
796 }
797
798 for i, pit_image := range expected.PitImageList {
799 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
800 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
801 }
802 }
803}
804
Emily Markova8e39f452023-12-23 12:17:30 -0800805func TestRequestAllPitImages(t *testing.T) {
806 db := MockDatabase{
807 images: []db.PitImage{
808 {
809 TeamNumber: "32", ImagePath: "pitimage.jpg",
810 ImageData: []byte{3, 43, 44, 32}, CheckSum: "cdhrj",
811 },
812 {
813 TeamNumber: "231", ImagePath: "232robot.png",
814 ImageData: []byte{64, 54, 54, 21, 76, 32}, CheckSum: "rgre",
815 },
816 {
817 TeamNumber: "90", ImagePath: "abcd.jpg",
818 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "erfer",
819 },
820 },
821 }
822
823 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700824 mockClock := MockClock{now: time.Now()}
825 HandleRequests(&db, scoutingServer, mockClock)
Emily Markova8e39f452023-12-23 12:17:30 -0800826 scoutingServer.Start(8080)
827 defer scoutingServer.Stop()
828
829 builder := flatbuffers.NewBuilder(1024)
830 builder.Finish((&request_all_pit_images.RequestAllPitImagesT{}).Pack(builder))
831
832 response, err := debug.RequestAllPitImages("http://localhost:8080", builder.FinishedBytes())
833 if err != nil {
834 t.Fatal("Failed to request pit images: ", err)
835 }
836
837 expected := request_all_pit_images_response.RequestAllPitImagesResponseT{
838 PitImageList: []*request_all_pit_images_response.PitImageT{
839 {
840 TeamNumber: "32", ImagePath: "pitimage.jpg", CheckSum: "cdhrj",
841 },
842 {
843 TeamNumber: "231", ImagePath: "232robot.png", CheckSum: "rgre",
844 },
845 {
846 TeamNumber: "90", ImagePath: "abcd.jpg", CheckSum: "erfer",
847 },
848 },
849 }
850
851 if len(expected.PitImageList) != len(response.PitImageList) {
852 t.Fatal("Expected ", expected, ", but got ", *response)
853 }
854
855 for i, pit_image := range expected.PitImageList {
856 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
857 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
858 }
859 }
860}
861
Milo Lin1d59f0c2022-06-22 20:30:58 -0700862func TestRequestShiftSchedule(t *testing.T) {
863 db := MockDatabase{
864 shiftSchedule: []db.Shift{
865 {
866 MatchNumber: 1,
867 R1scouter: "Bob",
868 R2scouter: "James",
869 R3scouter: "Robert",
870 B1scouter: "Alice",
871 B2scouter: "Mary",
872 B3scouter: "Patricia",
873 },
874 {
875 MatchNumber: 2,
876 R1scouter: "Liam",
877 R2scouter: "Noah",
878 R3scouter: "Oliver",
879 B1scouter: "Emma",
880 B2scouter: "Charlotte",
881 B3scouter: "Amelia",
882 },
883 },
884 }
885 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700886 mockClock := MockClock{now: time.Now()}
887 HandleRequests(&db, scoutingServer, mockClock)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700888 scoutingServer.Start(8080)
889 defer scoutingServer.Stop()
890
891 builder := flatbuffers.NewBuilder(1024)
892 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
893
894 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
895 if err != nil {
896 t.Fatal("Failed to request shift schedule: ", err)
897 }
898
899 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
900 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
901 {
902 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700903 R1Scouter: "Bob",
904 R2Scouter: "James",
905 R3Scouter: "Robert",
906 B1Scouter: "Alice",
907 B2Scouter: "Mary",
908 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700909 },
910 {
911 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700912 R1Scouter: "Liam",
913 R2Scouter: "Noah",
914 R3Scouter: "Oliver",
915 B1Scouter: "Emma",
916 B2Scouter: "Charlotte",
917 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700918 },
919 },
920 }
921 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
922 t.Fatal("Expected ", expected, ", but got ", *response)
923 }
924 for i, match := range expected.ShiftSchedule {
925 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
926 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
927 }
928 }
929}
930
931func TestSubmitShiftSchedule(t *testing.T) {
932 database := MockDatabase{}
933 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700934 mockClock := MockClock{now: time.Now()}
935 HandleRequests(&database, scoutingServer, mockClock)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700936 scoutingServer.Start(8080)
937 defer scoutingServer.Stop()
938
939 builder := flatbuffers.NewBuilder(1024)
940 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
941 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
942 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700943 R1Scouter: "Bob",
944 R2Scouter: "James",
945 R3Scouter: "Robert",
946 B1Scouter: "Alice",
947 B2Scouter: "Mary",
948 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700949 },
950 }).Pack(builder))
951
952 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
953 if err != nil {
954 t.Fatal("Failed to submit shift schedule: ", err)
955 }
956
957 expected := []db.Shift{
958 {MatchNumber: 1,
959 R1scouter: "Bob",
960 R2scouter: "James",
961 R3scouter: "Robert",
962 B1scouter: "Alice",
963 B2scouter: "Mary",
964 B3scouter: "Patricia"},
965 }
966 if !reflect.DeepEqual(expected, database.shiftSchedule) {
967 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
968 }
969}
970
Filip Kujawa210a03b2022-11-24 14:41:11 -0800971func TestSubmitDriverRanking(t *testing.T) {
972 database := MockDatabase{}
973 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700974 mockClock := MockClock{now: time.Now()}
975 HandleRequests(&database, scoutingServer, mockClock)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800976 scoutingServer.Start(8080)
977 defer scoutingServer.Stop()
978
979 builder := flatbuffers.NewBuilder(1024)
980 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
981 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800982 Rank1: "1234",
983 Rank2: "1235",
984 Rank3: "1236",
Filip Kujawa210a03b2022-11-24 14:41:11 -0800985 }).Pack(builder))
986
987 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
988 if err != nil {
989 t.Fatal("Failed to submit driver ranking: ", err)
990 }
991
992 expected := []db.DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -0800993 {MatchNumber: 36, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -0800994 }
995
996 if !reflect.DeepEqual(database.driver_ranking, expected) {
997 t.Fatal("Submitted notes did not match", expected, database.notes)
998 }
999}
1000
Filip Kujawaf882e022022-12-14 13:14:08 -08001001// Validates that we can request the driver rankings.
1002func TestRequestDriverRankings(t *testing.T) {
1003 db := MockDatabase{
1004 driver_ranking: []db.DriverRankingData{
1005 {
1006 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001007 Rank1: "1234",
1008 Rank2: "1235",
1009 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001010 },
1011 {
1012 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001013 Rank1: "101",
1014 Rank2: "202",
1015 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001016 },
1017 },
1018 }
1019 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -07001020 mockClock := MockClock{now: time.Now()}
1021 HandleRequests(&db, scoutingServer, mockClock)
Filip Kujawaf882e022022-12-14 13:14:08 -08001022 scoutingServer.Start(8080)
1023 defer scoutingServer.Stop()
1024
1025 builder := flatbuffers.NewBuilder(1024)
1026 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
1027
1028 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
1029 if err != nil {
1030 t.Fatal("Failed to request all driver rankings: ", err)
1031 }
1032
1033 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
1034 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
1035 {
1036 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001037 Rank1: "1234",
1038 Rank2: "1235",
1039 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -08001040 },
1041 {
1042 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -08001043 Rank1: "101",
1044 Rank2: "202",
1045 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -08001046 },
1047 },
1048 }
1049 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
1050 t.Fatal("Expected ", expected, ", but got ", *response)
1051 }
1052 for i, match := range expected.DriverRankingList {
1053 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
1054 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
1055 }
1056 }
1057}
1058
1059// Validates that we can request all notes.
1060func TestRequestAllNotes(t *testing.T) {
1061 db := MockDatabase{
1062 notes: []db.NotesData{
1063 {
Emily Markovae68b7632023-12-30 14:17:55 -08001064 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001065 Notes: "Notes",
1066 GoodDriving: true,
1067 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001068 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001069 SketchyPlacing: false,
1070 GoodDefense: true,
1071 BadDefense: false,
1072 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001073 NoShow: false,
1074 MatchNumber: 4,
1075 CompLevel: "qm",
1076 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -08001077 },
1078 {
Emily Markovae68b7632023-12-30 14:17:55 -08001079 TeamNumber: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001080 Notes: "More Notes",
1081 GoodDriving: false,
1082 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001083 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001084 SketchyPlacing: true,
1085 GoodDefense: false,
1086 BadDefense: true,
1087 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001088 NoShow: false,
1089 MatchNumber: 1,
1090 CompLevel: "qm",
1091 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -08001092 },
1093 },
1094 }
1095 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -07001096 mockClock := MockClock{now: time.Now()}
1097 HandleRequests(&db, scoutingServer, mockClock)
Filip Kujawaf882e022022-12-14 13:14:08 -08001098 scoutingServer.Start(8080)
1099 defer scoutingServer.Stop()
1100
1101 builder := flatbuffers.NewBuilder(1024)
1102 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
1103
1104 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
1105 if err != nil {
1106 t.Fatal("Failed to request all notes: ", err)
1107 }
1108
1109 expected := request_all_notes_response.RequestAllNotesResponseT{
1110 NoteList: []*request_all_notes_response.NoteT{
1111 {
Emily Markovae68b7632023-12-30 14:17:55 -08001112 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001113 Notes: "Notes",
1114 GoodDriving: true,
1115 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001116 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001117 SketchyPlacing: false,
1118 GoodDefense: true,
1119 BadDefense: false,
1120 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001121 NoShow: false,
1122 MatchNumber: 4,
1123 CompLevel: "qm",
1124 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -08001125 },
1126 {
Emily Markovae68b7632023-12-30 14:17:55 -08001127 Team: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001128 Notes: "More Notes",
1129 GoodDriving: false,
1130 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001131 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001132 SketchyPlacing: true,
1133 GoodDefense: false,
1134 BadDefense: true,
1135 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001136 NoShow: false,
1137 MatchNumber: 1,
1138 CompLevel: "qm",
1139 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -08001140 },
1141 },
1142 }
1143 if len(expected.NoteList) != len(response.NoteList) {
1144 t.Fatal("Expected ", expected, ", but got ", *response)
1145 }
1146 for i, note := range expected.NoteList {
1147 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
1148 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
1149 }
1150 }
1151}
1152
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001153func packAction(action *submit_actions.ActionT) []byte {
1154 builder := flatbuffers.NewBuilder(50 * 1024)
1155 builder.Finish((action).Pack(builder))
1156 return (builder.FinishedBytes())
1157}
1158
Emily Markova8cb91312024-02-02 12:30:37 -08001159func TestAddingActions2024(t *testing.T) {
1160 database := MockDatabase{}
1161 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -07001162 mockClock := MockClock{now: time.Now()}
1163 HandleRequests(&database, scoutingServer, mockClock)
Emily Markova8cb91312024-02-02 12:30:37 -08001164 scoutingServer.Start(8080)
1165 defer scoutingServer.Stop()
1166
1167 builder := flatbuffers.NewBuilder(1024)
1168 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
1169 TeamNumber: "3421",
1170 MatchNumber: 2,
1171 SetNumber: 1,
1172 CompLevel: "quals",
1173 ActionsList: []*submit_2024_actions.ActionT{
1174 {
1175 ActionTaken: &submit_2024_actions.ActionTypeT{
1176 Type: submit_2024_actions.ActionTypePickupNoteAction,
1177 Value: &submit_2024_actions.PickupNoteActionT{
1178 Auto: true,
1179 },
1180 },
1181 Timestamp: 1800,
1182 },
1183 {
1184 ActionTaken: &submit_2024_actions.ActionTypeT{
1185 Type: submit_2024_actions.ActionTypePlaceNoteAction,
1186 Value: &submit_2024_actions.PlaceNoteActionT{
1187 ScoreType: submit_2024_actions.ScoreTypekSPEAKER,
1188 Auto: false,
1189 },
1190 },
1191 Timestamp: 2500,
1192 },
1193 },
Emily Markova9c18e9c2024-04-03 20:06:27 -07001194 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001195 }).Pack(builder))
1196
1197 _, err := debug.Submit2024Actions("http://localhost:8080", builder.FinishedBytes())
1198 if err != nil {
1199 t.Fatal("Failed to submit actions: ", err)
1200 }
1201
1202 expectedActions := []db.Action{
1203 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001204 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001205 TeamNumber: "3421",
1206 MatchNumber: 2,
1207 SetNumber: 1,
1208 CompLevel: "quals",
1209 CollectedBy: "debug_cli",
1210 CompletedAction: []byte{},
1211 Timestamp: 1800,
1212 },
1213 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001214 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001215 TeamNumber: "3421",
1216 MatchNumber: 2,
1217 SetNumber: 1,
1218 CompLevel: "quals",
1219 CollectedBy: "debug_cli",
1220 CompletedAction: []byte{},
1221 Timestamp: 2500,
1222 },
1223 }
1224
1225 expectedStats := []db.Stats2024{
1226 db.Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -07001227 CompType: "Prescouting", TeamNumber: "3421",
Emily Markova8cb91312024-02-02 12:30:37 -08001228 MatchNumber: 2, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 0,
1229 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001230 Speaker: 1, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001231 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -07001232 Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "debug_cli",
Emily Markova8cb91312024-02-02 12:30:37 -08001233 },
1234 }
1235
1236 if !reflect.DeepEqual(expectedActions, database.actions) {
1237 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1238 }
1239 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1240 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1241 }
1242}
1243
Emily Markova8cb91312024-02-02 12:30:37 -08001244// Validates that we can delete 2024 stats.
1245func TestDeleteFromStats2024(t *testing.T) {
Emily Markova521725a2024-03-21 18:46:04 -07001246 mockClock := MockClock{now: time.Now()}
Emily Markova8cb91312024-02-02 12:30:37 -08001247 database := MockDatabase{
1248 stats2024: []db.Stats2024{
1249 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001250 CompType: "Practice", TeamNumber: "746",
Emily Markova8cb91312024-02-02 12:30:37 -08001251 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1252 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001253 Speaker: 0, Amp: 1, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -08001254 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markovaf17f2812024-04-03 20:55:12 -07001255 Park: false, OnStage: false, Harmony: true, RobotDied: false, NoShow: false, CollectedBy: "alek",
Emily Markova8cb91312024-02-02 12:30:37 -08001256 },
1257 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001258 CompType: "Regular", TeamNumber: "244",
Emily Markova8cb91312024-02-02 12:30:37 -08001259 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1260 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001261 Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001262 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markovaf17f2812024-04-03 20:55:12 -07001263 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001264 },
1265 },
1266 actions: []db.Action{
1267 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001268 CompType: "Practice",
Emily Markova8cb91312024-02-02 12:30:37 -08001269 TeamNumber: "746",
1270 MatchNumber: 3,
1271 SetNumber: 1,
1272 CompLevel: "quals",
1273 CollectedBy: "debug_cli",
1274 CompletedAction: []byte{},
1275 Timestamp: 2400,
1276 },
1277 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001278 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001279 TeamNumber: "244",
1280 MatchNumber: 5,
1281 SetNumber: 3,
1282 CompLevel: "quals",
1283 CollectedBy: "debug_cli",
1284 CompletedAction: []byte{},
1285 Timestamp: 1009,
1286 },
1287 },
1288 }
1289 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -07001290 HandleRequests(&database, scoutingServer, mockClock)
Emily Markova8cb91312024-02-02 12:30:37 -08001291 scoutingServer.Start(8080)
1292 defer scoutingServer.Stop()
1293
1294 builder := flatbuffers.NewBuilder(1024)
1295 builder.Finish((&delete_2024_data_scouting.Delete2024DataScoutingT{
1296 CompLevel: "quals",
1297 MatchNumber: 3,
1298 SetNumber: 1,
1299 TeamNumber: "746",
1300 }).Pack(builder))
1301
1302 _, err := debug.Delete2024DataScouting("http://localhost:8080", builder.FinishedBytes())
1303 if err != nil {
1304 t.Fatal("Failed to delete from data scouting 2024", err)
1305 }
1306
1307 expectedActions := []db.Action{
1308 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001309 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001310 TeamNumber: "244",
1311 MatchNumber: 5,
1312 SetNumber: 3,
1313 CompLevel: "quals",
1314 CollectedBy: "debug_cli",
1315 CompletedAction: []byte{},
1316 Timestamp: 1009,
1317 },
1318 }
1319
1320 expectedStats := []db.Stats2024{
1321 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001322 CompType: "Regular", TeamNumber: "244",
Emily Markova8cb91312024-02-02 12:30:37 -08001323 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1324 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001325 Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001326 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markovaf17f2812024-04-03 20:55:12 -07001327 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001328 },
1329 }
1330
1331 if !reflect.DeepEqual(expectedActions, database.actions) {
1332 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1333 }
1334 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1335 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1336 }
1337}
1338
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001339// A mocked database we can use for testing. Add functionality to this as
1340// needed for your tests.
1341
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001342type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001343 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -08001344 notes []db.NotesData
1345 shiftSchedule []db.Shift
1346 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -08001347 stats2023 []db.Stats2023
Emily Markova8cb91312024-02-02 12:30:37 -08001348 stats2024 []db.Stats2024
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001349 actions []db.Action
Emily Markovafaecfe12023-07-01 12:40:03 -07001350 images []db.PitImage
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001351}
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001352
Emily Markovabf24c9e2023-02-08 20:31:11 -08001353func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -08001354 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001355 return nil
1356}
1357
Emily Markova290147d2023-03-03 22:40:06 -08001358func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
1359 database.stats2023 = append(database.stats2023, stats2023)
1360 return nil
1361}
Emily Markova8cb91312024-02-02 12:30:37 -08001362
1363func (database *MockDatabase) AddToStats2024(stats2024 db.Stats2024) error {
1364 database.stats2024 = append(database.stats2024, stats2024)
1365 return nil
1366}
Emily Markovabf24c9e2023-02-08 20:31:11 -08001367func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001368 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001369}
1370
Emily Markova290147d2023-03-03 22:40:06 -08001371func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
1372 return database.stats2023, nil
1373}
1374
Emily Markova8cb91312024-02-02 12:30:37 -08001375func (database *MockDatabase) ReturnStats2024() ([]db.Stats2024, error) {
1376 return database.stats2024, nil
1377}
1378
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001379func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error) {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001380 var results []db.Stats2023
1381 for _, stats := range database.stats2023 {
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001382 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001383 results = append(results, stats)
1384 }
1385 }
1386 return results, nil
1387}
1388
Emily Markova9c18e9c2024-04-03 20:06:27 -07001389func (database *MockDatabase) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, compType string) ([]db.Stats2024, error) {
Emily Markova8cb91312024-02-02 12:30:37 -08001390 var results []db.Stats2024
1391 for _, stats := range database.stats2024 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001392 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.CompType == compType {
Emily Markova8cb91312024-02-02 12:30:37 -08001393 results = append(results, stats)
1394 }
1395 }
1396 return results, nil
1397}
1398
Emily Markovae68b7632023-12-30 14:17:55 -08001399func (database *MockDatabase) QueryNotes(requestedTeam string) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -07001400 var results []string
1401 for _, data := range database.notes {
1402 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -07001403 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -07001404 }
1405 }
Philipp Schradereecb8962022-06-01 21:02:42 -07001406 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -07001407}
1408
Filip Kujawaf947cb42022-11-21 10:00:30 -08001409func (database *MockDatabase) AddNotes(data db.NotesData) error {
1410 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -07001411 return nil
1412}
1413
Filip Kujawaf882e022022-12-14 13:14:08 -08001414func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
1415 return database.notes, nil
1416}
1417
Milo Lin1d59f0c2022-06-22 20:30:58 -07001418func (database *MockDatabase) AddToShift(data db.Shift) error {
1419 database.shiftSchedule = append(database.shiftSchedule, data)
1420 return nil
1421}
1422
1423func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
1424 return database.shiftSchedule, nil
1425}
1426
1427func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
1428 return []db.Shift{}, nil
1429}
1430
Emily Markovafaecfe12023-07-01 12:40:03 -07001431func (database *MockDatabase) QueryPitImages(requestedTeam string) ([]db.RequestedPitImage, error) {
1432 var results []db.RequestedPitImage
1433 for _, data := range database.images {
1434 if data.TeamNumber == requestedTeam {
1435 results = append(results, db.RequestedPitImage{
1436 TeamNumber: data.TeamNumber,
1437 ImagePath: data.ImagePath,
1438 CheckSum: data.CheckSum,
1439 })
1440 }
1441 }
1442 return results, nil
1443}
1444
Filip Kujawa210a03b2022-11-24 14:41:11 -08001445func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
1446 database.driver_ranking = append(database.driver_ranking, data)
1447 return nil
1448}
1449
Filip Kujawaf882e022022-12-14 13:14:08 -08001450func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
1451 return database.driver_ranking, nil
1452}
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001453
1454func (database *MockDatabase) AddAction(action db.Action) error {
1455 database.actions = append(database.actions, action)
1456 return nil
1457}
1458
Emily Markovafaecfe12023-07-01 12:40:03 -07001459func (database *MockDatabase) AddPitImage(pitImage db.PitImage) error {
1460 database.images = append(database.images, pitImage)
1461 return nil
1462}
1463
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001464func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
1465 return database.actions, nil
1466}
Filip Kujawac1ded372023-05-27 14:33:43 -07001467
Emily Markova8e39f452023-12-23 12:17:30 -08001468func (database *MockDatabase) ReturnPitImages() ([]db.PitImage, error) {
1469 return database.images, nil
1470}
1471
Filip Kujawac1ded372023-05-27 14:33:43 -07001472func (database *MockDatabase) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1473 for i, stat := range database.stats2023 {
1474 if stat.CompLevel == compLevel_ &&
1475 stat.MatchNumber == matchNumber_ &&
1476 stat.SetNumber == setNumber_ &&
1477 stat.TeamNumber == teamNumber_ {
1478 // Match found, remove the element from the array.
1479 database.stats2023 = append(database.stats2023[:i], database.stats2023[i+1:]...)
1480 }
1481 }
1482 return nil
1483}
1484
Emily Markova8cb91312024-02-02 12:30:37 -08001485func (database *MockDatabase) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1486 for i, stat := range database.stats2024 {
1487 if stat.CompLevel == compLevel_ &&
1488 stat.MatchNumber == matchNumber_ &&
1489 stat.SetNumber == setNumber_ &&
1490 stat.TeamNumber == teamNumber_ {
1491 // Match found, remove the element from the array.
1492 database.stats2024 = append(database.stats2024[:i], database.stats2024[i+1:]...)
1493 }
1494 }
1495 return nil
1496}
1497
Filip Kujawac1ded372023-05-27 14:33:43 -07001498func (database *MockDatabase) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1499 for i, action := range database.actions {
1500 if action.CompLevel == compLevel_ &&
1501 action.MatchNumber == matchNumber_ &&
1502 action.SetNumber == setNumber_ &&
1503 action.TeamNumber == teamNumber_ {
1504 // Match found, remove the element from the array.
1505 database.actions = append(database.actions[:i], database.actions[i+1:]...)
1506 }
1507 }
1508 return nil
1509}