blob: a6bfa7973e799f9207c48a6b26d0d6c0b5a3be35 [file] [log] [blame]
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001package db
2
3import (
Philipp Schrader83fc2722022-03-10 21:59:20 -08004 "fmt"
Philipp Schrader7365d322022-03-06 16:40:08 -08005 "log"
Philipp Schrader4953cc32022-02-25 18:09:02 -08006 "os"
Philipp Schrader7365d322022-03-06 16:40:08 -08007 "os/exec"
Sabina Leaverc5fd2772022-01-29 17:00:23 -08008 "reflect"
Emily Markova6b551e02023-02-18 17:37:40 -08009 "strconv"
Philipp Schraderf117fae2022-04-08 20:14:57 -070010 "strings"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080011 "testing"
Philipp Schrader7365d322022-03-06 16:40:08 -080012 "time"
Philipp Schradereecb8962022-06-01 21:02:42 -070013
14 "github.com/davecgh/go-spew/spew"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080015)
16
Philipp Schrader83fc2722022-03-10 21:59:20 -080017// Shortcut for error checking. If the specified error is non-nil, print the
18// error message and exit the test.
19func check(t *testing.T, err error, message string) {
20 if err != nil {
21 t.Fatal(message, ":", err)
22 }
23}
24
Philipp Schrader7365d322022-03-06 16:40:08 -080025type dbFixture struct {
26 db *Database
27 server *exec.Cmd
28}
29
30func (fixture dbFixture) TearDown() {
31 fixture.db.Delete()
Philipp Schrader7365d322022-03-06 16:40:08 -080032 log.Println("Shutting down testdb")
33 fixture.server.Process.Signal(os.Interrupt)
34 fixture.server.Process.Wait()
35 log.Println("Successfully shut down testdb")
36}
37
38func createDatabase(t *testing.T) dbFixture {
39 var fixture dbFixture
40
41 log.Println("Starting up postgres.")
42 fixture.server = exec.Command("testdb_server/testdb_server_/testdb_server")
43 fixture.server.Stdout = os.Stdout
44 fixture.server.Stderr = os.Stderr
45 err := fixture.server.Start()
46 check(t, err, "Failed to run postgres")
47
48 // Wait until the server is ready. We cannot rely on the TCP socket
49 // alone because postgres creates the socket before it's actually ready
50 // to service requests.
51 for {
52 fixture.db, err = NewDatabase("test", "password", 5432)
53 if err == nil {
54 break
55 }
56 time.Sleep(50 * time.Millisecond)
57 }
58 log.Println("Connected to postgres.")
59
Philipp Schradereecb8962022-06-01 21:02:42 -070060 fixture.db.SetDebugLogLevel()
61
Philipp Schrader7365d322022-03-06 16:40:08 -080062 return fixture
Philipp Schrader4953cc32022-02-25 18:09:02 -080063}
64
Philipp Schradereecb8962022-06-01 21:02:42 -070065func checkDeepEqual(t *testing.T, expected interface{}, actual interface{}) {
66 if !reflect.DeepEqual(expected, actual) {
67 t.Fatalf(spew.Sprintf("Got %#v,\nbut expected %#v.", actual, expected))
68 }
69}
70
Philipp Schrader4953cc32022-02-25 18:09:02 -080071func TestAddToMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080072 fixture := createDatabase(t)
73 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080074
Emily Markovabf24c9e2023-02-08 20:31:11 -080075 correct := []TeamMatch{
76 TeamMatch{
77 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
78 Alliance: "R", AlliancePosition: 1, TeamNumber: 9999,
79 },
80 TeamMatch{
81 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
82 Alliance: "R", AlliancePosition: 2, TeamNumber: 1000,
83 },
84 TeamMatch{
85 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
86 Alliance: "R", AlliancePosition: 3, TeamNumber: 777,
87 },
88 TeamMatch{
89 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
90 Alliance: "B", AlliancePosition: 1, TeamNumber: 0000,
91 },
92 TeamMatch{
93 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
94 Alliance: "B", AlliancePosition: 2, TeamNumber: 4321,
95 },
96 TeamMatch{
97 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
98 Alliance: "B", AlliancePosition: 3, TeamNumber: 1234,
Philipp Schrader83fc2722022-03-10 21:59:20 -080099 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800100 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800101
Emily Markovabf24c9e2023-02-08 20:31:11 -0800102 for _, match := range correct {
103 err := fixture.db.AddToMatch(match)
104 check(t, err, "Failed to add match data")
105 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800106
Philipp Schrader7365d322022-03-06 16:40:08 -0800107 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800108 check(t, err, "Failed ReturnMatches()")
109
Philipp Schradereecb8962022-06-01 21:02:42 -0700110 checkDeepEqual(t, correct, got)
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800111}
112
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700113func TestAddOrUpdateRankingsDB(t *testing.T) {
114 fixture := createDatabase(t)
115 defer fixture.TearDown()
116
117 correct := []Ranking{
118 Ranking{
119 TeamNumber: 123,
120 Losses: 1, Wins: 7, Ties: 0,
121 Rank: 2, Dq: 0,
122 },
123 Ranking{
124 TeamNumber: 125,
125 Losses: 2, Wins: 4, Ties: 0,
126 Rank: 2, Dq: 0,
127 },
128 }
129
130 for i := 0; i < len(correct); i++ {
131 err := fixture.db.AddOrUpdateRankings(correct[i])
132 check(t, err, "Failed to add ranking data")
133 }
134
135 got, err := fixture.db.ReturnRankings()
136 check(t, err, "Failed ReturnRankings()")
137
138 if !reflect.DeepEqual(correct, got) {
139 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
140 }
141}
142
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800143func TestAddToStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800144 fixture := createDatabase(t)
145 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800146
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800147 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800148 Stats{
149 TeamNumber: 1236, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700150 StartingQuadrant: 2,
151 AutoBallPickedUp: [5]bool{false, false, false, true, false},
152 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800153 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700154 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
155 Comment: "this is a comment", CollectedBy: "josh",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800156 },
157 Stats{
158 TeamNumber: 1001, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700159 StartingQuadrant: 3,
160 AutoBallPickedUp: [5]bool{true, false, true, true, false},
161 ShotsMissed: 6, UpperGoalShots: 9, LowerGoalShots: 9,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800162 ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700163 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
164 Comment: "another comment", CollectedBy: "rupert",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800165 },
166 Stats{
167 TeamNumber: 777, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700168 StartingQuadrant: 4,
169 AutoBallPickedUp: [5]bool{false, true, true, true, false},
170 ShotsMissed: 5, UpperGoalShots: 7, LowerGoalShots: 12,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800171 ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700172 PlayedDefense: 0, DefenseReceivedScore: 3, Climbing: 0,
173 Comment: "and another", CollectedBy: "felix",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800174 },
175 Stats{
176 TeamNumber: 1000, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700177 StartingQuadrant: 1,
178 AutoBallPickedUp: [5]bool{false, false, false, false, false},
179 ShotsMissed: 12, UpperGoalShots: 6, LowerGoalShots: 10,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800180 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700181 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
182 Comment: "and another one", CollectedBy: "thea",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800183 },
184 Stats{
185 TeamNumber: 4321, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700186 StartingQuadrant: 2,
187 AutoBallPickedUp: [5]bool{true, false, false, false, false},
188 ShotsMissed: 14, UpperGoalShots: 12, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800189 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700190 PlayedDefense: 0, DefenseReceivedScore: 0, Climbing: 0,
191 Comment: "more comment", CollectedBy: "amy",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800192 },
193 Stats{
194 TeamNumber: 1234, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700195 StartingQuadrant: 3,
196 AutoBallPickedUp: [5]bool{false, false, false, false, true},
197 ShotsMissed: 3, UpperGoalShots: 4, LowerGoalShots: 0,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800198 ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700199 PlayedDefense: 0, DefenseReceivedScore: 5, Climbing: 0,
200 Comment: "final comment", CollectedBy: "beth",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800201 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800202 }
Emily Markovabf24c9e2023-02-08 20:31:11 -0800203 matches := []TeamMatch{
204 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
205 Alliance: "R", AlliancePosition: 1, TeamNumber: 1236},
206 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
207 Alliance: "R", AlliancePosition: 2, TeamNumber: 1001},
208 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
209 Alliance: "R", AlliancePosition: 3, TeamNumber: 777},
210 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
211 Alliance: "B", AlliancePosition: 1, TeamNumber: 1000},
212 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
213 Alliance: "B", AlliancePosition: 2, TeamNumber: 4321},
214 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
215 Alliance: "B", AlliancePosition: 3, TeamNumber: 1234},
216 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800217
Emily Markovabf24c9e2023-02-08 20:31:11 -0800218 for _, match := range matches {
219 err := fixture.db.AddToMatch(match)
220 check(t, err, "Failed to add match")
221 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800222
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800223 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800224 err := fixture.db.AddToStats(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800225 check(t, err, "Failed to add stats to DB")
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800226 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800227
Philipp Schrader7365d322022-03-06 16:40:08 -0800228 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800229 check(t, err, "Failed ReturnStats()")
230
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800231 if !reflect.DeepEqual(correct, got) {
232 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
233 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800234}
235
Emily Markova290147d2023-03-03 22:40:06 -0800236func TestAddToStats2023DB(t *testing.T) {
237 fixture := createDatabase(t)
238 defer fixture.TearDown()
239
240 correct := []Stats2023{
241 Stats2023{
242 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
243 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
244 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
245 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
246 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
247 HighCubes: 1, CubesDropped: 0, LowCones: 0,
248 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
249 AvgCycle: 0, CollectedBy: "emma",
250 },
251 Stats2023{
252 TeamNumber: "7454", MatchNumber: 3, SetNumber: 1,
253 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
254 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
255 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
256 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
257 HighCubes: 0, CubesDropped: 1, LowCones: 0,
258 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
259 AvgCycle: 0, CollectedBy: "tyler",
260 },
261 Stats2023{
262 TeamNumber: "4354", MatchNumber: 3, SetNumber: 1,
263 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
264 MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
265 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 1,
266 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 0,
267 HighCubes: 2, CubesDropped: 1, LowCones: 1,
268 MiddleCones: 1, HighCones: 0, ConesDropped: 1,
269 AvgCycle: 0, CollectedBy: "isaac",
270 },
271 Stats2023{
272 TeamNumber: "6533", MatchNumber: 3, SetNumber: 1,
273 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
274 MiddleCubesAuto: 2, HighCubesAuto: 1, CubesDroppedAuto: 1,
275 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
276 ConesDroppedAuto: 0, LowCubes: 0, MiddleCubes: 1,
277 HighCubes: 2, CubesDropped: 1, LowCones: 0,
278 MiddleCones: 1, HighCones: 0, ConesDropped: 0,
279 AvgCycle: 0, CollectedBy: "will",
280 },
281 Stats2023{
282 TeamNumber: "8354", MatchNumber: 3, SetNumber: 1,
283 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
284 MiddleCubesAuto: 1, HighCubesAuto: 2, CubesDroppedAuto: 0,
285 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 1,
286 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
287 HighCubes: 0, CubesDropped: 2, LowCones: 1,
288 MiddleCones: 1, HighCones: 0, ConesDropped: 1,
289 AvgCycle: 0, CollectedBy: "unkown",
290 },
291 }
292
293 matches := []TeamMatch{
294 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
295 Alliance: "R", AlliancePosition: 1, TeamNumber: 6344},
296 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
297 Alliance: "R", AlliancePosition: 2, TeamNumber: 7454},
298 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
299 Alliance: "R", AlliancePosition: 3, TeamNumber: 4354},
300 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
301 Alliance: "B", AlliancePosition: 1, TeamNumber: 6533},
302 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
303 Alliance: "B", AlliancePosition: 2, TeamNumber: 8354},
304 }
305
306 for _, match := range matches {
307 err := fixture.db.AddToMatch(match)
308 check(t, err, "Failed to add match")
309 }
310
311 for i := 0; i < len(correct); i++ {
312 err := fixture.db.AddToStats2023(correct[i])
313 check(t, err, "Failed to add 2023stats to DB")
314 }
315
316 got, err := fixture.db.ReturnStats2023()
317 check(t, err, "Failed ReturnStats2023()")
318
319 if !reflect.DeepEqual(correct, got) {
320 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
321 }
322}
323
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800324func TestQueryingStats2023ByTeam(t *testing.T) {
325 fixture := createDatabase(t)
326 defer fixture.TearDown()
327
328 stats := []Stats2023{
329 Stats2023{
330 TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
331 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
332 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
333 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
334 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
335 HighCubes: 1, CubesDropped: 0, LowCones: 0,
336 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
337 AvgCycle: 0, CollectedBy: "emma",
338 },
339 Stats2023{
340 TeamNumber: "7454", MatchNumber: 4, SetNumber: 1,
341 CompLevel: "qm", StartingQuadrant: 2, LowCubesAuto: 1,
342 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
343 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
344 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 0,
345 HighCubes: 0, CubesDropped: 1, LowCones: 0,
346 MiddleCones: 0, HighCones: 1, ConesDropped: 0,
347 AvgCycle: 0, CollectedBy: "tyler",
348 },
349 Stats2023{
350 TeamNumber: "6344", MatchNumber: 5, SetNumber: 1,
351 CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
352 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
353 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
354 ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
355 HighCubes: 1, CubesDropped: 0, LowCones: 0,
356 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
357 AvgCycle: 0, CollectedBy: "emma",
358 },
359 }
360
361 matches := []TeamMatch{
362 TeamMatch{MatchNumber: 3, SetNumber: 1, CompLevel: "qm",
363 Alliance: "R", AlliancePosition: 1, TeamNumber: 6344},
364 TeamMatch{MatchNumber: 4, SetNumber: 1, CompLevel: "qm",
365 Alliance: "R", AlliancePosition: 1, TeamNumber: 7454},
366 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "qm",
367 Alliance: "R", AlliancePosition: 1, TeamNumber: 6344},
368 }
369
370 for _, match := range matches {
371 err := fixture.db.AddToMatch(match)
372 check(t, err, "Failed to add match")
373 }
374
375 for i := range stats {
376 err := fixture.db.AddToStats2023(stats[i])
377 check(t, err, "Failed to add 2023stats to DB")
378 }
379
380 // Validate that requesting status for a single team gets us the
381 // expected data.
382 statsFor6344, err := fixture.db.ReturnStats2023ForTeam("6344", 3, 1, "qm")
383 check(t, err, "Failed ReturnStats2023()")
384
385 if !reflect.DeepEqual([]Stats2023{stats[0]}, statsFor6344) {
386 t.Errorf("Got %#v,\nbut expected %#v.", statsFor6344, stats[0])
387 }
388
389 // Validate that requesting team data for a non-existent match returns
390 // nothing.
391 statsForMissing, err := fixture.db.ReturnStats2023ForTeam("6344", 9, 1, "qm")
392 check(t, err, "Failed ReturnStats2023()")
393
394 if !reflect.DeepEqual([]Stats2023{}, statsForMissing) {
395 t.Errorf("Got %#v,\nbut expected %#v.", statsForMissing, []Stats2023{})
396 }
397}
398
Philipp Schraderf117fae2022-04-08 20:14:57 -0700399func TestAddDuplicateStats(t *testing.T) {
400 fixture := createDatabase(t)
401 defer fixture.TearDown()
402
403 stats := Stats{
404 TeamNumber: 1236, MatchNumber: 7,
Philipp Schradereecb8962022-06-01 21:02:42 -0700405 SetNumber: 1, CompLevel: "qual",
Philipp Schraderf117fae2022-04-08 20:14:57 -0700406 StartingQuadrant: 2,
407 AutoBallPickedUp: [5]bool{false, false, false, true, false},
408 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
409 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
410 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
411 Comment: "this is a comment", CollectedBy: "josh",
412 }
413
Emily Markovabf24c9e2023-02-08 20:31:11 -0800414 matches := []TeamMatch{
415 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
416 Alliance: "R", AlliancePosition: 1, TeamNumber: 1236},
417 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
418 Alliance: "R", AlliancePosition: 2, TeamNumber: 1001},
419 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
420 Alliance: "R", AlliancePosition: 3, TeamNumber: 777},
421 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
422 Alliance: "B", AlliancePosition: 1, TeamNumber: 1000},
423 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
424 Alliance: "B", AlliancePosition: 2, TeamNumber: 4321},
425 TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
426 Alliance: "B", AlliancePosition: 3, TeamNumber: 1234},
427 }
428
429 for _, match := range matches {
430 err := fixture.db.AddToMatch(match)
431 check(t, err, "Failed to add match")
432 }
Philipp Schraderf117fae2022-04-08 20:14:57 -0700433
434 // Add stats. This should succeed.
Emily Markovabf24c9e2023-02-08 20:31:11 -0800435 err := fixture.db.AddToStats(stats)
Philipp Schraderf117fae2022-04-08 20:14:57 -0700436 check(t, err, "Failed to add stats to DB")
437
438 // Try again. It should fail this time.
439 err = fixture.db.AddToStats(stats)
440 if err == nil {
441 t.Fatal("Failed to get error when adding duplicate stats.")
442 }
443 if !strings.Contains(err.Error(), "ERROR: duplicate key value violates unique constraint") {
444 t.Fatal("Expected error message to be complain about duplicate key value, but got ", err)
445 }
446}
447
Emily Markova6b551e02023-02-18 17:37:40 -0800448func TestDeleteFromStats(t *testing.T) {
449 fixture := createDatabase(t)
450 defer fixture.TearDown()
451
452 startingStats := []Stats2023{
453 Stats2023{
454 TeamNumber: "1111", MatchNumber: 5, SetNumber: 1,
455 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 2,
456 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
457 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
458 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
459 HighCubes: 2, CubesDropped: 1, LowCones: 1,
460 MiddleCones: 0, HighCones: 1, ConesDropped: 2,
461 AvgCycle: 58, CollectedBy: "unknown",
462 },
463 Stats2023{
464 TeamNumber: "2314", MatchNumber: 5, SetNumber: 1,
465 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 1,
466 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
467 LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 0,
468 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 0,
469 HighCubes: 1, CubesDropped: 0, LowCones: 0,
470 MiddleCones: 2, HighCones: 1, ConesDropped: 0,
471 AvgCycle: 34, CollectedBy: "simon",
472 },
473 Stats2023{
474 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
475 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
476 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
477 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
478 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
479 HighCubes: 0, CubesDropped: 0, LowCones: 2,
480 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
481 AvgCycle: 50, CollectedBy: "eliza",
482 },
483 Stats2023{
484 TeamNumber: "1742", MatchNumber: 5, SetNumber: 1,
485 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 1,
486 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 0,
487 LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
488 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 1,
489 HighCubes: 2, CubesDropped: 1, LowCones: 0,
490 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
491 AvgCycle: 49, CollectedBy: "isaac",
492 },
493 Stats2023{
494 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
495 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
496 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
497 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
498 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
499 HighCubes: 0, CubesDropped: 0, LowCones: 1,
500 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
501 AvgCycle: 70, CollectedBy: "sam",
502 },
503 }
504
505 correct := []Stats2023{
506 Stats2023{
507 TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
508 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
509 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
510 LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
511 ConesDroppedAuto: 1, LowCubes: 0, MiddleCubes: 2,
512 HighCubes: 0, CubesDropped: 0, LowCones: 2,
513 MiddleCones: 0, HighCones: 1, ConesDropped: 1,
514 AvgCycle: 50, CollectedBy: "eliza",
515 },
516 Stats2023{
517 TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
518 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
519 MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
520 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
521 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
522 HighCubes: 0, CubesDropped: 0, LowCones: 1,
523 MiddleCones: 1, HighCones: 1, ConesDropped: 0,
524 AvgCycle: 70, CollectedBy: "sam",
525 },
526 }
527
528 originalMatches := []TeamMatch{
529 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
530 Alliance: "R", AlliancePosition: 1, TeamNumber: 1111},
531 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
532 Alliance: "B", AlliancePosition: 1, TeamNumber: 2314},
533 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
534 Alliance: "R", AlliancePosition: 3, TeamNumber: 1742},
535 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
536 Alliance: "B", AlliancePosition: 2, TeamNumber: 2454},
537 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
538 Alliance: "B", AlliancePosition: 3, TeamNumber: 3242},
539 }
540
541 // Matches for which we want to delete the stats.
542 matches := []TeamMatch{
543 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
544 TeamNumber: 1111},
545 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
546 TeamNumber: 2314},
547 TeamMatch{MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
548 TeamNumber: 1742},
549 }
550
551 for _, match := range originalMatches {
552 err := fixture.db.AddToMatch(match)
553 check(t, err, "Failed to add match")
554 fmt.Println("Match has been added : ", match.TeamNumber)
555 }
556
557 for _, stat := range startingStats {
558 err := fixture.db.AddToStats2023(stat)
559 check(t, err, "Failed to add stat")
560 }
561
562 for _, match := range matches {
563 err := fixture.db.DeleteFromStats(match.CompLevel, match.MatchNumber, match.SetNumber, strconv.Itoa(int(match.TeamNumber)))
564 check(t, err, "Failed to delete stat")
565 }
566
567 got, err := fixture.db.ReturnStats2023()
568 check(t, err, "Failed ReturnStats()")
569
570 if !reflect.DeepEqual(correct, got) {
571 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
572 }
573}
574
Milo Lina72e2002022-04-06 20:31:13 -0700575func TestQueryShiftDB(t *testing.T) {
576 fixture := createDatabase(t)
577 defer fixture.TearDown()
578
579 testDatabase := []Shift{
580 Shift{
581 MatchNumber: 1,
582 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
583 },
584 Shift{
585 MatchNumber: 2,
586 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
587 },
588 }
589
590 for i := 0; i < len(testDatabase); i++ {
591 err := fixture.db.AddToShift(testDatabase[i])
592 check(t, err, fmt.Sprint("Failed to add shift", i))
593 }
594
595 correct := []Shift{
596 Shift{
597 MatchNumber: 1,
598 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
599 },
600 }
601
602 got, err := fixture.db.QueryAllShifts(1)
603 check(t, err, "Failed to query shift for match 1")
604
605 if !reflect.DeepEqual(correct, got) {
606 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
607 }
608}
609
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800610func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800611 fixture := createDatabase(t)
612 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800613
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800614 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800615 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700616 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700617 StartingQuadrant: 1,
618 AutoBallPickedUp: [5]bool{false, false, false, false, false},
619 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800620 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700621 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800622 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700623 TeamNumber: 1234, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700624 StartingQuadrant: 2,
625 AutoBallPickedUp: [5]bool{false, false, false, false, true},
626 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800627 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700628 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800629 },
630 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700631 TeamNumber: 1233, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700632 StartingQuadrant: 3,
633 AutoBallPickedUp: [5]bool{false, false, false, false, false},
634 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800635 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700636 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800637 },
638 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700639 TeamNumber: 1232, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700640 StartingQuadrant: 2,
641 AutoBallPickedUp: [5]bool{true, false, false, false, true},
642 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800643 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700644 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800645 },
646 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700647 TeamNumber: 1231, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700648 StartingQuadrant: 3,
649 AutoBallPickedUp: [5]bool{false, false, true, false, false},
650 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800651 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700652 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800653 },
654 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700655 TeamNumber: 1239, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700656 StartingQuadrant: 4,
657 AutoBallPickedUp: [5]bool{false, true, true, false, false},
658 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800659 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700660 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800661 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800662 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800663
Emily Markovabf24c9e2023-02-08 20:31:11 -0800664 matches := []TeamMatch{
665 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
666 Alliance: "R", AlliancePosition: 1, TeamNumber: 1235},
667 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
668 Alliance: "R", AlliancePosition: 2, TeamNumber: 1234},
669 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
670 Alliance: "R", AlliancePosition: 3, TeamNumber: 1233},
671 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
672 Alliance: "B", AlliancePosition: 1, TeamNumber: 1232},
673 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
674 Alliance: "B", AlliancePosition: 2, TeamNumber: 1231},
675 TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
676 Alliance: "B", AlliancePosition: 3, TeamNumber: 1239},
677 }
678
679 for _, match := range matches {
680 err := fixture.db.AddToMatch(match)
681 check(t, err, "Failed to add match")
682 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800683
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800684 for i := 0; i < len(testDatabase); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800685 err := fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700686 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800687 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800688
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800689 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800690 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700691 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700692 StartingQuadrant: 1,
693 AutoBallPickedUp: [5]bool{false, false, false, false, false},
694 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800695 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700696 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800697 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800698 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800699
Philipp Schrader7365d322022-03-06 16:40:08 -0800700 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800701 check(t, err, "Failed QueryStats()")
702
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800703 if !reflect.DeepEqual(correct, got) {
704 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
705 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800706}
707
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700708func TestQueryRankingsDB(t *testing.T) {
709 fixture := createDatabase(t)
710 defer fixture.TearDown()
711
712 testDatabase := []Ranking{
713 Ranking{
714 TeamNumber: 123,
715 Losses: 1, Wins: 7, Ties: 2,
716 Rank: 2, Dq: 0,
717 },
718 Ranking{
719 TeamNumber: 124,
720 Losses: 3, Wins: 4, Ties: 0,
721 Rank: 4, Dq: 2,
722 },
723 Ranking{
724 TeamNumber: 125,
725 Losses: 5, Wins: 2, Ties: 0,
726 Rank: 17, Dq: 0,
727 },
728 Ranking{
729 TeamNumber: 126,
730 Losses: 0, Wins: 7, Ties: 0,
731 Rank: 5, Dq: 0,
732 },
733 }
734
735 for i := 0; i < len(testDatabase); i++ {
736 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
737 check(t, err, fmt.Sprint("Failed to add rankings ", i))
738 }
739
740 correct := []Ranking{
741 Ranking{
742 TeamNumber: 126,
743 Losses: 0, Wins: 7, Ties: 0,
744 Rank: 5, Dq: 0,
745 },
746 }
747
748 got, err := fixture.db.QueryRankings(126)
749 check(t, err, "Failed QueryRankings()")
750
751 if !reflect.DeepEqual(correct, got) {
752 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
753 }
754}
755
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800756func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800757 fixture := createDatabase(t)
758 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800759
Emily Markovabf24c9e2023-02-08 20:31:11 -0800760 correct := []TeamMatch{
761 TeamMatch{
762 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 1, TeamNumber: 6835},
763 TeamMatch{
764 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: 4834},
765 TeamMatch{
766 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 9824},
767 TeamMatch{
768 MatchNumber: 7, SetNumber: 2, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: 3732},
769 TeamMatch{
770 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 1, TeamNumber: 3732},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800771 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800772
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800773 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800774 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800775 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800776 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800777
Philipp Schrader7365d322022-03-06 16:40:08 -0800778 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800779 check(t, err, "Failed ReturnMatches()")
780
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800781 if !reflect.DeepEqual(correct, got) {
782 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
783 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800784}
785
Philipp Schraderfe583842022-04-08 19:47:07 -0700786func TestOverwriteNewMatchData(t *testing.T) {
787 fixture := createDatabase(t)
788 defer fixture.TearDown()
789
Emily Markovabf24c9e2023-02-08 20:31:11 -0800790 testDatabase := []TeamMatch{
791 TeamMatch{
792 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 4464},
793 TeamMatch{
794 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: 2352},
795 TeamMatch{
796 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 6321},
Philipp Schraderfe583842022-04-08 19:47:07 -0700797 }
798
799 for i := 0; i < len(testDatabase); i++ {
800 err := fixture.db.AddToMatch(testDatabase[i])
801 check(t, err, fmt.Sprint("Failed to add match", i))
802 }
803
Emily Markovabf24c9e2023-02-08 20:31:11 -0800804 correct := []TeamMatch{
805 TeamMatch{
806 MatchNumber: 8, SetNumber: 1, CompLevel: "quals", Alliance: "R", AlliancePosition: 2, TeamNumber: 2352},
807 TeamMatch{
808 MatchNumber: 9, SetNumber: 1, CompLevel: "quals", Alliance: "B", AlliancePosition: 3, TeamNumber: 6321},
Philipp Schraderfe583842022-04-08 19:47:07 -0700809 }
810
811 got, err := fixture.db.ReturnMatches()
812 check(t, err, "Failed to get match list")
813
814 if !reflect.DeepEqual(correct, got) {
815 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
816 }
817}
818
Milo Lina72e2002022-04-06 20:31:13 -0700819func TestAddReturnShiftDB(t *testing.T) {
820 fixture := createDatabase(t)
821 defer fixture.TearDown()
822
823 correct := []Shift{
824 Shift{
825 MatchNumber: 1,
826 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
827 },
828 Shift{
829 MatchNumber: 2,
830 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
831 },
832 }
833
834 for i := 0; i < len(correct); i++ {
835 err := fixture.db.AddToShift(correct[i])
836 check(t, err, fmt.Sprint("Failed to add shift", i))
837 }
838
839 got, err := fixture.db.ReturnAllShifts()
840 check(t, err, "Failed ReturnAllShifts()")
841
842 if !reflect.DeepEqual(correct, got) {
843 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
844 }
845}
846
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700847func TestReturnRankingsDB(t *testing.T) {
848 fixture := createDatabase(t)
849 defer fixture.TearDown()
850
851 correct := []Ranking{
852 Ranking{
853 TeamNumber: 123,
854 Losses: 1, Wins: 7, Ties: 2,
855 Rank: 2, Dq: 0,
856 },
857 Ranking{
858 TeamNumber: 124,
859 Losses: 3, Wins: 4, Ties: 0,
860 Rank: 4, Dq: 2,
861 },
862 Ranking{
863 TeamNumber: 125,
864 Losses: 5, Wins: 2, Ties: 0,
865 Rank: 17, Dq: 0,
866 },
867 Ranking{
868 TeamNumber: 126,
869 Losses: 0, Wins: 7, Ties: 0,
870 Rank: 5, Dq: 0,
871 },
872 }
873
874 for i := 0; i < len(correct); i++ {
875 err := fixture.db.AddOrUpdateRankings(correct[i])
876 check(t, err, fmt.Sprint("Failed to add rankings", i))
877 }
878
879 got, err := fixture.db.ReturnRankings()
880 check(t, err, "Failed ReturnRankings()")
881
882 if !reflect.DeepEqual(correct, got) {
883 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
884 }
885}
886
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800887func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800888 fixture := createDatabase(t)
889 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800890
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800891 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800892 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700893 TeamNumber: 1235, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700894 StartingQuadrant: 1,
895 AutoBallPickedUp: [5]bool{false, false, false, false, false},
896 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800897 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700898 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800899 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700900 TeamNumber: 1236, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700901 StartingQuadrant: 2,
902 AutoBallPickedUp: [5]bool{false, false, false, false, true},
903 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800904 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700905 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800906 },
907 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700908 TeamNumber: 1237, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700909 StartingQuadrant: 3,
910 AutoBallPickedUp: [5]bool{false, false, false, false, false},
911 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800912 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700913 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800914 },
915 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700916 TeamNumber: 1238, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700917 StartingQuadrant: 2,
918 AutoBallPickedUp: [5]bool{true, false, false, false, true},
919 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800920 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700921 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800922 },
923 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700924 TeamNumber: 1239, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700925 StartingQuadrant: 3,
926 AutoBallPickedUp: [5]bool{false, false, true, false, false},
927 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800928 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700929 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800930 },
931 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700932 TeamNumber: 1233, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700933 StartingQuadrant: 4,
934 AutoBallPickedUp: [5]bool{false, true, true, false, false},
935 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800936 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700937 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800938 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800939 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800940
Emily Markovabf24c9e2023-02-08 20:31:11 -0800941 matches := []TeamMatch{
942 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
943 Alliance: "R", AlliancePosition: 1, TeamNumber: 1235},
944 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
945 Alliance: "R", AlliancePosition: 2, TeamNumber: 1236},
946 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
947 Alliance: "R", AlliancePosition: 3, TeamNumber: 1237},
948 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
949 Alliance: "B", AlliancePosition: 1, TeamNumber: 1238},
950 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
951 Alliance: "B", AlliancePosition: 2, TeamNumber: 1239},
952 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
953 Alliance: "B", AlliancePosition: 3, TeamNumber: 1233},
954 }
955
956 for _, match := range matches {
957 err := fixture.db.AddToMatch(match)
958 check(t, err, "Failed to add match")
959 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800960
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800961 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800962 err := fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700963 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800964 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800965
Philipp Schrader7365d322022-03-06 16:40:08 -0800966 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800967 check(t, err, "Failed ReturnStats()")
968
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800969 if !reflect.DeepEqual(correct, got) {
970 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
971 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800972}
Alex Perry871eab92022-03-12 17:43:52 -0800973
Emily Markova290147d2023-03-03 22:40:06 -0800974func TestReturnStats2023DB(t *testing.T) {
975 fixture := createDatabase(t)
976 defer fixture.TearDown()
977
978 correct := []Stats2023{
979 Stats2023{
980 TeamNumber: "2343", MatchNumber: 2, SetNumber: 1,
981 CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
982 MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 1,
983 LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 2,
984 ConesDroppedAuto: 1, LowCubes: 1, MiddleCubes: 2,
985 HighCubes: 1, CubesDropped: 0, LowCones: 2,
986 MiddleCones: 0, HighCones: 2, ConesDropped: 1,
987 AvgCycle: 51, CollectedBy: "isaac",
988 },
989 Stats2023{
990 TeamNumber: "5443", MatchNumber: 2, SetNumber: 1,
991 CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
992 MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
993 LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
994 ConesDroppedAuto: 0, LowCubes: 2, MiddleCubes: 2,
995 HighCubes: 1, CubesDropped: 0, LowCones: 1,
996 MiddleCones: 0, HighCones: 2, ConesDropped: 1,
997 AvgCycle: 39, CollectedBy: "jack",
998 },
999 Stats2023{
1000 TeamNumber: "5436", MatchNumber: 2, SetNumber: 1,
1001 CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
1002 MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
1003 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
1004 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
1005 HighCubes: 0, CubesDropped: 0, LowCones: 1,
1006 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
1007 AvgCycle: 45, CollectedBy: "martin",
1008 },
1009 Stats2023{
1010 TeamNumber: "5643", MatchNumber: 2, SetNumber: 1,
1011 CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 0,
1012 MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
1013 LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
1014 ConesDroppedAuto: 1, LowCubes: 2, MiddleCubes: 2,
1015 HighCubes: 0, CubesDropped: 0, LowCones: 2,
1016 MiddleCones: 2, HighCones: 1, ConesDropped: 1,
1017 AvgCycle: 34, CollectedBy: "unknown",
1018 },
1019 }
1020
1021 matches := []TeamMatch{
1022 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
1023 Alliance: "R", AlliancePosition: 1, TeamNumber: 2343},
1024 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
1025 Alliance: "R", AlliancePosition: 2, TeamNumber: 5443},
1026 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
1027 Alliance: "R", AlliancePosition: 3, TeamNumber: 5436},
1028 TeamMatch{MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
1029 Alliance: "B", AlliancePosition: 1, TeamNumber: 5643},
1030 }
1031
1032 for _, match := range matches {
1033 err := fixture.db.AddToMatch(match)
1034 check(t, err, "Failed to add match")
1035 }
1036
1037 for i := 0; i < len(correct); i++ {
1038 err := fixture.db.AddToStats2023(correct[i])
1039 check(t, err, fmt.Sprint("Failed to add stats ", i))
1040 }
1041
1042 got, err := fixture.db.ReturnStats2023()
1043 check(t, err, "Failed ReturnStats()")
1044
1045 if !reflect.DeepEqual(correct, got) {
1046 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1047 }
1048}
1049
Sabina Leaver759090b2023-01-14 20:42:56 -08001050func TestReturnActionsDB(t *testing.T) {
1051 fixture := createDatabase(t)
1052 defer fixture.TearDown()
1053 correct := []Action{
1054 Action{
1055 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1056 CompletedAction: []byte(""), TimeStamp: 0000, CollectedBy: "",
1057 },
1058 Action{
1059 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1060 CompletedAction: []byte(""), TimeStamp: 0321, CollectedBy: "",
1061 },
1062 Action{
1063 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1064 CompletedAction: []byte(""), TimeStamp: 0222, CollectedBy: "",
1065 },
1066 Action{
1067 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1068 CompletedAction: []byte(""), TimeStamp: 0110, CollectedBy: "",
1069 },
1070 Action{
1071 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1072 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
1073 },
1074 Action{
1075 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1076 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
1077 },
1078 }
1079
Emily Markovabf24c9e2023-02-08 20:31:11 -08001080 matches := []TeamMatch{
1081 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1082 Alliance: "R", AlliancePosition: 1, TeamNumber: 1235},
1083 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1084 Alliance: "R", AlliancePosition: 2, TeamNumber: 1236},
1085 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1086 Alliance: "R", AlliancePosition: 3, TeamNumber: 1237},
1087 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1088 Alliance: "B", AlliancePosition: 1, TeamNumber: 1238},
1089 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1090 Alliance: "B", AlliancePosition: 2, TeamNumber: 1239},
1091 TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
1092 Alliance: "B", AlliancePosition: 3, TeamNumber: 1233},
1093 }
1094
1095 for _, match := range matches {
1096 err := fixture.db.AddToMatch(match)
1097 check(t, err, "Failed to add match")
1098 }
Sabina Leaver759090b2023-01-14 20:42:56 -08001099
1100 for i := 0; i < len(correct); i++ {
Emily Markovabf24c9e2023-02-08 20:31:11 -08001101 err := fixture.db.AddAction(correct[i])
Sabina Leaver759090b2023-01-14 20:42:56 -08001102 check(t, err, fmt.Sprint("Failed to add to actions ", i))
1103 }
1104
1105 got, err := fixture.db.ReturnActions()
1106 check(t, err, "Failed ReturnActions()")
1107
1108 if !reflect.DeepEqual(correct, got) {
1109 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
1110 }
1111}
1112
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001113func TestRankingsDbUpdate(t *testing.T) {
1114 fixture := createDatabase(t)
1115 defer fixture.TearDown()
1116
1117 testDatabase := []Ranking{
1118 Ranking{
1119 TeamNumber: 123,
1120 Losses: 1, Wins: 7, Ties: 2,
1121 Rank: 2, Dq: 0,
1122 },
1123 Ranking{
1124 TeamNumber: 124,
1125 Losses: 3, Wins: 4, Ties: 0,
1126 Rank: 4, Dq: 2,
1127 },
1128 Ranking{
1129 TeamNumber: 125,
1130 Losses: 5, Wins: 2, Ties: 0,
1131 Rank: 17, Dq: 0,
1132 },
1133 Ranking{
1134 TeamNumber: 126,
1135 Losses: 0, Wins: 7, Ties: 0,
1136 Rank: 5, Dq: 0,
1137 },
1138 Ranking{
1139 TeamNumber: 125,
1140 Losses: 2, Wins: 4, Ties: 1,
1141 Rank: 5, Dq: 0,
1142 },
1143 }
1144
1145 for i := 0; i < len(testDatabase); i++ {
1146 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
1147 check(t, err, fmt.Sprint("Failed to add rankings ", i))
1148 }
1149
1150 correct := []Ranking{
1151 Ranking{
1152 TeamNumber: 125,
1153 Losses: 2, Wins: 4, Ties: 1,
1154 Rank: 5, Dq: 0,
1155 },
1156 }
1157
1158 got, err := fixture.db.QueryRankings(125)
1159 check(t, err, "Failed QueryRankings()")
1160
Philipp Schradereecb8962022-06-01 21:02:42 -07001161 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -07001162}
1163
Alex Perry871eab92022-03-12 17:43:52 -08001164func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -08001165 fixture := createDatabase(t)
1166 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -08001167
Philipp Schradereecb8962022-06-01 21:02:42 -07001168 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -08001169
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001170 err := fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 1", GoodDriving: true, BadDriving: false, SketchyPickup: false, SketchyPlacing: true, GoodDefense: false, BadDefense: true, EasilyDefended: true})
Alex Perry871eab92022-03-12 17:43:52 -08001171 check(t, err, "Failed to add Note")
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001172 err = fixture.db.AddNotes(NotesData{TeamNumber: 1235, Notes: "Note 2", GoodDriving: false, BadDriving: true, SketchyPickup: false, SketchyPlacing: true, GoodDefense: false, BadDefense: false, EasilyDefended: false})
Alex Perry871eab92022-03-12 17:43:52 -08001173 check(t, err, "Failed to add Note")
Filip Kujawa7ddd5652023-03-07 19:56:15 -08001174 err = fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 3", GoodDriving: true, BadDriving: false, SketchyPickup: false, SketchyPlacing: true, GoodDefense: true, BadDefense: false, EasilyDefended: true})
Alex Perry871eab92022-03-12 17:43:52 -08001175 check(t, err, "Failed to add Note")
1176
Philipp Schrader7365d322022-03-06 16:40:08 -08001177 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -08001178 check(t, err, "Failed to get Notes")
1179
1180 if !reflect.DeepEqual(expected, actual) {
1181 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1182 }
1183}
Filip Kujawa210a03b2022-11-24 14:41:11 -08001184
1185func TestDriverRanking(t *testing.T) {
1186 fixture := createDatabase(t)
1187 defer fixture.TearDown()
1188
1189 expected := []DriverRankingData{
1190 {ID: 1, MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
1191 {ID: 2, MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
1192 }
1193
1194 err := fixture.db.AddDriverRanking(
1195 DriverRankingData{MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
1196 )
1197 check(t, err, "Failed to add Driver Ranking")
1198 err = fixture.db.AddDriverRanking(
1199 DriverRankingData{MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
1200 )
1201 check(t, err, "Failed to add Driver Ranking")
1202 err = fixture.db.AddDriverRanking(
1203 DriverRankingData{MatchNumber: 13, Rank1: 1235, Rank2: 1234, Rank3: 1236},
1204 )
1205 check(t, err, "Failed to add Driver Ranking")
1206
1207 actual, err := fixture.db.QueryDriverRanking(12)
1208 check(t, err, "Failed to get Driver Ranking")
1209
1210 if !reflect.DeepEqual(expected, actual) {
1211 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1212 }
1213}
Philipp Schradera8955fb2023-03-05 15:47:19 -08001214
1215func TestParsedDriverRanking(t *testing.T) {
1216 fixture := createDatabase(t)
1217 defer fixture.TearDown()
1218
1219 expected := []ParsedDriverRankingData{
1220 {TeamNumber: "1234", Score: 100},
1221 {TeamNumber: "1235", Score: 110},
1222 {TeamNumber: "1236", Score: 90},
1223 }
1224
1225 for i := range expected {
1226 err := fixture.db.AddParsedDriverRanking(expected[i])
1227 check(t, err, "Failed to add Parsed Driver Ranking")
1228 }
1229
1230 actual, err := fixture.db.ReturnAllParsedDriverRankings()
1231 check(t, err, "Failed to get Parsed Driver Ranking")
1232 if !reflect.DeepEqual(expected, actual) {
1233 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1234 }
1235
1236 // Now update one of the rankings and make sure we get the properly
1237 // merged result.
1238 err = fixture.db.AddParsedDriverRanking(ParsedDriverRankingData{
1239 TeamNumber: "1235", Score: 200,
1240 })
1241 check(t, err, "Failed to add Parsed Driver Ranking")
1242
1243 expected = []ParsedDriverRankingData{
1244 {TeamNumber: "1234", Score: 100},
1245 {TeamNumber: "1236", Score: 90},
1246 {TeamNumber: "1235", Score: 200},
1247 }
1248
1249 actual, err = fixture.db.ReturnAllParsedDriverRankings()
1250 check(t, err, "Failed to get Parsed Driver Ranking")
1251 if !reflect.DeepEqual(expected, actual) {
1252 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
1253 }
1254}