blob: f8fb2caccd926428e5cd3da45c4e385153ef3963 [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,
140 Park: false, OnStage: true, Harmony: false, RobotDied: 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 Markova040123c2024-02-27 09:48:37 -0800148 Park: true, OnStage: false, Harmony: false, RobotDied: true, 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 Markova040123c2024-02-27 09:48:37 -0800217 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "alex",
Emily Markova8cb91312024-02-02 12:30:37 -0800218 },
219 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700220 CompType: "Regular", TeamNumber: "982",
Emily Markova8cb91312024-02-02 12:30:37 -0800221 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
222 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700223 Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800224 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800225 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "george",
Emily Markova8cb91312024-02-02 12:30:37 -0800226 },
227 },
228 }
229 scoutingServer := server.NewScoutingServer()
230 HandleRequests(&db, scoutingServer)
231 scoutingServer.Start(8080)
232 defer scoutingServer.Stop()
233
234 builder := flatbuffers.NewBuilder(1024)
235 builder.Finish((&request_2024_data_scouting.Request2024DataScoutingT{}).Pack(builder))
236
237 response, err := debug.Request2024DataScouting("http://localhost:8080", builder.FinishedBytes())
238 if err != nil {
239 t.Fatal("Failed to request all matches: ", err)
240 }
241
242 expected := request_2024_data_scouting_response.Request2024DataScoutingResponseT{
243 StatsList: []*request_2024_data_scouting_response.Stats2024T{
244 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700245 CompType: "Regular", TeamNumber: "342",
Emily Markova8cb91312024-02-02 12:30:37 -0800246 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
247 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700248 Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800249 NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800250 Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "alex",
Emily Markova8cb91312024-02-02 12:30:37 -0800251 },
252 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700253 CompType: "Regular", TeamNumber: "982",
Emily Markova8cb91312024-02-02 12:30:37 -0800254 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
255 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700256 Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800257 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -0800258 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "george",
Emily Markova8cb91312024-02-02 12:30:37 -0800259 },
260 },
261 }
262 if len(expected.StatsList) != len(response.StatsList) {
263 t.Fatal("Expected ", expected, ", but got ", *response)
264 }
265 for i, match := range expected.StatsList {
266 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
267 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
268 }
269 }
270}
271
Emily Markova290147d2023-03-03 22:40:06 -0800272// Validates that we can request the 2023 stats.
273func TestRequest2023DataScouting(t *testing.T) {
274 db := MockDatabase{
275 stats2023: []db.Stats2023{
276 {
277 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
278 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
279 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
280 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
281 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
282 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700283 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700284 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700285 BalanceAttemptAuto: false, Docked: false, Engaged: false,
286 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800287 },
288 {
289 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
290 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
291 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
292 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
293 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
294 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700295 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700296 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700297 BalanceAttemptAuto: true, Docked: false, Engaged: false,
298 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800299 },
300 },
301 }
302 scoutingServer := server.NewScoutingServer()
303 HandleRequests(&db, scoutingServer)
304 scoutingServer.Start(8080)
305 defer scoutingServer.Stop()
306
307 builder := flatbuffers.NewBuilder(1024)
308 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
309
310 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
311 if err != nil {
312 t.Fatal("Failed to request all matches: ", err)
313 }
314
315 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
316 StatsList: []*request_2023_data_scouting_response.Stats2023T{
317 {
318 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
319 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
320 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
321 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
322 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
323 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700324 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700325 AvgCycle: 34, Mobility: false, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700326 BalanceAttemptAuto: false, Docked: false, Engaged: false,
327 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800328 },
329 {
330 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
331 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
332 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
333 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
334 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
335 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700336 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Filip Kujawa0b4b1e52023-04-15 14:05:40 -0700337 AvgCycle: 53, Mobility: false, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700338 BalanceAttemptAuto: true, Docked: false, Engaged: false,
339 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800340 },
341 },
342 }
343 if len(expected.StatsList) != len(response.StatsList) {
344 t.Fatal("Expected ", expected, ", but got ", *response)
345 }
346 for i, match := range expected.StatsList {
347 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
348 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
349 }
350 }
351}
352
Emily Markova8cb91312024-02-02 12:30:37 -0800353// Validates that we can request the 2024 stats.
354func TestConvertActionsToStat2024(t *testing.T) {
355 builder := flatbuffers.NewBuilder(1024)
356 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
357 TeamNumber: "4244",
358 MatchNumber: 3,
359 SetNumber: 1,
360 CompLevel: "quals",
361 ActionsList: []*submit_2024_actions.ActionT{
362 {
363 ActionTaken: &submit_2024_actions.ActionTypeT{
364 Type: submit_2024_actions.ActionTypeStartMatchAction,
365 Value: &submit_2024_actions.StartMatchActionT{
366 Position: 2,
367 },
368 },
369 Timestamp: 0,
370 },
371 {
372 ActionTaken: &submit_2024_actions.ActionTypeT{
373 Type: submit_2024_actions.ActionTypePickupNoteAction,
374 Value: &submit_2024_actions.PickupNoteActionT{
375 Auto: true,
376 },
377 },
Emily Markova8cb91312024-02-02 12:30:37 -0800378 Timestamp: 800,
379 },
380 {
381 ActionTaken: &submit_2024_actions.ActionTypeT{
382 Type: submit_2024_actions.ActionTypePlaceNoteAction,
383 Value: &submit_2024_actions.PlaceNoteActionT{
384 ScoreType: submit_2024_actions.ScoreTypekAMP,
385 Auto: true,
386 },
387 },
388 Timestamp: 2000,
389 },
390 {
391 ActionTaken: &submit_2024_actions.ActionTypeT{
392 Type: submit_2024_actions.ActionTypeMobilityAction,
393 Value: &submit_2024_actions.MobilityActionT{
394 Mobility: true,
395 },
396 },
397 Timestamp: 2200,
398 },
399 {
400 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markovadcadcb62024-02-03 13:07:17 -0800401 Type: submit_2024_actions.ActionTypePenaltyAction,
402 Value: &submit_2024_actions.PenaltyActionT{
403 Penalties: 5,
404 },
Emily Markova8cb91312024-02-02 12:30:37 -0800405 },
406 Timestamp: 2400,
407 },
408 {
409 ActionTaken: &submit_2024_actions.ActionTypeT{
410 Type: submit_2024_actions.ActionTypePickupNoteAction,
411 Value: &submit_2024_actions.PickupNoteActionT{
412 Auto: false,
413 },
414 },
415 Timestamp: 2800,
416 },
417 {
418 ActionTaken: &submit_2024_actions.ActionTypeT{
419 Type: submit_2024_actions.ActionTypePlaceNoteAction,
420 Value: &submit_2024_actions.PlaceNoteActionT{
Emily Markovacd156942024-04-07 19:32:28 -0700421 ScoreType: submit_2024_actions.ScoreTypekSHUTTLED,
Emily Markova8cb91312024-02-02 12:30:37 -0800422 Auto: false,
423 },
424 },
425 Timestamp: 3100,
426 },
427 {
428 ActionTaken: &submit_2024_actions.ActionTypeT{
429 Type: submit_2024_actions.ActionTypePickupNoteAction,
430 Value: &submit_2024_actions.PickupNoteActionT{
431 Auto: false,
432 },
433 },
Emily Markova040123c2024-02-27 09:48:37 -0800434 Timestamp: 3200,
435 },
436 {
437 ActionTaken: &submit_2024_actions.ActionTypeT{
438 Type: submit_2024_actions.ActionTypePlaceNoteAction,
439 Value: &submit_2024_actions.PlaceNoteActionT{
440 ScoreType: submit_2024_actions.ScoreTypekDROPPED,
441 Auto: false,
442 },
443 },
444 Timestamp: 3300,
445 },
446 {
447 ActionTaken: &submit_2024_actions.ActionTypeT{
448 Type: submit_2024_actions.ActionTypeRobotDeathAction,
449 Value: &submit_2024_actions.RobotDeathActionT{
450 RobotDead: true,
451 },
452 },
453 Timestamp: 3400,
454 },
455 {
456 ActionTaken: &submit_2024_actions.ActionTypeT{
457 Type: submit_2024_actions.ActionTypeRobotDeathAction,
458 Value: &submit_2024_actions.RobotDeathActionT{
459 RobotDead: false,
460 },
461 },
462 Timestamp: 3450,
463 },
464 {
465 ActionTaken: &submit_2024_actions.ActionTypeT{
466 Type: submit_2024_actions.ActionTypePickupNoteAction,
467 Value: &submit_2024_actions.PickupNoteActionT{
468 Auto: false,
469 },
470 },
Emily Markova8cb91312024-02-02 12:30:37 -0800471 Timestamp: 3500,
472 },
473 {
474 ActionTaken: &submit_2024_actions.ActionTypeT{
475 Type: submit_2024_actions.ActionTypePlaceNoteAction,
476 Value: &submit_2024_actions.PlaceNoteActionT{
477 ScoreType: submit_2024_actions.ScoreTypekSPEAKER_AMPLIFIED,
478 Auto: false,
479 },
480 },
481 Timestamp: 3900,
482 },
483 {
484 ActionTaken: &submit_2024_actions.ActionTypeT{
485 Type: submit_2024_actions.ActionTypeEndMatchAction,
486 Value: &submit_2024_actions.EndMatchActionT{
487 StageType: submit_2024_actions.StageTypekHARMONY,
488 TrapNote: false,
Emily Markova6079e2f2024-02-17 13:17:24 -0800489 Spotlight: false,
Emily Markova8cb91312024-02-02 12:30:37 -0800490 },
491 },
492 Timestamp: 4200,
493 },
494 },
Emily Markova9c18e9c2024-04-03 20:06:27 -0700495 CompType: "Regular",
Emily Markova8cb91312024-02-02 12:30:37 -0800496 }).Pack(builder))
497
498 submit2024Actions := submit_2024_actions.GetRootAsSubmit2024Actions(builder.FinishedBytes(), 0)
499 response, err := ConvertActionsToStat2024(submit2024Actions)
500
501 if err != nil {
502 t.Fatal("Failed to convert actions to stats: ", err)
503 }
504
505 expected := db.Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700506 CompType: "Regular", TeamNumber: "4244",
Emily Markova8cb91312024-02-02 12:30:37 -0800507 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
Emily Markova040123c2024-02-27 09:48:37 -0800508 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700509 Speaker: 0, Amp: 0, SpeakerAmplified: 1, Shuttled: 1, OutOfField: 0,
510 NotesDropped: 1, Penalties: 5, TrapNote: false, Spotlight: false, AvgCycle: 950,
Emily Markova040123c2024-02-27 09:48:37 -0800511 Park: false, OnStage: false, Harmony: true, RobotDied: true, CollectedBy: "",
Emily Markova8cb91312024-02-02 12:30:37 -0800512 }
513
514 if expected != response {
515 t.Fatal("Expected ", expected, ", but got ", response)
516 }
517}
518
Alex Perry81f96ba2022-03-13 18:26:19 -0700519func TestSubmitNotes(t *testing.T) {
520 database := MockDatabase{}
521 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800522 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700523 scoutingServer.Start(8080)
524 defer scoutingServer.Stop()
525
526 builder := flatbuffers.NewBuilder(1024)
527 builder.Finish((&submit_notes.SubmitNotesT{
Emily Markovae68b7632023-12-30 14:17:55 -0800528 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800529 Notes: "Notes",
530 GoodDriving: true,
531 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700532 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800533 SketchyPlacing: false,
534 GoodDefense: true,
535 BadDefense: false,
536 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700537 NoShow: false,
538 MatchNumber: 4,
539 CompLevel: "qm",
540 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700541 }).Pack(builder))
542
543 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
544 if err != nil {
545 t.Fatal("Failed to submit notes: ", err)
546 }
547
548 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800549 {
Emily Markovae68b7632023-12-30 14:17:55 -0800550 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800551 Notes: "Notes",
552 GoodDriving: true,
553 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700554 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800555 SketchyPlacing: false,
556 GoodDefense: true,
557 BadDefense: false,
558 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700559 NoShow: false,
560 MatchNumber: 4,
561 CompLevel: "qm",
562 SetNumber: 1,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800563 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700564 }
565
566 if !reflect.DeepEqual(database.notes, expected) {
567 t.Fatal("Submitted notes did not match", expected, database.notes)
568 }
569}
570
571func TestRequestNotes(t *testing.T) {
572 database := MockDatabase{
573 notes: []db.NotesData{{
Emily Markovae68b7632023-12-30 14:17:55 -0800574 TeamNumber: "971A",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800575 Notes: "Notes",
576 GoodDriving: true,
577 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700578 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800579 SketchyPlacing: false,
580 GoodDefense: true,
581 BadDefense: false,
582 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700583 NoShow: false,
584 MatchNumber: 4,
585 CompLevel: "qm",
586 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700587 }},
588 }
589 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800590 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700591 scoutingServer.Start(8080)
592 defer scoutingServer.Stop()
593
594 builder := flatbuffers.NewBuilder(1024)
595 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
Emily Markovae68b7632023-12-30 14:17:55 -0800596 Team: "971A",
Alex Perry81f96ba2022-03-13 18:26:19 -0700597 }).Pack(builder))
598 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
599 if err != nil {
600 t.Fatal("Failed to submit notes: ", err)
601 }
602
603 if response.Notes[0].Data != "Notes" {
604 t.Fatal("requested notes did not match", response)
605 }
606}
607
Emily Markovafaecfe12023-07-01 12:40:03 -0700608func TestSubmitPitImage(t *testing.T) {
609 database := MockDatabase{}
610 scoutingServer := server.NewScoutingServer()
611 HandleRequests(&database, scoutingServer)
612 scoutingServer.Start(8080)
613 defer scoutingServer.Stop()
614
615 builder := flatbuffers.NewBuilder(1024)
616 builder.Finish((&submit_pit_image.SubmitPitImageT{
617 TeamNumber: "483A", ImagePath: "483Arobot.jpg",
618 ImageData: []byte{12, 43, 54, 34, 98},
619 }).Pack(builder))
620
621 _, err := debug.SubmitPitImage("http://localhost:8080", builder.FinishedBytes())
622 if err != nil {
623 t.Fatal("Failed to submit pit image: ", err)
624 }
625
626 expected := []db.PitImage{
627 {
628 TeamNumber: "483A", CheckSum: "177d9dc52bc25f391232e82521259c378964c068832a9178d73448ba4ac5e0b1",
629 ImagePath: "483Arobot.jpg", ImageData: []byte{12, 43, 54, 34, 98},
630 },
631 }
632
633 if !reflect.DeepEqual(database.images, expected) {
634 t.Fatal("Submitted image did not match", expected, database.images)
635 }
636}
637
638func TestRequestPitImages(t *testing.T) {
639 db := MockDatabase{
640 images: []db.PitImage{
641 {
642 TeamNumber: "932", ImagePath: "pitimage.jpg",
643 ImageData: []byte{3, 34, 44, 65}, CheckSum: "abcdf",
644 },
645 {
646 TeamNumber: "234", ImagePath: "234robot.png",
647 ImageData: []byte{64, 54, 21, 21, 76, 32}, CheckSum: "egrfd",
648 },
649 {
650 TeamNumber: "93A", ImagePath: "abcd.jpg",
651 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "rgegfd",
652 },
653 },
654 }
655
656 scoutingServer := server.NewScoutingServer()
657 HandleRequests(&db, scoutingServer)
658 scoutingServer.Start(8080)
659 defer scoutingServer.Stop()
660
661 builder := flatbuffers.NewBuilder(1024)
662 builder.Finish((&request_pit_images.RequestPitImagesT{"932"}).Pack(builder))
663
664 response, err := debug.RequestPitImages("http://localhost:8080", builder.FinishedBytes())
665 if err != nil {
666 t.Fatal("Failed to request pit images: ", err)
667 }
668
669 expected := request_pit_images_response.RequestPitImagesResponseT{
670 PitImageList: []*request_pit_images_response.PitImageT{
671 {
672 TeamNumber: "932", ImagePath: "pitimage.jpg", CheckSum: "abcdf",
673 },
674 },
675 }
676
677 if len(expected.PitImageList) != len(response.PitImageList) {
678 t.Fatal("Expected ", expected, ", but got ", *response)
679 }
680
681 for i, pit_image := range expected.PitImageList {
682 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
683 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
684 }
685 }
686}
687
Emily Markova8e39f452023-12-23 12:17:30 -0800688func TestRequestAllPitImages(t *testing.T) {
689 db := MockDatabase{
690 images: []db.PitImage{
691 {
692 TeamNumber: "32", ImagePath: "pitimage.jpg",
693 ImageData: []byte{3, 43, 44, 32}, CheckSum: "cdhrj",
694 },
695 {
696 TeamNumber: "231", ImagePath: "232robot.png",
697 ImageData: []byte{64, 54, 54, 21, 76, 32}, CheckSum: "rgre",
698 },
699 {
700 TeamNumber: "90", ImagePath: "abcd.jpg",
701 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "erfer",
702 },
703 },
704 }
705
706 scoutingServer := server.NewScoutingServer()
707 HandleRequests(&db, scoutingServer)
708 scoutingServer.Start(8080)
709 defer scoutingServer.Stop()
710
711 builder := flatbuffers.NewBuilder(1024)
712 builder.Finish((&request_all_pit_images.RequestAllPitImagesT{}).Pack(builder))
713
714 response, err := debug.RequestAllPitImages("http://localhost:8080", builder.FinishedBytes())
715 if err != nil {
716 t.Fatal("Failed to request pit images: ", err)
717 }
718
719 expected := request_all_pit_images_response.RequestAllPitImagesResponseT{
720 PitImageList: []*request_all_pit_images_response.PitImageT{
721 {
722 TeamNumber: "32", ImagePath: "pitimage.jpg", CheckSum: "cdhrj",
723 },
724 {
725 TeamNumber: "231", ImagePath: "232robot.png", CheckSum: "rgre",
726 },
727 {
728 TeamNumber: "90", ImagePath: "abcd.jpg", CheckSum: "erfer",
729 },
730 },
731 }
732
733 if len(expected.PitImageList) != len(response.PitImageList) {
734 t.Fatal("Expected ", expected, ", but got ", *response)
735 }
736
737 for i, pit_image := range expected.PitImageList {
738 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
739 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
740 }
741 }
742}
743
Milo Lin1d59f0c2022-06-22 20:30:58 -0700744func TestRequestShiftSchedule(t *testing.T) {
745 db := MockDatabase{
746 shiftSchedule: []db.Shift{
747 {
748 MatchNumber: 1,
749 R1scouter: "Bob",
750 R2scouter: "James",
751 R3scouter: "Robert",
752 B1scouter: "Alice",
753 B2scouter: "Mary",
754 B3scouter: "Patricia",
755 },
756 {
757 MatchNumber: 2,
758 R1scouter: "Liam",
759 R2scouter: "Noah",
760 R3scouter: "Oliver",
761 B1scouter: "Emma",
762 B2scouter: "Charlotte",
763 B3scouter: "Amelia",
764 },
765 },
766 }
767 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800768 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700769 scoutingServer.Start(8080)
770 defer scoutingServer.Stop()
771
772 builder := flatbuffers.NewBuilder(1024)
773 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
774
775 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
776 if err != nil {
777 t.Fatal("Failed to request shift schedule: ", err)
778 }
779
780 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
781 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
782 {
783 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700784 R1Scouter: "Bob",
785 R2Scouter: "James",
786 R3Scouter: "Robert",
787 B1Scouter: "Alice",
788 B2Scouter: "Mary",
789 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700790 },
791 {
792 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700793 R1Scouter: "Liam",
794 R2Scouter: "Noah",
795 R3Scouter: "Oliver",
796 B1Scouter: "Emma",
797 B2Scouter: "Charlotte",
798 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700799 },
800 },
801 }
802 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
803 t.Fatal("Expected ", expected, ", but got ", *response)
804 }
805 for i, match := range expected.ShiftSchedule {
806 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
807 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
808 }
809 }
810}
811
812func TestSubmitShiftSchedule(t *testing.T) {
813 database := MockDatabase{}
814 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800815 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700816 scoutingServer.Start(8080)
817 defer scoutingServer.Stop()
818
819 builder := flatbuffers.NewBuilder(1024)
820 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
821 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
822 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700823 R1Scouter: "Bob",
824 R2Scouter: "James",
825 R3Scouter: "Robert",
826 B1Scouter: "Alice",
827 B2Scouter: "Mary",
828 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700829 },
830 }).Pack(builder))
831
832 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
833 if err != nil {
834 t.Fatal("Failed to submit shift schedule: ", err)
835 }
836
837 expected := []db.Shift{
838 {MatchNumber: 1,
839 R1scouter: "Bob",
840 R2scouter: "James",
841 R3scouter: "Robert",
842 B1scouter: "Alice",
843 B2scouter: "Mary",
844 B3scouter: "Patricia"},
845 }
846 if !reflect.DeepEqual(expected, database.shiftSchedule) {
847 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
848 }
849}
850
Filip Kujawa210a03b2022-11-24 14:41:11 -0800851func TestSubmitDriverRanking(t *testing.T) {
852 database := MockDatabase{}
853 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800854 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800855 scoutingServer.Start(8080)
856 defer scoutingServer.Stop()
857
858 builder := flatbuffers.NewBuilder(1024)
859 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
860 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800861 Rank1: "1234",
862 Rank2: "1235",
863 Rank3: "1236",
Filip Kujawa210a03b2022-11-24 14:41:11 -0800864 }).Pack(builder))
865
866 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
867 if err != nil {
868 t.Fatal("Failed to submit driver ranking: ", err)
869 }
870
871 expected := []db.DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -0800872 {MatchNumber: 36, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -0800873 }
874
875 if !reflect.DeepEqual(database.driver_ranking, expected) {
876 t.Fatal("Submitted notes did not match", expected, database.notes)
877 }
878}
879
Filip Kujawaf882e022022-12-14 13:14:08 -0800880// Validates that we can request the driver rankings.
881func TestRequestDriverRankings(t *testing.T) {
882 db := MockDatabase{
883 driver_ranking: []db.DriverRankingData{
884 {
885 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800886 Rank1: "1234",
887 Rank2: "1235",
888 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -0800889 },
890 {
891 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800892 Rank1: "101",
893 Rank2: "202",
894 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -0800895 },
896 },
897 }
898 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800899 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800900 scoutingServer.Start(8080)
901 defer scoutingServer.Stop()
902
903 builder := flatbuffers.NewBuilder(1024)
904 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
905
906 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
907 if err != nil {
908 t.Fatal("Failed to request all driver rankings: ", err)
909 }
910
911 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
912 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
913 {
914 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800915 Rank1: "1234",
916 Rank2: "1235",
917 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -0800918 },
919 {
920 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800921 Rank1: "101",
922 Rank2: "202",
923 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -0800924 },
925 },
926 }
927 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
928 t.Fatal("Expected ", expected, ", but got ", *response)
929 }
930 for i, match := range expected.DriverRankingList {
931 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
932 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
933 }
934 }
935}
936
937// Validates that we can request all notes.
938func TestRequestAllNotes(t *testing.T) {
939 db := MockDatabase{
940 notes: []db.NotesData{
941 {
Emily Markovae68b7632023-12-30 14:17:55 -0800942 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800943 Notes: "Notes",
944 GoodDriving: true,
945 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700946 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800947 SketchyPlacing: false,
948 GoodDefense: true,
949 BadDefense: false,
950 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -0700951 NoShow: false,
952 MatchNumber: 4,
953 CompLevel: "qm",
954 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -0800955 },
956 {
Emily Markovae68b7632023-12-30 14:17:55 -0800957 TeamNumber: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800958 Notes: "More Notes",
959 GoodDriving: false,
960 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700961 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800962 SketchyPlacing: true,
963 GoodDefense: false,
964 BadDefense: true,
965 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -0700966 NoShow: false,
967 MatchNumber: 1,
968 CompLevel: "qm",
969 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -0800970 },
971 },
972 }
973 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800974 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800975 scoutingServer.Start(8080)
976 defer scoutingServer.Stop()
977
978 builder := flatbuffers.NewBuilder(1024)
979 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
980
981 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
982 if err != nil {
983 t.Fatal("Failed to request all notes: ", err)
984 }
985
986 expected := request_all_notes_response.RequestAllNotesResponseT{
987 NoteList: []*request_all_notes_response.NoteT{
988 {
Emily Markovae68b7632023-12-30 14:17:55 -0800989 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800990 Notes: "Notes",
991 GoodDriving: true,
992 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700993 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800994 SketchyPlacing: false,
995 GoodDefense: true,
996 BadDefense: false,
997 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -0700998 NoShow: false,
999 MatchNumber: 4,
1000 CompLevel: "qm",
1001 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -08001002 },
1003 {
Emily Markovae68b7632023-12-30 14:17:55 -08001004 Team: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001005 Notes: "More Notes",
1006 GoodDriving: false,
1007 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001008 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001009 SketchyPlacing: true,
1010 GoodDefense: false,
1011 BadDefense: true,
1012 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001013 NoShow: false,
1014 MatchNumber: 1,
1015 CompLevel: "qm",
1016 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -08001017 },
1018 },
1019 }
1020 if len(expected.NoteList) != len(response.NoteList) {
1021 t.Fatal("Expected ", expected, ", but got ", *response)
1022 }
1023 for i, note := range expected.NoteList {
1024 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
1025 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
1026 }
1027 }
1028}
1029
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001030func packAction(action *submit_actions.ActionT) []byte {
1031 builder := flatbuffers.NewBuilder(50 * 1024)
1032 builder.Finish((action).Pack(builder))
1033 return (builder.FinishedBytes())
1034}
1035
Emily Markova8cb91312024-02-02 12:30:37 -08001036func TestAddingActions2024(t *testing.T) {
1037 database := MockDatabase{}
1038 scoutingServer := server.NewScoutingServer()
1039 HandleRequests(&database, scoutingServer)
1040 scoutingServer.Start(8080)
1041 defer scoutingServer.Stop()
1042
1043 builder := flatbuffers.NewBuilder(1024)
1044 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
1045 TeamNumber: "3421",
1046 MatchNumber: 2,
1047 SetNumber: 1,
1048 CompLevel: "quals",
1049 ActionsList: []*submit_2024_actions.ActionT{
1050 {
1051 ActionTaken: &submit_2024_actions.ActionTypeT{
1052 Type: submit_2024_actions.ActionTypePickupNoteAction,
1053 Value: &submit_2024_actions.PickupNoteActionT{
1054 Auto: true,
1055 },
1056 },
1057 Timestamp: 1800,
1058 },
1059 {
1060 ActionTaken: &submit_2024_actions.ActionTypeT{
1061 Type: submit_2024_actions.ActionTypePlaceNoteAction,
1062 Value: &submit_2024_actions.PlaceNoteActionT{
1063 ScoreType: submit_2024_actions.ScoreTypekSPEAKER,
1064 Auto: false,
1065 },
1066 },
1067 Timestamp: 2500,
1068 },
1069 },
Emily Markova9c18e9c2024-04-03 20:06:27 -07001070 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001071 }).Pack(builder))
1072
1073 _, err := debug.Submit2024Actions("http://localhost:8080", builder.FinishedBytes())
1074 if err != nil {
1075 t.Fatal("Failed to submit actions: ", err)
1076 }
1077
1078 expectedActions := []db.Action{
1079 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001080 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001081 TeamNumber: "3421",
1082 MatchNumber: 2,
1083 SetNumber: 1,
1084 CompLevel: "quals",
1085 CollectedBy: "debug_cli",
1086 CompletedAction: []byte{},
1087 Timestamp: 1800,
1088 },
1089 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001090 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001091 TeamNumber: "3421",
1092 MatchNumber: 2,
1093 SetNumber: 1,
1094 CompLevel: "quals",
1095 CollectedBy: "debug_cli",
1096 CompletedAction: []byte{},
1097 Timestamp: 2500,
1098 },
1099 }
1100
1101 expectedStats := []db.Stats2024{
1102 db.Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -07001103 CompType: "Prescouting", TeamNumber: "3421",
Emily Markova8cb91312024-02-02 12:30:37 -08001104 MatchNumber: 2, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 0,
1105 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001106 Speaker: 1, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001107 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markova040123c2024-02-27 09:48:37 -08001108 Park: false, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "debug_cli",
Emily Markova8cb91312024-02-02 12:30:37 -08001109 },
1110 }
1111
1112 if !reflect.DeepEqual(expectedActions, database.actions) {
1113 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1114 }
1115 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1116 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1117 }
1118}
1119
Emily Markova8cb91312024-02-02 12:30:37 -08001120// Validates that we can delete 2024 stats.
1121func TestDeleteFromStats2024(t *testing.T) {
1122 database := MockDatabase{
1123 stats2024: []db.Stats2024{
1124 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001125 CompType: "Practice", TeamNumber: "746",
Emily Markova8cb91312024-02-02 12:30:37 -08001126 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1127 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001128 Speaker: 0, Amp: 1, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -08001129 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markova040123c2024-02-27 09:48:37 -08001130 Park: false, OnStage: false, Harmony: true, RobotDied: false, CollectedBy: "alek",
Emily Markova8cb91312024-02-02 12:30:37 -08001131 },
1132 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001133 CompType: "Regular", TeamNumber: "244",
Emily Markova8cb91312024-02-02 12:30:37 -08001134 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1135 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001136 Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001137 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markova040123c2024-02-27 09:48:37 -08001138 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001139 },
1140 },
1141 actions: []db.Action{
1142 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001143 CompType: "Practice",
Emily Markova8cb91312024-02-02 12:30:37 -08001144 TeamNumber: "746",
1145 MatchNumber: 3,
1146 SetNumber: 1,
1147 CompLevel: "quals",
1148 CollectedBy: "debug_cli",
1149 CompletedAction: []byte{},
1150 Timestamp: 2400,
1151 },
1152 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001153 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001154 TeamNumber: "244",
1155 MatchNumber: 5,
1156 SetNumber: 3,
1157 CompLevel: "quals",
1158 CollectedBy: "debug_cli",
1159 CompletedAction: []byte{},
1160 Timestamp: 1009,
1161 },
1162 },
1163 }
1164 scoutingServer := server.NewScoutingServer()
1165 HandleRequests(&database, scoutingServer)
1166 scoutingServer.Start(8080)
1167 defer scoutingServer.Stop()
1168
1169 builder := flatbuffers.NewBuilder(1024)
1170 builder.Finish((&delete_2024_data_scouting.Delete2024DataScoutingT{
1171 CompLevel: "quals",
1172 MatchNumber: 3,
1173 SetNumber: 1,
1174 TeamNumber: "746",
1175 }).Pack(builder))
1176
1177 _, err := debug.Delete2024DataScouting("http://localhost:8080", builder.FinishedBytes())
1178 if err != nil {
1179 t.Fatal("Failed to delete from data scouting 2024", err)
1180 }
1181
1182 expectedActions := []db.Action{
1183 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001184 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001185 TeamNumber: "244",
1186 MatchNumber: 5,
1187 SetNumber: 3,
1188 CompLevel: "quals",
1189 CollectedBy: "debug_cli",
1190 CompletedAction: []byte{},
1191 Timestamp: 1009,
1192 },
1193 }
1194
1195 expectedStats := []db.Stats2024{
1196 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001197 CompType: "Regular", TeamNumber: "244",
Emily Markova8cb91312024-02-02 12:30:37 -08001198 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1199 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001200 Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001201 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markova040123c2024-02-27 09:48:37 -08001202 Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001203 },
1204 }
1205
1206 if !reflect.DeepEqual(expectedActions, database.actions) {
1207 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1208 }
1209 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1210 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1211 }
1212}
1213
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001214// A mocked database we can use for testing. Add functionality to this as
1215// needed for your tests.
1216
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001217type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001218 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -08001219 notes []db.NotesData
1220 shiftSchedule []db.Shift
1221 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -08001222 stats2023 []db.Stats2023
Emily Markova8cb91312024-02-02 12:30:37 -08001223 stats2024 []db.Stats2024
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001224 actions []db.Action
Emily Markovafaecfe12023-07-01 12:40:03 -07001225 images []db.PitImage
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001226}
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001227
Emily Markovabf24c9e2023-02-08 20:31:11 -08001228func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -08001229 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001230 return nil
1231}
1232
Emily Markova290147d2023-03-03 22:40:06 -08001233func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
1234 database.stats2023 = append(database.stats2023, stats2023)
1235 return nil
1236}
Emily Markova8cb91312024-02-02 12:30:37 -08001237
1238func (database *MockDatabase) AddToStats2024(stats2024 db.Stats2024) error {
1239 database.stats2024 = append(database.stats2024, stats2024)
1240 return nil
1241}
Emily Markovabf24c9e2023-02-08 20:31:11 -08001242func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001243 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001244}
1245
Emily Markova290147d2023-03-03 22:40:06 -08001246func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
1247 return database.stats2023, nil
1248}
1249
Emily Markova8cb91312024-02-02 12:30:37 -08001250func (database *MockDatabase) ReturnStats2024() ([]db.Stats2024, error) {
1251 return database.stats2024, nil
1252}
1253
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001254func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error) {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001255 var results []db.Stats2023
1256 for _, stats := range database.stats2023 {
Filip Kujawaf3f9def2023-04-20 13:46:46 -07001257 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.PreScouting == preScouting {
Philipp Schrader0f7b6362023-03-11 14:02:48 -08001258 results = append(results, stats)
1259 }
1260 }
1261 return results, nil
1262}
1263
Emily Markova9c18e9c2024-04-03 20:06:27 -07001264func (database *MockDatabase) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, compType string) ([]db.Stats2024, error) {
Emily Markova8cb91312024-02-02 12:30:37 -08001265 var results []db.Stats2024
1266 for _, stats := range database.stats2024 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001267 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.CompType == compType {
Emily Markova8cb91312024-02-02 12:30:37 -08001268 results = append(results, stats)
1269 }
1270 }
1271 return results, nil
1272}
1273
Emily Markovae68b7632023-12-30 14:17:55 -08001274func (database *MockDatabase) QueryNotes(requestedTeam string) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -07001275 var results []string
1276 for _, data := range database.notes {
1277 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -07001278 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -07001279 }
1280 }
Philipp Schradereecb8962022-06-01 21:02:42 -07001281 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -07001282}
1283
Filip Kujawaf947cb42022-11-21 10:00:30 -08001284func (database *MockDatabase) AddNotes(data db.NotesData) error {
1285 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -07001286 return nil
1287}
1288
Filip Kujawaf882e022022-12-14 13:14:08 -08001289func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
1290 return database.notes, nil
1291}
1292
Milo Lin1d59f0c2022-06-22 20:30:58 -07001293func (database *MockDatabase) AddToShift(data db.Shift) error {
1294 database.shiftSchedule = append(database.shiftSchedule, data)
1295 return nil
1296}
1297
1298func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
1299 return database.shiftSchedule, nil
1300}
1301
1302func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
1303 return []db.Shift{}, nil
1304}
1305
Emily Markovafaecfe12023-07-01 12:40:03 -07001306func (database *MockDatabase) QueryPitImages(requestedTeam string) ([]db.RequestedPitImage, error) {
1307 var results []db.RequestedPitImage
1308 for _, data := range database.images {
1309 if data.TeamNumber == requestedTeam {
1310 results = append(results, db.RequestedPitImage{
1311 TeamNumber: data.TeamNumber,
1312 ImagePath: data.ImagePath,
1313 CheckSum: data.CheckSum,
1314 })
1315 }
1316 }
1317 return results, nil
1318}
1319
Filip Kujawa210a03b2022-11-24 14:41:11 -08001320func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
1321 database.driver_ranking = append(database.driver_ranking, data)
1322 return nil
1323}
1324
Filip Kujawaf882e022022-12-14 13:14:08 -08001325func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
1326 return database.driver_ranking, nil
1327}
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001328
1329func (database *MockDatabase) AddAction(action db.Action) error {
1330 database.actions = append(database.actions, action)
1331 return nil
1332}
1333
Emily Markovafaecfe12023-07-01 12:40:03 -07001334func (database *MockDatabase) AddPitImage(pitImage db.PitImage) error {
1335 database.images = append(database.images, pitImage)
1336 return nil
1337}
1338
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001339func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
1340 return database.actions, nil
1341}
Filip Kujawac1ded372023-05-27 14:33:43 -07001342
Emily Markova8e39f452023-12-23 12:17:30 -08001343func (database *MockDatabase) ReturnPitImages() ([]db.PitImage, error) {
1344 return database.images, nil
1345}
1346
Filip Kujawac1ded372023-05-27 14:33:43 -07001347func (database *MockDatabase) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1348 for i, stat := range database.stats2023 {
1349 if stat.CompLevel == compLevel_ &&
1350 stat.MatchNumber == matchNumber_ &&
1351 stat.SetNumber == setNumber_ &&
1352 stat.TeamNumber == teamNumber_ {
1353 // Match found, remove the element from the array.
1354 database.stats2023 = append(database.stats2023[:i], database.stats2023[i+1:]...)
1355 }
1356 }
1357 return nil
1358}
1359
Emily Markova8cb91312024-02-02 12:30:37 -08001360func (database *MockDatabase) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1361 for i, stat := range database.stats2024 {
1362 if stat.CompLevel == compLevel_ &&
1363 stat.MatchNumber == matchNumber_ &&
1364 stat.SetNumber == setNumber_ &&
1365 stat.TeamNumber == teamNumber_ {
1366 // Match found, remove the element from the array.
1367 database.stats2024 = append(database.stats2024[:i], database.stats2024[i+1:]...)
1368 }
1369 }
1370 return nil
1371}
1372
Filip Kujawac1ded372023-05-27 14:33:43 -07001373func (database *MockDatabase) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1374 for i, action := range database.actions {
1375 if action.CompLevel == compLevel_ &&
1376 action.MatchNumber == matchNumber_ &&
1377 action.SetNumber == setNumber_ &&
1378 action.TeamNumber == teamNumber_ {
1379 // Match found, remove the element from the array.
1380 database.actions = append(database.actions[:i], database.actions[i+1:]...)
1381 }
1382 }
1383 return nil
1384}