blob: e2d921928d0169d602b48bdbe0164cd748dc17e3 [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 Schraderd3fac192022-03-02 20:35:46 -080011 "github.com/frc971/971-Robot-Code/scouting/scraping"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080012 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/debug"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080013 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/error_response"
Philipp Schraderd3fac192022-03-02 20:35:46 -080014 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/refresh_match_list"
15 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/refresh_match_list_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"
Philipp Schraderacf96232022-03-01 22:03:30 -080018 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting"
19 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting_response"
Philipp Schraderd1c4bef2022-02-28 22:51:30 -080020 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_matches_for_team"
21 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_matches_for_team_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070022 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080023 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting"
Philipp Schrader30005e42022-03-06 13:53:58 -080024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070025 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080026 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
27 flatbuffers "github.com/google/flatbuffers/go"
28)
29
30// Validates that an unhandled address results in a 404.
31func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080032 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080033 scoutingServer := server.NewScoutingServer()
Philipp Schraderd3fac192022-03-02 20:35:46 -080034 HandleRequests(&db, scrapeEmtpyMatchList, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080035 scoutingServer.Start(8080)
36 defer scoutingServer.Stop()
37
38 resp, err := http.Get("http://localhost:8080/requests/foo")
39 if err != nil {
40 t.Fatalf("Failed to get data: %v", err)
41 }
42 if resp.StatusCode != http.StatusNotFound {
43 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
44 }
45}
46
47// Validates that we can submit new data scouting data.
48func TestSubmitDataScoutingError(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080049 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080050 scoutingServer := server.NewScoutingServer()
Philipp Schraderd3fac192022-03-02 20:35:46 -080051 HandleRequests(&db, scrapeEmtpyMatchList, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080052 scoutingServer.Start(8080)
53 defer scoutingServer.Stop()
54
55 resp, err := http.Post("http://localhost:8080/requests/submit/data_scouting", "application/octet-stream", bytes.NewReader([]byte("")))
56 if err != nil {
57 t.Fatalf("Failed to send request: %v", err)
58 }
59 if resp.StatusCode != http.StatusBadRequest {
60 t.Fatal("Unexpected status code. Got", resp.Status)
61 }
62
63 responseBytes, err := io.ReadAll(resp.Body)
64 if err != nil {
65 t.Fatal("Failed to read response bytes:", err)
66 }
67 errorResponse := error_response.GetRootAsErrorResponse(responseBytes, 0)
68
69 errorMessage := string(errorResponse.ErrorMessage())
70 if errorMessage != "Failed to parse SubmitDataScouting: runtime error: index out of range [3] with length 0" {
71 t.Fatal("Got mismatched error message:", errorMessage)
72 }
73}
74
75// Validates that we can submit new data scouting data.
76func TestSubmitDataScouting(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080077 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080078 scoutingServer := server.NewScoutingServer()
Philipp Schraderd3fac192022-03-02 20:35:46 -080079 HandleRequests(&db, scrapeEmtpyMatchList, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080080 scoutingServer.Start(8080)
81 defer scoutingServer.Stop()
82
83 builder := flatbuffers.NewBuilder(1024)
84 builder.Finish((&submit_data_scouting.SubmitDataScoutingT{
Philipp Schraderfa45d742022-03-18 19:29:05 -070085 Team: 971,
86 Match: 1,
87 StartingQuadrant: 2,
88 AutoBall1: true,
89 AutoBall2: false,
90 AutoBall3: false,
91 AutoBall4: false,
92 AutoBall5: false,
93 MissedShotsAuto: 9971,
94 UpperGoalAuto: 9971,
95 LowerGoalAuto: 9971,
96 MissedShotsTele: 9971,
97 UpperGoalTele: 9971,
98 LowerGoalTele: 9971,
99 DefenseRating: 9971,
100 DefenseReceivedRating: 4,
101 ClimbLevel: submit_data_scouting.ClimbLevelLow,
102 Comment: "this is a comment",
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800103 }).Pack(builder))
104
Philipp Schrader30005e42022-03-06 13:53:58 -0800105 response, err := debug.SubmitDataScouting("http://localhost:8080", builder.FinishedBytes())
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800106 if err != nil {
Philipp Schrader30005e42022-03-06 13:53:58 -0800107 t.Fatal("Failed to submit data scouting: ", err)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800108 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800109
110 // We get an empty response back. Validate that.
111 expected := submit_data_scouting_response.SubmitDataScoutingResponseT{}
112 if !reflect.DeepEqual(expected, *response) {
113 t.Fatal("Expected ", expected, ", but got:", *response)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800114 }
Philipp Schradercdb5cfc2022-02-20 14:57:07 -0800115}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800116
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800117// Validates that we can request the full match list.
118func TestRequestAllMatches(t *testing.T) {
119 db := MockDatabase{
120 matches: []db.Match{
121 {
122 MatchNumber: 1, Round: 1, CompLevel: "qual",
123 R1: 5, R2: 42, R3: 600, B1: 971, B2: 400, B3: 200,
124 },
125 {
126 MatchNumber: 2, Round: 1, CompLevel: "qual",
127 R1: 6, R2: 43, R3: 601, B1: 972, B2: 401, B3: 201,
128 },
129 {
130 MatchNumber: 3, Round: 1, CompLevel: "qual",
131 R1: 7, R2: 44, R3: 602, B1: 973, B2: 402, B3: 202,
132 },
133 },
134 }
135 scoutingServer := server.NewScoutingServer()
Philipp Schraderd3fac192022-03-02 20:35:46 -0800136 HandleRequests(&db, scrapeEmtpyMatchList, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800137 scoutingServer.Start(8080)
138 defer scoutingServer.Stop()
139
140 builder := flatbuffers.NewBuilder(1024)
141 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
142
143 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
144 if err != nil {
145 t.Fatal("Failed to request all matches: ", err)
146 }
147
148 expected := request_all_matches_response.RequestAllMatchesResponseT{
149 MatchList: []*request_all_matches_response.MatchT{
150 // MatchNumber, Round, CompLevel
151 // R1, R2, R3, B1, B2, B3
152 {
153 1, 1, "qual",
154 5, 42, 600, 971, 400, 200,
155 },
156 {
157 2, 1, "qual",
158 6, 43, 601, 972, 401, 201,
159 },
160 {
161 3, 1, "qual",
162 7, 44, 602, 973, 402, 202,
163 },
164 },
165 }
166 if len(expected.MatchList) != len(response.MatchList) {
167 t.Fatal("Expected ", expected, ", but got ", *response)
168 }
169 for i, match := range expected.MatchList {
170 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
171 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
172 }
173 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800174
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800175}
176
Philipp Schraderd1c4bef2022-02-28 22:51:30 -0800177// Validates that we can request the full match list.
178func TestRequestMatchesForTeam(t *testing.T) {
179 db := MockDatabase{
180 matches: []db.Match{
181 {
182 MatchNumber: 1, Round: 1, CompLevel: "qual",
183 R1: 5, R2: 42, R3: 600, B1: 971, B2: 400, B3: 200,
184 },
185 {
186 MatchNumber: 2, Round: 1, CompLevel: "qual",
187 R1: 6, R2: 43, R3: 601, B1: 972, B2: 401, B3: 201,
188 },
189 },
190 }
191 scoutingServer := server.NewScoutingServer()
Philipp Schraderd3fac192022-03-02 20:35:46 -0800192 HandleRequests(&db, scrapeEmtpyMatchList, scoutingServer)
Philipp Schraderd1c4bef2022-02-28 22:51:30 -0800193 scoutingServer.Start(8080)
194 defer scoutingServer.Stop()
195
196 builder := flatbuffers.NewBuilder(1024)
197 builder.Finish((&request_matches_for_team.RequestMatchesForTeamT{
198 Team: 971,
199 }).Pack(builder))
200
201 response, err := debug.RequestMatchesForTeam("http://localhost:8080", builder.FinishedBytes())
202 if err != nil {
203 t.Fatal("Failed to request all matches: ", err)
204 }
205
206 expected := request_matches_for_team_response.RequestMatchesForTeamResponseT{
207 MatchList: []*request_matches_for_team_response.MatchT{
208 // MatchNumber, Round, CompLevel
209 // R1, R2, R3, B1, B2, B3
210 {
211 1, 1, "qual",
212 5, 42, 600, 971, 400, 200,
213 },
214 },
215 }
216 if len(expected.MatchList) != len(response.MatchList) {
217 t.Fatal("Expected ", expected, ", but got ", *response)
218 }
219 for i, match := range expected.MatchList {
220 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
221 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
222 }
223 }
224}
225
Philipp Schraderacf96232022-03-01 22:03:30 -0800226// Validates that we can request the stats.
227func TestRequestDataScouting(t *testing.T) {
228 db := MockDatabase{
229 stats: []db.Stats{
230 {
231 TeamNumber: 971, MatchNumber: 1,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700232 StartingQuadrant: 1,
233 AutoBallPickedUp: [5]bool{true, false, false, false, true},
234 ShotsMissed: 1, UpperGoalShots: 2, LowerGoalShots: 3,
Philipp Schraderacf96232022-03-01 22:03:30 -0800235 ShotsMissedAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700236 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 2,
237 Comment: "a lovely comment", CollectedBy: "john",
Philipp Schraderacf96232022-03-01 22:03:30 -0800238 },
239 {
240 TeamNumber: 972, MatchNumber: 1,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700241 StartingQuadrant: 2,
242 AutoBallPickedUp: [5]bool{false, false, true, false, false},
243 ShotsMissed: 2, UpperGoalShots: 3, LowerGoalShots: 4,
Philipp Schraderacf96232022-03-01 22:03:30 -0800244 ShotsMissedAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700245 PlayedDefense: 8, DefenseReceivedScore: 1, Climbing: 4,
246 Comment: "another lovely comment", CollectedBy: "andrea",
Philipp Schraderacf96232022-03-01 22:03:30 -0800247 },
248 },
249 }
250 scoutingServer := server.NewScoutingServer()
Philipp Schraderd3fac192022-03-02 20:35:46 -0800251 HandleRequests(&db, scrapeEmtpyMatchList, scoutingServer)
Philipp Schraderacf96232022-03-01 22:03:30 -0800252 scoutingServer.Start(8080)
253 defer scoutingServer.Stop()
254
255 builder := flatbuffers.NewBuilder(1024)
256 builder.Finish((&request_data_scouting.RequestDataScoutingT{}).Pack(builder))
257
258 response, err := debug.RequestDataScouting("http://localhost:8080", builder.FinishedBytes())
259 if err != nil {
260 t.Fatal("Failed to request all matches: ", err)
261 }
262
263 expected := request_data_scouting_response.RequestDataScoutingResponseT{
264 StatsList: []*request_data_scouting_response.StatsT{
Philipp Schraderacf96232022-03-01 22:03:30 -0800265 {
Philipp Schrader36df73a2022-03-17 23:27:24 -0700266 Team: 971, Match: 1,
267 MissedShotsAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
268 MissedShotsTele: 1, UpperGoalTele: 2, LowerGoalTele: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700269 DefenseRating: 7,
270 DefenseReceivedRating: 3,
271 CollectedBy: "john",
272 AutoBall1: true, AutoBall2: false, AutoBall3: false,
Philipp Schrader36df73a2022-03-17 23:27:24 -0700273 AutoBall4: false, AutoBall5: true,
274 StartingQuadrant: 1,
275 ClimbLevel: request_data_scouting_response.ClimbLevelFailedWithPlentyOfTime,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700276 Comment: "a lovely comment",
Philipp Schraderacf96232022-03-01 22:03:30 -0800277 },
278 {
Philipp Schrader36df73a2022-03-17 23:27:24 -0700279 Team: 972, Match: 1,
280 MissedShotsAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
281 MissedShotsTele: 2, UpperGoalTele: 3, LowerGoalTele: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700282 DefenseRating: 8,
283 DefenseReceivedRating: 1,
284 CollectedBy: "andrea",
285 AutoBall1: false, AutoBall2: false, AutoBall3: true,
Philipp Schrader36df73a2022-03-17 23:27:24 -0700286 AutoBall4: false, AutoBall5: false,
287 StartingQuadrant: 2,
288 ClimbLevel: request_data_scouting_response.ClimbLevelMedium,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700289 Comment: "another lovely comment",
Philipp Schraderacf96232022-03-01 22:03:30 -0800290 },
291 },
292 }
293 if len(expected.StatsList) != len(response.StatsList) {
294 t.Fatal("Expected ", expected, ", but got ", *response)
295 }
296 for i, match := range expected.StatsList {
297 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
298 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
299 }
300 }
301}
302
Alex Perry81f96ba2022-03-13 18:26:19 -0700303func TestSubmitNotes(t *testing.T) {
304 database := MockDatabase{}
305 scoutingServer := server.NewScoutingServer()
306 HandleRequests(&database, scrapeEmtpyMatchList, scoutingServer)
307 scoutingServer.Start(8080)
308 defer scoutingServer.Stop()
309
310 builder := flatbuffers.NewBuilder(1024)
311 builder.Finish((&submit_notes.SubmitNotesT{
312 Team: 971,
313 Notes: "Notes",
314 }).Pack(builder))
315
316 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
317 if err != nil {
318 t.Fatal("Failed to submit notes: ", err)
319 }
320
321 expected := []db.NotesData{
322 {TeamNumber: 971, Notes: []string{"Notes"}},
323 }
324
325 if !reflect.DeepEqual(database.notes, expected) {
326 t.Fatal("Submitted notes did not match", expected, database.notes)
327 }
328}
329
330func TestRequestNotes(t *testing.T) {
331 database := MockDatabase{
332 notes: []db.NotesData{{
333 TeamNumber: 971,
334 Notes: []string{"Notes"},
335 }},
336 }
337 scoutingServer := server.NewScoutingServer()
338 HandleRequests(&database, scrapeEmtpyMatchList, scoutingServer)
339 scoutingServer.Start(8080)
340 defer scoutingServer.Stop()
341
342 builder := flatbuffers.NewBuilder(1024)
343 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
344 Team: 971,
345 }).Pack(builder))
346 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
347 if err != nil {
348 t.Fatal("Failed to submit notes: ", err)
349 }
350
351 if response.Notes[0].Data != "Notes" {
352 t.Fatal("requested notes did not match", response)
353 }
354}
355
Philipp Schraderd3fac192022-03-02 20:35:46 -0800356// Validates that we can download the schedule from The Blue Alliance.
357func TestRefreshMatchList(t *testing.T) {
358 scrapeMockSchedule := func(int32, string) ([]scraping.Match, error) {
359 return []scraping.Match{
360 {
361 CompLevel: "qual",
362 MatchNumber: 1,
Philipp Schrader45befdd2022-04-08 19:12:44 -0700363 SetNumber: 2,
Philipp Schraderd3fac192022-03-02 20:35:46 -0800364 Alliances: scraping.Alliances{
365 Red: scraping.Alliance{
366 TeamKeys: []string{
367 "100",
368 "200",
369 "300",
370 },
371 },
372 Blue: scraping.Alliance{
373 TeamKeys: []string{
374 "101",
375 "201",
376 "301",
377 },
378 },
379 },
380 WinningAlliance: "",
381 EventKey: "",
382 Time: 0,
383 PredictedTime: 0,
384 ActualTime: 0,
385 PostResultTime: 0,
386 ScoreBreakdowns: scraping.ScoreBreakdowns{},
387 },
388 }, nil
389 }
390
391 database := MockDatabase{}
392 scoutingServer := server.NewScoutingServer()
393 HandleRequests(&database, scrapeMockSchedule, scoutingServer)
394 scoutingServer.Start(8080)
395 defer scoutingServer.Stop()
396
397 builder := flatbuffers.NewBuilder(1024)
398 builder.Finish((&refresh_match_list.RefreshMatchListT{}).Pack(builder))
399
400 response, err := debug.RefreshMatchList("http://localhost:8080", builder.FinishedBytes())
401 if err != nil {
402 t.Fatal("Failed to request all matches: ", err)
403 }
404
405 // Validate the response.
406 expected := refresh_match_list_response.RefreshMatchListResponseT{}
407 if !reflect.DeepEqual(expected, *response) {
408 t.Fatal("Expected ", expected, ", but got ", *response)
409 }
410
411 // Make sure that the data made it into the database.
412 expectedMatches := []db.Match{
413 {
414 MatchNumber: 1,
Philipp Schrader45befdd2022-04-08 19:12:44 -0700415 Round: 2,
Philipp Schraderd3fac192022-03-02 20:35:46 -0800416 CompLevel: "qual",
417 R1: 100,
418 R2: 200,
419 R3: 300,
420 B1: 101,
421 B2: 201,
422 B3: 301,
423 },
424 }
425 if !reflect.DeepEqual(expectedMatches, database.matches) {
426 t.Fatal("Expected ", expectedMatches, ", but got ", database.matches)
427 }
428}
429
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800430// A mocked database we can use for testing. Add functionality to this as
431// needed for your tests.
432
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800433type MockDatabase struct {
434 matches []db.Match
Philipp Schraderacf96232022-03-01 22:03:30 -0800435 stats []db.Stats
Alex Perry81f96ba2022-03-13 18:26:19 -0700436 notes []db.NotesData
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800437}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800438
Philipp Schraderd3fac192022-03-02 20:35:46 -0800439func (database *MockDatabase) AddToMatch(match db.Match) error {
440 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800441 return nil
442}
443
Philipp Schrader30005e42022-03-06 13:53:58 -0800444func (database *MockDatabase) AddToStats(stats db.Stats) error {
445 database.stats = append(database.stats, stats)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800446 return nil
447}
448
449func (database *MockDatabase) ReturnMatches() ([]db.Match, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800450 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800451}
452
453func (database *MockDatabase) ReturnStats() ([]db.Stats, error) {
Philipp Schraderacf96232022-03-01 22:03:30 -0800454 return database.stats, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800455}
456
Philipp Schraderd1c4bef2022-02-28 22:51:30 -0800457func (database *MockDatabase) QueryMatches(requestedTeam int32) ([]db.Match, error) {
458 var matches []db.Match
459 for _, match := range database.matches {
460 for _, team := range []int32{match.R1, match.R2, match.R3, match.B1, match.B2, match.B3} {
461 if team == requestedTeam {
462 matches = append(matches, match)
463 break
464 }
465 }
466 }
467 return matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800468}
469
470func (database *MockDatabase) QueryStats(int) ([]db.Stats, error) {
471 return []db.Stats{}, nil
472}
Philipp Schraderd3fac192022-03-02 20:35:46 -0800473
Alex Perry81f96ba2022-03-13 18:26:19 -0700474func (database *MockDatabase) QueryNotes(requestedTeam int32) (db.NotesData, error) {
475 var results []string
476 for _, data := range database.notes {
477 if data.TeamNumber == requestedTeam {
478 results = append(results, data.Notes[0])
479 }
480 }
481 return db.NotesData{TeamNumber: requestedTeam, Notes: results}, nil
482}
483
484func (database *MockDatabase) AddNotes(data db.NotesData) error {
485 database.notes = append(database.notes, data)
486 return nil
487}
488
Philipp Schraderd3fac192022-03-02 20:35:46 -0800489// Returns an empty match list from the fake The Blue Alliance scraping.
490func scrapeEmtpyMatchList(int32, string) ([]scraping.Match, error) {
491 return nil, nil
492}