blob: d0e17b8595959eaed5ceb37f8a47de23d033651b [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"
Emily Markova8cb91312024-02-02 12:30:37 -080010 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/delete_2024_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"
Emily Markova8cb91312024-02-02 12:30:37 -080013 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2024_data_scouting"
14 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2024_data_scouting_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080015 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
16 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080017 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
18 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080019 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
20 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
Emily Markova8e39f452023-12-23 12:17:30 -080021 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images"
22 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070023 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Emily Markovafaecfe12023-07-01 12:40:03 -070024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images"
25 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images_response"
Milo Lin1d59f0c2022-06-22 20:30:58 -070026 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
27 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Emily Markova8cb91312024-02-02 12:30:37 -080028 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_2024_actions"
Emily Markova1abe9782023-03-11 19:45:38 -080029 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions"
Filip Kujawa210a03b2022-11-24 14:41:11 -080030 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
Alex Perry81f96ba2022-03-13 18:26:19 -070031 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Emily Markovafaecfe12023-07-01 12:40:03 -070032 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_pit_image"
Milo Lin1d59f0c2022-06-22 20:30:58 -070033 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080034 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
35 flatbuffers "github.com/google/flatbuffers/go"
36)
37
38// Validates that an unhandled address results in a 404.
39func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080040 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080041 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080042 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080043 scoutingServer.Start(8080)
44 defer scoutingServer.Stop()
45
46 resp, err := http.Get("http://localhost:8080/requests/foo")
47 if err != nil {
48 t.Fatalf("Failed to get data: %v", err)
49 }
50 if resp.StatusCode != http.StatusNotFound {
51 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
52 }
53}
54
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080055// Validates that we can request the full match list.
56func TestRequestAllMatches(t *testing.T) {
57 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -080058 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080059 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080060 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070061 Alliance: "R", AlliancePosition: 1, TeamNumber: "5",
Emily Markovabf24c9e2023-02-08 20:31:11 -080062 },
63 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080064 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070065 Alliance: "R", AlliancePosition: 2, TeamNumber: "42",
Emily Markovabf24c9e2023-02-08 20:31:11 -080066 },
67 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080068 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070069 Alliance: "R", AlliancePosition: 3, TeamNumber: "600",
Emily Markovabf24c9e2023-02-08 20:31:11 -080070 },
71 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080072 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070073 Alliance: "B", AlliancePosition: 1, TeamNumber: "971",
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: "B", AlliancePosition: 2, TeamNumber: "400",
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: "B", AlliancePosition: 3, TeamNumber: "200",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080082 },
83 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080084 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070085 Alliance: "R", AlliancePosition: 1, TeamNumber: "6",
Emily Markovabf24c9e2023-02-08 20:31:11 -080086 },
87 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080088 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070089 Alliance: "R", AlliancePosition: 2, TeamNumber: "43",
Emily Markovabf24c9e2023-02-08 20:31:11 -080090 },
91 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080092 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070093 Alliance: "R", AlliancePosition: 3, TeamNumber: "601",
Emily Markovabf24c9e2023-02-08 20:31:11 -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: "B", AlliancePosition: 1, TeamNumber: "972",
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: "B", AlliancePosition: 2, TeamNumber: "401",
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: "B", AlliancePosition: 3, TeamNumber: "201",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800106 },
107 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800108 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700109 Alliance: "R", AlliancePosition: 1, TeamNumber: "7",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800110 },
111 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800112 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700113 Alliance: "R", AlliancePosition: 2, TeamNumber: "44",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800114 },
115 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800116 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700117 Alliance: "R", AlliancePosition: 3, TeamNumber: "602",
Emily Markovabf24c9e2023-02-08 20:31:11 -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: "B", AlliancePosition: 1, TeamNumber: "973",
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: "B", AlliancePosition: 2, TeamNumber: "402",
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: "B", AlliancePosition: 3, TeamNumber: "202",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800130 },
131 },
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800132 // Pretend that we have some data scouting data.
Emily Markovadcadcb62024-02-03 13:07:17 -0800133 stats2024: []db.Stats2024{
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800134 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700135 CompType: "Regular", TeamNumber: "5",
Emily Markovadcadcb62024-02-03 13:07:17 -0800136 MatchNumber: 1, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 3,
137 SpeakerAuto: 2, AmpAuto: 4, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700138 Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 1, OutOfField: 2,
Emily Markova040123c2024-02-27 09:48:37 -0800139 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markovaf17f2812024-04-03 20:55:12 -0700140 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800141 },
142 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700143 CompType: "Regular", TeamNumber: "973",
Emily Markovadcadcb62024-02-03 13:07:17 -0800144 MatchNumber: 3, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 1,
145 SpeakerAuto: 0, AmpAuto: 2, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700146 Speaker: 0, Amp: 4, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800147 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 120,
Emily Markovaf17f2812024-04-03 20:55:12 -0700148 Park: true, OnStage: false, Harmony: false, RobotDied: true, NoShow: false, CollectedBy: "bob",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800149 },
150 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800151 }
152 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800153 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800154 scoutingServer.Start(8080)
155 defer scoutingServer.Stop()
156
157 builder := flatbuffers.NewBuilder(1024)
158 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
159
160 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
161 if err != nil {
162 t.Fatal("Failed to request all matches: ", err)
163 }
164
165 expected := request_all_matches_response.RequestAllMatchesResponseT{
166 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700167 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800168 // R1, R2, R3, B1, B2, B3
169 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800170 1, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700171 "5", "42", "600", "971", "400", "200",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800172 &request_all_matches_response.ScoutedLevelT{
173 // The R1 team has already been data
174 // scouted.
175 true, false, false, false, false, false,
176 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800177 },
178 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800179 2, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700180 "6", "43", "601", "972", "401", "201",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800181 &request_all_matches_response.ScoutedLevelT{
182 false, false, false, false, false, false,
183 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800184 },
185 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800186 3, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700187 "7", "44", "602", "973", "402", "202",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800188 &request_all_matches_response.ScoutedLevelT{
189 // The B1 team has already been data
190 // scouted.
191 false, false, false, true, false, false,
192 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800193 },
194 },
195 }
196 if len(expected.MatchList) != len(response.MatchList) {
197 t.Fatal("Expected ", expected, ", but got ", *response)
198 }
199 for i, match := range expected.MatchList {
200 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
201 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
202 }
203 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800204
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800205}
206
Emily Markova8cb91312024-02-02 12:30:37 -0800207// Validates that we can request the 2024 stats.
208func TestRequest2024DataScouting(t *testing.T) {
209 db := MockDatabase{
210 stats2024: []db.Stats2024{
211 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700212 CompType: "Regular", TeamNumber: "342",
Emily Markova8cb91312024-02-02 12:30:37 -0800213 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
214 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700215 Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800216 NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700217 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
218 },
219 {
220 CompType: "Regular", TeamNumber: "132",
221 MatchNumber: 4, SetNumber: 2, CompLevel: "quals", StartingQuadrant: 0,
222 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
223 Speaker: 0, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 1,
224 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
225 Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "jeff",
Emily Markova8cb91312024-02-02 12:30:37 -0800226 },
227 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700228 CompType: "Regular", TeamNumber: "982",
Emily Markova8cb91312024-02-02 12:30:37 -0800229 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
230 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700231 Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800232 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700233 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "george",
Emily Markova8cb91312024-02-02 12:30:37 -0800234 },
235 },
236 }
237 scoutingServer := server.NewScoutingServer()
238 HandleRequests(&db, scoutingServer)
239 scoutingServer.Start(8080)
240 defer scoutingServer.Stop()
241
242 builder := flatbuffers.NewBuilder(1024)
243 builder.Finish((&request_2024_data_scouting.Request2024DataScoutingT{}).Pack(builder))
244
245 response, err := debug.Request2024DataScouting("http://localhost:8080", builder.FinishedBytes())
246 if err != nil {
247 t.Fatal("Failed to request all matches: ", err)
248 }
249
250 expected := request_2024_data_scouting_response.Request2024DataScoutingResponseT{
251 StatsList: []*request_2024_data_scouting_response.Stats2024T{
252 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700253 CompType: "Regular", TeamNumber: "342",
Emily Markova8cb91312024-02-02 12:30:37 -0800254 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
255 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700256 Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800257 NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700258 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
259 },
260 {
261 CompType: "Regular", TeamNumber: "132",
262 MatchNumber: 4, SetNumber: 2, CompLevel: "quals", StartingQuadrant: 0,
263 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
264 Speaker: 0, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 1,
265 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
266 Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "jeff",
Emily Markova8cb91312024-02-02 12:30:37 -0800267 },
268 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700269 CompType: "Regular", TeamNumber: "982",
Emily Markova8cb91312024-02-02 12:30:37 -0800270 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
271 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700272 Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800273 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700274 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "george",
Emily Markova8cb91312024-02-02 12:30:37 -0800275 },
276 },
277 }
278 if len(expected.StatsList) != len(response.StatsList) {
279 t.Fatal("Expected ", expected, ", but got ", *response)
280 }
281 for i, match := range expected.StatsList {
282 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
283 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
284 }
285 }
286}
287
Emily Markova290147d2023-03-03 22:40:06 -0800288// Validates that we can request the 2023 stats.
289func TestRequest2023DataScouting(t *testing.T) {
290 db := MockDatabase{
291 stats2023: []db.Stats2023{
292 {
293 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
294 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
295 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
296 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
297 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
298 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700299 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700300 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700301 BalanceAttemptAuto: false, Docked: false, Engaged: false,
302 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800303 },
304 {
305 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
306 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
307 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
308 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
309 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
310 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700311 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700312 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700313 BalanceAttemptAuto: true, Docked: false, Engaged: false,
314 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800315 },
316 },
317 }
318 scoutingServer := server.NewScoutingServer()
319 HandleRequests(&db, scoutingServer)
320 scoutingServer.Start(8080)
321 defer scoutingServer.Stop()
322
323 builder := flatbuffers.NewBuilder(1024)
324 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
325
326 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
327 if err != nil {
328 t.Fatal("Failed to request all matches: ", err)
329 }
330
331 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
332 StatsList: []*request_2023_data_scouting_response.Stats2023T{
333 {
334 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
335 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
336 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
337 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
338 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
339 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700340 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700341 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700342 BalanceAttemptAuto: false, Docked: false, Engaged: false,
343 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800344 },
345 {
346 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
347 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
348 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
349 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
350 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
351 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700352 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700353 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700354 BalanceAttemptAuto: true, Docked: false, Engaged: false,
355 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800356 },
357 },
358 }
359 if len(expected.StatsList) != len(response.StatsList) {
360 t.Fatal("Expected ", expected, ", but got ", *response)
361 }
362 for i, match := range expected.StatsList {
363 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
364 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
365 }
366 }
367}
368
Emily Markova8cb91312024-02-02 12:30:37 -0800369// Validates that we can request the 2024 stats.
370func TestConvertActionsToStat2024(t *testing.T) {
371 builder := flatbuffers.NewBuilder(1024)
372 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
373 TeamNumber: "4244",
374 MatchNumber: 3,
375 SetNumber: 1,
376 CompLevel: "quals",
377 ActionsList: []*submit_2024_actions.ActionT{
378 {
379 ActionTaken: &submit_2024_actions.ActionTypeT{
380 Type: submit_2024_actions.ActionTypeStartMatchAction,
381 Value: &submit_2024_actions.StartMatchActionT{
382 Position: 2,
383 },
384 },
385 Timestamp: 0,
386 },
387 {
388 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markovaf17f2812024-04-03 20:55:12 -0700389 Type: submit_2024_actions.ActionTypeNoShowAction,
390 Value: &submit_2024_actions.NoShowActionT{},
391 },
392 Timestamp: 200,
393 },
394 {
395 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markova8cb91312024-02-02 12:30:37 -0800396 Type: submit_2024_actions.ActionTypePickupNoteAction,
397 Value: &submit_2024_actions.PickupNoteActionT{
398 Auto: true,
399 },
400 },
Emily Markova8cb91312024-02-02 12:30:37 -0800401 Timestamp: 800,
402 },
403 {
404 ActionTaken: &submit_2024_actions.ActionTypeT{
405 Type: submit_2024_actions.ActionTypePlaceNoteAction,
406 Value: &submit_2024_actions.PlaceNoteActionT{
407 ScoreType: submit_2024_actions.ScoreTypekAMP,
408 Auto: true,
409 },
410 },
411 Timestamp: 2000,
412 },
413 {
414 ActionTaken: &submit_2024_actions.ActionTypeT{
415 Type: submit_2024_actions.ActionTypeMobilityAction,
416 Value: &submit_2024_actions.MobilityActionT{
417 Mobility: true,
418 },
419 },
420 Timestamp: 2200,
421 },
422 {
423 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markovadcadcb62024-02-03 13:07:17 -0800424 Type: submit_2024_actions.ActionTypePenaltyAction,
425 Value: &submit_2024_actions.PenaltyActionT{
426 Penalties: 5,
427 },
Emily Markova8cb91312024-02-02 12:30:37 -0800428 },
429 Timestamp: 2400,
430 },
431 {
432 ActionTaken: &submit_2024_actions.ActionTypeT{
433 Type: submit_2024_actions.ActionTypePickupNoteAction,
434 Value: &submit_2024_actions.PickupNoteActionT{
435 Auto: false,
436 },
437 },
438 Timestamp: 2800,
439 },
440 {
441 ActionTaken: &submit_2024_actions.ActionTypeT{
442 Type: submit_2024_actions.ActionTypePlaceNoteAction,
443 Value: &submit_2024_actions.PlaceNoteActionT{
Emily Markovacd156942024-04-07 19:32:28 -0700444 ScoreType: submit_2024_actions.ScoreTypekSHUTTLED,
Emily Markova8cb91312024-02-02 12:30:37 -0800445 Auto: false,
446 },
447 },
448 Timestamp: 3100,
449 },
450 {
451 ActionTaken: &submit_2024_actions.ActionTypeT{
452 Type: submit_2024_actions.ActionTypePickupNoteAction,
453 Value: &submit_2024_actions.PickupNoteActionT{
454 Auto: false,
455 },
456 },
Emily Markova040123c2024-02-27 09:48:37 -0800457 Timestamp: 3200,
458 },
459 {
460 ActionTaken: &submit_2024_actions.ActionTypeT{
461 Type: submit_2024_actions.ActionTypePlaceNoteAction,
462 Value: &submit_2024_actions.PlaceNoteActionT{
463 ScoreType: submit_2024_actions.ScoreTypekDROPPED,
464 Auto: false,
465 },
466 },
467 Timestamp: 3300,
468 },
469 {
470 ActionTaken: &submit_2024_actions.ActionTypeT{
471 Type: submit_2024_actions.ActionTypeRobotDeathAction,
472 Value: &submit_2024_actions.RobotDeathActionT{
473 RobotDead: true,
474 },
475 },
476 Timestamp: 3400,
477 },
478 {
479 ActionTaken: &submit_2024_actions.ActionTypeT{
480 Type: submit_2024_actions.ActionTypeRobotDeathAction,
481 Value: &submit_2024_actions.RobotDeathActionT{
482 RobotDead: false,
483 },
484 },
485 Timestamp: 3450,
486 },
487 {
488 ActionTaken: &submit_2024_actions.ActionTypeT{
489 Type: submit_2024_actions.ActionTypePickupNoteAction,
490 Value: &submit_2024_actions.PickupNoteActionT{
491 Auto: false,
492 },
493 },
Emily Markova8cb91312024-02-02 12:30:37 -0800494 Timestamp: 3500,
495 },
496 {
497 ActionTaken: &submit_2024_actions.ActionTypeT{
498 Type: submit_2024_actions.ActionTypePlaceNoteAction,
499 Value: &submit_2024_actions.PlaceNoteActionT{
500 ScoreType: submit_2024_actions.ScoreTypekSPEAKER_AMPLIFIED,
501 Auto: false,
502 },
503 },
504 Timestamp: 3900,
505 },
506 {
507 ActionTaken: &submit_2024_actions.ActionTypeT{
508 Type: submit_2024_actions.ActionTypeEndMatchAction,
509 Value: &submit_2024_actions.EndMatchActionT{
510 StageType: submit_2024_actions.StageTypekHARMONY,
511 TrapNote: false,
Emily Markova6079e2f2024-02-17 13:17:24 -0800512 Spotlight: false,
Emily Markova8cb91312024-02-02 12:30:37 -0800513 },
514 },
515 Timestamp: 4200,
516 },
517 },
Emily Markova9c18e9c2024-04-03 20:06:27 -0700518 CompType: "Regular",
Emily Markova8cb91312024-02-02 12:30:37 -0800519 }).Pack(builder))
520
521 submit2024Actions := submit_2024_actions.GetRootAsSubmit2024Actions(builder.FinishedBytes(), 0)
522 response, err := ConvertActionsToStat2024(submit2024Actions)
523
524 if err != nil {
525 t.Fatal("Failed to convert actions to stats: ", err)
526 }
527
528 expected := db.Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700529 CompType: "Regular", TeamNumber: "4244",
Emily Markova8cb91312024-02-02 12:30:37 -0800530 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
Emily Markova040123c2024-02-27 09:48:37 -0800531 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700532 Speaker: 0, Amp: 0, SpeakerAmplified: 1, Shuttled: 1, OutOfField: 0,
533 NotesDropped: 1, Penalties: 5, TrapNote: false, Spotlight: false, AvgCycle: 950,
Emily Markovaf17f2812024-04-03 20:55:12 -0700534 Park: false, OnStage: false, Harmony: true, RobotDied: true, NoShow: true, CollectedBy: "",
Emily Markova8cb91312024-02-02 12:30:37 -0800535 }
536
537 if expected != response {
538 t.Fatal("Expected ", expected, ", but got ", response)
539 }
540}
541
Alex Perry81f96ba2022-03-13 18:26:19 -0700542func TestSubmitNotes(t *testing.T) {
543 database := MockDatabase{}
544 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800545 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700546 scoutingServer.Start(8080)
547 defer scoutingServer.Stop()
548
549 builder := flatbuffers.NewBuilder(1024)
550 builder.Finish((&submit_notes.SubmitNotesT{
Emily Markovae68b7632023-12-30 14:17:55 -0800551 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800552 Notes: "Notes",
553 GoodDriving: true,
554 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700555 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800556 SketchyPlacing: false,
557 GoodDefense: true,
558 BadDefense: false,
559 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700560 NoShow: false,
561 MatchNumber: 4,
562 CompLevel: "qm",
563 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700564 }).Pack(builder))
565
566 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
567 if err != nil {
568 t.Fatal("Failed to submit notes: ", err)
569 }
570
571 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800572 {
Emily Markovae68b7632023-12-30 14:17:55 -0800573 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800574 Notes: "Notes",
575 GoodDriving: true,
576 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700577 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800578 SketchyPlacing: false,
579 GoodDefense: true,
580 BadDefense: false,
581 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700582 NoShow: false,
583 MatchNumber: 4,
584 CompLevel: "qm",
585 SetNumber: 1,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800586 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700587 }
588
589 if !reflect.DeepEqual(database.notes, expected) {
590 t.Fatal("Submitted notes did not match", expected, database.notes)
591 }
592}
593
594func TestRequestNotes(t *testing.T) {
595 database := MockDatabase{
596 notes: []db.NotesData{{
Emily Markovae68b7632023-12-30 14:17:55 -0800597 TeamNumber: "971A",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800598 Notes: "Notes",
599 GoodDriving: true,
600 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700601 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800602 SketchyPlacing: false,
603 GoodDefense: true,
604 BadDefense: false,
605 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700606 NoShow: false,
607 MatchNumber: 4,
608 CompLevel: "qm",
609 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700610 }},
611 }
612 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800613 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700614 scoutingServer.Start(8080)
615 defer scoutingServer.Stop()
616
617 builder := flatbuffers.NewBuilder(1024)
618 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
Emily Markovae68b7632023-12-30 14:17:55 -0800619 Team: "971A",
Alex Perry81f96ba2022-03-13 18:26:19 -0700620 }).Pack(builder))
621 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
622 if err != nil {
623 t.Fatal("Failed to submit notes: ", err)
624 }
625
626 if response.Notes[0].Data != "Notes" {
627 t.Fatal("requested notes did not match", response)
628 }
629}
630
Emily Markovafaecfe12023-07-01 12:40:03 -0700631func TestSubmitPitImage(t *testing.T) {
632 database := MockDatabase{}
633 scoutingServer := server.NewScoutingServer()
634 HandleRequests(&database, scoutingServer)
635 scoutingServer.Start(8080)
636 defer scoutingServer.Stop()
637
638 builder := flatbuffers.NewBuilder(1024)
639 builder.Finish((&submit_pit_image.SubmitPitImageT{
640 TeamNumber: "483A", ImagePath: "483Arobot.jpg",
641 ImageData: []byte{12, 43, 54, 34, 98},
642 }).Pack(builder))
643
644 _, err := debug.SubmitPitImage("http://localhost:8080", builder.FinishedBytes())
645 if err != nil {
646 t.Fatal("Failed to submit pit image: ", err)
647 }
648
649 expected := []db.PitImage{
650 {
651 TeamNumber: "483A", CheckSum: "177d9dc52bc25f391232e82521259c378964c068832a9178d73448ba4ac5e0b1",
652 ImagePath: "483Arobot.jpg", ImageData: []byte{12, 43, 54, 34, 98},
653 },
654 }
655
656 if !reflect.DeepEqual(database.images, expected) {
657 t.Fatal("Submitted image did not match", expected, database.images)
658 }
659}
660
661func TestRequestPitImages(t *testing.T) {
662 db := MockDatabase{
663 images: []db.PitImage{
664 {
665 TeamNumber: "932", ImagePath: "pitimage.jpg",
666 ImageData: []byte{3, 34, 44, 65}, CheckSum: "abcdf",
667 },
668 {
669 TeamNumber: "234", ImagePath: "234robot.png",
670 ImageData: []byte{64, 54, 21, 21, 76, 32}, CheckSum: "egrfd",
671 },
672 {
673 TeamNumber: "93A", ImagePath: "abcd.jpg",
674 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "rgegfd",
675 },
676 },
677 }
678
679 scoutingServer := server.NewScoutingServer()
680 HandleRequests(&db, scoutingServer)
681 scoutingServer.Start(8080)
682 defer scoutingServer.Stop()
683
684 builder := flatbuffers.NewBuilder(1024)
685 builder.Finish((&request_pit_images.RequestPitImagesT{"932"}).Pack(builder))
686
687 response, err := debug.RequestPitImages("http://localhost:8080", builder.FinishedBytes())
688 if err != nil {
689 t.Fatal("Failed to request pit images: ", err)
690 }
691
692 expected := request_pit_images_response.RequestPitImagesResponseT{
693 PitImageList: []*request_pit_images_response.PitImageT{
694 {
695 TeamNumber: "932", ImagePath: "pitimage.jpg", CheckSum: "abcdf",
696 },
697 },
698 }
699
700 if len(expected.PitImageList) != len(response.PitImageList) {
701 t.Fatal("Expected ", expected, ", but got ", *response)
702 }
703
704 for i, pit_image := range expected.PitImageList {
705 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
706 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
707 }
708 }
709}
710
Emily Markova8e39f452023-12-23 12:17:30 -0800711func TestRequestAllPitImages(t *testing.T) {
712 db := MockDatabase{
713 images: []db.PitImage{
714 {
715 TeamNumber: "32", ImagePath: "pitimage.jpg",
716 ImageData: []byte{3, 43, 44, 32}, CheckSum: "cdhrj",
717 },
718 {
719 TeamNumber: "231", ImagePath: "232robot.png",
720 ImageData: []byte{64, 54, 54, 21, 76, 32}, CheckSum: "rgre",
721 },
722 {
723 TeamNumber: "90", ImagePath: "abcd.jpg",
724 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "erfer",
725 },
726 },
727 }
728
729 scoutingServer := server.NewScoutingServer()
730 HandleRequests(&db, scoutingServer)
731 scoutingServer.Start(8080)
732 defer scoutingServer.Stop()
733
734 builder := flatbuffers.NewBuilder(1024)
735 builder.Finish((&request_all_pit_images.RequestAllPitImagesT{}).Pack(builder))
736
737 response, err := debug.RequestAllPitImages("http://localhost:8080", builder.FinishedBytes())
738 if err != nil {
739 t.Fatal("Failed to request pit images: ", err)
740 }
741
742 expected := request_all_pit_images_response.RequestAllPitImagesResponseT{
743 PitImageList: []*request_all_pit_images_response.PitImageT{
744 {
745 TeamNumber: "32", ImagePath: "pitimage.jpg", CheckSum: "cdhrj",
746 },
747 {
748 TeamNumber: "231", ImagePath: "232robot.png", CheckSum: "rgre",
749 },
750 {
751 TeamNumber: "90", ImagePath: "abcd.jpg", CheckSum: "erfer",
752 },
753 },
754 }
755
756 if len(expected.PitImageList) != len(response.PitImageList) {
757 t.Fatal("Expected ", expected, ", but got ", *response)
758 }
759
760 for i, pit_image := range expected.PitImageList {
761 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
762 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
763 }
764 }
765}
766
Milo Lin1d59f0c2022-06-22 20:30:58 -0700767func TestRequestShiftSchedule(t *testing.T) {
768 db := MockDatabase{
769 shiftSchedule: []db.Shift{
770 {
771 MatchNumber: 1,
772 R1scouter: "Bob",
773 R2scouter: "James",
774 R3scouter: "Robert",
775 B1scouter: "Alice",
776 B2scouter: "Mary",
777 B3scouter: "Patricia",
778 },
779 {
780 MatchNumber: 2,
781 R1scouter: "Liam",
782 R2scouter: "Noah",
783 R3scouter: "Oliver",
784 B1scouter: "Emma",
785 B2scouter: "Charlotte",
786 B3scouter: "Amelia",
787 },
788 },
789 }
790 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800791 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700792 scoutingServer.Start(8080)
793 defer scoutingServer.Stop()
794
795 builder := flatbuffers.NewBuilder(1024)
796 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
797
798 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
799 if err != nil {
800 t.Fatal("Failed to request shift schedule: ", err)
801 }
802
803 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
804 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
805 {
806 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700807 R1Scouter: "Bob",
808 R2Scouter: "James",
809 R3Scouter: "Robert",
810 B1Scouter: "Alice",
811 B2Scouter: "Mary",
812 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700813 },
814 {
815 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700816 R1Scouter: "Liam",
817 R2Scouter: "Noah",
818 R3Scouter: "Oliver",
819 B1Scouter: "Emma",
820 B2Scouter: "Charlotte",
821 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700822 },
823 },
824 }
825 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
826 t.Fatal("Expected ", expected, ", but got ", *response)
827 }
828 for i, match := range expected.ShiftSchedule {
829 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
830 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
831 }
832 }
833}
834
835func TestSubmitShiftSchedule(t *testing.T) {
836 database := MockDatabase{}
837 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800838 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700839 scoutingServer.Start(8080)
840 defer scoutingServer.Stop()
841
842 builder := flatbuffers.NewBuilder(1024)
843 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
844 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
845 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700846 R1Scouter: "Bob",
847 R2Scouter: "James",
848 R3Scouter: "Robert",
849 B1Scouter: "Alice",
850 B2Scouter: "Mary",
851 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700852 },
853 }).Pack(builder))
854
855 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
856 if err != nil {
857 t.Fatal("Failed to submit shift schedule: ", err)
858 }
859
860 expected := []db.Shift{
861 {MatchNumber: 1,
862 R1scouter: "Bob",
863 R2scouter: "James",
864 R3scouter: "Robert",
865 B1scouter: "Alice",
866 B2scouter: "Mary",
867 B3scouter: "Patricia"},
868 }
869 if !reflect.DeepEqual(expected, database.shiftSchedule) {
870 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
871 }
872}
873
Filip Kujawa210a03b2022-11-24 14:41:11 -0800874func TestSubmitDriverRanking(t *testing.T) {
875 database := MockDatabase{}
876 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800877 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800878 scoutingServer.Start(8080)
879 defer scoutingServer.Stop()
880
881 builder := flatbuffers.NewBuilder(1024)
882 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
883 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800884 Rank1: "1234",
885 Rank2: "1235",
886 Rank3: "1236",
Filip Kujawa210a03b2022-11-24 14:41:11 -0800887 }).Pack(builder))
888
889 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
890 if err != nil {
891 t.Fatal("Failed to submit driver ranking: ", err)
892 }
893
894 expected := []db.DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -0800895 {MatchNumber: 36, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -0800896 }
897
898 if !reflect.DeepEqual(database.driver_ranking, expected) {
899 t.Fatal("Submitted notes did not match", expected, database.notes)
900 }
901}
902
Filip Kujawaf882e022022-12-14 13:14:08 -0800903// Validates that we can request the driver rankings.
904func TestRequestDriverRankings(t *testing.T) {
905 db := MockDatabase{
906 driver_ranking: []db.DriverRankingData{
907 {
908 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800909 Rank1: "1234",
910 Rank2: "1235",
911 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -0800912 },
913 {
914 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800915 Rank1: "101",
916 Rank2: "202",
917 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -0800918 },
919 },
920 }
921 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800922 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800923 scoutingServer.Start(8080)
924 defer scoutingServer.Stop()
925
926 builder := flatbuffers.NewBuilder(1024)
927 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
928
929 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
930 if err != nil {
931 t.Fatal("Failed to request all driver rankings: ", err)
932 }
933
934 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
935 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
936 {
937 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800938 Rank1: "1234",
939 Rank2: "1235",
940 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -0800941 },
942 {
943 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800944 Rank1: "101",
945 Rank2: "202",
946 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -0800947 },
948 },
949 }
950 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
951 t.Fatal("Expected ", expected, ", but got ", *response)
952 }
953 for i, match := range expected.DriverRankingList {
954 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
955 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
956 }
957 }
958}
959
960// Validates that we can request all notes.
961func TestRequestAllNotes(t *testing.T) {
962 db := MockDatabase{
963 notes: []db.NotesData{
964 {
Emily Markovae68b7632023-12-30 14:17:55 -0800965 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800966 Notes: "Notes",
967 GoodDriving: true,
968 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700969 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800970 SketchyPlacing: false,
971 GoodDefense: true,
972 BadDefense: false,
973 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -0700974 NoShow: false,
975 MatchNumber: 4,
976 CompLevel: "qm",
977 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -0800978 },
979 {
Emily Markovae68b7632023-12-30 14:17:55 -0800980 TeamNumber: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800981 Notes: "More Notes",
982 GoodDriving: false,
983 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700984 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800985 SketchyPlacing: true,
986 GoodDefense: false,
987 BadDefense: true,
988 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -0700989 NoShow: false,
990 MatchNumber: 1,
991 CompLevel: "qm",
992 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -0800993 },
994 },
995 }
996 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800997 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800998 scoutingServer.Start(8080)
999 defer scoutingServer.Stop()
1000
1001 builder := flatbuffers.NewBuilder(1024)
1002 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
1003
1004 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
1005 if err != nil {
1006 t.Fatal("Failed to request all notes: ", err)
1007 }
1008
1009 expected := request_all_notes_response.RequestAllNotesResponseT{
1010 NoteList: []*request_all_notes_response.NoteT{
1011 {
Emily Markovae68b7632023-12-30 14:17:55 -08001012 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001013 Notes: "Notes",
1014 GoodDriving: true,
1015 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001016 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001017 SketchyPlacing: false,
1018 GoodDefense: true,
1019 BadDefense: false,
1020 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001021 NoShow: false,
1022 MatchNumber: 4,
1023 CompLevel: "qm",
1024 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -08001025 },
1026 {
Emily Markovae68b7632023-12-30 14:17:55 -08001027 Team: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001028 Notes: "More Notes",
1029 GoodDriving: false,
1030 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001031 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001032 SketchyPlacing: true,
1033 GoodDefense: false,
1034 BadDefense: true,
1035 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001036 NoShow: false,
1037 MatchNumber: 1,
1038 CompLevel: "qm",
1039 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -08001040 },
1041 },
1042 }
1043 if len(expected.NoteList) != len(response.NoteList) {
1044 t.Fatal("Expected ", expected, ", but got ", *response)
1045 }
1046 for i, note := range expected.NoteList {
1047 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
1048 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
1049 }
1050 }
1051}
1052
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001053func packAction(action *submit_actions.ActionT) []byte {
1054 builder := flatbuffers.NewBuilder(50 * 1024)
1055 builder.Finish((action).Pack(builder))
1056 return (builder.FinishedBytes())
1057}
1058
Emily Markova8cb91312024-02-02 12:30:37 -08001059func TestAddingActions2024(t *testing.T) {
1060 database := MockDatabase{}
1061 scoutingServer := server.NewScoutingServer()
1062 HandleRequests(&database, scoutingServer)
1063 scoutingServer.Start(8080)
1064 defer scoutingServer.Stop()
1065
1066 builder := flatbuffers.NewBuilder(1024)
1067 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
1068 TeamNumber: "3421",
1069 MatchNumber: 2,
1070 SetNumber: 1,
1071 CompLevel: "quals",
1072 ActionsList: []*submit_2024_actions.ActionT{
1073 {
1074 ActionTaken: &submit_2024_actions.ActionTypeT{
1075 Type: submit_2024_actions.ActionTypePickupNoteAction,
1076 Value: &submit_2024_actions.PickupNoteActionT{
1077 Auto: true,
1078 },
1079 },
1080 Timestamp: 1800,
1081 },
1082 {
1083 ActionTaken: &submit_2024_actions.ActionTypeT{
1084 Type: submit_2024_actions.ActionTypePlaceNoteAction,
1085 Value: &submit_2024_actions.PlaceNoteActionT{
1086 ScoreType: submit_2024_actions.ScoreTypekSPEAKER,
1087 Auto: false,
1088 },
1089 },
1090 Timestamp: 2500,
1091 },
1092 },
Emily Markova9c18e9c2024-04-03 20:06:27 -07001093 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001094 }).Pack(builder))
1095
1096 _, err := debug.Submit2024Actions("http://localhost:8080", builder.FinishedBytes())
1097 if err != nil {
1098 t.Fatal("Failed to submit actions: ", err)
1099 }
1100
1101 expectedActions := []db.Action{
1102 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001103 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001104 TeamNumber: "3421",
1105 MatchNumber: 2,
1106 SetNumber: 1,
1107 CompLevel: "quals",
1108 CollectedBy: "debug_cli",
1109 CompletedAction: []byte{},
1110 Timestamp: 1800,
1111 },
1112 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001113 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001114 TeamNumber: "3421",
1115 MatchNumber: 2,
1116 SetNumber: 1,
1117 CompLevel: "quals",
1118 CollectedBy: "debug_cli",
1119 CompletedAction: []byte{},
1120 Timestamp: 2500,
1121 },
1122 }
1123
1124 expectedStats := []db.Stats2024{
1125 db.Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -07001126 CompType: "Prescouting", TeamNumber: "3421",
Emily Markova8cb91312024-02-02 12:30:37 -08001127 MatchNumber: 2, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 0,
1128 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001129 Speaker: 1, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001130 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -07001131 Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "debug_cli",
Emily Markova8cb91312024-02-02 12:30:37 -08001132 },
1133 }
1134
1135 if !reflect.DeepEqual(expectedActions, database.actions) {
1136 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1137 }
1138 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1139 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1140 }
1141}
1142
Emily Markova8cb91312024-02-02 12:30:37 -08001143// Validates that we can delete 2024 stats.
1144func TestDeleteFromStats2024(t *testing.T) {
1145 database := MockDatabase{
1146 stats2024: []db.Stats2024{
1147 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001148 CompType: "Practice", TeamNumber: "746",
Emily Markova8cb91312024-02-02 12:30:37 -08001149 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1150 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001151 Speaker: 0, Amp: 1, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -08001152 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markovaf17f2812024-04-03 20:55:12 -07001153 Park: false, OnStage: false, Harmony: true, RobotDied: false, NoShow: false, CollectedBy: "alek",
Emily Markova8cb91312024-02-02 12:30:37 -08001154 },
1155 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001156 CompType: "Regular", TeamNumber: "244",
Emily Markova8cb91312024-02-02 12:30:37 -08001157 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1158 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001159 Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001160 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markovaf17f2812024-04-03 20:55:12 -07001161 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001162 },
1163 },
1164 actions: []db.Action{
1165 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001166 CompType: "Practice",
Emily Markova8cb91312024-02-02 12:30:37 -08001167 TeamNumber: "746",
1168 MatchNumber: 3,
1169 SetNumber: 1,
1170 CompLevel: "quals",
1171 CollectedBy: "debug_cli",
1172 CompletedAction: []byte{},
1173 Timestamp: 2400,
1174 },
1175 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001176 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001177 TeamNumber: "244",
1178 MatchNumber: 5,
1179 SetNumber: 3,
1180 CompLevel: "quals",
1181 CollectedBy: "debug_cli",
1182 CompletedAction: []byte{},
1183 Timestamp: 1009,
1184 },
1185 },
1186 }
1187 scoutingServer := server.NewScoutingServer()
1188 HandleRequests(&database, scoutingServer)
1189 scoutingServer.Start(8080)
1190 defer scoutingServer.Stop()
1191
1192 builder := flatbuffers.NewBuilder(1024)
1193 builder.Finish((&delete_2024_data_scouting.Delete2024DataScoutingT{
1194 CompLevel: "quals",
1195 MatchNumber: 3,
1196 SetNumber: 1,
1197 TeamNumber: "746",
1198 }).Pack(builder))
1199
1200 _, err := debug.Delete2024DataScouting("http://localhost:8080", builder.FinishedBytes())
1201 if err != nil {
1202 t.Fatal("Failed to delete from data scouting 2024", err)
1203 }
1204
1205 expectedActions := []db.Action{
1206 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001207 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001208 TeamNumber: "244",
1209 MatchNumber: 5,
1210 SetNumber: 3,
1211 CompLevel: "quals",
1212 CollectedBy: "debug_cli",
1213 CompletedAction: []byte{},
1214 Timestamp: 1009,
1215 },
1216 }
1217
1218 expectedStats := []db.Stats2024{
1219 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001220 CompType: "Regular", TeamNumber: "244",
Emily Markova8cb91312024-02-02 12:30:37 -08001221 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1222 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001223 Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001224 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markovaf17f2812024-04-03 20:55:12 -07001225 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001226 },
1227 }
1228
1229 if !reflect.DeepEqual(expectedActions, database.actions) {
1230 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1231 }
1232 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1233 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1234 }
1235}
1236
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001237// A mocked database we can use for testing. Add functionality to this as
1238// needed for your tests.
1239
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001240type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001241 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -08001242 notes []db.NotesData
1243 shiftSchedule []db.Shift
1244 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -08001245 stats2023 []db.Stats2023
Emily Markova8cb91312024-02-02 12:30:37 -08001246 stats2024 []db.Stats2024
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001247 actions []db.Action
Emily Markovafaecfe12023-07-01 12:40:03 -07001248 images []db.PitImage
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001249}
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001250
Emily Markovabf24c9e2023-02-08 20:31:11 -08001251func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -08001252 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001253 return nil
1254}
1255
Emily Markova290147d2023-03-03 22:40:06 -08001256func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
1257 database.stats2023 = append(database.stats2023, stats2023)
1258 return nil
1259}
Emily Markova8cb91312024-02-02 12:30:37 -08001260
1261func (database *MockDatabase) AddToStats2024(stats2024 db.Stats2024) error {
1262 database.stats2024 = append(database.stats2024, stats2024)
1263 return nil
1264}
Emily Markovabf24c9e2023-02-08 20:31:11 -08001265func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001266 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001267}
1268
Emily Markova290147d2023-03-03 22:40:06 -08001269func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
1270 return database.stats2023, nil
1271}
1272
Emily Markova8cb91312024-02-02 12:30:37 -08001273func (database *MockDatabase) ReturnStats2024() ([]db.Stats2024, error) {
1274 return database.stats2024, nil
1275}
1276
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001277func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error) {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001278 var results []db.Stats2023
1279 for _, stats := range database.stats2023 {
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001280 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001281 results = append(results, stats)
1282 }
1283 }
1284 return results, nil
1285}
1286
Emily Markova9c18e9c2024-04-03 20:06:27 -07001287func (database *MockDatabase) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, compType string) ([]db.Stats2024, error) {
Emily Markova8cb91312024-02-02 12:30:37 -08001288 var results []db.Stats2024
1289 for _, stats := range database.stats2024 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001290 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.CompType == compType {
Emily Markova8cb91312024-02-02 12:30:37 -08001291 results = append(results, stats)
1292 }
1293 }
1294 return results, nil
1295}
1296
Emily Markovae68b7632023-12-30 14:17:55 -08001297func (database *MockDatabase) QueryNotes(requestedTeam string) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -07001298 var results []string
1299 for _, data := range database.notes {
1300 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -07001301 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -07001302 }
1303 }
Philipp Schradereecb8962022-06-01 21:02:42 -07001304 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -07001305}
1306
Filip Kujawaf947cb42022-11-21 10:00:30 -08001307func (database *MockDatabase) AddNotes(data db.NotesData) error {
1308 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -07001309 return nil
1310}
1311
Filip Kujawaf882e022022-12-14 13:14:08 -08001312func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
1313 return database.notes, nil
1314}
1315
Milo Lin1d59f0c2022-06-22 20:30:58 -07001316func (database *MockDatabase) AddToShift(data db.Shift) error {
1317 database.shiftSchedule = append(database.shiftSchedule, data)
1318 return nil
1319}
1320
1321func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
1322 return database.shiftSchedule, nil
1323}
1324
1325func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
1326 return []db.Shift{}, nil
1327}
1328
Emily Markovafaecfe12023-07-01 12:40:03 -07001329func (database *MockDatabase) QueryPitImages(requestedTeam string) ([]db.RequestedPitImage, error) {
1330 var results []db.RequestedPitImage
1331 for _, data := range database.images {
1332 if data.TeamNumber == requestedTeam {
1333 results = append(results, db.RequestedPitImage{
1334 TeamNumber: data.TeamNumber,
1335 ImagePath: data.ImagePath,
1336 CheckSum: data.CheckSum,
1337 })
1338 }
1339 }
1340 return results, nil
1341}
1342
Filip Kujawa210a03b2022-11-24 14:41:11 -08001343func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
1344 database.driver_ranking = append(database.driver_ranking, data)
1345 return nil
1346}
1347
Filip Kujawaf882e022022-12-14 13:14:08 -08001348func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
1349 return database.driver_ranking, nil
1350}
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001351
1352func (database *MockDatabase) AddAction(action db.Action) error {
1353 database.actions = append(database.actions, action)
1354 return nil
1355}
1356
Emily Markovafaecfe12023-07-01 12:40:03 -07001357func (database *MockDatabase) AddPitImage(pitImage db.PitImage) error {
1358 database.images = append(database.images, pitImage)
1359 return nil
1360}
1361
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001362func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
1363 return database.actions, nil
1364}
Filip Kujawac1ded372023-05-27 14:33:43 -07001365
Emily Markova8e39f452023-12-23 12:17:30 -08001366func (database *MockDatabase) ReturnPitImages() ([]db.PitImage, error) {
1367 return database.images, nil
1368}
1369
Filip Kujawac1ded372023-05-27 14:33:43 -07001370func (database *MockDatabase) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1371 for i, stat := range database.stats2023 {
1372 if stat.CompLevel == compLevel_ &&
1373 stat.MatchNumber == matchNumber_ &&
1374 stat.SetNumber == setNumber_ &&
1375 stat.TeamNumber == teamNumber_ {
1376 // Match found, remove the element from the array.
1377 database.stats2023 = append(database.stats2023[:i], database.stats2023[i+1:]...)
1378 }
1379 }
1380 return nil
1381}
1382
Emily Markova8cb91312024-02-02 12:30:37 -08001383func (database *MockDatabase) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1384 for i, stat := range database.stats2024 {
1385 if stat.CompLevel == compLevel_ &&
1386 stat.MatchNumber == matchNumber_ &&
1387 stat.SetNumber == setNumber_ &&
1388 stat.TeamNumber == teamNumber_ {
1389 // Match found, remove the element from the array.
1390 database.stats2024 = append(database.stats2024[:i], database.stats2024[i+1:]...)
1391 }
1392 }
1393 return nil
1394}
1395
Filip Kujawac1ded372023-05-27 14:33:43 -07001396func (database *MockDatabase) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1397 for i, action := range database.actions {
1398 if action.CompLevel == compLevel_ &&
1399 action.MatchNumber == matchNumber_ &&
1400 action.SetNumber == setNumber_ &&
1401 action.TeamNumber == teamNumber_ {
1402 // Match found, remove the element from the array.
1403 database.actions = append(database.actions[:i], database.actions[i+1:]...)
1404 }
1405 }
1406 return nil
1407}