blob: dbad9554755fa8bc3a7a5576025549703fd3ddf6 [file] [log] [blame]
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08001package requests
2
3import (
4 "bytes"
5 "io"
6 "net/http"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08007 "reflect"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08008 "testing"
9
Philipp Schrader8747f1b2022-02-23 23:56:22 -080010 "github.com/frc971/971-Robot-Code/scouting/db"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080011 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/debug"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080012 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/error_response"
Emily Markova290147d2023-03-03 22:40:06 -080013 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting"
14 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_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"
Philipp Schraderacf96232022-03-01 22:03:30 -080021 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting"
22 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070023 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Milo Lin1d59f0c2022-06-22 20:30:58 -070024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
25 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Emily Markova1abe9782023-03-11 19:45:38 -080026 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080027 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting"
Philipp Schrader30005e42022-03-06 13:53:58 -080028 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting_response"
Filip Kujawa210a03b2022-11-24 14:41:11 -080029 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
Alex Perry81f96ba2022-03-13 18:26:19 -070030 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Milo Lin1d59f0c2022-06-22 20:30:58 -070031 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080032 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
33 flatbuffers "github.com/google/flatbuffers/go"
34)
35
36// Validates that an unhandled address results in a 404.
37func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080038 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080039 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080040 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080041 scoutingServer.Start(8080)
42 defer scoutingServer.Stop()
43
44 resp, err := http.Get("http://localhost:8080/requests/foo")
45 if err != nil {
46 t.Fatalf("Failed to get data: %v", err)
47 }
48 if resp.StatusCode != http.StatusNotFound {
49 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
50 }
51}
52
53// Validates that we can submit new data scouting data.
54func TestSubmitDataScoutingError(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080055 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080056 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080057 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080058 scoutingServer.Start(8080)
59 defer scoutingServer.Stop()
60
61 resp, err := http.Post("http://localhost:8080/requests/submit/data_scouting", "application/octet-stream", bytes.NewReader([]byte("")))
62 if err != nil {
63 t.Fatalf("Failed to send request: %v", err)
64 }
65 if resp.StatusCode != http.StatusBadRequest {
66 t.Fatal("Unexpected status code. Got", resp.Status)
67 }
68
69 responseBytes, err := io.ReadAll(resp.Body)
70 if err != nil {
71 t.Fatal("Failed to read response bytes:", err)
72 }
73 errorResponse := error_response.GetRootAsErrorResponse(responseBytes, 0)
74
75 errorMessage := string(errorResponse.ErrorMessage())
76 if errorMessage != "Failed to parse SubmitDataScouting: runtime error: index out of range [3] with length 0" {
77 t.Fatal("Got mismatched error message:", errorMessage)
78 }
79}
80
81// Validates that we can submit new data scouting data.
82func TestSubmitDataScouting(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080083 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080084 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080085 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080086 scoutingServer.Start(8080)
87 defer scoutingServer.Stop()
88
89 builder := flatbuffers.NewBuilder(1024)
90 builder.Finish((&submit_data_scouting.SubmitDataScoutingT{
Philipp Schraderfa45d742022-03-18 19:29:05 -070091 Team: 971,
92 Match: 1,
Philipp Schrader30b4a682022-04-16 14:36:17 -070093 SetNumber: 8,
Philipp Schrader4535b7e2022-04-08 20:27:00 -070094 CompLevel: "quals",
Philipp Schraderfa45d742022-03-18 19:29:05 -070095 StartingQuadrant: 2,
96 AutoBall1: true,
97 AutoBall2: false,
98 AutoBall3: false,
99 AutoBall4: false,
100 AutoBall5: false,
101 MissedShotsAuto: 9971,
102 UpperGoalAuto: 9971,
103 LowerGoalAuto: 9971,
104 MissedShotsTele: 9971,
105 UpperGoalTele: 9971,
106 LowerGoalTele: 9971,
107 DefenseRating: 9971,
108 DefenseReceivedRating: 4,
109 ClimbLevel: submit_data_scouting.ClimbLevelLow,
110 Comment: "this is a comment",
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800111 }).Pack(builder))
112
Philipp Schrader30005e42022-03-06 13:53:58 -0800113 response, err := debug.SubmitDataScouting("http://localhost:8080", builder.FinishedBytes())
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800114 if err != nil {
Philipp Schrader30005e42022-03-06 13:53:58 -0800115 t.Fatal("Failed to submit data scouting: ", err)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800116 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800117
118 // We get an empty response back. Validate that.
119 expected := submit_data_scouting_response.SubmitDataScoutingResponseT{}
120 if !reflect.DeepEqual(expected, *response) {
121 t.Fatal("Expected ", expected, ", but got:", *response)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800122 }
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800123}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800124
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800125// Validates that we can request the full match list.
126func TestRequestAllMatches(t *testing.T) {
127 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -0800128 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800129 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800130 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800131 Alliance: "R", AlliancePosition: 1, TeamNumber: 5,
132 },
133 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800134 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800135 Alliance: "R", AlliancePosition: 2, TeamNumber: 42,
136 },
137 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800138 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800139 Alliance: "R", AlliancePosition: 3, TeamNumber: 600,
140 },
141 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800142 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800143 Alliance: "B", AlliancePosition: 1, TeamNumber: 971,
144 },
145 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800146 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800147 Alliance: "B", AlliancePosition: 2, TeamNumber: 400,
148 },
149 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800150 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800151 Alliance: "B", AlliancePosition: 3, TeamNumber: 200,
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800152 },
153 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800154 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800155 Alliance: "R", AlliancePosition: 1, TeamNumber: 6,
156 },
157 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800158 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800159 Alliance: "R", AlliancePosition: 2, TeamNumber: 43,
160 },
161 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800162 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800163 Alliance: "R", AlliancePosition: 3, TeamNumber: 601,
164 },
165 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800166 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800167 Alliance: "B", AlliancePosition: 1, TeamNumber: 972,
168 },
169 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800170 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800171 Alliance: "B", AlliancePosition: 2, TeamNumber: 401,
172 },
173 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800174 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800175 Alliance: "B", AlliancePosition: 3, TeamNumber: 201,
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800176 },
177 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800178 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800179 Alliance: "R", AlliancePosition: 1, TeamNumber: 7,
180 },
181 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800182 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800183 Alliance: "R", AlliancePosition: 2, TeamNumber: 44,
184 },
185 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800186 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800187 Alliance: "R", AlliancePosition: 3, TeamNumber: 602,
188 },
189 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800190 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800191 Alliance: "B", AlliancePosition: 1, TeamNumber: 973,
192 },
193 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800194 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800195 Alliance: "B", AlliancePosition: 2, TeamNumber: 402,
196 },
197 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800198 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800199 Alliance: "B", AlliancePosition: 3, TeamNumber: 202,
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800200 },
201 },
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800202 // Pretend that we have some data scouting data.
203 stats2023: []db.Stats2023{
204 {
205 TeamNumber: "5", MatchNumber: 1, SetNumber: 1,
206 CompLevel: "qm", StartingQuadrant: 3, LowCubesAuto: 10,
207 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
208 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
209 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
210 HighCubes: 2, CubesDropped: 1, LowCones: 1,
211 MiddleCones: 2, HighCones: 0, ConesDropped: 1,
212 AvgCycle: 34, CollectedBy: "alex",
213 },
214 {
215 TeamNumber: "973", MatchNumber: 3, SetNumber: 1,
216 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
217 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
218 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
219 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
220 HighCubes: 1, CubesDropped: 0, LowCones: 0,
221 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
222 AvgCycle: 53, CollectedBy: "bob",
223 },
224 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800225 }
226 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800227 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800228 scoutingServer.Start(8080)
229 defer scoutingServer.Stop()
230
231 builder := flatbuffers.NewBuilder(1024)
232 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
233
234 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
235 if err != nil {
236 t.Fatal("Failed to request all matches: ", err)
237 }
238
239 expected := request_all_matches_response.RequestAllMatchesResponseT{
240 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700241 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800242 // R1, R2, R3, B1, B2, B3
243 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800244 1, 1, "qm",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800245 5, 42, 600, 971, 400, 200,
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800246 &request_all_matches_response.ScoutedLevelT{
247 // The R1 team has already been data
248 // scouted.
249 true, false, false, false, false, false,
250 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800251 },
252 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800253 2, 1, "qm",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800254 6, 43, 601, 972, 401, 201,
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800255 &request_all_matches_response.ScoutedLevelT{
256 false, false, false, false, false, false,
257 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800258 },
259 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800260 3, 1, "qm",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800261 7, 44, 602, 973, 402, 202,
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800262 &request_all_matches_response.ScoutedLevelT{
263 // The B1 team has already been data
264 // scouted.
265 false, false, false, true, false, false,
266 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800267 },
268 },
269 }
270 if len(expected.MatchList) != len(response.MatchList) {
271 t.Fatal("Expected ", expected, ", but got ", *response)
272 }
273 for i, match := range expected.MatchList {
274 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
275 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
276 }
277 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800278
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800279}
280
Philipp Schraderacf96232022-03-01 22:03:30 -0800281// Validates that we can request the stats.
282func TestRequestDataScouting(t *testing.T) {
283 db := MockDatabase{
284 stats: []db.Stats{
285 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700286 TeamNumber: 971, MatchNumber: 1, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700287 StartingQuadrant: 1,
288 AutoBallPickedUp: [5]bool{true, false, false, false, true},
289 ShotsMissed: 1, UpperGoalShots: 2, LowerGoalShots: 3,
Philipp Schraderacf96232022-03-01 22:03:30 -0800290 ShotsMissedAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700291 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 2,
292 Comment: "a lovely comment", CollectedBy: "john",
Philipp Schraderacf96232022-03-01 22:03:30 -0800293 },
294 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700295 TeamNumber: 972, MatchNumber: 1, SetNumber: 4, CompLevel: "extra",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700296 StartingQuadrant: 2,
297 AutoBallPickedUp: [5]bool{false, false, true, false, false},
298 ShotsMissed: 2, UpperGoalShots: 3, LowerGoalShots: 4,
Philipp Schraderacf96232022-03-01 22:03:30 -0800299 ShotsMissedAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700300 PlayedDefense: 8, DefenseReceivedScore: 1, Climbing: 4,
301 Comment: "another lovely comment", CollectedBy: "andrea",
Philipp Schraderacf96232022-03-01 22:03:30 -0800302 },
303 },
304 }
305 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800306 HandleRequests(&db, scoutingServer)
Philipp Schraderacf96232022-03-01 22:03:30 -0800307 scoutingServer.Start(8080)
308 defer scoutingServer.Stop()
309
310 builder := flatbuffers.NewBuilder(1024)
311 builder.Finish((&request_data_scouting.RequestDataScoutingT{}).Pack(builder))
312
313 response, err := debug.RequestDataScouting("http://localhost:8080", builder.FinishedBytes())
314 if err != nil {
315 t.Fatal("Failed to request all matches: ", err)
316 }
317
318 expected := request_data_scouting_response.RequestDataScoutingResponseT{
319 StatsList: []*request_data_scouting_response.StatsT{
Philipp Schraderacf96232022-03-01 22:03:30 -0800320 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700321 Team: 971, Match: 1, SetNumber: 2, CompLevel: "quals",
Philipp Schrader36df73a2022-03-17 23:27:24 -0700322 MissedShotsAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
323 MissedShotsTele: 1, UpperGoalTele: 2, LowerGoalTele: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700324 DefenseRating: 7,
325 DefenseReceivedRating: 3,
326 CollectedBy: "john",
327 AutoBall1: true, AutoBall2: false, AutoBall3: false,
Philipp Schrader36df73a2022-03-17 23:27:24 -0700328 AutoBall4: false, AutoBall5: true,
329 StartingQuadrant: 1,
330 ClimbLevel: request_data_scouting_response.ClimbLevelFailedWithPlentyOfTime,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700331 Comment: "a lovely comment",
Philipp Schraderacf96232022-03-01 22:03:30 -0800332 },
333 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700334 Team: 972, Match: 1, SetNumber: 4, CompLevel: "extra",
Philipp Schrader36df73a2022-03-17 23:27:24 -0700335 MissedShotsAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
336 MissedShotsTele: 2, UpperGoalTele: 3, LowerGoalTele: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700337 DefenseRating: 8,
338 DefenseReceivedRating: 1,
339 CollectedBy: "andrea",
340 AutoBall1: false, AutoBall2: false, AutoBall3: true,
Philipp Schrader36df73a2022-03-17 23:27:24 -0700341 AutoBall4: false, AutoBall5: false,
342 StartingQuadrant: 2,
343 ClimbLevel: request_data_scouting_response.ClimbLevelMedium,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700344 Comment: "another lovely comment",
Philipp Schraderacf96232022-03-01 22:03:30 -0800345 },
346 },
347 }
348 if len(expected.StatsList) != len(response.StatsList) {
349 t.Fatal("Expected ", expected, ", but got ", *response)
350 }
351 for i, match := range expected.StatsList {
352 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
353 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
354 }
355 }
356}
357
Emily Markova290147d2023-03-03 22:40:06 -0800358// Validates that we can request the 2023 stats.
359func TestRequest2023DataScouting(t *testing.T) {
360 db := MockDatabase{
361 stats2023: []db.Stats2023{
362 {
363 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
364 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
365 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
366 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
367 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
368 HighCubes: 2, CubesDropped: 1, LowCones: 1,
369 MiddleCones: 2, HighCones: 0, ConesDropped: 1,
370 AvgCycle: 34, CollectedBy: "isaac",
371 },
372 {
373 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
374 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
375 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
376 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
377 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
378 HighCubes: 1, CubesDropped: 0, LowCones: 0,
379 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
380 AvgCycle: 53, CollectedBy: "unknown",
381 },
382 },
383 }
384 scoutingServer := server.NewScoutingServer()
385 HandleRequests(&db, scoutingServer)
386 scoutingServer.Start(8080)
387 defer scoutingServer.Stop()
388
389 builder := flatbuffers.NewBuilder(1024)
390 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
391
392 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
393 if err != nil {
394 t.Fatal("Failed to request all matches: ", err)
395 }
396
397 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
398 StatsList: []*request_2023_data_scouting_response.Stats2023T{
399 {
400 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
401 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
402 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
403 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
404 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
405 HighCubes: 2, CubesDropped: 1, LowCones: 1,
406 MiddleCones: 2, HighCones: 0, ConesDropped: 1,
407 AvgCycle: 34, CollectedBy: "isaac",
408 },
409 {
410 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
411 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
412 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
413 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
414 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
415 HighCubes: 1, CubesDropped: 0, LowCones: 0,
416 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
417 AvgCycle: 53, CollectedBy: "unknown",
418 },
419 },
420 }
421 if len(expected.StatsList) != len(response.StatsList) {
422 t.Fatal("Expected ", expected, ", but got ", *response)
423 }
424 for i, match := range expected.StatsList {
425 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
426 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
427 }
428 }
429}
430
Emily Markova1abe9782023-03-11 19:45:38 -0800431// Validates that we can request the 2023 stats.
432func TestConvertActionsToStat(t *testing.T) {
433 builder := flatbuffers.NewBuilder(1024)
434 builder.Finish((&submit_actions.SubmitActionsT{
435 TeamNumber: "4244",
436 MatchNumber: 3,
437 SetNumber: 1,
438 CompLevel: "quals",
439 CollectedBy: "katie",
440 ActionsList: []*submit_actions.ActionT{
441 {
442 ActionTaken: &submit_actions.ActionTypeT{
443 Type: submit_actions.ActionTypeStartMatchAction,
444 Value: &submit_actions.StartMatchActionT{
445 Position: 1,
446 },
447 },
448 Timestamp: 0,
449 },
450 {
451 ActionTaken: &submit_actions.ActionTypeT{
452 Type: submit_actions.ActionTypePickupObjectAction,
453 Value: &submit_actions.PickupObjectActionT{
454 ObjectType: submit_actions.ObjectTypekCube,
455 Auto: true,
456 },
457 },
458 Timestamp: 400,
459 },
460 {
461 ActionTaken: &submit_actions.ActionTypeT{
462 Type: submit_actions.ActionTypePickupObjectAction,
463 Value: &submit_actions.PickupObjectActionT{
464 ObjectType: submit_actions.ObjectTypekCube,
465 Auto: true,
466 },
467 },
468 Timestamp: 800,
469 },
470 {
471 ActionTaken: &submit_actions.ActionTypeT{
472 Type: submit_actions.ActionTypePlaceObjectAction,
473 Value: &submit_actions.PlaceObjectActionT{
474 ObjectType: submit_actions.ObjectTypekCube,
475 ScoreLevel: submit_actions.ScoreLevelkLow,
476 Auto: true,
477 },
478 },
479 Timestamp: 2000,
480 },
481 {
482 ActionTaken: &submit_actions.ActionTypeT{
483 Type: submit_actions.ActionTypePickupObjectAction,
484 Value: &submit_actions.PickupObjectActionT{
485 ObjectType: submit_actions.ObjectTypekCone,
486 Auto: false,
487 },
488 },
489 Timestamp: 2800,
490 },
491 {
492 ActionTaken: &submit_actions.ActionTypeT{
493 Type: submit_actions.ActionTypePlaceObjectAction,
494 Value: &submit_actions.PlaceObjectActionT{
495 ObjectType: submit_actions.ObjectTypekCone,
496 ScoreLevel: submit_actions.ScoreLevelkHigh,
497 Auto: false,
498 },
499 },
500 Timestamp: 3100,
501 },
502 },
503 }).Pack(builder))
504
505 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
506 response, err := ConvertActionsToStat(submitActions)
507
508 if err != nil {
509 t.Fatal("Failed to convert actions to stats: ", err)
510 }
511
512 expected := db.Stats2023{
513 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
514 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
515 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
516 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
517 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
518 HighCubes: 0, CubesDropped: 0, LowCones: 0,
519 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
520 AvgCycle: 1100, CollectedBy: "katie",
521 }
522
523 if expected != response {
524 t.Fatal("Expected ", expected, ", but got ", response)
525 }
526}
527
Alex Perry81f96ba2022-03-13 18:26:19 -0700528func TestSubmitNotes(t *testing.T) {
529 database := MockDatabase{}
530 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800531 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700532 scoutingServer.Start(8080)
533 defer scoutingServer.Stop()
534
535 builder := flatbuffers.NewBuilder(1024)
536 builder.Finish((&submit_notes.SubmitNotesT{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800537 Team: 971,
538 Notes: "Notes",
539 GoodDriving: true,
540 BadDriving: false,
541 SketchyPickup: true,
542 SketchyPlacing: false,
543 GoodDefense: true,
544 BadDefense: false,
545 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700546 }).Pack(builder))
547
548 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
549 if err != nil {
550 t.Fatal("Failed to submit notes: ", err)
551 }
552
553 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800554 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800555 TeamNumber: 971,
556 Notes: "Notes",
557 GoodDriving: true,
558 BadDriving: false,
559 SketchyPickup: true,
560 SketchyPlacing: false,
561 GoodDefense: true,
562 BadDefense: false,
563 EasilyDefended: true,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800564 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700565 }
566
567 if !reflect.DeepEqual(database.notes, expected) {
568 t.Fatal("Submitted notes did not match", expected, database.notes)
569 }
570}
571
572func TestRequestNotes(t *testing.T) {
573 database := MockDatabase{
574 notes: []db.NotesData{{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800575 TeamNumber: 971,
576 Notes: "Notes",
577 GoodDriving: true,
578 BadDriving: false,
579 SketchyPickup: true,
580 SketchyPlacing: false,
581 GoodDefense: true,
582 BadDefense: false,
583 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700584 }},
585 }
586 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800587 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700588 scoutingServer.Start(8080)
589 defer scoutingServer.Stop()
590
591 builder := flatbuffers.NewBuilder(1024)
592 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
593 Team: 971,
594 }).Pack(builder))
595 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
596 if err != nil {
597 t.Fatal("Failed to submit notes: ", err)
598 }
599
600 if response.Notes[0].Data != "Notes" {
601 t.Fatal("requested notes did not match", response)
602 }
603}
604
Milo Lin1d59f0c2022-06-22 20:30:58 -0700605func TestRequestShiftSchedule(t *testing.T) {
606 db := MockDatabase{
607 shiftSchedule: []db.Shift{
608 {
609 MatchNumber: 1,
610 R1scouter: "Bob",
611 R2scouter: "James",
612 R3scouter: "Robert",
613 B1scouter: "Alice",
614 B2scouter: "Mary",
615 B3scouter: "Patricia",
616 },
617 {
618 MatchNumber: 2,
619 R1scouter: "Liam",
620 R2scouter: "Noah",
621 R3scouter: "Oliver",
622 B1scouter: "Emma",
623 B2scouter: "Charlotte",
624 B3scouter: "Amelia",
625 },
626 },
627 }
628 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800629 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700630 scoutingServer.Start(8080)
631 defer scoutingServer.Stop()
632
633 builder := flatbuffers.NewBuilder(1024)
634 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
635
636 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
637 if err != nil {
638 t.Fatal("Failed to request shift schedule: ", err)
639 }
640
641 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
642 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
643 {
644 MatchNumber: 1,
645 R1scouter: "Bob",
646 R2scouter: "James",
647 R3scouter: "Robert",
648 B1scouter: "Alice",
649 B2scouter: "Mary",
650 B3scouter: "Patricia",
651 },
652 {
653 MatchNumber: 2,
654 R1scouter: "Liam",
655 R2scouter: "Noah",
656 R3scouter: "Oliver",
657 B1scouter: "Emma",
658 B2scouter: "Charlotte",
659 B3scouter: "Amelia",
660 },
661 },
662 }
663 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
664 t.Fatal("Expected ", expected, ", but got ", *response)
665 }
666 for i, match := range expected.ShiftSchedule {
667 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
668 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
669 }
670 }
671}
672
673func TestSubmitShiftSchedule(t *testing.T) {
674 database := MockDatabase{}
675 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800676 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700677 scoutingServer.Start(8080)
678 defer scoutingServer.Stop()
679
680 builder := flatbuffers.NewBuilder(1024)
681 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
682 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
683 {MatchNumber: 1,
684 R1scouter: "Bob",
685 R2scouter: "James",
686 R3scouter: "Robert",
687 B1scouter: "Alice",
688 B2scouter: "Mary",
689 B3scouter: "Patricia"},
690 },
691 }).Pack(builder))
692
693 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
694 if err != nil {
695 t.Fatal("Failed to submit shift schedule: ", err)
696 }
697
698 expected := []db.Shift{
699 {MatchNumber: 1,
700 R1scouter: "Bob",
701 R2scouter: "James",
702 R3scouter: "Robert",
703 B1scouter: "Alice",
704 B2scouter: "Mary",
705 B3scouter: "Patricia"},
706 }
707 if !reflect.DeepEqual(expected, database.shiftSchedule) {
708 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
709 }
710}
711
Filip Kujawa210a03b2022-11-24 14:41:11 -0800712func TestSubmitDriverRanking(t *testing.T) {
713 database := MockDatabase{}
714 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800715 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800716 scoutingServer.Start(8080)
717 defer scoutingServer.Stop()
718
719 builder := flatbuffers.NewBuilder(1024)
720 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
721 MatchNumber: 36,
722 Rank1: 1234,
723 Rank2: 1235,
724 Rank3: 1236,
725 }).Pack(builder))
726
727 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
728 if err != nil {
729 t.Fatal("Failed to submit driver ranking: ", err)
730 }
731
732 expected := []db.DriverRankingData{
733 {MatchNumber: 36, Rank1: 1234, Rank2: 1235, Rank3: 1236},
734 }
735
736 if !reflect.DeepEqual(database.driver_ranking, expected) {
737 t.Fatal("Submitted notes did not match", expected, database.notes)
738 }
739}
740
Filip Kujawaf882e022022-12-14 13:14:08 -0800741// Validates that we can request the driver rankings.
742func TestRequestDriverRankings(t *testing.T) {
743 db := MockDatabase{
744 driver_ranking: []db.DriverRankingData{
745 {
746 MatchNumber: 36,
747 Rank1: 1234,
748 Rank2: 1235,
749 Rank3: 1236,
750 },
751 {
752 MatchNumber: 36,
753 Rank1: 101,
754 Rank2: 202,
755 Rank3: 303,
756 },
757 },
758 }
759 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800760 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800761 scoutingServer.Start(8080)
762 defer scoutingServer.Stop()
763
764 builder := flatbuffers.NewBuilder(1024)
765 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
766
767 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
768 if err != nil {
769 t.Fatal("Failed to request all driver rankings: ", err)
770 }
771
772 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
773 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
774 {
775 MatchNumber: 36,
776 Rank1: 1234,
777 Rank2: 1235,
778 Rank3: 1236,
779 },
780 {
781 MatchNumber: 36,
782 Rank1: 101,
783 Rank2: 202,
784 Rank3: 303,
785 },
786 },
787 }
788 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
789 t.Fatal("Expected ", expected, ", but got ", *response)
790 }
791 for i, match := range expected.DriverRankingList {
792 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
793 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
794 }
795 }
796}
797
798// Validates that we can request all notes.
799func TestRequestAllNotes(t *testing.T) {
800 db := MockDatabase{
801 notes: []db.NotesData{
802 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800803 TeamNumber: 971,
804 Notes: "Notes",
805 GoodDriving: true,
806 BadDriving: false,
807 SketchyPickup: true,
808 SketchyPlacing: false,
809 GoodDefense: true,
810 BadDefense: false,
811 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800812 },
813 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800814 TeamNumber: 972,
815 Notes: "More Notes",
816 GoodDriving: false,
817 BadDriving: false,
818 SketchyPickup: false,
819 SketchyPlacing: true,
820 GoodDefense: false,
821 BadDefense: true,
822 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800823 },
824 },
825 }
826 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800827 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800828 scoutingServer.Start(8080)
829 defer scoutingServer.Stop()
830
831 builder := flatbuffers.NewBuilder(1024)
832 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
833
834 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
835 if err != nil {
836 t.Fatal("Failed to request all notes: ", err)
837 }
838
839 expected := request_all_notes_response.RequestAllNotesResponseT{
840 NoteList: []*request_all_notes_response.NoteT{
841 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800842 Team: 971,
843 Notes: "Notes",
844 GoodDriving: true,
845 BadDriving: false,
846 SketchyPickup: true,
847 SketchyPlacing: false,
848 GoodDefense: true,
849 BadDefense: false,
850 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800851 },
852 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800853 Team: 972,
854 Notes: "More Notes",
855 GoodDriving: false,
856 BadDriving: false,
857 SketchyPickup: false,
858 SketchyPlacing: true,
859 GoodDefense: false,
860 BadDefense: true,
861 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800862 },
863 },
864 }
865 if len(expected.NoteList) != len(response.NoteList) {
866 t.Fatal("Expected ", expected, ", but got ", *response)
867 }
868 for i, note := range expected.NoteList {
869 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
870 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
871 }
872 }
873}
874
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800875// A mocked database we can use for testing. Add functionality to this as
876// needed for your tests.
877
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800878type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800879 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -0800880 stats []db.Stats
881 notes []db.NotesData
882 shiftSchedule []db.Shift
883 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -0800884 stats2023 []db.Stats2023
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800885}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800886
Emily Markovabf24c9e2023-02-08 20:31:11 -0800887func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -0800888 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800889 return nil
890}
891
Philipp Schrader30005e42022-03-06 13:53:58 -0800892func (database *MockDatabase) AddToStats(stats db.Stats) error {
893 database.stats = append(database.stats, stats)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800894 return nil
895}
896
Emily Markova290147d2023-03-03 22:40:06 -0800897func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
898 database.stats2023 = append(database.stats2023, stats2023)
899 return nil
900}
Emily Markovabf24c9e2023-02-08 20:31:11 -0800901func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800902 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800903}
904
905func (database *MockDatabase) ReturnStats() ([]db.Stats, error) {
Philipp Schraderacf96232022-03-01 22:03:30 -0800906 return database.stats, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800907}
908
Emily Markova290147d2023-03-03 22:40:06 -0800909func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
910 return database.stats2023, nil
911}
912
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800913func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string) ([]db.Stats2023, error) {
914 var results []db.Stats2023
915 for _, stats := range database.stats2023 {
916 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel {
917 results = append(results, stats)
918 }
919 }
920 return results, nil
921}
922
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800923func (database *MockDatabase) QueryStats(int) ([]db.Stats, error) {
924 return []db.Stats{}, nil
925}
Philipp Schraderd3fac192022-03-02 20:35:46 -0800926
Philipp Schradereecb8962022-06-01 21:02:42 -0700927func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -0700928 var results []string
929 for _, data := range database.notes {
930 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -0700931 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -0700932 }
933 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700934 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -0700935}
936
Filip Kujawaf947cb42022-11-21 10:00:30 -0800937func (database *MockDatabase) AddNotes(data db.NotesData) error {
938 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -0700939 return nil
940}
941
Filip Kujawaf882e022022-12-14 13:14:08 -0800942func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
943 return database.notes, nil
944}
945
Milo Lin1d59f0c2022-06-22 20:30:58 -0700946func (database *MockDatabase) AddToShift(data db.Shift) error {
947 database.shiftSchedule = append(database.shiftSchedule, data)
948 return nil
949}
950
951func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
952 return database.shiftSchedule, nil
953}
954
955func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
956 return []db.Shift{}, nil
957}
958
Filip Kujawa210a03b2022-11-24 14:41:11 -0800959func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
960 database.driver_ranking = append(database.driver_ranking, data)
961 return nil
962}
963
Filip Kujawaf882e022022-12-14 13:14:08 -0800964func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
965 return database.driver_ranking, nil
966}