blob: b6f09fcbba970edc331841d7d52ca26abd185b7f [file] [log] [blame]
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08001package requests
2
3import (
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08004 "net/http"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08005 "reflect"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -08006 "testing"
7
Philipp Schrader8747f1b2022-02-23 23:56:22 -08008 "github.com/frc971/971-Robot-Code/scouting/db"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -08009 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/debug"
Emily Markova290147d2023-03-03 22:40:06 -080010 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting"
11 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080012 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
13 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080014 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
15 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
Filip Kujawaf882e022022-12-14 13:14:08 -080016 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
17 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
Alex Perry81f96ba2022-03-13 18:26:19 -070018 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
Milo Lin1d59f0c2022-06-22 20:30:58 -070019 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
20 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
Emily Markova1abe9782023-03-11 19:45:38 -080021 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions"
Filip Kujawa210a03b2022-11-24 14:41:11 -080022 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
Alex Perry81f96ba2022-03-13 18:26:19 -070023 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
Milo Lin1d59f0c2022-06-22 20:30:58 -070024 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080025 "github.com/frc971/971-Robot-Code/scouting/webserver/server"
26 flatbuffers "github.com/google/flatbuffers/go"
27)
28
29// Validates that an unhandled address results in a 404.
30func Test404(t *testing.T) {
Philipp Schrader8747f1b2022-02-23 23:56:22 -080031 db := MockDatabase{}
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080032 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -080033 HandleRequests(&db, scoutingServer)
Philipp Schradercdb5cfc2022-02-20 14:57:07 -080034 scoutingServer.Start(8080)
35 defer scoutingServer.Stop()
36
37 resp, err := http.Get("http://localhost:8080/requests/foo")
38 if err != nil {
39 t.Fatalf("Failed to get data: %v", err)
40 }
41 if resp.StatusCode != http.StatusNotFound {
42 t.Fatalf("Expected error code 404, but got %d instead", resp.Status)
43 }
44}
45
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080046// Validates that we can request the full match list.
47func TestRequestAllMatches(t *testing.T) {
48 db := MockDatabase{
Emily Markovabf24c9e2023-02-08 20:31:11 -080049 matches: []db.TeamMatch{
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080050 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080051 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070052 Alliance: "R", AlliancePosition: 1, TeamNumber: "5",
Emily Markovabf24c9e2023-02-08 20:31:11 -080053 },
54 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080055 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070056 Alliance: "R", AlliancePosition: 2, TeamNumber: "42",
Emily Markovabf24c9e2023-02-08 20:31:11 -080057 },
58 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080059 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070060 Alliance: "R", AlliancePosition: 3, TeamNumber: "600",
Emily Markovabf24c9e2023-02-08 20:31:11 -080061 },
62 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080063 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070064 Alliance: "B", AlliancePosition: 1, TeamNumber: "971",
Emily Markovabf24c9e2023-02-08 20:31:11 -080065 },
66 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080067 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070068 Alliance: "B", AlliancePosition: 2, TeamNumber: "400",
Emily Markovabf24c9e2023-02-08 20:31:11 -080069 },
70 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080071 MatchNumber: 1, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070072 Alliance: "B", AlliancePosition: 3, TeamNumber: "200",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080073 },
74 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080075 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070076 Alliance: "R", AlliancePosition: 1, TeamNumber: "6",
Emily Markovabf24c9e2023-02-08 20:31:11 -080077 },
78 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080079 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070080 Alliance: "R", AlliancePosition: 2, TeamNumber: "43",
Emily Markovabf24c9e2023-02-08 20:31:11 -080081 },
82 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080083 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070084 Alliance: "R", AlliancePosition: 3, TeamNumber: "601",
Emily Markovabf24c9e2023-02-08 20:31:11 -080085 },
86 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080087 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070088 Alliance: "B", AlliancePosition: 1, TeamNumber: "972",
Emily Markovabf24c9e2023-02-08 20:31:11 -080089 },
90 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080091 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070092 Alliance: "B", AlliancePosition: 2, TeamNumber: "401",
Emily Markovabf24c9e2023-02-08 20:31:11 -080093 },
94 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080095 MatchNumber: 2, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -070096 Alliance: "B", AlliancePosition: 3, TeamNumber: "201",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080097 },
98 {
Emily Markovaabcac6e2023-02-18 17:50:03 -080099 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700100 Alliance: "R", AlliancePosition: 1, TeamNumber: "7",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800101 },
102 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800103 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700104 Alliance: "R", AlliancePosition: 2, TeamNumber: "44",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800105 },
106 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800107 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700108 Alliance: "R", AlliancePosition: 3, TeamNumber: "602",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800109 },
110 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800111 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700112 Alliance: "B", AlliancePosition: 1, TeamNumber: "973",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800113 },
114 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800115 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700116 Alliance: "B", AlliancePosition: 2, TeamNumber: "402",
Emily Markovabf24c9e2023-02-08 20:31:11 -0800117 },
118 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800119 MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700120 Alliance: "B", AlliancePosition: 3, TeamNumber: "202",
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800121 },
122 },
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800123 // Pretend that we have some data scouting data.
124 stats2023: []db.Stats2023{
125 {
126 TeamNumber: "5", MatchNumber: 1, SetNumber: 1,
127 CompLevel: "qm", StartingQuadrant: 3, LowCubesAuto: 10,
128 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
129 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
130 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
131 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700132 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700133 AvgCycle: 34, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700134 BalanceAttemptAuto: false, Docked: false, Engaged: false,
135 BalanceAttempt: false, CollectedBy: "alex",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800136 },
137 {
138 TeamNumber: "973", MatchNumber: 3, SetNumber: 1,
139 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
140 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
141 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
142 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
143 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700144 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700145 AvgCycle: 53, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700146 BalanceAttemptAuto: false, Docked: false, Engaged: false,
147 BalanceAttempt: true, CollectedBy: "bob",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800148 },
149 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800150 }
151 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800152 HandleRequests(&db, scoutingServer)
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800153 scoutingServer.Start(8080)
154 defer scoutingServer.Stop()
155
156 builder := flatbuffers.NewBuilder(1024)
157 builder.Finish((&request_all_matches.RequestAllMatchesT{}).Pack(builder))
158
159 response, err := debug.RequestAllMatches("http://localhost:8080", builder.FinishedBytes())
160 if err != nil {
161 t.Fatal("Failed to request all matches: ", err)
162 }
163
164 expected := request_all_matches_response.RequestAllMatchesResponseT{
165 MatchList: []*request_all_matches_response.MatchT{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700166 // MatchNumber, SetNumber, CompLevel
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800167 // R1, R2, R3, B1, B2, B3
168 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800169 1, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700170 "5", "42", "600", "971", "400", "200",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800171 &request_all_matches_response.ScoutedLevelT{
172 // The R1 team has already been data
173 // scouted.
174 true, false, false, false, false, false,
175 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800176 },
177 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800178 2, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700179 "6", "43", "601", "972", "401", "201",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800180 &request_all_matches_response.ScoutedLevelT{
181 false, false, false, false, false, false,
182 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800183 },
184 {
Emily Markovaabcac6e2023-02-18 17:50:03 -0800185 3, 1, "qm",
Emily Markovab8551572023-03-22 19:49:39 -0700186 "7", "44", "602", "973", "402", "202",
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800187 &request_all_matches_response.ScoutedLevelT{
188 // The B1 team has already been data
189 // scouted.
190 false, false, false, true, false, false,
191 },
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800192 },
193 },
194 }
195 if len(expected.MatchList) != len(response.MatchList) {
196 t.Fatal("Expected ", expected, ", but got ", *response)
197 }
198 for i, match := range expected.MatchList {
199 if !reflect.DeepEqual(*match, *response.MatchList[i]) {
200 t.Fatal("Expected for match", i, ":", *match, ", but got:", *response.MatchList[i])
201 }
202 }
Philipp Schrader30005e42022-03-06 13:53:58 -0800203
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800204}
205
Emily Markova290147d2023-03-03 22:40:06 -0800206// Validates that we can request the 2023 stats.
207func TestRequest2023DataScouting(t *testing.T) {
208 db := MockDatabase{
209 stats2023: []db.Stats2023{
210 {
211 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
212 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
213 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
214 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
215 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
216 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700217 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700218 AvgCycle: 34, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700219 BalanceAttemptAuto: false, Docked: false, Engaged: false,
220 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800221 },
222 {
223 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
224 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
225 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
226 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
227 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
228 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700229 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700230 AvgCycle: 53, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700231 BalanceAttemptAuto: true, Docked: false, Engaged: false,
232 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800233 },
234 },
235 }
236 scoutingServer := server.NewScoutingServer()
237 HandleRequests(&db, scoutingServer)
238 scoutingServer.Start(8080)
239 defer scoutingServer.Stop()
240
241 builder := flatbuffers.NewBuilder(1024)
242 builder.Finish((&request_2023_data_scouting.Request2023DataScoutingT{}).Pack(builder))
243
244 response, err := debug.Request2023DataScouting("http://localhost:8080", builder.FinishedBytes())
245 if err != nil {
246 t.Fatal("Failed to request all matches: ", err)
247 }
248
249 expected := request_2023_data_scouting_response.Request2023DataScoutingResponseT{
250 StatsList: []*request_2023_data_scouting_response.Stats2023T{
251 {
252 TeamNumber: "3634", MatchNumber: 1, SetNumber: 2,
253 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 10,
254 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
255 LowConesAuto: 1, MiddleConesAuto: 2, HighConesAuto: 1,
256 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 1,
257 HighCubes: 2, CubesDropped: 1, LowCones: 1,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700258 MiddleCones: 2, HighCones: 0, ConesDropped: 1, SuperchargedPieces: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700259 AvgCycle: 34, DockedAuto: true, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700260 BalanceAttemptAuto: false, Docked: false, Engaged: false,
261 BalanceAttempt: true, CollectedBy: "isaac",
Emily Markova290147d2023-03-03 22:40:06 -0800262 },
263 {
264 TeamNumber: "2343", MatchNumber: 1, SetNumber: 2,
265 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
266 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 2,
267 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
268 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
269 HighCubes: 1, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700270 MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
Emily Markova46a69bf2023-03-22 20:45:52 -0700271 AvgCycle: 53, DockedAuto: false, EngagedAuto: false,
Emily Markova63c63f62023-03-29 20:57:35 -0700272 BalanceAttemptAuto: true, Docked: false, Engaged: false,
273 BalanceAttempt: true, CollectedBy: "unknown",
Emily Markova290147d2023-03-03 22:40:06 -0800274 },
275 },
276 }
277 if len(expected.StatsList) != len(response.StatsList) {
278 t.Fatal("Expected ", expected, ", but got ", *response)
279 }
280 for i, match := range expected.StatsList {
281 if !reflect.DeepEqual(*match, *response.StatsList[i]) {
282 t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
283 }
284 }
285}
286
Emily Markova1abe9782023-03-11 19:45:38 -0800287// Validates that we can request the 2023 stats.
288func TestConvertActionsToStat(t *testing.T) {
289 builder := flatbuffers.NewBuilder(1024)
290 builder.Finish((&submit_actions.SubmitActionsT{
291 TeamNumber: "4244",
292 MatchNumber: 3,
293 SetNumber: 1,
294 CompLevel: "quals",
295 CollectedBy: "katie",
296 ActionsList: []*submit_actions.ActionT{
297 {
298 ActionTaken: &submit_actions.ActionTypeT{
299 Type: submit_actions.ActionTypeStartMatchAction,
300 Value: &submit_actions.StartMatchActionT{
301 Position: 1,
302 },
303 },
304 Timestamp: 0,
305 },
306 {
307 ActionTaken: &submit_actions.ActionTypeT{
308 Type: submit_actions.ActionTypePickupObjectAction,
309 Value: &submit_actions.PickupObjectActionT{
310 ObjectType: submit_actions.ObjectTypekCube,
311 Auto: true,
312 },
313 },
314 Timestamp: 400,
315 },
316 {
317 ActionTaken: &submit_actions.ActionTypeT{
318 Type: submit_actions.ActionTypePickupObjectAction,
319 Value: &submit_actions.PickupObjectActionT{
320 ObjectType: submit_actions.ObjectTypekCube,
321 Auto: true,
322 },
323 },
324 Timestamp: 800,
325 },
326 {
327 ActionTaken: &submit_actions.ActionTypeT{
328 Type: submit_actions.ActionTypePlaceObjectAction,
329 Value: &submit_actions.PlaceObjectActionT{
330 ObjectType: submit_actions.ObjectTypekCube,
331 ScoreLevel: submit_actions.ScoreLevelkLow,
332 Auto: true,
333 },
334 },
335 Timestamp: 2000,
336 },
337 {
338 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700339 Type: submit_actions.ActionTypeAutoBalanceAction,
340 Value: &submit_actions.AutoBalanceActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700341 Docked: true,
342 Engaged: true,
343 BalanceAttempt: false,
Emily Markova46a69bf2023-03-22 20:45:52 -0700344 },
345 },
346 Timestamp: 2400,
347 },
348 {
349 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova1abe9782023-03-11 19:45:38 -0800350 Type: submit_actions.ActionTypePickupObjectAction,
351 Value: &submit_actions.PickupObjectActionT{
352 ObjectType: submit_actions.ObjectTypekCone,
353 Auto: false,
354 },
355 },
356 Timestamp: 2800,
357 },
358 {
359 ActionTaken: &submit_actions.ActionTypeT{
360 Type: submit_actions.ActionTypePlaceObjectAction,
361 Value: &submit_actions.PlaceObjectActionT{
362 ObjectType: submit_actions.ObjectTypekCone,
363 ScoreLevel: submit_actions.ScoreLevelkHigh,
364 Auto: false,
365 },
366 },
367 Timestamp: 3100,
368 },
Emily Markova46a69bf2023-03-22 20:45:52 -0700369 {
370 ActionTaken: &submit_actions.ActionTypeT{
Filip Kujawa7a045e72023-04-13 08:41:09 -0700371 Type: submit_actions.ActionTypePickupObjectAction,
372 Value: &submit_actions.PickupObjectActionT{
373 ObjectType: submit_actions.ObjectTypekCube,
374 Auto: false,
375 },
376 },
377 Timestamp: 3500,
378 },
379 {
380 ActionTaken: &submit_actions.ActionTypeT{
381 Type: submit_actions.ActionTypePlaceObjectAction,
382 Value: &submit_actions.PlaceObjectActionT{
383 ObjectType: submit_actions.ObjectTypekCube,
384 ScoreLevel: submit_actions.ScoreLevelkSupercharged,
385 Auto: false,
386 },
387 },
388 Timestamp: 3900,
389 },
390 {
391 ActionTaken: &submit_actions.ActionTypeT{
Emily Markova46a69bf2023-03-22 20:45:52 -0700392 Type: submit_actions.ActionTypeEndMatchAction,
393 Value: &submit_actions.EndMatchActionT{
Emily Markova63c63f62023-03-29 20:57:35 -0700394 Docked: true,
395 Engaged: false,
396 BalanceAttempt: true,
Emily Markova46a69bf2023-03-22 20:45:52 -0700397 },
398 },
Filip Kujawa7a045e72023-04-13 08:41:09 -0700399 Timestamp: 4200,
Emily Markova46a69bf2023-03-22 20:45:52 -0700400 },
Emily Markova1abe9782023-03-11 19:45:38 -0800401 },
402 }).Pack(builder))
403
404 submitActions := submit_actions.GetRootAsSubmitActions(builder.FinishedBytes(), 0)
405 response, err := ConvertActionsToStat(submitActions)
406
407 if err != nil {
408 t.Fatal("Failed to convert actions to stats: ", err)
409 }
410
411 expected := db.Stats2023{
412 TeamNumber: "4244", MatchNumber: 3, SetNumber: 1,
413 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
414 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 1,
415 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 0,
416 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 0,
417 HighCubes: 0, CubesDropped: 0, LowCones: 0,
Filip Kujawa7a045e72023-04-13 08:41:09 -0700418 MiddleCones: 0, HighCones: 1, ConesDropped: 0, SuperchargedPieces: 1,
419 AvgCycle: 950, DockedAuto: true, EngagedAuto: true,
Emily Markova63c63f62023-03-29 20:57:35 -0700420 BalanceAttemptAuto: false, Docked: true, Engaged: false,
421 BalanceAttempt: true, CollectedBy: "katie",
Emily Markova1abe9782023-03-11 19:45:38 -0800422 }
423
424 if expected != response {
425 t.Fatal("Expected ", expected, ", but got ", response)
426 }
427}
428
Alex Perry81f96ba2022-03-13 18:26:19 -0700429func TestSubmitNotes(t *testing.T) {
430 database := MockDatabase{}
431 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800432 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700433 scoutingServer.Start(8080)
434 defer scoutingServer.Stop()
435
436 builder := flatbuffers.NewBuilder(1024)
437 builder.Finish((&submit_notes.SubmitNotesT{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800438 Team: 971,
439 Notes: "Notes",
440 GoodDriving: true,
441 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700442 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800443 SketchyPlacing: false,
444 GoodDefense: true,
445 BadDefense: false,
446 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700447 }).Pack(builder))
448
449 _, err := debug.SubmitNotes("http://localhost:8080", builder.FinishedBytes())
450 if err != nil {
451 t.Fatal("Failed to submit notes: ", err)
452 }
453
454 expected := []db.NotesData{
Filip Kujawaf947cb42022-11-21 10:00:30 -0800455 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800456 TeamNumber: 971,
457 Notes: "Notes",
458 GoodDriving: true,
459 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700460 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800461 SketchyPlacing: false,
462 GoodDefense: true,
463 BadDefense: false,
464 EasilyDefended: true,
Filip Kujawaf947cb42022-11-21 10:00:30 -0800465 },
Alex Perry81f96ba2022-03-13 18:26:19 -0700466 }
467
468 if !reflect.DeepEqual(database.notes, expected) {
469 t.Fatal("Submitted notes did not match", expected, database.notes)
470 }
471}
472
473func TestRequestNotes(t *testing.T) {
474 database := MockDatabase{
475 notes: []db.NotesData{{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800476 TeamNumber: 971,
477 Notes: "Notes",
478 GoodDriving: true,
479 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700480 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800481 SketchyPlacing: false,
482 GoodDefense: true,
483 BadDefense: false,
484 EasilyDefended: true,
Alex Perry81f96ba2022-03-13 18:26:19 -0700485 }},
486 }
487 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800488 HandleRequests(&database, scoutingServer)
Alex Perry81f96ba2022-03-13 18:26:19 -0700489 scoutingServer.Start(8080)
490 defer scoutingServer.Stop()
491
492 builder := flatbuffers.NewBuilder(1024)
493 builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
494 Team: 971,
495 }).Pack(builder))
496 response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
497 if err != nil {
498 t.Fatal("Failed to submit notes: ", err)
499 }
500
501 if response.Notes[0].Data != "Notes" {
502 t.Fatal("requested notes did not match", response)
503 }
504}
505
Milo Lin1d59f0c2022-06-22 20:30:58 -0700506func TestRequestShiftSchedule(t *testing.T) {
507 db := MockDatabase{
508 shiftSchedule: []db.Shift{
509 {
510 MatchNumber: 1,
511 R1scouter: "Bob",
512 R2scouter: "James",
513 R3scouter: "Robert",
514 B1scouter: "Alice",
515 B2scouter: "Mary",
516 B3scouter: "Patricia",
517 },
518 {
519 MatchNumber: 2,
520 R1scouter: "Liam",
521 R2scouter: "Noah",
522 R3scouter: "Oliver",
523 B1scouter: "Emma",
524 B2scouter: "Charlotte",
525 B3scouter: "Amelia",
526 },
527 },
528 }
529 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800530 HandleRequests(&db, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700531 scoutingServer.Start(8080)
532 defer scoutingServer.Stop()
533
534 builder := flatbuffers.NewBuilder(1024)
535 builder.Finish((&request_shift_schedule.RequestShiftScheduleT{}).Pack(builder))
536
537 response, err := debug.RequestShiftSchedule("http://localhost:8080", builder.FinishedBytes())
538 if err != nil {
539 t.Fatal("Failed to request shift schedule: ", err)
540 }
541
542 expected := request_shift_schedule_response.RequestShiftScheduleResponseT{
543 ShiftSchedule: []*request_shift_schedule_response.MatchAssignmentT{
544 {
545 MatchNumber: 1,
546 R1scouter: "Bob",
547 R2scouter: "James",
548 R3scouter: "Robert",
549 B1scouter: "Alice",
550 B2scouter: "Mary",
551 B3scouter: "Patricia",
552 },
553 {
554 MatchNumber: 2,
555 R1scouter: "Liam",
556 R2scouter: "Noah",
557 R3scouter: "Oliver",
558 B1scouter: "Emma",
559 B2scouter: "Charlotte",
560 B3scouter: "Amelia",
561 },
562 },
563 }
564 if len(expected.ShiftSchedule) != len(response.ShiftSchedule) {
565 t.Fatal("Expected ", expected, ", but got ", *response)
566 }
567 for i, match := range expected.ShiftSchedule {
568 if !reflect.DeepEqual(*match, *response.ShiftSchedule[i]) {
569 t.Fatal("Expected for shift schedule", i, ":", *match, ", but got:", *response.ShiftSchedule[i])
570 }
571 }
572}
573
574func TestSubmitShiftSchedule(t *testing.T) {
575 database := MockDatabase{}
576 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800577 HandleRequests(&database, scoutingServer)
Milo Lin1d59f0c2022-06-22 20:30:58 -0700578 scoutingServer.Start(8080)
579 defer scoutingServer.Stop()
580
581 builder := flatbuffers.NewBuilder(1024)
582 builder.Finish((&submit_shift_schedule.SubmitShiftScheduleT{
583 ShiftSchedule: []*submit_shift_schedule.MatchAssignmentT{
584 {MatchNumber: 1,
585 R1scouter: "Bob",
586 R2scouter: "James",
587 R3scouter: "Robert",
588 B1scouter: "Alice",
589 B2scouter: "Mary",
590 B3scouter: "Patricia"},
591 },
592 }).Pack(builder))
593
594 _, err := debug.SubmitShiftSchedule("http://localhost:8080", builder.FinishedBytes())
595 if err != nil {
596 t.Fatal("Failed to submit shift schedule: ", err)
597 }
598
599 expected := []db.Shift{
600 {MatchNumber: 1,
601 R1scouter: "Bob",
602 R2scouter: "James",
603 R3scouter: "Robert",
604 B1scouter: "Alice",
605 B2scouter: "Mary",
606 B3scouter: "Patricia"},
607 }
608 if !reflect.DeepEqual(expected, database.shiftSchedule) {
609 t.Fatal("Expected ", expected, ", but got:", database.shiftSchedule)
610 }
611}
612
Filip Kujawa210a03b2022-11-24 14:41:11 -0800613func TestSubmitDriverRanking(t *testing.T) {
614 database := MockDatabase{}
615 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800616 HandleRequests(&database, scoutingServer)
Filip Kujawa210a03b2022-11-24 14:41:11 -0800617 scoutingServer.Start(8080)
618 defer scoutingServer.Stop()
619
620 builder := flatbuffers.NewBuilder(1024)
621 builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
622 MatchNumber: 36,
623 Rank1: 1234,
624 Rank2: 1235,
625 Rank3: 1236,
626 }).Pack(builder))
627
628 _, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
629 if err != nil {
630 t.Fatal("Failed to submit driver ranking: ", err)
631 }
632
633 expected := []db.DriverRankingData{
634 {MatchNumber: 36, Rank1: 1234, Rank2: 1235, Rank3: 1236},
635 }
636
637 if !reflect.DeepEqual(database.driver_ranking, expected) {
638 t.Fatal("Submitted notes did not match", expected, database.notes)
639 }
640}
641
Filip Kujawaf882e022022-12-14 13:14:08 -0800642// Validates that we can request the driver rankings.
643func TestRequestDriverRankings(t *testing.T) {
644 db := MockDatabase{
645 driver_ranking: []db.DriverRankingData{
646 {
647 MatchNumber: 36,
648 Rank1: 1234,
649 Rank2: 1235,
650 Rank3: 1236,
651 },
652 {
653 MatchNumber: 36,
654 Rank1: 101,
655 Rank2: 202,
656 Rank3: 303,
657 },
658 },
659 }
660 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800661 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800662 scoutingServer.Start(8080)
663 defer scoutingServer.Stop()
664
665 builder := flatbuffers.NewBuilder(1024)
666 builder.Finish((&request_all_driver_rankings.RequestAllDriverRankingsT{}).Pack(builder))
667
668 response, err := debug.RequestAllDriverRankings("http://localhost:8080", builder.FinishedBytes())
669 if err != nil {
670 t.Fatal("Failed to request all driver rankings: ", err)
671 }
672
673 expected := request_all_driver_rankings_response.RequestAllDriverRankingsResponseT{
674 DriverRankingList: []*request_all_driver_rankings_response.RankingT{
675 {
676 MatchNumber: 36,
677 Rank1: 1234,
678 Rank2: 1235,
679 Rank3: 1236,
680 },
681 {
682 MatchNumber: 36,
683 Rank1: 101,
684 Rank2: 202,
685 Rank3: 303,
686 },
687 },
688 }
689 if len(expected.DriverRankingList) != len(response.DriverRankingList) {
690 t.Fatal("Expected ", expected, ", but got ", *response)
691 }
692 for i, match := range expected.DriverRankingList {
693 if !reflect.DeepEqual(*match, *response.DriverRankingList[i]) {
694 t.Fatal("Expected for driver ranking", i, ":", *match, ", but got:", *response.DriverRankingList[i])
695 }
696 }
697}
698
699// Validates that we can request all notes.
700func TestRequestAllNotes(t *testing.T) {
701 db := MockDatabase{
702 notes: []db.NotesData{
703 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800704 TeamNumber: 971,
705 Notes: "Notes",
706 GoodDriving: true,
707 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700708 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800709 SketchyPlacing: false,
710 GoodDefense: true,
711 BadDefense: false,
712 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800713 },
714 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800715 TeamNumber: 972,
716 Notes: "More Notes",
717 GoodDriving: false,
718 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700719 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800720 SketchyPlacing: true,
721 GoodDefense: false,
722 BadDefense: true,
723 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800724 },
725 },
726 }
727 scoutingServer := server.NewScoutingServer()
Philipp Schrader43c730b2023-02-26 20:27:44 -0800728 HandleRequests(&db, scoutingServer)
Filip Kujawaf882e022022-12-14 13:14:08 -0800729 scoutingServer.Start(8080)
730 defer scoutingServer.Stop()
731
732 builder := flatbuffers.NewBuilder(1024)
733 builder.Finish((&request_all_notes.RequestAllNotesT{}).Pack(builder))
734
735 response, err := debug.RequestAllNotes("http://localhost:8080", builder.FinishedBytes())
736 if err != nil {
737 t.Fatal("Failed to request all notes: ", err)
738 }
739
740 expected := request_all_notes_response.RequestAllNotesResponseT{
741 NoteList: []*request_all_notes_response.NoteT{
742 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800743 Team: 971,
744 Notes: "Notes",
745 GoodDriving: true,
746 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700747 SolidPlacing: true,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800748 SketchyPlacing: false,
749 GoodDefense: true,
750 BadDefense: false,
751 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800752 },
753 {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800754 Team: 972,
755 Notes: "More Notes",
756 GoodDriving: false,
757 BadDriving: false,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700758 SolidPlacing: false,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800759 SketchyPlacing: true,
760 GoodDefense: false,
761 BadDefense: true,
762 EasilyDefended: false,
Filip Kujawaf882e022022-12-14 13:14:08 -0800763 },
764 },
765 }
766 if len(expected.NoteList) != len(response.NoteList) {
767 t.Fatal("Expected ", expected, ", but got ", *response)
768 }
769 for i, note := range expected.NoteList {
770 if !reflect.DeepEqual(*note, *response.NoteList[i]) {
771 t.Fatal("Expected for note", i, ":", *note, ", but got:", *response.NoteList[i])
772 }
773 }
774}
775
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800776func packAction(action *submit_actions.ActionT) []byte {
777 builder := flatbuffers.NewBuilder(50 * 1024)
778 builder.Finish((action).Pack(builder))
779 return (builder.FinishedBytes())
780}
781
782func TestAddingActions(t *testing.T) {
783 database := MockDatabase{}
784 scoutingServer := server.NewScoutingServer()
785 HandleRequests(&database, scoutingServer)
786 scoutingServer.Start(8080)
787 defer scoutingServer.Stop()
788
789 builder := flatbuffers.NewBuilder(1024)
790 builder.Finish((&submit_actions.SubmitActionsT{
791 TeamNumber: "1234",
792 MatchNumber: 4,
793 SetNumber: 1,
794 CompLevel: "qual",
795 ActionsList: []*submit_actions.ActionT{
796 {
797 ActionTaken: &submit_actions.ActionTypeT{
798 Type: submit_actions.ActionTypePickupObjectAction,
799 Value: &submit_actions.PickupObjectActionT{
800 ObjectType: submit_actions.ObjectTypekCube,
801 Auto: true,
802 },
803 },
804 Timestamp: 2400,
805 },
806 {
807 ActionTaken: &submit_actions.ActionTypeT{
808 Type: submit_actions.ActionTypePlaceObjectAction,
809 Value: &submit_actions.PlaceObjectActionT{
810 ObjectType: submit_actions.ObjectTypekCube,
811 ScoreLevel: submit_actions.ScoreLevelkLow,
812 Auto: false,
813 },
814 },
815 Timestamp: 1009,
816 },
817 },
818 }).Pack(builder))
819
820 _, err := debug.SubmitActions("http://localhost:8080", builder.FinishedBytes())
821 if err != nil {
822 t.Fatal("Failed to submit actions: ", err)
823 }
824
825 // Make sure that the data made it into the database.
826 // TODO: Add this back when we figure out how to add the serialized action into the database.
827
828 /* expectedActionsT := []*submit_actions.ActionT{
829 {
830 ActionTaken: &submit_actions.ActionTypeT{
831 Type: submit_actions.ActionTypePickupObjectAction,
832 Value: &submit_actions.PickupObjectActionT{
833 ObjectType: submit_actions.ObjectTypekCube,
834 Auto: true,
835 },
836 },
837 Timestamp: 2400,
838 },
839 {
840 ActionTaken: &submit_actions.ActionTypeT{
841 Type: submit_actions.ActionTypePlaceObjectAction,
842 Value: &submit_actions.PlaceObjectActionT{
843 ObjectType: submit_actions.ObjectTypekCube,
844 ScoreLevel: submit_actions.ScoreLevelkLow,
845 Auto: false,
846 },
847 },
848 Timestamp: 1009,
849 },
850 } */
851
852 expectedActions := []db.Action{
853 {
854 TeamNumber: "1234",
855 MatchNumber: 4,
856 SetNumber: 1,
857 CompLevel: "qual",
858 CollectedBy: "debug_cli",
859 CompletedAction: []byte{},
860 Timestamp: 2400,
861 },
862 {
863 TeamNumber: "1234",
864 MatchNumber: 4,
865 SetNumber: 1,
866 CompLevel: "qual",
867 CollectedBy: "debug_cli",
868 CompletedAction: []byte{},
869 Timestamp: 1009,
870 },
871 }
872
873 if !reflect.DeepEqual(expectedActions, database.actions) {
874 t.Fatal("Expected ", expectedActions, ", but got:", database.actions)
875 }
876
877}
878
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800879// A mocked database we can use for testing. Add functionality to this as
880// needed for your tests.
881
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800882type MockDatabase struct {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800883 matches []db.TeamMatch
Filip Kujawa210a03b2022-11-24 14:41:11 -0800884 notes []db.NotesData
885 shiftSchedule []db.Shift
886 driver_ranking []db.DriverRankingData
Emily Markova290147d2023-03-03 22:40:06 -0800887 stats2023 []db.Stats2023
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800888 actions []db.Action
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800889}
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800890
Emily Markovabf24c9e2023-02-08 20:31:11 -0800891func (database *MockDatabase) AddToMatch(match db.TeamMatch) error {
Philipp Schraderd3fac192022-03-02 20:35:46 -0800892 database.matches = append(database.matches, match)
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800893 return nil
894}
895
Emily Markova290147d2023-03-03 22:40:06 -0800896func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
897 database.stats2023 = append(database.stats2023, stats2023)
898 return nil
899}
Emily Markovabf24c9e2023-02-08 20:31:11 -0800900func (database *MockDatabase) ReturnMatches() ([]db.TeamMatch, error) {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -0800901 return database.matches, nil
Philipp Schrader8747f1b2022-02-23 23:56:22 -0800902}
903
Emily Markova290147d2023-03-03 22:40:06 -0800904func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
905 return database.stats2023, nil
906}
907
Philipp Schrader0f7b6362023-03-11 14:02:48 -0800908func (database *MockDatabase) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string) ([]db.Stats2023, error) {
909 var results []db.Stats2023
910 for _, stats := range database.stats2023 {
911 if stats.TeamNumber == teamNumber && stats.MatchNumber == matchNumber && stats.SetNumber == setNumber && stats.CompLevel == compLevel {
912 results = append(results, stats)
913 }
914 }
915 return results, nil
916}
917
Philipp Schradereecb8962022-06-01 21:02:42 -0700918func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
Alex Perry81f96ba2022-03-13 18:26:19 -0700919 var results []string
920 for _, data := range database.notes {
921 if data.TeamNumber == requestedTeam {
Philipp Schradereecb8962022-06-01 21:02:42 -0700922 results = append(results, data.Notes)
Alex Perry81f96ba2022-03-13 18:26:19 -0700923 }
924 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700925 return results, nil
Alex Perry81f96ba2022-03-13 18:26:19 -0700926}
927
Filip Kujawaf947cb42022-11-21 10:00:30 -0800928func (database *MockDatabase) AddNotes(data db.NotesData) error {
929 database.notes = append(database.notes, data)
Alex Perry81f96ba2022-03-13 18:26:19 -0700930 return nil
931}
932
Filip Kujawaf882e022022-12-14 13:14:08 -0800933func (database *MockDatabase) ReturnAllNotes() ([]db.NotesData, error) {
934 return database.notes, nil
935}
936
Milo Lin1d59f0c2022-06-22 20:30:58 -0700937func (database *MockDatabase) AddToShift(data db.Shift) error {
938 database.shiftSchedule = append(database.shiftSchedule, data)
939 return nil
940}
941
942func (database *MockDatabase) ReturnAllShifts() ([]db.Shift, error) {
943 return database.shiftSchedule, nil
944}
945
946func (database *MockDatabase) QueryAllShifts(int) ([]db.Shift, error) {
947 return []db.Shift{}, nil
948}
949
Filip Kujawa210a03b2022-11-24 14:41:11 -0800950func (database *MockDatabase) AddDriverRanking(data db.DriverRankingData) error {
951 database.driver_ranking = append(database.driver_ranking, data)
952 return nil
953}
954
Filip Kujawaf882e022022-12-14 13:14:08 -0800955func (database *MockDatabase) ReturnAllDriverRankings() ([]db.DriverRankingData, error) {
956 return database.driver_ranking, nil
957}
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800958
959func (database *MockDatabase) AddAction(action db.Action) error {
960 database.actions = append(database.actions, action)
961 return nil
962}
963
964func (database *MockDatabase) ReturnActions() ([]db.Action, error) {
965 return database.actions, nil
966}