blob: d2d5acc8347f82daddb6508002edec1843cc43b0 [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 Markovab8551572023-03-22 19:49:39 -0700131 Alliance: "R", AlliancePosition: 1, TeamNumber: "5",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800132 },
133 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800134 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700135 Alliance: "R", AlliancePosition: 2, TeamNumber: "42",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800136 },
137 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800138 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700139 Alliance: "R", AlliancePosition: 3, TeamNumber: "600",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800140 },
141 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800142 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700143 Alliance: "B", AlliancePosition: 1, TeamNumber: "971",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800144 },
145 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800146 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700147 Alliance: "B", AlliancePosition: 2, TeamNumber: "400",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800148 },
149 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800150 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700151 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 Markovab8551572023-03-22 19:49:39 -0700155 Alliance: "R", AlliancePosition: 1, TeamNumber: "6",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800156 },
157 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800158 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700159 Alliance: "R", AlliancePosition: 2, TeamNumber: "43",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800160 },
161 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800162 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700163 Alliance: "R", AlliancePosition: 3, TeamNumber: "601",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800164 },
165 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800166 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700167 Alliance: "B", AlliancePosition: 1, TeamNumber: "972",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800168 },
169 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800170 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700171 Alliance: "B", AlliancePosition: 2, TeamNumber: "401",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800172 },
173 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800174 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700175 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 Markovab8551572023-03-22 19:49:39 -0700179 Alliance: "R", AlliancePosition: 1, TeamNumber: "7",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800180 },
181 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800182 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700183 Alliance: "R", AlliancePosition: 2, TeamNumber: "44",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800184 },
185 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800186 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700187 Alliance: "R", AlliancePosition: 3, TeamNumber: "602",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800188 },
189 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800190 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700191 Alliance: "B", AlliancePosition: 1, TeamNumber: "973",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800192 },
193 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800194 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700195 Alliance: "B", AlliancePosition: 2, TeamNumber: "402",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800196 },
197 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800198 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700199 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,
Emily Markova46a69bf2023-03-22 20:45:52 -0700212 AvgCycle: 34, DockedAuto: true, EngagedAuto: true,
213 Docked: false, Engaged: false, CollectedBy: "alex",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800214 },
215 {
216 TeamNumber: "973", MatchNumber: 3, SetNumber: 1,
217 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
218 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
219 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
220 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
221 HighCubes: 1, CubesDropped: 0, LowCones: 0,
222 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700223 AvgCycle: 53, DockedAuto: true, EngagedAuto: false,
224 Docked: false, Engaged: false, CollectedBy: "bob",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800225 },
226 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800227 }
228 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800229 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800230 scoutingServer.Start(8080)
231 defer scoutingServer.Stop()
232
233 builder := flatbuffers.NewBuilder(1024)
234 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
235
236 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
237 if err != nil {
238 t.Fatal("Failed to request all matches: ", err)
239 }
240
241 expected := request_all_matches_response.RequestAllMatchesResponseT{
242 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700243 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800244 // R1, R2, R3, B1, B2, B3
245 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800246 1, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700247 "5", "42", "600", "971", "400", "200",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800248 &request_all_matches_response.ScoutedLevelT{
249 // The R1 team has already been data
250 // scouted.
251 true, false, false, false, false, false,
252 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800253 },
254 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800255 2, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700256 "6", "43", "601", "972", "401", "201",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800257 &request_all_matches_response.ScoutedLevelT{
258 false, false, false, false, false, false,
259 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800260 },
261 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800262 3, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700263 "7", "44", "602", "973", "402", "202",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800264 &request_all_matches_response.ScoutedLevelT{
265 // The B1 team has already been data
266 // scouted.
267 false, false, false, true, false, false,
268 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800269 },
270 },
271 }
272 if len(expected.MatchList) != len(response.MatchList) {
273 t.Fatal("Expected ", expected, ", but got ", *response)
274 }
275 for i, match := range expected.MatchList {
276 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
277 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
278 }
279 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800280
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800281}
282
Philipp Schraderacf96232022-03-01 22:03:30 -0800283// Validates that we can request the stats.
284func TestRequestDataScouting(t *testing.T) {
285 db := MockDatabase{
286 stats: []db.Stats{
287 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700288 TeamNumber: 971, MatchNumber: 1, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700289 StartingQuadrant: 1,
290 AutoBallPickedUp: [5]bool{true, false, false, false, true},
291 ShotsMissed: 1, UpperGoalShots: 2, LowerGoalShots: 3,
Philipp Schraderacf96232022-03-01 22:03:30 -0800292 ShotsMissedAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700293 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 2,
294 Comment: "a lovely comment", CollectedBy: "john",
Philipp Schraderacf96232022-03-01 22:03:30 -0800295 },
296 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700297 TeamNumber: 972, MatchNumber: 1, SetNumber: 4, CompLevel: "extra",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700298 StartingQuadrant: 2,
299 AutoBallPickedUp: [5]bool{false, false, true, false, false},
300 ShotsMissed: 2, UpperGoalShots: 3, LowerGoalShots: 4,
Philipp Schraderacf96232022-03-01 22:03:30 -0800301 ShotsMissedAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700302 PlayedDefense: 8, DefenseReceivedScore: 1, Climbing: 4,
303 Comment: "another lovely comment", CollectedBy: "andrea",
Philipp Schraderacf96232022-03-01 22:03:30 -0800304 },
305 },
306 }
307 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800308 HandleRequests(&db, scoutingServer)
Philipp Schraderacf96232022-03-01 22:03:30 -0800309 scoutingServer.Start(8080)
310 defer scoutingServer.Stop()
311
312 builder := flatbuffers.NewBuilder(1024)
313 builder.Finish((&request_data_scouting.RequestDataScoutingT{}).Pack(builder))
314
315 response, err := debug.RequestDataScouting("http://localhost:8080", builder.FinishedBytes())
316 if err != nil {
317 t.Fatal("Failed to request all matches: ", err)
318 }
319
320 expected := request_data_scouting_response.RequestDataScoutingResponseT{
321 StatsList: []*request_data_scouting_response.StatsT{
Philipp Schraderacf96232022-03-01 22:03:30 -0800322 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700323 Team: 971, Match: 1, SetNumber: 2, CompLevel: "quals",
Philipp Schrader36df73a2022-03-17 23:27:24 -0700324 MissedShotsAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
325 MissedShotsTele: 1, UpperGoalTele: 2, LowerGoalTele: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700326 DefenseRating: 7,
327 DefenseReceivedRating: 3,
328 CollectedBy: "john",
329 AutoBall1: true, AutoBall2: false, AutoBall3: false,
Philipp Schrader36df73a2022-03-17 23:27:24 -0700330 AutoBall4: false, AutoBall5: true,
331 StartingQuadrant: 1,
332 ClimbLevel: request_data_scouting_response.ClimbLevelFailedWithPlentyOfTime,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700333 Comment: "a lovely comment",
Philipp Schraderacf96232022-03-01 22:03:30 -0800334 },
335 {
Philipp Schrader30b4a682022-04-16 14:36:17 -0700336 Team: 972, Match: 1, SetNumber: 4, CompLevel: "extra",
Philipp Schrader36df73a2022-03-17 23:27:24 -0700337 MissedShotsAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
338 MissedShotsTele: 2, UpperGoalTele: 3, LowerGoalTele: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700339 DefenseRating: 8,
340 DefenseReceivedRating: 1,
341 CollectedBy: "andrea",
342 AutoBall1: false, AutoBall2: false, AutoBall3: true,
Philipp Schrader36df73a2022-03-17 23:27:24 -0700343 AutoBall4: false, AutoBall5: false,
344 StartingQuadrant: 2,
345 ClimbLevel: request_data_scouting_response.ClimbLevelMedium,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700346 Comment: "another lovely comment",
Philipp Schraderacf96232022-03-01 22:03:30 -0800347 },
348 },
349 }
350 if len(expected.StatsList) != len(response.StatsList) {
351 t.Fatal("Expected ", expected, ", but got ", *response)
352 }
353 for i, match := range expected.StatsList {
354 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
355 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
356 }
357 }
358}
359
Emily Markova290147d2023-03-03 22:40:06 -0800360// Validates that we can request the 2023 stats.
361func TestRequest2023DataScouting(t *testing.T) {
362 db := MockDatabase{
363 stats2023: []db.Stats2023{
364 {
365 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
366 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
367 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
368 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
369 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
370 HighCubes: 2, CubesDropped: 1, LowCones: 1,
371 MiddleCones: 2, HighCones: 0, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700372 AvgCycle: 34, DockedAuto: true, EngagedAuto: false,
373 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800374 },
375 {
376 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
377 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
378 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
379 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
380 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
381 HighCubes: 1, CubesDropped: 0, LowCones: 0,
382 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700383 AvgCycle: 53, DockedAuto: false, EngagedAuto: false,
384 Docked: false, Engaged: false, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800385 },
386 },
387 }
388 scoutingServer := server.NewScoutingServer()
389 HandleRequests(&db, scoutingServer)
390 scoutingServer.Start(8080)
391 defer scoutingServer.Stop()
392
393 builder := flatbuffers.NewBuilder(1024)
394 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
395
396 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
397 if err != nil {
398 t.Fatal("Failed to request all matches: ", err)
399 }
400
401 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
402 StatsList: []*request_2023_data_scouting_response.Stats2023T{
403 {
404 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
405 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
406 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
407 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
408 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
409 HighCubes: 2, CubesDropped: 1, LowCones: 1,
410 MiddleCones: 2, HighCones: 0, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700411 AvgCycle: 34, DockedAuto: true, EngagedAuto: false,
412 Docked: false, Engaged: false, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800413 },
414 {
415 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
416 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
417 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
418 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
419 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
420 HighCubes: 1, CubesDropped: 0, LowCones: 0,
421 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
Emily Markova46a69bf2023-03-22 20:45:52 -0700422 AvgCycle: 53, DockedAuto: false, EngagedAuto: false,
423 Docked: false, Engaged: false, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800424 },
425 },
426 }
427 if len(expected.StatsList) != len(response.StatsList) {
428 t.Fatal("Expected ", expected, ", but got ", *response)
429 }
430 for i, match := range expected.StatsList {
431 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
432 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
433 }
434 }
435}
436
Emily Markova1abe9782023-03-11 19:45:38 -0800437// Validates that we can request the 2023 stats.
438func TestConvertActionsToStat(t *testing.T) {
439 builder := flatbuffers.NewBuilder(1024)
440 builder.Finish((&submit_actions.SubmitActionsT{
441 TeamNumber: "4244",
442 MatchNumber: 3,
443 SetNumber: 1,
444 CompLevel: "quals",
445 CollectedBy: "katie",
446 ActionsList: []*submit_actions.ActionT{
447 {
448 ActionTaken: &submit_actions.ActionTypeT{
449 Type: submit_actions.ActionTypeStartMatchAction,
450 Value: &submit_actions.StartMatchActionT{
451 Position: 1,
452 },
453 },
454 Timestamp: 0,
455 },
456 {
457 ActionTaken: &submit_actions.ActionTypeT{
458 Type: submit_actions.ActionTypePickupObjectAction,
459 Value: &submit_actions.PickupObjectActionT{
460 ObjectType: submit_actions.ObjectTypekCube,
461 Auto: true,
462 },
463 },
464 Timestamp: 400,
465 },
466 {
467 ActionTaken: &submit_actions.ActionTypeT{
468 Type: submit_actions.ActionTypePickupObjectAction,
469 Value: &submit_actions.PickupObjectActionT{
470 ObjectType: submit_actions.ObjectTypekCube,
471 Auto: true,
472 },
473 },
474 Timestamp: 800,
475 },
476 {
477 ActionTaken: &submit_actions.ActionTypeT{
478 Type: submit_actions.ActionTypePlaceObjectAction,
479 Value: &submit_actions.PlaceObjectActionT{
480 ObjectType: submit_actions.ObjectTypekCube,
481 ScoreLevel: submit_actions.ScoreLevelkLow,
482 Auto: true,
483 },
484 },
485 Timestamp: 2000,
486 },
487 {
488 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700489 Type: submit_actions.ActionTypeAutoBalanceAction,
490 Value: &submit_actions.AutoBalanceActionT{
491 Docked: true,
492 Engaged: true,
493 },
494 },
495 Timestamp: 2400,
496 },
497 {
498 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova1abe9782023-03-11 19:45:38 -0800499 Type: submit_actions.ActionTypePickupObjectAction,
500 Value: &submit_actions.PickupObjectActionT{
501 ObjectType: submit_actions.ObjectTypekCone,
502 Auto: false,
503 },
504 },
505 Timestamp: 2800,
506 },
507 {
508 ActionTaken: &submit_actions.ActionTypeT{
509 Type: submit_actions.ActionTypePlaceObjectAction,
510 Value: &submit_actions.PlaceObjectActionT{
511 ObjectType: submit_actions.ObjectTypekCone,
512 ScoreLevel: submit_actions.ScoreLevelkHigh,
513 Auto: false,
514 },
515 },
516 Timestamp: 3100,
517 },
Emily Markova46a69bf2023-03-22 20:45:52 -0700518 {
519 ActionTaken: &submit_actions.ActionTypeT{
520 Type: submit_actions.ActionTypeEndMatchAction,
521 Value: &submit_actions.EndMatchActionT{
522 Docked: true,
523 Engaged: false,
524 },
525 },
526 Timestamp: 4000,
527 },
Emily Markova1abe9782023-03-11 19:45:38 -0800528 },
529 }).Pack(builder))
530
531 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
532 response, err := ConvertActionsToStat(submitActions)
533
534 if err != nil {
535 t.Fatal("Failed to convert actions to stats: ", err)
536 }
537
538 expected := db.Stats2023{
539 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
540 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
541 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
542 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
543 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
544 HighCubes: 0, CubesDropped: 0, LowCones: 0,
545 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700546 AvgCycle: 1100, DockedAuto: true, EngagedAuto: true,
547 Docked: true, Engaged: false, CollectedBy: "katie",
Emily Markova1abe9782023-03-11 19:45:38 -0800548 }
549
550 if expected != response {
551 t.Fatal("Expected ", expected, ", but got ", response)
552 }
553}
554
Alex Perry81f96ba2022-03-13 18:26:19 -0700555func TestSubmitNotes(t *testing.T) {
556 database := MockDatabase{}
557 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800558 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700559 scoutingServer.Start(8080)
560 defer scoutingServer.Stop()
561
562 builder := flatbuffers.NewBuilder(1024)
563 builder.Finish((&submit_notes.SubmitNotesT{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800564 Team: 971,
565 Notes: "Notes",
566 GoodDriving: true,
567 BadDriving: false,
568 SketchyPickup: true,
569 SketchyPlacing: false,
570 GoodDefense: true,
571 BadDefense: false,
572 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700573 }).Pack(builder))
574
575 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
576 if err != nil {
577 t.Fatal("Failed to submit notes: ", err)
578 }
579
580 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800581 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800582 TeamNumber: 971,
583 Notes: "Notes",
584 GoodDriving: true,
585 BadDriving: false,
586 SketchyPickup: true,
587 SketchyPlacing: false,
588 GoodDefense: true,
589 BadDefense: false,
590 EasilyDefended: true,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800591 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700592 }
593
594 if !reflect.DeepEqual(database.notes, expected) {
595 t.Fatal("Submitted notes did not match", expected, database.notes)
596 }
597}
598
599func TestRequestNotes(t *testing.T) {
600 database := MockDatabase{
601 notes: []db.NotesData{{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800602 TeamNumber: 971,
603 Notes: "Notes",
604 GoodDriving: true,
605 BadDriving: false,
606 SketchyPickup: true,
607 SketchyPlacing: false,
608 GoodDefense: true,
609 BadDefense: false,
610 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700611 }},
612 }
613 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800614 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700615 scoutingServer.Start(8080)
616 defer scoutingServer.Stop()
617
618 builder := flatbuffers.NewBuilder(1024)
619 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
620 Team: 971,
621 }).Pack(builder))
622 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
623 if err != nil {
624 t.Fatal("Failed to submit notes: ", err)
625 }
626
627 if response.Notes[0].Data != "Notes" {
628 t.Fatal("requested notes did not match", response)
629 }
630}
631
Milo Lin1d59f0c2022-06-22 20:30:58 -0700632func TestRequestShiftSchedule(t *testing.T) {
633 db := MockDatabase{
634 shiftSchedule: []db.Shift{
635 {
636 MatchNumber: 1,
637 R1scouter: "Bob",
638 R2scouter: "James",
639 R3scouter: "Robert",
640 B1scouter: "Alice",
641 B2scouter: "Mary",
642 B3scouter: "Patricia",
643 },
644 {
645 MatchNumber: 2,
646 R1scouter: "Liam",
647 R2scouter: "Noah",
648 R3scouter: "Oliver",
649 B1scouter: "Emma",
650 B2scouter: "Charlotte",
651 B3scouter: "Amelia",
652 },
653 },
654 }
655 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800656 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700657 scoutingServer.Start(8080)
658 defer scoutingServer.Stop()
659
660 builder := flatbuffers.NewBuilder(1024)
661 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
662
663 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
664 if err != nil {
665 t.Fatal("Failed to request shift schedule: ", err)
666 }
667
668 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
669 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
670 {
671 MatchNumber: 1,
672 R1scouter: "Bob",
673 R2scouter: "James",
674 R3scouter: "Robert",
675 B1scouter: "Alice",
676 B2scouter: "Mary",
677 B3scouter: "Patricia",
678 },
679 {
680 MatchNumber: 2,
681 R1scouter: "Liam",
682 R2scouter: "Noah",
683 R3scouter: "Oliver",
684 B1scouter: "Emma",
685 B2scouter: "Charlotte",
686 B3scouter: "Amelia",
687 },
688 },
689 }
690 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
691 t.Fatal("Expected ", expected, ", but got ", *response)
692 }
693 for i, match := range expected.ShiftSchedule {
694 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
695 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
696 }
697 }
698}
699
700func TestSubmitShiftSchedule(t *testing.T) {
701 database := MockDatabase{}
702 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800703 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700704 scoutingServer.Start(8080)
705 defer scoutingServer.Stop()
706
707 builder := flatbuffers.NewBuilder(1024)
708 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
709 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
710 {MatchNumber: 1,
711 R1scouter: "Bob",
712 R2scouter: "James",
713 R3scouter: "Robert",
714 B1scouter: "Alice",
715 B2scouter: "Mary",
716 B3scouter: "Patricia"},
717 },
718 }).Pack(builder))
719
720 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
721 if err != nil {
722 t.Fatal("Failed to submit shift schedule: ", err)
723 }
724
725 expected := []db.Shift{
726 {MatchNumber: 1,
727 R1scouter: "Bob",
728 R2scouter: "James",
729 R3scouter: "Robert",
730 B1scouter: "Alice",
731 B2scouter: "Mary",
732 B3scouter: "Patricia"},
733 }
734 if !reflect.DeepEqual(expected, database.shiftSchedule) {
735 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
736 }
737}
738
Filip Kujawa210a03b2022-11-24 14:41:11 -0800739func TestSubmitDriverRanking(t *testing.T) {
740 database := MockDatabase{}
741 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800742 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800743 scoutingServer.Start(8080)
744 defer scoutingServer.Stop()
745
746 builder := flatbuffers.NewBuilder(1024)
747 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
748 MatchNumber: 36,
749 Rank1: 1234,
750 Rank2: 1235,
751 Rank3: 1236,
752 }).Pack(builder))
753
754 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
755 if err != nil {
756 t.Fatal("Failed to submit driver ranking: ", err)
757 }
758
759 expected := []db.DriverRankingData{
760 {MatchNumber: 36, Rank1: 1234, Rank2: 1235, Rank3: 1236},
761 }
762
763 if !reflect.DeepEqual(database.driver_ranking, expected) {
764 t.Fatal("Submitted notes did not match", expected, database.notes)
765 }
766}
767
Filip Kujawaf882e022022-12-14 13:14:08 -0800768// Validates that we can request the driver rankings.
769func TestRequestDriverRankings(t *testing.T) {
770 db := MockDatabase{
771 driver_ranking: []db.DriverRankingData{
772 {
773 MatchNumber: 36,
774 Rank1: 1234,
775 Rank2: 1235,
776 Rank3: 1236,
777 },
778 {
779 MatchNumber: 36,
780 Rank1: 101,
781 Rank2: 202,
782 Rank3: 303,
783 },
784 },
785 }
786 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800787 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800788 scoutingServer.Start(8080)
789 defer scoutingServer.Stop()
790
791 builder := flatbuffers.NewBuilder(1024)
792 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
793
794 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
795 if err != nil {
796 t.Fatal("Failed to request all driver rankings: ", err)
797 }
798
799 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
800 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
801 {
802 MatchNumber: 36,
803 Rank1: 1234,
804 Rank2: 1235,
805 Rank3: 1236,
806 },
807 {
808 MatchNumber: 36,
809 Rank1: 101,
810 Rank2: 202,
811 Rank3: 303,
812 },
813 },
814 }
815 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
816 t.Fatal("Expected ", expected, ", but got ", *response)
817 }
818 for i, match := range expected.DriverRankingList {
819 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
820 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
821 }
822 }
823}
824
825// Validates that we can request all notes.
826func TestRequestAllNotes(t *testing.T) {
827 db := MockDatabase{
828 notes: []db.NotesData{
829 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800830 TeamNumber: 971,
831 Notes: "Notes",
832 GoodDriving: true,
833 BadDriving: false,
834 SketchyPickup: true,
835 SketchyPlacing: false,
836 GoodDefense: true,
837 BadDefense: false,
838 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800839 },
840 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800841 TeamNumber: 972,
842 Notes: "More Notes",
843 GoodDriving: false,
844 BadDriving: false,
845 SketchyPickup: false,
846 SketchyPlacing: true,
847 GoodDefense: false,
848 BadDefense: true,
849 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800850 },
851 },
852 }
853 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800854 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800855 scoutingServer.Start(8080)
856 defer scoutingServer.Stop()
857
858 builder := flatbuffers.NewBuilder(1024)
859 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
860
861 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
862 if err != nil {
863 t.Fatal("Failed to request all notes: ", err)
864 }
865
866 expected := request_all_notes_response.RequestAllNotesResponseT{
867 NoteList: []*request_all_notes_response.NoteT{
868 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800869 Team: 971,
870 Notes: "Notes",
871 GoodDriving: true,
872 BadDriving: false,
873 SketchyPickup: true,
874 SketchyPlacing: false,
875 GoodDefense: true,
876 BadDefense: false,
877 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800878 },
879 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800880 Team: 972,
881 Notes: "More Notes",
882 GoodDriving: false,
883 BadDriving: false,
884 SketchyPickup: false,
885 SketchyPlacing: true,
886 GoodDefense: false,
887 BadDefense: true,
888 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800889 },
890 },
891 }
892 if len(expected.NoteList) != len(response.NoteList) {
893 t.Fatal("Expected ", expected, ", but got ", *response)
894 }
895 for i, note := range expected.NoteList {
896 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
897 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
898 }
899 }
900}
901
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800902// A mocked database we can use for testing. Add functionality to this as
903// needed for your tests.
904
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800905type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800906 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -0800907 stats []db.Stats
908 notes []db.NotesData
909 shiftSchedule []db.Shift
910 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -0800911 stats2023 []db.Stats2023
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800912}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800913
Emily Markovabf24c9e2023-02-08 20:31:11 -0800914func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -0800915 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800916 return nil
917}
918
Philipp Schrader30005e42022-03-06 13:53:58 -0800919func (database *MockDatabase) AddToStats(stats db.Stats) error {
920 database.stats = append(database.stats, stats)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800921 return nil
922}
923
Emily Markova290147d2023-03-03 22:40:06 -0800924func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
925 database.stats2023 = append(database.stats2023, stats2023)
926 return nil
927}
Emily Markovabf24c9e2023-02-08 20:31:11 -0800928func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800929 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800930}
931
932func (database *MockDatabase) ReturnStats() ([]db.Stats, error) {
Philipp Schraderacf96232022-03-01 22:03:30 -0800933 return database.stats, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800934}
935
Emily Markova290147d2023-03-03 22:40:06 -0800936func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
937 return database.stats2023, nil
938}
939
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800940func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string) ([]db.Stats2023, error) {
941 var results []db.Stats2023
942 for _, stats := range database.stats2023 {
943 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel {
944 results = append(results, stats)
945 }
946 }
947 return results, nil
948}
949
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800950func (database *MockDatabase) QueryStats(int) ([]db.Stats, error) {
951 return []db.Stats{}, nil
952}
Philipp Schraderd3fac192022-03-02 20:35:46 -0800953
Philipp Schradereecb8962022-06-01 21:02:42 -0700954func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -0700955 var results []string
956 for _, data := range database.notes {
957 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -0700958 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -0700959 }
960 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700961 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -0700962}
963
Filip Kujawaf947cb42022-11-21 10:00:30 -0800964func (database *MockDatabase) AddNotes(data db.NotesData) error {
965 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -0700966 return nil
967}
968
Filip Kujawaf882e022022-12-14 13:14:08 -0800969func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
970 return database.notes, nil
971}
972
Milo Lin1d59f0c2022-06-22 20:30:58 -0700973func (database *MockDatabase) AddToShift(data db.Shift) error {
974 database.shiftSchedule = append(database.shiftSchedule, data)
975 return nil
976}
977
978func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
979 return database.shiftSchedule, nil
980}
981
982func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
983 return []db.Shift{}, nil
984}
985
Filip Kujawa210a03b2022-11-24 14:41:11 -0800986func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
987 database.driver_ranking = append(database.driver_ranking, data)
988 return nil
989}
990
Filip Kujawaf882e022022-12-14 13:14:08 -0800991func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
992 return database.driver_ranking, nil
993}