blob: e50583b2da53976e344e22a7917dcfde55180ccc [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 Markova290147d2023-03-03 22:40:06 -080011 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting"
12 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080013 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
14 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080015 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
16 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080017 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
18 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070019 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Emily Markovafaecfe12023-07-01 12:40:03 -070020 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images"
21 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images_response"
Milo Lin1d59f0c2022-06-22 20:30:58 -070022 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
23 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Emily Markova1abe9782023-03-11 19:45:38 -080024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions"
Filip Kujawa210a03b2022-11-24 14:41:11 -080025 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
Alex Perry81f96ba2022-03-13 18:26:19 -070026 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Emily Markovafaecfe12023-07-01 12:40:03 -070027 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_pit_image"
Milo Lin1d59f0c2022-06-22 20:30:58 -070028 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080029 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
30 flatbuffers "github.com/google/flatbuffers/go"
31)
32
33// Validates that an unhandled address results in a 404.
34func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080035 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080036 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080037 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080038 scoutingServer.Start(8080)
39 defer scoutingServer.Stop()
40
41 resp, err := http.Get("http://localhost:8080/requests/foo")
42 if err != nil {
43 t.Fatalf("Failed to get data: %v", err)
44 }
45 if resp.StatusCode != http.StatusNotFound {
46 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
47 }
48}
49
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080050// Validates that we can request the full match list.
51func TestRequestAllMatches(t *testing.T) {
52 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -080053 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080054 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080055 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070056 Alliance: "R", AlliancePosition: 1, TeamNumber: "5",
Emily Markovabf24c9e2023-02-08 20:31:11 -080057 },
58 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080059 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070060 Alliance: "R", AlliancePosition: 2, TeamNumber: "42",
Emily Markovabf24c9e2023-02-08 20:31:11 -080061 },
62 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080063 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070064 Alliance: "R", AlliancePosition: 3, TeamNumber: "600",
Emily Markovabf24c9e2023-02-08 20:31:11 -080065 },
66 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080067 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070068 Alliance: "B", AlliancePosition: 1, TeamNumber: "971",
Emily Markovabf24c9e2023-02-08 20:31:11 -080069 },
70 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080071 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070072 Alliance: "B", AlliancePosition: 2, TeamNumber: "400",
Emily Markovabf24c9e2023-02-08 20:31:11 -080073 },
74 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080075 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070076 Alliance: "B", AlliancePosition: 3, TeamNumber: "200",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080077 },
78 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080079 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070080 Alliance: "R", AlliancePosition: 1, TeamNumber: "6",
Emily Markovabf24c9e2023-02-08 20:31:11 -080081 },
82 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080083 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070084 Alliance: "R", AlliancePosition: 2, TeamNumber: "43",
Emily Markovabf24c9e2023-02-08 20:31:11 -080085 },
86 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080087 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070088 Alliance: "R", AlliancePosition: 3, TeamNumber: "601",
Emily Markovabf24c9e2023-02-08 20:31:11 -080089 },
90 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080091 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070092 Alliance: "B", AlliancePosition: 1, TeamNumber: "972",
Emily Markovabf24c9e2023-02-08 20:31:11 -080093 },
94 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080095 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070096 Alliance: "B", AlliancePosition: 2, TeamNumber: "401",
Emily Markovabf24c9e2023-02-08 20:31:11 -080097 },
98 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080099 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700100 Alliance: "B", AlliancePosition: 3, TeamNumber: "201",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800101 },
102 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800103 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700104 Alliance: "R", AlliancePosition: 1, TeamNumber: "7",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800105 },
106 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800107 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700108 Alliance: "R", AlliancePosition: 2, TeamNumber: "44",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800109 },
110 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800111 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700112 Alliance: "R", AlliancePosition: 3, TeamNumber: "602",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800113 },
114 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800115 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700116 Alliance: "B", AlliancePosition: 1, TeamNumber: "973",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800117 },
118 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800119 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700120 Alliance: "B", AlliancePosition: 2, TeamNumber: "402",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800121 },
122 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800123 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700124 Alliance: "B", AlliancePosition: 3, TeamNumber: "202",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800125 },
126 },
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800127 // Pretend that we have some data scouting data.
128 stats2023: []db.Stats2023{
129 {
130 TeamNumber: "5", MatchNumber: 1, SetNumber: 1,
131 CompLevel: "qm", StartingQuadrant: 3, LowCubesAuto: 10,
132 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
133 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
134 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
135 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700136 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700137 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700138 BalanceAttemptAuto: false, Docked: false, Engaged: false,
139 BalanceAttempt: false, CollectedBy: "alex",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800140 },
141 {
142 TeamNumber: "973", MatchNumber: 3, SetNumber: 1,
143 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
144 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
145 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
146 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
147 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700148 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700149 AvgCycle: 53, Mobility: true, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700150 BalanceAttemptAuto: false, Docked: false, Engaged: false,
151 BalanceAttempt: true, CollectedBy: "bob",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800152 },
153 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800154 }
155 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800156 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800157 scoutingServer.Start(8080)
158 defer scoutingServer.Stop()
159
160 builder := flatbuffers.NewBuilder(1024)
161 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
162
163 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
164 if err != nil {
165 t.Fatal("Failed to request all matches: ", err)
166 }
167
168 expected := request_all_matches_response.RequestAllMatchesResponseT{
169 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700170 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800171 // R1, R2, R3, B1, B2, B3
172 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800173 1, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700174 "5", "42", "600", "971", "400", "200",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800175 &request_all_matches_response.ScoutedLevelT{
176 // The R1 team has already been data
177 // scouted.
178 true, false, false, false, false, false,
179 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800180 },
181 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800182 2, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700183 "6", "43", "601", "972", "401", "201",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800184 &request_all_matches_response.ScoutedLevelT{
185 false, false, false, false, false, false,
186 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800187 },
188 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800189 3, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700190 "7", "44", "602", "973", "402", "202",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800191 &request_all_matches_response.ScoutedLevelT{
192 // The B1 team has already been data
193 // scouted.
194 false, false, false, true, false, false,
195 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800196 },
197 },
198 }
199 if len(expected.MatchList) != len(response.MatchList) {
200 t.Fatal("Expected ", expected, ", but got ", *response)
201 }
202 for i, match := range expected.MatchList {
203 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
204 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
205 }
206 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800207
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800208}
209
Emily Markova290147d2023-03-03 22:40:06 -0800210// Validates that we can request the 2023 stats.
211func TestRequest2023DataScouting(t *testing.T) {
212 db := MockDatabase{
213 stats2023: []db.Stats2023{
214 {
215 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
216 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
217 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
218 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
219 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
220 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700221 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700222 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700223 BalanceAttemptAuto: false, Docked: false, Engaged: false,
224 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800225 },
226 {
227 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
228 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
229 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
230 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
231 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
232 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700233 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700234 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700235 BalanceAttemptAuto: true, Docked: false, Engaged: false,
236 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800237 },
238 },
239 }
240 scoutingServer := server.NewScoutingServer()
241 HandleRequests(&db, scoutingServer)
242 scoutingServer.Start(8080)
243 defer scoutingServer.Stop()
244
245 builder := flatbuffers.NewBuilder(1024)
246 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
247
248 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
249 if err != nil {
250 t.Fatal("Failed to request all matches: ", err)
251 }
252
253 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
254 StatsList: []*request_2023_data_scouting_response.Stats2023T{
255 {
256 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
257 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
258 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
259 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
260 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
261 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700262 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700263 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700264 BalanceAttemptAuto: false, Docked: false, Engaged: false,
265 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800266 },
267 {
268 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
269 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
270 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
271 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
272 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
273 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700274 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700275 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700276 BalanceAttemptAuto: true, Docked: false, Engaged: false,
277 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800278 },
279 },
280 }
281 if len(expected.StatsList) != len(response.StatsList) {
282 t.Fatal("Expected ", expected, ", but got ", *response)
283 }
284 for i, match := range expected.StatsList {
285 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
286 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
287 }
288 }
289}
290
Emily Markova1abe9782023-03-11 19:45:38 -0800291// Validates that we can request the 2023 stats.
292func TestConvertActionsToStat(t *testing.T) {
293 builder := flatbuffers.NewBuilder(1024)
294 builder.Finish((&submit_actions.SubmitActionsT{
295 TeamNumber: "4244",
296 MatchNumber: 3,
297 SetNumber: 1,
298 CompLevel: "quals",
Emily Markova1abe9782023-03-11 19:45:38 -0800299 ActionsList: []*submit_actions.ActionT{
300 {
301 ActionTaken: &submit_actions.ActionTypeT{
302 Type: submit_actions.ActionTypeStartMatchAction,
303 Value: &submit_actions.StartMatchActionT{
304 Position: 1,
305 },
306 },
307 Timestamp: 0,
308 },
309 {
310 ActionTaken: &submit_actions.ActionTypeT{
311 Type: submit_actions.ActionTypePickupObjectAction,
312 Value: &submit_actions.PickupObjectActionT{
313 ObjectType: submit_actions.ObjectTypekCube,
314 Auto: true,
315 },
316 },
317 Timestamp: 400,
318 },
319 {
320 ActionTaken: &submit_actions.ActionTypeT{
321 Type: submit_actions.ActionTypePickupObjectAction,
322 Value: &submit_actions.PickupObjectActionT{
323 ObjectType: submit_actions.ObjectTypekCube,
324 Auto: true,
325 },
326 },
327 Timestamp: 800,
328 },
329 {
330 ActionTaken: &submit_actions.ActionTypeT{
331 Type: submit_actions.ActionTypePlaceObjectAction,
332 Value: &submit_actions.PlaceObjectActionT{
333 ObjectType: submit_actions.ObjectTypekCube,
334 ScoreLevel: submit_actions.ScoreLevelkLow,
335 Auto: true,
336 },
337 },
338 Timestamp: 2000,
339 },
340 {
341 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700342 Type: submit_actions.ActionTypeMobilityAction,
343 Value: &submit_actions.MobilityActionT{
344 Mobility: true,
345 },
346 },
347 Timestamp: 2200,
348 },
349 {
350 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700351 Type: submit_actions.ActionTypeAutoBalanceAction,
352 Value: &submit_actions.AutoBalanceActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700353 Docked: true,
354 Engaged: true,
355 BalanceAttempt: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700356 },
357 },
358 Timestamp: 2400,
359 },
360 {
361 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova1abe9782023-03-11 19:45:38 -0800362 Type: submit_actions.ActionTypePickupObjectAction,
363 Value: &submit_actions.PickupObjectActionT{
364 ObjectType: submit_actions.ObjectTypekCone,
365 Auto: false,
366 },
367 },
368 Timestamp: 2800,
369 },
370 {
371 ActionTaken: &submit_actions.ActionTypeT{
372 Type: submit_actions.ActionTypePlaceObjectAction,
373 Value: &submit_actions.PlaceObjectActionT{
374 ObjectType: submit_actions.ObjectTypekCone,
375 ScoreLevel: submit_actions.ScoreLevelkHigh,
376 Auto: false,
377 },
378 },
379 Timestamp: 3100,
380 },
Emily Markova46a69bf2023-03-22 20:45:52 -0700381 {
382 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa7a045e72023-04-13 08:41:09 -0700383 Type: submit_actions.ActionTypePickupObjectAction,
384 Value: &submit_actions.PickupObjectActionT{
385 ObjectType: submit_actions.ObjectTypekCube,
386 Auto: false,
387 },
388 },
389 Timestamp: 3500,
390 },
391 {
392 ActionTaken: &submit_actions.ActionTypeT{
393 Type: submit_actions.ActionTypePlaceObjectAction,
394 Value: &submit_actions.PlaceObjectActionT{
395 ObjectType: submit_actions.ObjectTypekCube,
396 ScoreLevel: submit_actions.ScoreLevelkSupercharged,
397 Auto: false,
398 },
399 },
400 Timestamp: 3900,
401 },
402 {
403 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700404 Type: submit_actions.ActionTypeEndMatchAction,
405 Value: &submit_actions.EndMatchActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700406 Docked: true,
407 Engaged: false,
408 BalanceAttempt: true,
Emily Markova46a69bf2023-03-22 20:45:52 -0700409 },
410 },
Filip Kujawa7a045e72023-04-13 08:41:09 -0700411 Timestamp: 4200,
Emily Markova46a69bf2023-03-22 20:45:52 -0700412 },
Emily Markova1abe9782023-03-11 19:45:38 -0800413 },
Philipp Schrader4b489222023-04-15 16:40:16 -0700414 PreScouting: false,
Emily Markova1abe9782023-03-11 19:45:38 -0800415 }).Pack(builder))
416
417 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
418 response, err := ConvertActionsToStat(submitActions)
419
420 if err != nil {
421 t.Fatal("Failed to convert actions to stats: ", err)
422 }
423
424 expected := db.Stats2023{
Philipp Schrader4b489222023-04-15 16:40:16 -0700425 PreScouting: false,
426 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
Emily Markova1abe9782023-03-11 19:45:38 -0800427 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
428 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
429 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
430 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
431 HighCubes: 0, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700432 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700433 AvgCycle: 950, Mobility: true, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700434 BalanceAttemptAuto: false, Docked: true, Engaged: false,
Philipp Schradere11114f2023-04-15 17:04:25 -0700435 BalanceAttempt: true, CollectedBy: "",
Emily Markova1abe9782023-03-11 19:45:38 -0800436 }
437
438 if expected != response {
439 t.Fatal("Expected ", expected, ", but got ", response)
440 }
441}
442
Alex Perry81f96ba2022-03-13 18:26:19 -0700443func TestSubmitNotes(t *testing.T) {
444 database := MockDatabase{}
445 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800446 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700447 scoutingServer.Start(8080)
448 defer scoutingServer.Stop()
449
450 builder := flatbuffers.NewBuilder(1024)
451 builder.Finish((&submit_notes.SubmitNotesT{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800452 Team: 971,
453 Notes: "Notes",
454 GoodDriving: true,
455 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700456 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800457 SketchyPlacing: false,
458 GoodDefense: true,
459 BadDefense: false,
460 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700461 }).Pack(builder))
462
463 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
464 if err != nil {
465 t.Fatal("Failed to submit notes: ", err)
466 }
467
468 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800469 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800470 TeamNumber: 971,
471 Notes: "Notes",
472 GoodDriving: true,
473 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700474 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800475 SketchyPlacing: false,
476 GoodDefense: true,
477 BadDefense: false,
478 EasilyDefended: true,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800479 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700480 }
481
482 if !reflect.DeepEqual(database.notes, expected) {
483 t.Fatal("Submitted notes did not match", expected, database.notes)
484 }
485}
486
487func TestRequestNotes(t *testing.T) {
488 database := MockDatabase{
489 notes: []db.NotesData{{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800490 TeamNumber: 971,
491 Notes: "Notes",
492 GoodDriving: true,
493 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700494 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800495 SketchyPlacing: false,
496 GoodDefense: true,
497 BadDefense: false,
498 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700499 }},
500 }
501 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800502 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700503 scoutingServer.Start(8080)
504 defer scoutingServer.Stop()
505
506 builder := flatbuffers.NewBuilder(1024)
507 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
508 Team: 971,
509 }).Pack(builder))
510 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
511 if err != nil {
512 t.Fatal("Failed to submit notes: ", err)
513 }
514
515 if response.Notes[0].Data != "Notes" {
516 t.Fatal("requested notes did not match", response)
517 }
518}
519
Emily Markovafaecfe12023-07-01 12:40:03 -0700520func TestSubmitPitImage(t *testing.T) {
521 database := MockDatabase{}
522 scoutingServer := server.NewScoutingServer()
523 HandleRequests(&database, scoutingServer)
524 scoutingServer.Start(8080)
525 defer scoutingServer.Stop()
526
527 builder := flatbuffers.NewBuilder(1024)
528 builder.Finish((&submit_pit_image.SubmitPitImageT{
529 TeamNumber: "483A", ImagePath: "483Arobot.jpg",
530 ImageData: []byte{12, 43, 54, 34, 98},
531 }).Pack(builder))
532
533 _, err := debug.SubmitPitImage("http://localhost:8080", builder.FinishedBytes())
534 if err != nil {
535 t.Fatal("Failed to submit pit image: ", err)
536 }
537
538 expected := []db.PitImage{
539 {
540 TeamNumber: "483A", CheckSum: "177d9dc52bc25f391232e82521259c378964c068832a9178d73448ba4ac5e0b1",
541 ImagePath: "483Arobot.jpg", ImageData: []byte{12, 43, 54, 34, 98},
542 },
543 }
544
545 if !reflect.DeepEqual(database.images, expected) {
546 t.Fatal("Submitted image did not match", expected, database.images)
547 }
548}
549
550func TestRequestPitImages(t *testing.T) {
551 db := MockDatabase{
552 images: []db.PitImage{
553 {
554 TeamNumber: "932", ImagePath: "pitimage.jpg",
555 ImageData: []byte{3, 34, 44, 65}, CheckSum: "abcdf",
556 },
557 {
558 TeamNumber: "234", ImagePath: "234robot.png",
559 ImageData: []byte{64, 54, 21, 21, 76, 32}, CheckSum: "egrfd",
560 },
561 {
562 TeamNumber: "93A", ImagePath: "abcd.jpg",
563 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "rgegfd",
564 },
565 },
566 }
567
568 scoutingServer := server.NewScoutingServer()
569 HandleRequests(&db, scoutingServer)
570 scoutingServer.Start(8080)
571 defer scoutingServer.Stop()
572
573 builder := flatbuffers.NewBuilder(1024)
574 builder.Finish((&request_pit_images.RequestPitImagesT{"932"}).Pack(builder))
575
576 response, err := debug.RequestPitImages("http://localhost:8080", builder.FinishedBytes())
577 if err != nil {
578 t.Fatal("Failed to request pit images: ", err)
579 }
580
581 expected := request_pit_images_response.RequestPitImagesResponseT{
582 PitImageList: []*request_pit_images_response.PitImageT{
583 {
584 TeamNumber: "932", ImagePath: "pitimage.jpg", CheckSum: "abcdf",
585 },
586 },
587 }
588
589 if len(expected.PitImageList) != len(response.PitImageList) {
590 t.Fatal("Expected ", expected, ", but got ", *response)
591 }
592
593 for i, pit_image := range expected.PitImageList {
594 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
595 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
596 }
597 }
598}
599
Milo Lin1d59f0c2022-06-22 20:30:58 -0700600func TestRequestShiftSchedule(t *testing.T) {
601 db := MockDatabase{
602 shiftSchedule: []db.Shift{
603 {
604 MatchNumber: 1,
605 R1scouter: "Bob",
606 R2scouter: "James",
607 R3scouter: "Robert",
608 B1scouter: "Alice",
609 B2scouter: "Mary",
610 B3scouter: "Patricia",
611 },
612 {
613 MatchNumber: 2,
614 R1scouter: "Liam",
615 R2scouter: "Noah",
616 R3scouter: "Oliver",
617 B1scouter: "Emma",
618 B2scouter: "Charlotte",
619 B3scouter: "Amelia",
620 },
621 },
622 }
623 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800624 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700625 scoutingServer.Start(8080)
626 defer scoutingServer.Stop()
627
628 builder := flatbuffers.NewBuilder(1024)
629 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
630
631 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
632 if err != nil {
633 t.Fatal("Failed to request shift schedule: ", err)
634 }
635
636 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
637 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
638 {
639 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700640 R1Scouter: "Bob",
641 R2Scouter: "James",
642 R3Scouter: "Robert",
643 B1Scouter: "Alice",
644 B2Scouter: "Mary",
645 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700646 },
647 {
648 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700649 R1Scouter: "Liam",
650 R2Scouter: "Noah",
651 R3Scouter: "Oliver",
652 B1Scouter: "Emma",
653 B2Scouter: "Charlotte",
654 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700655 },
656 },
657 }
658 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
659 t.Fatal("Expected ", expected, ", but got ", *response)
660 }
661 for i, match := range expected.ShiftSchedule {
662 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
663 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
664 }
665 }
666}
667
668func TestSubmitShiftSchedule(t *testing.T) {
669 database := MockDatabase{}
670 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800671 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700672 scoutingServer.Start(8080)
673 defer scoutingServer.Stop()
674
675 builder := flatbuffers.NewBuilder(1024)
676 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
677 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
678 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700679 R1Scouter: "Bob",
680 R2Scouter: "James",
681 R3Scouter: "Robert",
682 B1Scouter: "Alice",
683 B2Scouter: "Mary",
684 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700685 },
686 }).Pack(builder))
687
688 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
689 if err != nil {
690 t.Fatal("Failed to submit shift schedule: ", err)
691 }
692
693 expected := []db.Shift{
694 {MatchNumber: 1,
695 R1scouter: "Bob",
696 R2scouter: "James",
697 R3scouter: "Robert",
698 B1scouter: "Alice",
699 B2scouter: "Mary",
700 B3scouter: "Patricia"},
701 }
702 if !reflect.DeepEqual(expected, database.shiftSchedule) {
703 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
704 }
705}
706
Filip Kujawa210a03b2022-11-24 14:41:11 -0800707func TestSubmitDriverRanking(t *testing.T) {
708 database := MockDatabase{}
709 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800710 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800711 scoutingServer.Start(8080)
712 defer scoutingServer.Stop()
713
714 builder := flatbuffers.NewBuilder(1024)
715 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
716 MatchNumber: 36,
717 Rank1: 1234,
718 Rank2: 1235,
719 Rank3: 1236,
720 }).Pack(builder))
721
722 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
723 if err != nil {
724 t.Fatal("Failed to submit driver ranking: ", err)
725 }
726
727 expected := []db.DriverRankingData{
728 {MatchNumber: 36, Rank1: 1234, Rank2: 1235, Rank3: 1236},
729 }
730
731 if !reflect.DeepEqual(database.driver_ranking, expected) {
732 t.Fatal("Submitted notes did not match", expected, database.notes)
733 }
734}
735
Filip Kujawaf882e022022-12-14 13:14:08 -0800736// Validates that we can request the driver rankings.
737func TestRequestDriverRankings(t *testing.T) {
738 db := MockDatabase{
739 driver_ranking: []db.DriverRankingData{
740 {
741 MatchNumber: 36,
742 Rank1: 1234,
743 Rank2: 1235,
744 Rank3: 1236,
745 },
746 {
747 MatchNumber: 36,
748 Rank1: 101,
749 Rank2: 202,
750 Rank3: 303,
751 },
752 },
753 }
754 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800755 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800756 scoutingServer.Start(8080)
757 defer scoutingServer.Stop()
758
759 builder := flatbuffers.NewBuilder(1024)
760 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
761
762 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
763 if err != nil {
764 t.Fatal("Failed to request all driver rankings: ", err)
765 }
766
767 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
768 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
769 {
770 MatchNumber: 36,
771 Rank1: 1234,
772 Rank2: 1235,
773 Rank3: 1236,
774 },
775 {
776 MatchNumber: 36,
777 Rank1: 101,
778 Rank2: 202,
779 Rank3: 303,
780 },
781 },
782 }
783 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
784 t.Fatal("Expected ", expected, ", but got ", *response)
785 }
786 for i, match := range expected.DriverRankingList {
787 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
788 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
789 }
790 }
791}
792
793// Validates that we can request all notes.
794func TestRequestAllNotes(t *testing.T) {
795 db := MockDatabase{
796 notes: []db.NotesData{
797 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800798 TeamNumber: 971,
799 Notes: "Notes",
800 GoodDriving: true,
801 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700802 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800803 SketchyPlacing: false,
804 GoodDefense: true,
805 BadDefense: false,
806 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800807 },
808 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800809 TeamNumber: 972,
810 Notes: "More Notes",
811 GoodDriving: false,
812 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700813 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800814 SketchyPlacing: true,
815 GoodDefense: false,
816 BadDefense: true,
817 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800818 },
819 },
820 }
821 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800822 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800823 scoutingServer.Start(8080)
824 defer scoutingServer.Stop()
825
826 builder := flatbuffers.NewBuilder(1024)
827 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
828
829 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
830 if err != nil {
831 t.Fatal("Failed to request all notes: ", err)
832 }
833
834 expected := request_all_notes_response.RequestAllNotesResponseT{
835 NoteList: []*request_all_notes_response.NoteT{
836 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800837 Team: 971,
838 Notes: "Notes",
839 GoodDriving: true,
840 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700841 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800842 SketchyPlacing: false,
843 GoodDefense: true,
844 BadDefense: false,
845 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800846 },
847 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800848 Team: 972,
849 Notes: "More Notes",
850 GoodDriving: false,
851 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700852 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800853 SketchyPlacing: true,
854 GoodDefense: false,
855 BadDefense: true,
856 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800857 },
858 },
859 }
860 if len(expected.NoteList) != len(response.NoteList) {
861 t.Fatal("Expected ", expected, ", but got ", *response)
862 }
863 for i, note := range expected.NoteList {
864 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
865 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
866 }
867 }
868}
869
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800870func packAction(action *submit_actions.ActionT) []byte {
871 builder := flatbuffers.NewBuilder(50 * 1024)
872 builder.Finish((action).Pack(builder))
873 return (builder.FinishedBytes())
874}
875
876func TestAddingActions(t *testing.T) {
877 database := MockDatabase{}
878 scoutingServer := server.NewScoutingServer()
879 HandleRequests(&database, scoutingServer)
880 scoutingServer.Start(8080)
881 defer scoutingServer.Stop()
882
883 builder := flatbuffers.NewBuilder(1024)
884 builder.Finish((&submit_actions.SubmitActionsT{
885 TeamNumber: "1234",
886 MatchNumber: 4,
887 SetNumber: 1,
888 CompLevel: "qual",
889 ActionsList: []*submit_actions.ActionT{
890 {
891 ActionTaken: &submit_actions.ActionTypeT{
892 Type: submit_actions.ActionTypePickupObjectAction,
893 Value: &submit_actions.PickupObjectActionT{
894 ObjectType: submit_actions.ObjectTypekCube,
895 Auto: true,
896 },
897 },
898 Timestamp: 2400,
899 },
900 {
901 ActionTaken: &submit_actions.ActionTypeT{
902 Type: submit_actions.ActionTypePlaceObjectAction,
903 Value: &submit_actions.PlaceObjectActionT{
904 ObjectType: submit_actions.ObjectTypekCube,
905 ScoreLevel: submit_actions.ScoreLevelkLow,
906 Auto: false,
907 },
908 },
909 Timestamp: 1009,
910 },
911 },
Philipp Schrader4b489222023-04-15 16:40:16 -0700912 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800913 }).Pack(builder))
914
915 _, err := debug.SubmitActions("http://localhost:8080", builder.FinishedBytes())
916 if err != nil {
917 t.Fatal("Failed to submit actions: ", err)
918 }
919
920 // Make sure that the data made it into the database.
921 // TODO: Add this back when we figure out how to add the serialized action into the database.
922
923 /* expectedActionsT := []*submit_actions.ActionT{
924 {
925 ActionTaken: &submit_actions.ActionTypeT{
926 Type: submit_actions.ActionTypePickupObjectAction,
927 Value: &submit_actions.PickupObjectActionT{
928 ObjectType: submit_actions.ObjectTypekCube,
929 Auto: true,
930 },
931 },
932 Timestamp: 2400,
933 },
934 {
935 ActionTaken: &submit_actions.ActionTypeT{
936 Type: submit_actions.ActionTypePlaceObjectAction,
937 Value: &submit_actions.PlaceObjectActionT{
938 ObjectType: submit_actions.ObjectTypekCube,
939 ScoreLevel: submit_actions.ScoreLevelkLow,
940 Auto: false,
941 },
942 },
943 Timestamp: 1009,
944 },
945 } */
946
947 expectedActions := []db.Action{
948 {
Philipp Schrader4b489222023-04-15 16:40:16 -0700949 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800950 TeamNumber: "1234",
951 MatchNumber: 4,
952 SetNumber: 1,
953 CompLevel: "qual",
954 CollectedBy: "debug_cli",
955 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -0700956 Timestamp: 2400,
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800957 },
958 {
Philipp Schrader4b489222023-04-15 16:40:16 -0700959 PreScouting: true,
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800960 TeamNumber: "1234",
961 MatchNumber: 4,
962 SetNumber: 1,
963 CompLevel: "qual",
964 CollectedBy: "debug_cli",
965 CompletedAction: []byte{},
Philipp Schrader670a1c82023-05-17 19:42:43 -0700966 Timestamp: 1009,
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800967 },
968 }
969
Philipp Schradere11114f2023-04-15 17:04:25 -0700970 expectedStats := []db.Stats2023{
971 db.Stats2023{
972 PreScouting: true,
973 TeamNumber: "1234", MatchNumber: 4, SetNumber: 1,
974 CompLevel: "qual", StartingQuadrant: 0, LowCubesAuto: 0,
975 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
976 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
977 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 0,
978 HighCubes: 0, CubesDropped: 0, LowCones: 0,
979 MiddleCones: 0, HighCones: 0, ConesDropped: 0, SuperchargedPieces: 0,
980 AvgCycle: 0, Mobility: false, DockedAuto: false, EngagedAuto: false,
981 BalanceAttemptAuto: false, Docked: false, Engaged: false,
982 BalanceAttempt: false, CollectedBy: "debug_cli",
983 },
984 }
985
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800986 if !reflect.DeepEqual(expectedActions, database.actions) {
987 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
988 }
Philipp Schradere11114f2023-04-15 17:04:25 -0700989 if !reflect.DeepEqual(expectedStats, database.stats2023) {
990 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
991 }
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800992}
993
Filip Kujawac1ded372023-05-27 14:33:43 -0700994// Validates that we can delete stats.
995func TestDeleteFromStats(t *testing.T) {
996 database := MockDatabase{
997 stats2023: []db.Stats2023{
998 {
999 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1000 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1001 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1002 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1003 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1004 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1005 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1006 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1007 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1008 BalanceAttempt: true, CollectedBy: "isaac",
1009 },
1010 {
1011 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
1012 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
1013 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
1014 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
1015 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
1016 HighCubes: 1, CubesDropped: 0, LowCones: 0,
1017 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
1018 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
1019 BalanceAttemptAuto: true, Docked: false, Engaged: false,
1020 BalanceAttempt: true, CollectedBy: "unknown",
1021 },
1022 },
1023 actions: []db.Action{
1024 {
1025 PreScouting: true,
1026 TeamNumber: "3634",
1027 MatchNumber: 1,
1028 SetNumber: 2,
1029 CompLevel: "quals",
1030 CollectedBy: "debug_cli",
1031 CompletedAction: []byte{},
1032 Timestamp: 2400,
1033 },
1034 {
1035 PreScouting: true,
1036 TeamNumber: "2343",
1037 MatchNumber: 1,
1038 SetNumber: 2,
1039 CompLevel: "quals",
1040 CollectedBy: "debug_cli",
1041 CompletedAction: []byte{},
1042 Timestamp: 1009,
1043 },
1044 },
1045 }
1046 scoutingServer := server.NewScoutingServer()
1047 HandleRequests(&database, scoutingServer)
1048 scoutingServer.Start(8080)
1049 defer scoutingServer.Stop()
1050
1051 builder := flatbuffers.NewBuilder(1024)
1052 builder.Finish((&delete_2023_data_scouting.Delete2023DataScoutingT{
1053 CompLevel: "quals",
1054 MatchNumber: 1,
1055 SetNumber: 2,
1056 TeamNumber: "2343",
1057 }).Pack(builder))
1058
1059 _, err := debug.Delete2023DataScouting("http://localhost:8080", builder.FinishedBytes())
1060 if err != nil {
1061 t.Fatal("Failed to delete from data scouting ", err)
1062 }
1063
1064 expectedActions := []db.Action{
1065 {
1066 PreScouting: true,
1067 TeamNumber: "3634",
1068 MatchNumber: 1,
1069 SetNumber: 2,
1070 CompLevel: "quals",
1071 CollectedBy: "debug_cli",
1072 CompletedAction: []byte{},
1073 Timestamp: 2400,
1074 },
1075 }
1076
1077 expectedStats := []db.Stats2023{
1078 {
1079 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
1080 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
1081 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
1082 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
1083 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
1084 HighCubes: 2, CubesDropped: 1, LowCones: 1,
1085 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
1086 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
1087 BalanceAttemptAuto: false, Docked: false, Engaged: false,
1088 BalanceAttempt: true, CollectedBy: "isaac",
1089 },
1090 }
1091
1092 if !reflect.DeepEqual(expectedActions, database.actions) {
1093 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1094 }
1095 if !reflect.DeepEqual(expectedStats, database.stats2023) {
1096 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2023)
1097 }
1098}
1099
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001100// A mocked database we can use for testing. Add functionality to this as
1101// needed for your tests.
1102
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001103type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001104 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -08001105 notes []db.NotesData
1106 shiftSchedule []db.Shift
1107 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -08001108 stats2023 []db.Stats2023
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001109 actions []db.Action
Emily Markovafaecfe12023-07-01 12:40:03 -07001110 images []db.PitImage
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001111}
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001112
Emily Markovabf24c9e2023-02-08 20:31:11 -08001113func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -08001114 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001115 return nil
1116}
1117
Emily Markova290147d2023-03-03 22:40:06 -08001118func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
1119 database.stats2023 = append(database.stats2023, stats2023)
1120 return nil
1121}
Emily Markovabf24c9e2023-02-08 20:31:11 -08001122func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001123 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001124}
1125
Emily Markova290147d2023-03-03 22:40:06 -08001126func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
1127 return database.stats2023, nil
1128}
1129
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001130func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error) {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001131 var results []db.Stats2023
1132 for _, stats := range database.stats2023 {
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001133 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001134 results = append(results, stats)
1135 }
1136 }
1137 return results, nil
1138}
1139
Philipp Schradereecb8962022-06-01 21:02:42 -07001140func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -07001141 var results []string
1142 for _, data := range database.notes {
1143 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -07001144 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -07001145 }
1146 }
Philipp Schradereecb8962022-06-01 21:02:42 -07001147 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -07001148}
1149
Filip Kujawaf947cb42022-11-21 10:00:30 -08001150func (database *MockDatabase) AddNotes(data db.NotesData) error {
1151 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -07001152 return nil
1153}
1154
Filip Kujawaf882e022022-12-14 13:14:08 -08001155func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
1156 return database.notes, nil
1157}
1158
Milo Lin1d59f0c2022-06-22 20:30:58 -07001159func (database *MockDatabase) AddToShift(data db.Shift) error {
1160 database.shiftSchedule = append(database.shiftSchedule, data)
1161 return nil
1162}
1163
1164func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
1165 return database.shiftSchedule, nil
1166}
1167
1168func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
1169 return []db.Shift{}, nil
1170}
1171
Emily Markovafaecfe12023-07-01 12:40:03 -07001172func (database *MockDatabase) QueryPitImages(requestedTeam string) ([]db.RequestedPitImage, error) {
1173 var results []db.RequestedPitImage
1174 for _, data := range database.images {
1175 if data.TeamNumber == requestedTeam {
1176 results = append(results, db.RequestedPitImage{
1177 TeamNumber: data.TeamNumber,
1178 ImagePath: data.ImagePath,
1179 CheckSum: data.CheckSum,
1180 })
1181 }
1182 }
1183 return results, nil
1184}
1185
Filip Kujawa210a03b2022-11-24 14:41:11 -08001186func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
1187 database.driver_ranking = append(database.driver_ranking, data)
1188 return nil
1189}
1190
Filip Kujawaf882e022022-12-14 13:14:08 -08001191func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
1192 return database.driver_ranking, nil
1193}
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001194
1195func (database *MockDatabase) AddAction(action db.Action) error {
1196 database.actions = append(database.actions, action)
1197 return nil
1198}
1199
Emily Markovafaecfe12023-07-01 12:40:03 -07001200func (database *MockDatabase) AddPitImage(pitImage db.PitImage) error {
1201 database.images = append(database.images, pitImage)
1202 return nil
1203}
1204
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001205func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
1206 return database.actions, nil
1207}
Filip Kujawac1ded372023-05-27 14:33:43 -07001208
1209func (database *MockDatabase) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1210 for i, stat := range database.stats2023 {
1211 if stat.CompLevel == compLevel_ &&
1212 stat.MatchNumber == matchNumber_ &&
1213 stat.SetNumber == setNumber_ &&
1214 stat.TeamNumber == teamNumber_ {
1215 // Match found, remove the element from the array.
1216 database.stats2023 = append(database.stats2023[:i], database.stats2023[i+1:]...)
1217 }
1218 }
1219 return nil
1220}
1221
1222func (database *MockDatabase) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1223 for i, action := range database.actions {
1224 if action.CompLevel == compLevel_ &&
1225 action.MatchNumber == matchNumber_ &&
1226 action.SetNumber == setNumber_ &&
1227 action.TeamNumber == teamNumber_ {
1228 // Match found, remove the element from the array.
1229 database.actions = append(database.actions[:i], database.actions[i+1:]...)
1230 }
1231 }
1232 return nil
1233}