blob: a84157959c1ac585ced9843e2b62cdcb99c85fac [file] [log] [blame]
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08001package requests
2
3import (
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08004 "net/http"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08005 "reflect"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08006 "testing"
Emily Markova521725a2024-03-21 18:46:04 -07007 "time"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08008
Philipp Schrader8747f1b2022-02-23 23:56:22 -08009 "github.com/frc971/971-Robot-Code/scouting/db"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080010 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/debug"
Emily Markova8cb91312024-02-02 12:30:37 -080011 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/delete_2024_data_scouting"
Emily Markova8cb91312024-02-02 12:30:37 -080012 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2024_data_scouting"
13 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2024_data_scouting_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080014 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
15 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080016 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
17 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080018 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
19 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
Emily Markova8e39f452023-12-23 12:17:30 -080020 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images"
21 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images_response"
Emily Markova521725a2024-03-21 18:46:04 -070022 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_current_scouting"
23 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_current_scouting_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Emily Markovafaecfe12023-07-01 12:40:03 -070025 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images"
26 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images_response"
Milo Lin1d59f0c2022-06-22 20:30:58 -070027 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
28 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Emily Markova8cb91312024-02-02 12:30:37 -080029 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_2024_actions"
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
Emily Markova521725a2024-03-21 18:46:04 -070038type MockClock struct {
39 now time.Time
40}
41
42func (mockClock MockClock) Now() time.Time {
43 return mockClock.now
44}
45
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080046// Validates that an unhandled address results in a 404.
47func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080048 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080049 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -070050 mockClock := MockClock{now: time.Now()}
51 HandleRequests(&db, scoutingServer, &mockClock)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080052 scoutingServer.Start(8080)
53 defer scoutingServer.Stop()
54
55 resp, err := http.Get("http://localhost:8080/requests/foo")
56 if err != nil {
57 t.Fatalf("Failed to get data: %v", err)
58 }
59 if resp.StatusCode != http.StatusNotFound {
60 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
61 }
62}
63
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080064// Validates that we can request the full match list.
65func TestRequestAllMatches(t *testing.T) {
66 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -080067 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080068 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080069 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070070 Alliance: "R", AlliancePosition: 1, TeamNumber: "5",
Emily Markovabf24c9e2023-02-08 20:31:11 -080071 },
72 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080073 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070074 Alliance: "R", AlliancePosition: 2, TeamNumber: "42",
Emily Markovabf24c9e2023-02-08 20:31:11 -080075 },
76 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080077 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070078 Alliance: "R", AlliancePosition: 3, TeamNumber: "600",
Emily Markovabf24c9e2023-02-08 20:31:11 -080079 },
80 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080081 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070082 Alliance: "B", AlliancePosition: 1, TeamNumber: "971",
Emily Markovabf24c9e2023-02-08 20:31:11 -080083 },
84 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080085 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070086 Alliance: "B", AlliancePosition: 2, TeamNumber: "400",
Emily Markovabf24c9e2023-02-08 20:31:11 -080087 },
88 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080089 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070090 Alliance: "B", AlliancePosition: 3, TeamNumber: "200",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080091 },
92 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080093 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070094 Alliance: "R", AlliancePosition: 1, TeamNumber: "6",
Emily Markovabf24c9e2023-02-08 20:31:11 -080095 },
96 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080097 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070098 Alliance: "R", AlliancePosition: 2, TeamNumber: "43",
Emily Markovabf24c9e2023-02-08 20:31:11 -080099 },
100 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800101 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700102 Alliance: "R", AlliancePosition: 3, TeamNumber: "601",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800103 },
104 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800105 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700106 Alliance: "B", AlliancePosition: 1, TeamNumber: "972",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800107 },
108 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800109 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700110 Alliance: "B", AlliancePosition: 2, TeamNumber: "401",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800111 },
112 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800113 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700114 Alliance: "B", AlliancePosition: 3, TeamNumber: "201",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800115 },
116 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800117 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700118 Alliance: "R", AlliancePosition: 1, TeamNumber: "7",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800119 },
120 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800121 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700122 Alliance: "R", AlliancePosition: 2, TeamNumber: "44",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800123 },
124 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800125 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700126 Alliance: "R", AlliancePosition: 3, TeamNumber: "602",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800127 },
128 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800129 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700130 Alliance: "B", AlliancePosition: 1, TeamNumber: "973",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800131 },
132 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800133 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700134 Alliance: "B", AlliancePosition: 2, TeamNumber: "402",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800135 },
136 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800137 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700138 Alliance: "B", AlliancePosition: 3, TeamNumber: "202",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800139 },
140 },
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800141 // Pretend that we have some data scouting data.
Emily Markovadcadcb62024-02-03 13:07:17 -0800142 stats2024: []db.Stats2024{
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800143 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700144 CompType: "Regular", TeamNumber: "5",
Emily Markovadcadcb62024-02-03 13:07:17 -0800145 MatchNumber: 1, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 3,
146 SpeakerAuto: 2, AmpAuto: 4, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700147 Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 1, OutOfField: 2,
Emily Markova040123c2024-02-27 09:48:37 -0800148 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markovaf17f2812024-04-03 20:55:12 -0700149 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800150 },
151 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700152 CompType: "Regular", TeamNumber: "973",
Emily Markovadcadcb62024-02-03 13:07:17 -0800153 MatchNumber: 3, SetNumber: 1, CompLevel: "qm", StartingQuadrant: 1,
154 SpeakerAuto: 0, AmpAuto: 2, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700155 Speaker: 0, Amp: 4, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800156 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 120,
Emily Markovaf17f2812024-04-03 20:55:12 -0700157 Park: true, OnStage: false, Harmony: false, RobotDied: true, NoShow: false, CollectedBy: "bob",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800158 },
159 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800160 }
161 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700162 mockClock := MockClock{now: time.Now()}
163 HandleRequests(&db, scoutingServer, mockClock)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800164 scoutingServer.Start(8080)
165 defer scoutingServer.Stop()
166
167 builder := flatbuffers.NewBuilder(1024)
168 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
169
170 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
171 if err != nil {
172 t.Fatal("Failed to request all matches: ", err)
173 }
174
175 expected := request_all_matches_response.RequestAllMatchesResponseT{
176 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700177 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800178 // R1, R2, R3, B1, B2, B3
179 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800180 1, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700181 "5", "42", "600", "971", "400", "200",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800182 &request_all_matches_response.ScoutedLevelT{
183 // The R1 team has already been data
184 // scouted.
185 true, false, false, false, false, false,
186 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800187 },
188 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800189 2, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700190 "6", "43", "601", "972", "401", "201",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800191 &request_all_matches_response.ScoutedLevelT{
192 false, false, false, false, false, false,
193 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800194 },
195 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800196 3, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700197 "7", "44", "602", "973", "402", "202",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800198 &request_all_matches_response.ScoutedLevelT{
199 // The B1 team has already been data
200 // scouted.
201 false, false, false, true, false, false,
202 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800203 },
204 },
205 }
206 if len(expected.MatchList) != len(response.MatchList) {
207 t.Fatal("Expected ", expected, ", but got ", *response)
208 }
209 for i, match := range expected.MatchList {
210 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
211 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
212 }
213 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800214
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800215}
216
Emily Markova8cb91312024-02-02 12:30:37 -0800217// Validates that we can request the 2024 stats.
218func TestRequest2024DataScouting(t *testing.T) {
219 db := MockDatabase{
220 stats2024: []db.Stats2024{
221 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700222 CompType: "Regular", TeamNumber: "342",
Emily Markova8cb91312024-02-02 12:30:37 -0800223 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
224 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700225 Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800226 NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700227 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
228 },
229 {
230 CompType: "Regular", TeamNumber: "132",
231 MatchNumber: 4, SetNumber: 2, CompLevel: "quals", StartingQuadrant: 0,
232 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
233 Speaker: 0, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 1,
234 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
235 Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "jeff",
Emily Markova8cb91312024-02-02 12:30:37 -0800236 },
237 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700238 CompType: "Regular", TeamNumber: "982",
Emily Markova8cb91312024-02-02 12:30:37 -0800239 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
240 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700241 Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800242 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700243 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "george",
Emily Markova8cb91312024-02-02 12:30:37 -0800244 },
245 },
246 }
247 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700248 mockClock := MockClock{now: time.Now()}
249 HandleRequests(&db, scoutingServer, mockClock)
Emily Markova8cb91312024-02-02 12:30:37 -0800250 scoutingServer.Start(8080)
251 defer scoutingServer.Stop()
252
253 builder := flatbuffers.NewBuilder(1024)
254 builder.Finish((&request_2024_data_scouting.Request2024DataScoutingT{}).Pack(builder))
255
256 response, err := debug.Request2024DataScouting("http://localhost:8080", builder.FinishedBytes())
257 if err != nil {
258 t.Fatal("Failed to request all matches: ", err)
259 }
260
261 expected := request_2024_data_scouting_response.Request2024DataScoutingResponseT{
262 StatsList: []*request_2024_data_scouting_response.Stats2024T{
263 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700264 CompType: "Regular", TeamNumber: "342",
Emily Markova8cb91312024-02-02 12:30:37 -0800265 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
266 SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700267 Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -0800268 NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700269 Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
270 },
271 {
272 CompType: "Regular", TeamNumber: "132",
273 MatchNumber: 4, SetNumber: 2, CompLevel: "quals", StartingQuadrant: 0,
274 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
275 Speaker: 0, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 1,
276 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
277 Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "jeff",
Emily Markova8cb91312024-02-02 12:30:37 -0800278 },
279 {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700280 CompType: "Regular", TeamNumber: "982",
Emily Markova8cb91312024-02-02 12:30:37 -0800281 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
282 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -0700283 Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -0800284 NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -0700285 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "george",
Emily Markova8cb91312024-02-02 12:30:37 -0800286 },
287 },
288 }
289 if len(expected.StatsList) != len(response.StatsList) {
290 t.Fatal("Expected ", expected, ", but got ", *response)
291 }
292 for i, match := range expected.StatsList {
293 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
294 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
295 }
296 }
297}
298
Emily Markova8cb91312024-02-02 12:30:37 -0800299// Validates that we can request the 2024 stats.
300func TestConvertActionsToStat2024(t *testing.T) {
301 builder := flatbuffers.NewBuilder(1024)
302 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
303 TeamNumber: "4244",
304 MatchNumber: 3,
305 SetNumber: 1,
306 CompLevel: "quals",
307 ActionsList: []*submit_2024_actions.ActionT{
308 {
309 ActionTaken: &submit_2024_actions.ActionTypeT{
310 Type: submit_2024_actions.ActionTypeStartMatchAction,
311 Value: &submit_2024_actions.StartMatchActionT{
312 Position: 2,
313 },
314 },
315 Timestamp: 0,
316 },
317 {
318 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markovaf17f2812024-04-03 20:55:12 -0700319 Type: submit_2024_actions.ActionTypeNoShowAction,
320 Value: &submit_2024_actions.NoShowActionT{},
321 },
322 Timestamp: 200,
323 },
324 {
325 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markova8cb91312024-02-02 12:30:37 -0800326 Type: submit_2024_actions.ActionTypePickupNoteAction,
327 Value: &submit_2024_actions.PickupNoteActionT{
328 Auto: true,
329 },
330 },
Emily Markova8cb91312024-02-02 12:30:37 -0800331 Timestamp: 800,
332 },
333 {
334 ActionTaken: &submit_2024_actions.ActionTypeT{
335 Type: submit_2024_actions.ActionTypePlaceNoteAction,
336 Value: &submit_2024_actions.PlaceNoteActionT{
337 ScoreType: submit_2024_actions.ScoreTypekAMP,
338 Auto: true,
339 },
340 },
341 Timestamp: 2000,
342 },
343 {
344 ActionTaken: &submit_2024_actions.ActionTypeT{
345 Type: submit_2024_actions.ActionTypeMobilityAction,
346 Value: &submit_2024_actions.MobilityActionT{
347 Mobility: true,
348 },
349 },
350 Timestamp: 2200,
351 },
352 {
353 ActionTaken: &submit_2024_actions.ActionTypeT{
Emily Markovadcadcb62024-02-03 13:07:17 -0800354 Type: submit_2024_actions.ActionTypePenaltyAction,
355 Value: &submit_2024_actions.PenaltyActionT{
356 Penalties: 5,
357 },
Emily Markova8cb91312024-02-02 12:30:37 -0800358 },
359 Timestamp: 2400,
360 },
361 {
362 ActionTaken: &submit_2024_actions.ActionTypeT{
363 Type: submit_2024_actions.ActionTypePickupNoteAction,
364 Value: &submit_2024_actions.PickupNoteActionT{
365 Auto: false,
366 },
367 },
368 Timestamp: 2800,
369 },
370 {
371 ActionTaken: &submit_2024_actions.ActionTypeT{
372 Type: submit_2024_actions.ActionTypePlaceNoteAction,
373 Value: &submit_2024_actions.PlaceNoteActionT{
Emily Markovacd156942024-04-07 19:32:28 -0700374 ScoreType: submit_2024_actions.ScoreTypekSHUTTLED,
Emily Markova8cb91312024-02-02 12:30:37 -0800375 Auto: false,
376 },
377 },
378 Timestamp: 3100,
379 },
380 {
381 ActionTaken: &submit_2024_actions.ActionTypeT{
382 Type: submit_2024_actions.ActionTypePickupNoteAction,
383 Value: &submit_2024_actions.PickupNoteActionT{
384 Auto: false,
385 },
386 },
Emily Markova040123c2024-02-27 09:48:37 -0800387 Timestamp: 3200,
388 },
389 {
390 ActionTaken: &submit_2024_actions.ActionTypeT{
391 Type: submit_2024_actions.ActionTypePlaceNoteAction,
392 Value: &submit_2024_actions.PlaceNoteActionT{
393 ScoreType: submit_2024_actions.ScoreTypekDROPPED,
394 Auto: false,
395 },
396 },
397 Timestamp: 3300,
398 },
399 {
400 ActionTaken: &submit_2024_actions.ActionTypeT{
401 Type: submit_2024_actions.ActionTypeRobotDeathAction,
402 Value: &submit_2024_actions.RobotDeathActionT{
403 RobotDead: true,
404 },
405 },
406 Timestamp: 3400,
407 },
408 {
409 ActionTaken: &submit_2024_actions.ActionTypeT{
410 Type: submit_2024_actions.ActionTypeRobotDeathAction,
411 Value: &submit_2024_actions.RobotDeathActionT{
412 RobotDead: false,
413 },
414 },
415 Timestamp: 3450,
416 },
417 {
418 ActionTaken: &submit_2024_actions.ActionTypeT{
419 Type: submit_2024_actions.ActionTypePickupNoteAction,
420 Value: &submit_2024_actions.PickupNoteActionT{
421 Auto: false,
422 },
423 },
Emily Markova8cb91312024-02-02 12:30:37 -0800424 Timestamp: 3500,
425 },
426 {
427 ActionTaken: &submit_2024_actions.ActionTypeT{
428 Type: submit_2024_actions.ActionTypePlaceNoteAction,
429 Value: &submit_2024_actions.PlaceNoteActionT{
430 ScoreType: submit_2024_actions.ScoreTypekSPEAKER_AMPLIFIED,
431 Auto: false,
432 },
433 },
434 Timestamp: 3900,
435 },
436 {
437 ActionTaken: &submit_2024_actions.ActionTypeT{
438 Type: submit_2024_actions.ActionTypeEndMatchAction,
439 Value: &submit_2024_actions.EndMatchActionT{
440 StageType: submit_2024_actions.StageTypekHARMONY,
441 TrapNote: false,
Emily Markova6079e2f2024-02-17 13:17:24 -0800442 Spotlight: false,
Emily Markova8cb91312024-02-02 12:30:37 -0800443 },
444 },
445 Timestamp: 4200,
446 },
447 },
Emily Markova9c18e9c2024-04-03 20:06:27 -0700448 CompType: "Regular",
Emily Markova8cb91312024-02-02 12:30:37 -0800449 }).Pack(builder))
450
451 submit2024Actions := submit_2024_actions.GetRootAsSubmit2024Actions(builder.FinishedBytes(), 0)
452 response, err := ConvertActionsToStat2024(submit2024Actions)
453
454 if err != nil {
455 t.Fatal("Failed to convert actions to stats: ", err)
456 }
457
458 expected := db.Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -0700459 CompType: "Regular", TeamNumber: "4244",
Emily Markova8cb91312024-02-02 12:30:37 -0800460 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
Emily Markova040123c2024-02-27 09:48:37 -0800461 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -0700462 Speaker: 0, Amp: 0, SpeakerAmplified: 1, Shuttled: 1, OutOfField: 0,
463 NotesDropped: 1, Penalties: 5, TrapNote: false, Spotlight: false, AvgCycle: 950,
Emily Markovaf17f2812024-04-03 20:55:12 -0700464 Park: false, OnStage: false, Harmony: true, RobotDied: true, NoShow: true, CollectedBy: "",
Emily Markova8cb91312024-02-02 12:30:37 -0800465 }
466
467 if expected != response {
468 t.Fatal("Expected ", expected, ", but got ", response)
469 }
470}
471
Alex Perry81f96ba2022-03-13 18:26:19 -0700472func TestSubmitNotes(t *testing.T) {
473 database := MockDatabase{}
474 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700475 mockClock := MockClock{now: time.Now()}
476 HandleRequests(&database, scoutingServer, mockClock)
Alex Perry81f96ba2022-03-13 18:26:19 -0700477 scoutingServer.Start(8080)
478 defer scoutingServer.Stop()
479
480 builder := flatbuffers.NewBuilder(1024)
481 builder.Finish((&submit_notes.SubmitNotesT{
Emily Markovae68b7632023-12-30 14:17:55 -0800482 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800483 Notes: "Notes",
484 GoodDriving: true,
485 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700486 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800487 SketchyPlacing: false,
488 GoodDefense: true,
489 BadDefense: false,
490 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700491 NoShow: false,
492 MatchNumber: 4,
493 CompLevel: "qm",
494 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700495 }).Pack(builder))
496
497 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
498 if err != nil {
499 t.Fatal("Failed to submit notes: ", err)
500 }
501
502 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800503 {
Emily Markovae68b7632023-12-30 14:17:55 -0800504 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800505 Notes: "Notes",
506 GoodDriving: true,
507 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700508 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800509 SketchyPlacing: false,
510 GoodDefense: true,
511 BadDefense: false,
512 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700513 NoShow: false,
514 MatchNumber: 4,
515 CompLevel: "qm",
516 SetNumber: 1,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800517 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700518 }
519
520 if !reflect.DeepEqual(database.notes, expected) {
521 t.Fatal("Submitted notes did not match", expected, database.notes)
522 }
523}
524
Emily Markova521725a2024-03-21 18:46:04 -0700525// Validates that we can request names of peoples who are currently scouting the same team.
526func TestRequestCurrentScouting(t *testing.T) {
527 database := MockDatabase{}
528 scoutingServer := server.NewScoutingServer()
529 mockClock := MockClock{now: time.Now()}
530 HandleRequests(&database, scoutingServer, mockClock)
531 scoutingServer.Start(8080)
532 defer scoutingServer.Stop()
533
534 builder := flatbuffers.NewBuilder(1024)
535 builder.Finish((&request_current_scouting.RequestCurrentScoutingT{
536 TeamNumber: "971",
537 }).Pack(builder))
538 response, err := debug.RequestCurrentScouting("http://localhost:8080", builder.FinishedBytes())
539 if err != nil {
540 t.Fatal("Failed to request current scouting: ", err)
541 }
542
543 expected := request_current_scouting_response.RequestCurrentScoutingResponseT{
544 CollectedBy: []*request_current_scouting_response.CollectedByT{},
545 }
546
547 if len(expected.CollectedBy) != len(response.CollectedBy) {
548 t.Fatal("Expected ", expected, ", but got ", *response)
549 }
550 for i, collectRecord := range expected.CollectedBy {
551 if !reflect.DeepEqual(*collectRecord, *response.CollectedBy[i]) {
552 t.Fatal("Expected for collected by ", i, ":", *collectRecord, ", but got:", *response.CollectedBy[i])
553 }
554 }
555
556 debug.Username = "george"
557 builder.Finish((&request_current_scouting.RequestCurrentScoutingT{
558 TeamNumber: "971",
559 }).Pack(builder))
560 response, err = debug.RequestCurrentScouting("http://localhost:8080", builder.FinishedBytes())
561 if err != nil {
562 t.Fatal("Failed to request current scouting: ", err)
563 }
564
565 expected = request_current_scouting_response.RequestCurrentScoutingResponseT{
566 CollectedBy: []*request_current_scouting_response.CollectedByT{
567 {"debug_cli"},
568 },
569 }
570
571 if len(expected.CollectedBy) != len(response.CollectedBy) {
572 t.Fatal("Expected ", expected, ", but got ", *response)
573 }
574
575 for i, collectRecord := range expected.CollectedBy {
576 if !reflect.DeepEqual(*collectRecord, *response.CollectedBy[i]) {
577 t.Fatal("Expected for collected by ", i, ":", *collectRecord, ", but got:", *response.CollectedBy[i])
578 }
579 }
580
581 // After skipping 10 seconds ahead, the previous request from "debug_cli" should no longer appear.
582 mockClock.now = mockClock.now.Add(time.Second * 10)
583
584 builder.Finish((&request_current_scouting.RequestCurrentScoutingT{
585 TeamNumber: "971",
586 }).Pack(builder))
587 response, err = debug.RequestCurrentScouting("http://localhost:8080", builder.FinishedBytes())
588 if err != nil {
589 t.Fatal("Failed to request current scouting: ", err)
590 }
591
592 expected = request_current_scouting_response.RequestCurrentScoutingResponseT{
593 CollectedBy: []*request_current_scouting_response.CollectedByT{},
594 }
595
596 // Reset username for other tests.
597 debug.Username = "debug_cli"
598}
599
Alex Perry81f96ba2022-03-13 18:26:19 -0700600func TestRequestNotes(t *testing.T) {
601 database := MockDatabase{
602 notes: []db.NotesData{{
Emily Markovae68b7632023-12-30 14:17:55 -0800603 TeamNumber: "971A",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800604 Notes: "Notes",
605 GoodDriving: true,
606 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700607 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800608 SketchyPlacing: false,
609 GoodDefense: true,
610 BadDefense: false,
611 EasilyDefended: true,
Emily Markovacf893f42024-03-13 19:03:10 -0700612 NoShow: false,
613 MatchNumber: 4,
614 CompLevel: "qm",
615 SetNumber: 1,
Alex Perry81f96ba2022-03-13 18:26:19 -0700616 }},
617 }
618 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700619 mockClock := MockClock{now: time.Now()}
620 HandleRequests(&database, scoutingServer, mockClock)
Alex Perry81f96ba2022-03-13 18:26:19 -0700621 scoutingServer.Start(8080)
622 defer scoutingServer.Stop()
623
624 builder := flatbuffers.NewBuilder(1024)
625 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
Emily Markovae68b7632023-12-30 14:17:55 -0800626 Team: "971A",
Alex Perry81f96ba2022-03-13 18:26:19 -0700627 }).Pack(builder))
628 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
629 if err != nil {
630 t.Fatal("Failed to submit notes: ", err)
631 }
632
633 if response.Notes[0].Data != "Notes" {
634 t.Fatal("requested notes did not match", response)
635 }
636}
637
Emily Markovafaecfe12023-07-01 12:40:03 -0700638func TestSubmitPitImage(t *testing.T) {
639 database := MockDatabase{}
640 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700641 mockClock := MockClock{now: time.Now()}
642 HandleRequests(&database, scoutingServer, mockClock)
Emily Markovafaecfe12023-07-01 12:40:03 -0700643 scoutingServer.Start(8080)
644 defer scoutingServer.Stop()
645
646 builder := flatbuffers.NewBuilder(1024)
647 builder.Finish((&submit_pit_image.SubmitPitImageT{
648 TeamNumber: "483A", ImagePath: "483Arobot.jpg",
649 ImageData: []byte{12, 43, 54, 34, 98},
650 }).Pack(builder))
651
652 _, err := debug.SubmitPitImage("http://localhost:8080", builder.FinishedBytes())
653 if err != nil {
654 t.Fatal("Failed to submit pit image: ", err)
655 }
656
657 expected := []db.PitImage{
658 {
659 TeamNumber: "483A", CheckSum: "177d9dc52bc25f391232e82521259c378964c068832a9178d73448ba4ac5e0b1",
660 ImagePath: "483Arobot.jpg", ImageData: []byte{12, 43, 54, 34, 98},
661 },
662 }
663
664 if !reflect.DeepEqual(database.images, expected) {
665 t.Fatal("Submitted image did not match", expected, database.images)
666 }
667}
668
669func TestRequestPitImages(t *testing.T) {
670 db := MockDatabase{
671 images: []db.PitImage{
672 {
673 TeamNumber: "932", ImagePath: "pitimage.jpg",
674 ImageData: []byte{3, 34, 44, 65}, CheckSum: "abcdf",
675 },
676 {
677 TeamNumber: "234", ImagePath: "234robot.png",
678 ImageData: []byte{64, 54, 21, 21, 76, 32}, CheckSum: "egrfd",
679 },
680 {
681 TeamNumber: "93A", ImagePath: "abcd.jpg",
682 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "rgegfd",
683 },
684 },
685 }
686
687 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700688 mockClock := MockClock{now: time.Now()}
689 HandleRequests(&db, scoutingServer, mockClock)
Emily Markovafaecfe12023-07-01 12:40:03 -0700690 scoutingServer.Start(8080)
691 defer scoutingServer.Stop()
692
693 builder := flatbuffers.NewBuilder(1024)
694 builder.Finish((&request_pit_images.RequestPitImagesT{"932"}).Pack(builder))
695
696 response, err := debug.RequestPitImages("http://localhost:8080", builder.FinishedBytes())
697 if err != nil {
698 t.Fatal("Failed to request pit images: ", err)
699 }
700
701 expected := request_pit_images_response.RequestPitImagesResponseT{
702 PitImageList: []*request_pit_images_response.PitImageT{
703 {
704 TeamNumber: "932", ImagePath: "pitimage.jpg", CheckSum: "abcdf",
705 },
706 },
707 }
708
709 if len(expected.PitImageList) != len(response.PitImageList) {
710 t.Fatal("Expected ", expected, ", but got ", *response)
711 }
712
713 for i, pit_image := range expected.PitImageList {
714 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
715 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
716 }
717 }
718}
719
Emily Markova8e39f452023-12-23 12:17:30 -0800720func TestRequestAllPitImages(t *testing.T) {
721 db := MockDatabase{
722 images: []db.PitImage{
723 {
724 TeamNumber: "32", ImagePath: "pitimage.jpg",
725 ImageData: []byte{3, 43, 44, 32}, CheckSum: "cdhrj",
726 },
727 {
728 TeamNumber: "231", ImagePath: "232robot.png",
729 ImageData: []byte{64, 54, 54, 21, 76, 32}, CheckSum: "rgre",
730 },
731 {
732 TeamNumber: "90", ImagePath: "abcd.jpg",
733 ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "erfer",
734 },
735 },
736 }
737
738 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700739 mockClock := MockClock{now: time.Now()}
740 HandleRequests(&db, scoutingServer, mockClock)
Emily Markova8e39f452023-12-23 12:17:30 -0800741 scoutingServer.Start(8080)
742 defer scoutingServer.Stop()
743
744 builder := flatbuffers.NewBuilder(1024)
745 builder.Finish((&request_all_pit_images.RequestAllPitImagesT{}).Pack(builder))
746
747 response, err := debug.RequestAllPitImages("http://localhost:8080", builder.FinishedBytes())
748 if err != nil {
749 t.Fatal("Failed to request pit images: ", err)
750 }
751
752 expected := request_all_pit_images_response.RequestAllPitImagesResponseT{
753 PitImageList: []*request_all_pit_images_response.PitImageT{
754 {
755 TeamNumber: "32", ImagePath: "pitimage.jpg", CheckSum: "cdhrj",
756 },
757 {
758 TeamNumber: "231", ImagePath: "232robot.png", CheckSum: "rgre",
759 },
760 {
761 TeamNumber: "90", ImagePath: "abcd.jpg", CheckSum: "erfer",
762 },
763 },
764 }
765
766 if len(expected.PitImageList) != len(response.PitImageList) {
767 t.Fatal("Expected ", expected, ", but got ", *response)
768 }
769
770 for i, pit_image := range expected.PitImageList {
771 if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
772 t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
773 }
774 }
775}
776
Milo Lin1d59f0c2022-06-22 20:30:58 -0700777func TestRequestShiftSchedule(t *testing.T) {
778 db := MockDatabase{
779 shiftSchedule: []db.Shift{
780 {
781 MatchNumber: 1,
782 R1scouter: "Bob",
783 R2scouter: "James",
784 R3scouter: "Robert",
785 B1scouter: "Alice",
786 B2scouter: "Mary",
787 B3scouter: "Patricia",
788 },
789 {
790 MatchNumber: 2,
791 R1scouter: "Liam",
792 R2scouter: "Noah",
793 R3scouter: "Oliver",
794 B1scouter: "Emma",
795 B2scouter: "Charlotte",
796 B3scouter: "Amelia",
797 },
798 },
799 }
800 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700801 mockClock := MockClock{now: time.Now()}
802 HandleRequests(&db, scoutingServer, mockClock)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700803 scoutingServer.Start(8080)
804 defer scoutingServer.Stop()
805
806 builder := flatbuffers.NewBuilder(1024)
807 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
808
809 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
810 if err != nil {
811 t.Fatal("Failed to request shift schedule: ", err)
812 }
813
814 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
815 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
816 {
817 MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700818 R1Scouter: "Bob",
819 R2Scouter: "James",
820 R3Scouter: "Robert",
821 B1Scouter: "Alice",
822 B2Scouter: "Mary",
823 B3Scouter: "Patricia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700824 },
825 {
826 MatchNumber: 2,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700827 R1Scouter: "Liam",
828 R2Scouter: "Noah",
829 R3Scouter: "Oliver",
830 B1Scouter: "Emma",
831 B2Scouter: "Charlotte",
832 B3Scouter: "Amelia",
Milo Lin1d59f0c2022-06-22 20:30:58 -0700833 },
834 },
835 }
836 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
837 t.Fatal("Expected ", expected, ", but got ", *response)
838 }
839 for i, match := range expected.ShiftSchedule {
840 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
841 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
842 }
843 }
844}
845
846func TestSubmitShiftSchedule(t *testing.T) {
847 database := MockDatabase{}
848 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700849 mockClock := MockClock{now: time.Now()}
850 HandleRequests(&database, scoutingServer, mockClock)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700851 scoutingServer.Start(8080)
852 defer scoutingServer.Stop()
853
854 builder := flatbuffers.NewBuilder(1024)
855 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
856 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
857 {MatchNumber: 1,
Philipp Schrader2ff455b2023-05-03 22:11:50 -0700858 R1Scouter: "Bob",
859 R2Scouter: "James",
860 R3Scouter: "Robert",
861 B1Scouter: "Alice",
862 B2Scouter: "Mary",
863 B3Scouter: "Patricia"},
Milo Lin1d59f0c2022-06-22 20:30:58 -0700864 },
865 }).Pack(builder))
866
867 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
868 if err != nil {
869 t.Fatal("Failed to submit shift schedule: ", err)
870 }
871
872 expected := []db.Shift{
873 {MatchNumber: 1,
874 R1scouter: "Bob",
875 R2scouter: "James",
876 R3scouter: "Robert",
877 B1scouter: "Alice",
878 B2scouter: "Mary",
879 B3scouter: "Patricia"},
880 }
881 if !reflect.DeepEqual(expected, database.shiftSchedule) {
882 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
883 }
884}
885
Filip Kujawa210a03b2022-11-24 14:41:11 -0800886func TestSubmitDriverRanking(t *testing.T) {
887 database := MockDatabase{}
888 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700889 mockClock := MockClock{now: time.Now()}
890 HandleRequests(&database, scoutingServer, mockClock)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800891 scoutingServer.Start(8080)
892 defer scoutingServer.Stop()
893
894 builder := flatbuffers.NewBuilder(1024)
895 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
896 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800897 Rank1: "1234",
898 Rank2: "1235",
899 Rank3: "1236",
Filip Kujawa210a03b2022-11-24 14:41:11 -0800900 }).Pack(builder))
901
902 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
903 if err != nil {
904 t.Fatal("Failed to submit driver ranking: ", err)
905 }
906
907 expected := []db.DriverRankingData{
Emily Markovae68b7632023-12-30 14:17:55 -0800908 {MatchNumber: 36, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
Filip Kujawa210a03b2022-11-24 14:41:11 -0800909 }
910
911 if !reflect.DeepEqual(database.driver_ranking, expected) {
912 t.Fatal("Submitted notes did not match", expected, database.notes)
913 }
914}
915
Filip Kujawaf882e022022-12-14 13:14:08 -0800916// Validates that we can request the driver rankings.
917func TestRequestDriverRankings(t *testing.T) {
918 db := MockDatabase{
919 driver_ranking: []db.DriverRankingData{
920 {
921 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800922 Rank1: "1234",
923 Rank2: "1235",
924 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -0800925 },
926 {
927 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800928 Rank1: "101",
929 Rank2: "202",
930 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -0800931 },
932 },
933 }
934 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -0700935 mockClock := MockClock{now: time.Now()}
936 HandleRequests(&db, scoutingServer, mockClock)
Filip Kujawaf882e022022-12-14 13:14:08 -0800937 scoutingServer.Start(8080)
938 defer scoutingServer.Stop()
939
940 builder := flatbuffers.NewBuilder(1024)
941 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
942
943 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
944 if err != nil {
945 t.Fatal("Failed to request all driver rankings: ", err)
946 }
947
948 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
949 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
950 {
951 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800952 Rank1: "1234",
953 Rank2: "1235",
954 Rank3: "1236",
Filip Kujawaf882e022022-12-14 13:14:08 -0800955 },
956 {
957 MatchNumber: 36,
Emily Markovae68b7632023-12-30 14:17:55 -0800958 Rank1: "101",
959 Rank2: "202",
960 Rank3: "303",
Filip Kujawaf882e022022-12-14 13:14:08 -0800961 },
962 },
963 }
964 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
965 t.Fatal("Expected ", expected, ", but got ", *response)
966 }
967 for i, match := range expected.DriverRankingList {
968 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
969 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
970 }
971 }
972}
973
974// Validates that we can request all notes.
975func TestRequestAllNotes(t *testing.T) {
976 db := MockDatabase{
977 notes: []db.NotesData{
978 {
Emily Markovae68b7632023-12-30 14:17:55 -0800979 TeamNumber: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800980 Notes: "Notes",
981 GoodDriving: true,
982 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700983 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800984 SketchyPlacing: false,
985 GoodDefense: true,
986 BadDefense: false,
987 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -0700988 NoShow: false,
989 MatchNumber: 4,
990 CompLevel: "qm",
991 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -0800992 },
993 {
Emily Markovae68b7632023-12-30 14:17:55 -0800994 TeamNumber: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800995 Notes: "More Notes",
996 GoodDriving: false,
997 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700998 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800999 SketchyPlacing: true,
1000 GoodDefense: false,
1001 BadDefense: true,
1002 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001003 NoShow: false,
1004 MatchNumber: 1,
1005 CompLevel: "qm",
1006 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -08001007 },
1008 },
1009 }
1010 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -07001011 mockClock := MockClock{now: time.Now()}
1012 HandleRequests(&db, scoutingServer, mockClock)
Filip Kujawaf882e022022-12-14 13:14:08 -08001013 scoutingServer.Start(8080)
1014 defer scoutingServer.Stop()
1015
1016 builder := flatbuffers.NewBuilder(1024)
1017 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
1018
1019 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
1020 if err != nil {
1021 t.Fatal("Failed to request all notes: ", err)
1022 }
1023
1024 expected := request_all_notes_response.RequestAllNotesResponseT{
1025 NoteList: []*request_all_notes_response.NoteT{
1026 {
Emily Markovae68b7632023-12-30 14:17:55 -08001027 Team: "971",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001028 Notes: "Notes",
1029 GoodDriving: true,
1030 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001031 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001032 SketchyPlacing: false,
1033 GoodDefense: true,
1034 BadDefense: false,
1035 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001036 NoShow: false,
1037 MatchNumber: 4,
1038 CompLevel: "qm",
1039 SetNumber: 1,
Filip Kujawaf882e022022-12-14 13:14:08 -08001040 },
1041 {
Emily Markovae68b7632023-12-30 14:17:55 -08001042 Team: "972",
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001043 Notes: "More Notes",
1044 GoodDriving: false,
1045 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -07001046 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001047 SketchyPlacing: true,
1048 GoodDefense: false,
1049 BadDefense: true,
1050 EasilyDefended: false,
Emily Markovacf893f42024-03-13 19:03:10 -07001051 NoShow: false,
1052 MatchNumber: 1,
1053 CompLevel: "qm",
1054 SetNumber: 2,
Filip Kujawaf882e022022-12-14 13:14:08 -08001055 },
1056 },
1057 }
1058 if len(expected.NoteList) != len(response.NoteList) {
1059 t.Fatal("Expected ", expected, ", but got ", *response)
1060 }
1061 for i, note := range expected.NoteList {
1062 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
1063 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
1064 }
1065 }
1066}
1067
Emily Markova8cb91312024-02-02 12:30:37 -08001068func TestAddingActions2024(t *testing.T) {
1069 database := MockDatabase{}
1070 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -07001071 mockClock := MockClock{now: time.Now()}
1072 HandleRequests(&database, scoutingServer, mockClock)
Emily Markova8cb91312024-02-02 12:30:37 -08001073 scoutingServer.Start(8080)
1074 defer scoutingServer.Stop()
1075
1076 builder := flatbuffers.NewBuilder(1024)
1077 builder.Finish((&submit_2024_actions.Submit2024ActionsT{
1078 TeamNumber: "3421",
1079 MatchNumber: 2,
1080 SetNumber: 1,
1081 CompLevel: "quals",
1082 ActionsList: []*submit_2024_actions.ActionT{
1083 {
1084 ActionTaken: &submit_2024_actions.ActionTypeT{
1085 Type: submit_2024_actions.ActionTypePickupNoteAction,
1086 Value: &submit_2024_actions.PickupNoteActionT{
1087 Auto: true,
1088 },
1089 },
1090 Timestamp: 1800,
1091 },
1092 {
1093 ActionTaken: &submit_2024_actions.ActionTypeT{
1094 Type: submit_2024_actions.ActionTypePlaceNoteAction,
1095 Value: &submit_2024_actions.PlaceNoteActionT{
1096 ScoreType: submit_2024_actions.ScoreTypekSPEAKER,
1097 Auto: false,
1098 },
1099 },
1100 Timestamp: 2500,
1101 },
1102 },
Emily Markova9c18e9c2024-04-03 20:06:27 -07001103 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001104 }).Pack(builder))
1105
1106 _, err := debug.Submit2024Actions("http://localhost:8080", builder.FinishedBytes())
1107 if err != nil {
1108 t.Fatal("Failed to submit actions: ", err)
1109 }
1110
1111 expectedActions := []db.Action{
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: 1800,
1121 },
1122 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001123 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001124 TeamNumber: "3421",
1125 MatchNumber: 2,
1126 SetNumber: 1,
1127 CompLevel: "quals",
1128 CollectedBy: "debug_cli",
1129 CompletedAction: []byte{},
1130 Timestamp: 2500,
1131 },
1132 }
1133
1134 expectedStats := []db.Stats2024{
1135 db.Stats2024{
Emily Markova9c18e9c2024-04-03 20:06:27 -07001136 CompType: "Prescouting", TeamNumber: "3421",
Emily Markova8cb91312024-02-02 12:30:37 -08001137 MatchNumber: 2, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 0,
1138 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001139 Speaker: 1, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001140 NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
Emily Markovaf17f2812024-04-03 20:55:12 -07001141 Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "debug_cli",
Emily Markova8cb91312024-02-02 12:30:37 -08001142 },
1143 }
1144
1145 if !reflect.DeepEqual(expectedActions, database.actions) {
1146 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1147 }
1148 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1149 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1150 }
1151}
1152
Emily Markova8cb91312024-02-02 12:30:37 -08001153// Validates that we can delete 2024 stats.
1154func TestDeleteFromStats2024(t *testing.T) {
Emily Markova521725a2024-03-21 18:46:04 -07001155 mockClock := MockClock{now: time.Now()}
Emily Markova8cb91312024-02-02 12:30:37 -08001156 database := MockDatabase{
1157 stats2024: []db.Stats2024{
1158 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001159 CompType: "Practice", TeamNumber: "746",
Emily Markova8cb91312024-02-02 12:30:37 -08001160 MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 2,
1161 SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
Emily Markovacd156942024-04-07 19:32:28 -07001162 Speaker: 0, Amp: 1, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
Emily Markova6079e2f2024-02-17 13:17:24 -08001163 NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
Emily Markovaf17f2812024-04-03 20:55:12 -07001164 Park: false, OnStage: false, Harmony: true, RobotDied: false, NoShow: false, CollectedBy: "alek",
Emily Markova8cb91312024-02-02 12:30:37 -08001165 },
1166 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001167 CompType: "Regular", TeamNumber: "244",
Emily Markova8cb91312024-02-02 12:30:37 -08001168 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1169 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001170 Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001171 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markovaf17f2812024-04-03 20:55:12 -07001172 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001173 },
1174 },
1175 actions: []db.Action{
1176 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001177 CompType: "Practice",
Emily Markova8cb91312024-02-02 12:30:37 -08001178 TeamNumber: "746",
1179 MatchNumber: 3,
1180 SetNumber: 1,
1181 CompLevel: "quals",
1182 CollectedBy: "debug_cli",
1183 CompletedAction: []byte{},
1184 Timestamp: 2400,
1185 },
1186 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001187 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001188 TeamNumber: "244",
1189 MatchNumber: 5,
1190 SetNumber: 3,
1191 CompLevel: "quals",
1192 CollectedBy: "debug_cli",
1193 CompletedAction: []byte{},
1194 Timestamp: 1009,
1195 },
1196 },
1197 }
1198 scoutingServer := server.NewScoutingServer()
Emily Markova521725a2024-03-21 18:46:04 -07001199 HandleRequests(&database, scoutingServer, mockClock)
Emily Markova8cb91312024-02-02 12:30:37 -08001200 scoutingServer.Start(8080)
1201 defer scoutingServer.Stop()
1202
1203 builder := flatbuffers.NewBuilder(1024)
1204 builder.Finish((&delete_2024_data_scouting.Delete2024DataScoutingT{
1205 CompLevel: "quals",
1206 MatchNumber: 3,
1207 SetNumber: 1,
1208 TeamNumber: "746",
1209 }).Pack(builder))
1210
1211 _, err := debug.Delete2024DataScouting("http://localhost:8080", builder.FinishedBytes())
1212 if err != nil {
1213 t.Fatal("Failed to delete from data scouting 2024", err)
1214 }
1215
1216 expectedActions := []db.Action{
1217 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001218 CompType: "Prescouting",
Emily Markova8cb91312024-02-02 12:30:37 -08001219 TeamNumber: "244",
1220 MatchNumber: 5,
1221 SetNumber: 3,
1222 CompLevel: "quals",
1223 CollectedBy: "debug_cli",
1224 CompletedAction: []byte{},
1225 Timestamp: 1009,
1226 },
1227 }
1228
1229 expectedStats := []db.Stats2024{
1230 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001231 CompType: "Regular", TeamNumber: "244",
Emily Markova8cb91312024-02-02 12:30:37 -08001232 MatchNumber: 5, SetNumber: 3, CompLevel: "quals", StartingQuadrant: 1,
1233 SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
Emily Markovacd156942024-04-07 19:32:28 -07001234 Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
Emily Markova6079e2f2024-02-17 13:17:24 -08001235 NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
Emily Markovaf17f2812024-04-03 20:55:12 -07001236 Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kacey",
Emily Markova8cb91312024-02-02 12:30:37 -08001237 },
1238 }
1239
1240 if !reflect.DeepEqual(expectedActions, database.actions) {
1241 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
1242 }
1243 if !reflect.DeepEqual(expectedStats, database.stats2024) {
1244 t.Fatal("Expected ", expectedStats, ", but got:", database.stats2024)
1245 }
1246}
1247
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001248// A mocked database we can use for testing. Add functionality to this as
1249// needed for your tests.
1250
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001251type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001252 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -08001253 notes []db.NotesData
1254 shiftSchedule []db.Shift
1255 driver_ranking []db.DriverRankingData
Emily Markova8cb91312024-02-02 12:30:37 -08001256 stats2024 []db.Stats2024
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001257 actions []db.Action
Emily Markovafaecfe12023-07-01 12:40:03 -07001258 images []db.PitImage
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001259}
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001260
Emily Markovabf24c9e2023-02-08 20:31:11 -08001261func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -08001262 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001263 return nil
1264}
1265
Emily Markova8cb91312024-02-02 12:30:37 -08001266func (database *MockDatabase) AddToStats2024(stats2024 db.Stats2024) error {
1267 database.stats2024 = append(database.stats2024, stats2024)
1268 return nil
1269}
Emily Markovabf24c9e2023-02-08 20:31:11 -08001270func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08001271 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -08001272}
1273
Emily Markova8cb91312024-02-02 12:30:37 -08001274func (database *MockDatabase) ReturnStats2024() ([]db.Stats2024, error) {
1275 return database.stats2024, nil
1276}
1277
Emily Markova9c18e9c2024-04-03 20:06:27 -07001278func (database *MockDatabase) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, compType string) ([]db.Stats2024, error) {
Emily Markova8cb91312024-02-02 12:30:37 -08001279 var results []db.Stats2024
1280 for _, stats := range database.stats2024 {
Emily Markova9c18e9c2024-04-03 20:06:27 -07001281 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel && stats.CompType == compType {
Emily Markova8cb91312024-02-02 12:30:37 -08001282 results = append(results, stats)
1283 }
1284 }
1285 return results, nil
1286}
1287
Emily Markovae68b7632023-12-30 14:17:55 -08001288func (database *MockDatabase) QueryNotes(requestedTeam string) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -07001289 var results []string
1290 for _, data := range database.notes {
1291 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -07001292 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -07001293 }
1294 }
Philipp Schradereecb8962022-06-01 21:02:42 -07001295 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -07001296}
1297
Filip Kujawaf947cb42022-11-21 10:00:30 -08001298func (database *MockDatabase) AddNotes(data db.NotesData) error {
1299 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -07001300 return nil
1301}
1302
Filip Kujawaf882e022022-12-14 13:14:08 -08001303func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
1304 return database.notes, nil
1305}
1306
Milo Lin1d59f0c2022-06-22 20:30:58 -07001307func (database *MockDatabase) AddToShift(data db.Shift) error {
1308 database.shiftSchedule = append(database.shiftSchedule, data)
1309 return nil
1310}
1311
1312func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
1313 return database.shiftSchedule, nil
1314}
1315
1316func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
1317 return []db.Shift{}, nil
1318}
1319
Emily Markovafaecfe12023-07-01 12:40:03 -07001320func (database *MockDatabase) QueryPitImages(requestedTeam string) ([]db.RequestedPitImage, error) {
1321 var results []db.RequestedPitImage
1322 for _, data := range database.images {
1323 if data.TeamNumber == requestedTeam {
1324 results = append(results, db.RequestedPitImage{
1325 TeamNumber: data.TeamNumber,
1326 ImagePath: data.ImagePath,
1327 CheckSum: data.CheckSum,
1328 })
1329 }
1330 }
1331 return results, nil
1332}
1333
Filip Kujawa210a03b2022-11-24 14:41:11 -08001334func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
1335 database.driver_ranking = append(database.driver_ranking, data)
1336 return nil
1337}
1338
Filip Kujawaf882e022022-12-14 13:14:08 -08001339func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
1340 return database.driver_ranking, nil
1341}
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001342
1343func (database *MockDatabase) AddAction(action db.Action) error {
1344 database.actions = append(database.actions, action)
1345 return nil
1346}
1347
Emily Markovafaecfe12023-07-01 12:40:03 -07001348func (database *MockDatabase) AddPitImage(pitImage db.PitImage) error {
1349 database.images = append(database.images, pitImage)
1350 return nil
1351}
1352
Sabina Leaver9b4eb312023-02-20 19:58:17 -08001353func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
1354 return database.actions, nil
1355}
Filip Kujawac1ded372023-05-27 14:33:43 -07001356
Emily Markova8e39f452023-12-23 12:17:30 -08001357func (database *MockDatabase) ReturnPitImages() ([]db.PitImage, error) {
1358 return database.images, nil
1359}
1360
Emily Markova8cb91312024-02-02 12:30:37 -08001361func (database *MockDatabase) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1362 for i, stat := range database.stats2024 {
1363 if stat.CompLevel == compLevel_ &&
1364 stat.MatchNumber == matchNumber_ &&
1365 stat.SetNumber == setNumber_ &&
1366 stat.TeamNumber == teamNumber_ {
1367 // Match found, remove the element from the array.
1368 database.stats2024 = append(database.stats2024[:i], database.stats2024[i+1:]...)
1369 }
1370 }
1371 return nil
1372}
1373
Filip Kujawac1ded372023-05-27 14:33:43 -07001374func (database *MockDatabase) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
1375 for i, action := range database.actions {
1376 if action.CompLevel == compLevel_ &&
1377 action.MatchNumber == matchNumber_ &&
1378 action.SetNumber == setNumber_ &&
1379 action.TeamNumber == teamNumber_ {
1380 // Match found, remove the element from the array.
1381 database.actions = append(database.actions[:i], database.actions[i+1:]...)
1382 }
1383 }
1384 return nil
1385}