blob: 9e85651d485819916a843d0c8f11e71350e2b51f [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"
Philipp Schraderf117fae2022-04-08 20:14:57 -07009 "strings"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080010 "testing"
Philipp Schrader7365d322022-03-06 16:40:08 -080011 "time"
Philipp Schradereecb8962022-06-01 21:02:42 -070012
13 "github.com/davecgh/go-spew/spew"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080014)
15
Philipp Schrader83fc2722022-03-10 21:59:20 -080016// Shortcut for error checking. If the specified error is non-nil, print the
17// error message and exit the test.
18func check(t *testing.T, err error, message string) {
19 if err != nil {
20 t.Fatal(message, ":", err)
21 }
22}
23
Philipp Schrader7365d322022-03-06 16:40:08 -080024type dbFixture struct {
25 db *Database
26 server *exec.Cmd
27}
28
29func (fixture dbFixture) TearDown() {
30 fixture.db.Delete()
Philipp Schrader7365d322022-03-06 16:40:08 -080031 log.Println("Shutting down testdb")
32 fixture.server.Process.Signal(os.Interrupt)
33 fixture.server.Process.Wait()
34 log.Println("Successfully shut down testdb")
35}
36
37func createDatabase(t *testing.T) dbFixture {
38 var fixture dbFixture
39
40 log.Println("Starting up postgres.")
41 fixture.server = exec.Command("testdb_server/testdb_server_/testdb_server")
42 fixture.server.Stdout = os.Stdout
43 fixture.server.Stderr = os.Stderr
44 err := fixture.server.Start()
45 check(t, err, "Failed to run postgres")
46
47 // Wait until the server is ready. We cannot rely on the TCP socket
48 // alone because postgres creates the socket before it's actually ready
49 // to service requests.
50 for {
51 fixture.db, err = NewDatabase("test", "password", 5432)
52 if err == nil {
53 break
54 }
55 time.Sleep(50 * time.Millisecond)
56 }
57 log.Println("Connected to postgres.")
58
Philipp Schradereecb8962022-06-01 21:02:42 -070059 fixture.db.SetDebugLogLevel()
60
Philipp Schrader7365d322022-03-06 16:40:08 -080061 return fixture
Philipp Schrader4953cc32022-02-25 18:09:02 -080062}
63
Philipp Schradereecb8962022-06-01 21:02:42 -070064func checkDeepEqual(t *testing.T, expected interface{}, actual interface{}) {
65 if !reflect.DeepEqual(expected, actual) {
66 t.Fatalf(spew.Sprintf("Got %#v,\nbut expected %#v.", actual, expected))
67 }
68}
69
Philipp Schrader4953cc32022-02-25 18:09:02 -080070func TestAddToMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080071 fixture := createDatabase(t)
72 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080073
Philipp Schrader83fc2722022-03-10 21:59:20 -080074 correct := []Match{
75 Match{
76 MatchNumber: 7,
Philipp Schrader30b4a682022-04-16 14:36:17 -070077 SetNumber: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -080078 CompLevel: "quals",
79 R1: 9999, R2: 1000, R3: 777, B1: 0000, B2: 4321, B3: 1234,
Philipp Schrader83fc2722022-03-10 21:59:20 -080080 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -080081 }
Philipp Schrader83fc2722022-03-10 21:59:20 -080082
Philipp Schrader7365d322022-03-06 16:40:08 -080083 err := fixture.db.AddToMatch(correct[0])
Philipp Schrader83fc2722022-03-10 21:59:20 -080084 check(t, err, "Failed to add match data")
85
Philipp Schrader7365d322022-03-06 16:40:08 -080086 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -080087 check(t, err, "Failed ReturnMatches()")
88
Philipp Schradereecb8962022-06-01 21:02:42 -070089 checkDeepEqual(t, correct, got)
Sabina Leaverc5fd2772022-01-29 17:00:23 -080090}
91
Yash Chainanibcd1bb32022-04-02 17:10:24 -070092func TestAddOrUpdateRankingsDB(t *testing.T) {
93 fixture := createDatabase(t)
94 defer fixture.TearDown()
95
96 correct := []Ranking{
97 Ranking{
98 TeamNumber: 123,
99 Losses: 1, Wins: 7, Ties: 0,
100 Rank: 2, Dq: 0,
101 },
102 Ranking{
103 TeamNumber: 125,
104 Losses: 2, Wins: 4, Ties: 0,
105 Rank: 2, Dq: 0,
106 },
107 }
108
109 for i := 0; i < len(correct); i++ {
110 err := fixture.db.AddOrUpdateRankings(correct[i])
111 check(t, err, "Failed to add ranking data")
112 }
113
114 got, err := fixture.db.ReturnRankings()
115 check(t, err, "Failed ReturnRankings()")
116
117 if !reflect.DeepEqual(correct, got) {
118 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
119 }
120}
121
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800122func TestAddToStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800123 fixture := createDatabase(t)
124 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800125
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800126 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800127 Stats{
128 TeamNumber: 1236, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700129 StartingQuadrant: 2,
130 AutoBallPickedUp: [5]bool{false, false, false, true, false},
131 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800132 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700133 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
134 Comment: "this is a comment", CollectedBy: "josh",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800135 },
136 Stats{
137 TeamNumber: 1001, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700138 StartingQuadrant: 3,
139 AutoBallPickedUp: [5]bool{true, false, true, true, false},
140 ShotsMissed: 6, UpperGoalShots: 9, LowerGoalShots: 9,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800141 ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700142 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
143 Comment: "another comment", CollectedBy: "rupert",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800144 },
145 Stats{
146 TeamNumber: 777, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700147 StartingQuadrant: 4,
148 AutoBallPickedUp: [5]bool{false, true, true, true, false},
149 ShotsMissed: 5, UpperGoalShots: 7, LowerGoalShots: 12,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800150 ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700151 PlayedDefense: 0, DefenseReceivedScore: 3, Climbing: 0,
152 Comment: "and another", CollectedBy: "felix",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800153 },
154 Stats{
155 TeamNumber: 1000, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700156 StartingQuadrant: 1,
157 AutoBallPickedUp: [5]bool{false, false, false, false, false},
158 ShotsMissed: 12, UpperGoalShots: 6, LowerGoalShots: 10,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800159 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700160 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
161 Comment: "and another one", CollectedBy: "thea",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800162 },
163 Stats{
164 TeamNumber: 4321, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700165 StartingQuadrant: 2,
166 AutoBallPickedUp: [5]bool{true, false, false, false, false},
167 ShotsMissed: 14, UpperGoalShots: 12, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800168 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700169 PlayedDefense: 0, DefenseReceivedScore: 0, Climbing: 0,
170 Comment: "more comment", CollectedBy: "amy",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800171 },
172 Stats{
173 TeamNumber: 1234, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700174 StartingQuadrant: 3,
175 AutoBallPickedUp: [5]bool{false, false, false, false, true},
176 ShotsMissed: 3, UpperGoalShots: 4, LowerGoalShots: 0,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800177 ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700178 PlayedDefense: 0, DefenseReceivedScore: 5, Climbing: 0,
179 Comment: "final comment", CollectedBy: "beth",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800180 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800181 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800182
Philipp Schrader7365d322022-03-06 16:40:08 -0800183 err := fixture.db.AddToMatch(Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700184 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800185 R1: 1236, R2: 1001, R3: 777, B1: 1000, B2: 4321, B3: 1234,
Philipp Schrader7365d322022-03-06 16:40:08 -0800186 })
Philipp Schrader83fc2722022-03-10 21:59:20 -0800187 check(t, err, "Failed to add match")
188
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800189 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800190 err = fixture.db.AddToStats(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800191 check(t, err, "Failed to add stats to DB")
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800192 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800193
Philipp Schrader7365d322022-03-06 16:40:08 -0800194 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800195 check(t, err, "Failed ReturnStats()")
196
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800197 if !reflect.DeepEqual(correct, got) {
198 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
199 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800200}
201
Philipp Schraderf117fae2022-04-08 20:14:57 -0700202func TestAddDuplicateStats(t *testing.T) {
203 fixture := createDatabase(t)
204 defer fixture.TearDown()
205
206 stats := Stats{
207 TeamNumber: 1236, MatchNumber: 7,
Philipp Schradereecb8962022-06-01 21:02:42 -0700208 SetNumber: 1, CompLevel: "qual",
Philipp Schraderf117fae2022-04-08 20:14:57 -0700209 StartingQuadrant: 2,
210 AutoBallPickedUp: [5]bool{false, false, false, true, false},
211 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
212 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
213 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
214 Comment: "this is a comment", CollectedBy: "josh",
215 }
216
217 err := fixture.db.AddToMatch(Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700218 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Philipp Schraderf117fae2022-04-08 20:14:57 -0700219 R1: 1236, R2: 1001, R3: 777, B1: 1000, B2: 4321, B3: 1234,
220 })
221 check(t, err, "Failed to add match")
222
223 // Add stats. This should succeed.
224 err = fixture.db.AddToStats(stats)
225 check(t, err, "Failed to add stats to DB")
226
227 // Try again. It should fail this time.
228 err = fixture.db.AddToStats(stats)
229 if err == nil {
230 t.Fatal("Failed to get error when adding duplicate stats.")
231 }
232 if !strings.Contains(err.Error(), "ERROR: duplicate key value violates unique constraint") {
233 t.Fatal("Expected error message to be complain about duplicate key value, but got ", err)
234 }
235}
236
Milo Lina72e2002022-04-06 20:31:13 -0700237func TestQueryShiftDB(t *testing.T) {
238 fixture := createDatabase(t)
239 defer fixture.TearDown()
240
241 testDatabase := []Shift{
242 Shift{
243 MatchNumber: 1,
244 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
245 },
246 Shift{
247 MatchNumber: 2,
248 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
249 },
250 }
251
252 for i := 0; i < len(testDatabase); i++ {
253 err := fixture.db.AddToShift(testDatabase[i])
254 check(t, err, fmt.Sprint("Failed to add shift", i))
255 }
256
257 correct := []Shift{
258 Shift{
259 MatchNumber: 1,
260 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
261 },
262 }
263
264 got, err := fixture.db.QueryAllShifts(1)
265 check(t, err, "Failed to query shift for match 1")
266
267 if !reflect.DeepEqual(correct, got) {
268 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
269 }
270}
271
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800272func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800273 fixture := createDatabase(t)
274 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800275
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800276 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800277 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700278 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700279 StartingQuadrant: 1,
280 AutoBallPickedUp: [5]bool{false, false, false, false, false},
281 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800282 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700283 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800284 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700285 TeamNumber: 1234, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700286 StartingQuadrant: 2,
287 AutoBallPickedUp: [5]bool{false, false, false, false, true},
288 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800289 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700290 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800291 },
292 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700293 TeamNumber: 1233, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700294 StartingQuadrant: 3,
295 AutoBallPickedUp: [5]bool{false, false, false, false, false},
296 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800297 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700298 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800299 },
300 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700301 TeamNumber: 1232, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700302 StartingQuadrant: 2,
303 AutoBallPickedUp: [5]bool{true, false, false, false, true},
304 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800305 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700306 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800307 },
308 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700309 TeamNumber: 1231, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700310 StartingQuadrant: 3,
311 AutoBallPickedUp: [5]bool{false, false, true, false, false},
312 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800313 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700314 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800315 },
316 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700317 TeamNumber: 1239, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700318 StartingQuadrant: 4,
319 AutoBallPickedUp: [5]bool{false, true, true, false, false},
320 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800321 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700322 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800323 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800324 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800325
Philipp Schrader7365d322022-03-06 16:40:08 -0800326 err := fixture.db.AddToMatch(Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700327 MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800328 R1: 1235, R2: 1234, R3: 1233, B1: 1232, B2: 1231, B3: 1239})
329 check(t, err, "Failed to add match")
330
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800331 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800332 err = fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700333 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800334 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800335
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800336 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800337 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700338 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700339 StartingQuadrant: 1,
340 AutoBallPickedUp: [5]bool{false, false, false, false, false},
341 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800342 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700343 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800344 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800345 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800346
Philipp Schrader7365d322022-03-06 16:40:08 -0800347 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800348 check(t, err, "Failed QueryStats()")
349
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800350 if !reflect.DeepEqual(correct, got) {
351 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
352 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800353}
354
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700355func TestQueryRankingsDB(t *testing.T) {
356 fixture := createDatabase(t)
357 defer fixture.TearDown()
358
359 testDatabase := []Ranking{
360 Ranking{
361 TeamNumber: 123,
362 Losses: 1, Wins: 7, Ties: 2,
363 Rank: 2, Dq: 0,
364 },
365 Ranking{
366 TeamNumber: 124,
367 Losses: 3, Wins: 4, Ties: 0,
368 Rank: 4, Dq: 2,
369 },
370 Ranking{
371 TeamNumber: 125,
372 Losses: 5, Wins: 2, Ties: 0,
373 Rank: 17, Dq: 0,
374 },
375 Ranking{
376 TeamNumber: 126,
377 Losses: 0, Wins: 7, Ties: 0,
378 Rank: 5, Dq: 0,
379 },
380 }
381
382 for i := 0; i < len(testDatabase); i++ {
383 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
384 check(t, err, fmt.Sprint("Failed to add rankings ", i))
385 }
386
387 correct := []Ranking{
388 Ranking{
389 TeamNumber: 126,
390 Losses: 0, Wins: 7, Ties: 0,
391 Rank: 5, Dq: 0,
392 },
393 }
394
395 got, err := fixture.db.QueryRankings(126)
396 check(t, err, "Failed QueryRankings()")
397
398 if !reflect.DeepEqual(correct, got) {
399 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
400 }
401}
402
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800403func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800404 fixture := createDatabase(t)
405 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800406
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800407 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800408 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700409 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800410 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800411 },
412 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700413 MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800414 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800415 },
416 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700417 MatchNumber: 4, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800418 R1: 251, R2: 169, R3: 286, B1: 653, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800419 },
420 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700421 MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800422 R1: 198, R2: 1421, R3: 538, B1: 26, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800423 },
424 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700425 MatchNumber: 6, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800426 R1: 251, R2: 188, R3: 286, B1: 555, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800427 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800428 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800429
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800430 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800431 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800432 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800433 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800434
Philipp Schrader7365d322022-03-06 16:40:08 -0800435 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800436 check(t, err, "Failed ReturnMatches()")
437
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800438 if !reflect.DeepEqual(correct, got) {
439 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
440 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800441}
442
Philipp Schraderfe583842022-04-08 19:47:07 -0700443func TestOverwriteNewMatchData(t *testing.T) {
444 fixture := createDatabase(t)
445 defer fixture.TearDown()
446
447 testDatabase := []Match{
448 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700449 MatchNumber: 1, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700450 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
451 },
452 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700453 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700454 R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698,
455 },
456 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700457 MatchNumber: 1, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700458 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
459 },
460 }
461
462 for i := 0; i < len(testDatabase); i++ {
463 err := fixture.db.AddToMatch(testDatabase[i])
464 check(t, err, fmt.Sprint("Failed to add match", i))
465 }
466
467 correct := []Match{
468 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700469 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700470 R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698,
471 },
472 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700473 MatchNumber: 1, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700474 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
475 },
476 }
477
478 got, err := fixture.db.ReturnMatches()
479 check(t, err, "Failed to get match list")
480
481 if !reflect.DeepEqual(correct, got) {
482 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
483 }
484}
485
Milo Lina72e2002022-04-06 20:31:13 -0700486func TestAddReturnShiftDB(t *testing.T) {
487 fixture := createDatabase(t)
488 defer fixture.TearDown()
489
490 correct := []Shift{
491 Shift{
492 MatchNumber: 1,
493 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
494 },
495 Shift{
496 MatchNumber: 2,
497 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
498 },
499 }
500
501 for i := 0; i < len(correct); i++ {
502 err := fixture.db.AddToShift(correct[i])
503 check(t, err, fmt.Sprint("Failed to add shift", i))
504 }
505
506 got, err := fixture.db.ReturnAllShifts()
507 check(t, err, "Failed ReturnAllShifts()")
508
509 if !reflect.DeepEqual(correct, got) {
510 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
511 }
512}
513
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700514func TestReturnRankingsDB(t *testing.T) {
515 fixture := createDatabase(t)
516 defer fixture.TearDown()
517
518 correct := []Ranking{
519 Ranking{
520 TeamNumber: 123,
521 Losses: 1, Wins: 7, Ties: 2,
522 Rank: 2, Dq: 0,
523 },
524 Ranking{
525 TeamNumber: 124,
526 Losses: 3, Wins: 4, Ties: 0,
527 Rank: 4, Dq: 2,
528 },
529 Ranking{
530 TeamNumber: 125,
531 Losses: 5, Wins: 2, Ties: 0,
532 Rank: 17, Dq: 0,
533 },
534 Ranking{
535 TeamNumber: 126,
536 Losses: 0, Wins: 7, Ties: 0,
537 Rank: 5, Dq: 0,
538 },
539 }
540
541 for i := 0; i < len(correct); i++ {
542 err := fixture.db.AddOrUpdateRankings(correct[i])
543 check(t, err, fmt.Sprint("Failed to add rankings", i))
544 }
545
546 got, err := fixture.db.ReturnRankings()
547 check(t, err, "Failed ReturnRankings()")
548
549 if !reflect.DeepEqual(correct, got) {
550 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
551 }
552}
553
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800554func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800555 fixture := createDatabase(t)
556 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800557
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800558 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800559 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700560 TeamNumber: 1235, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700561 StartingQuadrant: 1,
562 AutoBallPickedUp: [5]bool{false, false, false, false, false},
563 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800564 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700565 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800566 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700567 TeamNumber: 1236, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700568 StartingQuadrant: 2,
569 AutoBallPickedUp: [5]bool{false, false, false, false, true},
570 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800571 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700572 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800573 },
574 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700575 TeamNumber: 1237, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700576 StartingQuadrant: 3,
577 AutoBallPickedUp: [5]bool{false, false, false, false, false},
578 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800579 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700580 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800581 },
582 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700583 TeamNumber: 1238, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700584 StartingQuadrant: 2,
585 AutoBallPickedUp: [5]bool{true, false, false, false, true},
586 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800587 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700588 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800589 },
590 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700591 TeamNumber: 1239, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700592 StartingQuadrant: 3,
593 AutoBallPickedUp: [5]bool{false, false, true, false, false},
594 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800595 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700596 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800597 },
598 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700599 TeamNumber: 1233, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700600 StartingQuadrant: 4,
601 AutoBallPickedUp: [5]bool{false, true, true, false, false},
602 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800603 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700604 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800605 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800606 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800607
Philipp Schrader7365d322022-03-06 16:40:08 -0800608 err := fixture.db.AddToMatch(Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700609 MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800610 R1: 1235, R2: 1236, R3: 1237, B1: 1238, B2: 1239, B3: 1233})
611 check(t, err, "Failed to add match")
612
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800613 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800614 err = fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700615 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800616 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800617
Philipp Schrader7365d322022-03-06 16:40:08 -0800618 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800619 check(t, err, "Failed ReturnStats()")
620
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800621 if !reflect.DeepEqual(correct, got) {
622 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
623 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800624}
Alex Perry871eab92022-03-12 17:43:52 -0800625
Sabina Leaver759090b2023-01-14 20:42:56 -0800626func TestReturnActionsDB(t *testing.T) {
627 fixture := createDatabase(t)
628 defer fixture.TearDown()
629 correct := []Action{
630 Action{
631 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
632 CompletedAction: []byte(""), TimeStamp: 0000, CollectedBy: "",
633 },
634 Action{
635 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
636 CompletedAction: []byte(""), TimeStamp: 0321, CollectedBy: "",
637 },
638 Action{
639 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
640 CompletedAction: []byte(""), TimeStamp: 0222, CollectedBy: "",
641 },
642 Action{
643 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
644 CompletedAction: []byte(""), TimeStamp: 0110, CollectedBy: "",
645 },
646 Action{
647 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
648 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
649 },
650 Action{
651 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
652 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
653 },
654 }
655
656 err := fixture.db.AddToMatch(Match{
657 MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
658 R1: 1235, R2: 1236, R3: 1237, B1: 1238, B2: 1239, B3: 1233})
659 check(t, err, "Failed to add match")
660
661 for i := 0; i < len(correct); i++ {
662 err = fixture.db.AddAction(correct[i])
663 check(t, err, fmt.Sprint("Failed to add to actions ", i))
664 }
665
666 got, err := fixture.db.ReturnActions()
667 check(t, err, "Failed ReturnActions()")
668
669 if !reflect.DeepEqual(correct, got) {
670 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
671 }
672}
673
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700674func TestRankingsDbUpdate(t *testing.T) {
675 fixture := createDatabase(t)
676 defer fixture.TearDown()
677
678 testDatabase := []Ranking{
679 Ranking{
680 TeamNumber: 123,
681 Losses: 1, Wins: 7, Ties: 2,
682 Rank: 2, Dq: 0,
683 },
684 Ranking{
685 TeamNumber: 124,
686 Losses: 3, Wins: 4, Ties: 0,
687 Rank: 4, Dq: 2,
688 },
689 Ranking{
690 TeamNumber: 125,
691 Losses: 5, Wins: 2, Ties: 0,
692 Rank: 17, Dq: 0,
693 },
694 Ranking{
695 TeamNumber: 126,
696 Losses: 0, Wins: 7, Ties: 0,
697 Rank: 5, Dq: 0,
698 },
699 Ranking{
700 TeamNumber: 125,
701 Losses: 2, Wins: 4, Ties: 1,
702 Rank: 5, Dq: 0,
703 },
704 }
705
706 for i := 0; i < len(testDatabase); i++ {
707 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
708 check(t, err, fmt.Sprint("Failed to add rankings ", i))
709 }
710
711 correct := []Ranking{
712 Ranking{
713 TeamNumber: 125,
714 Losses: 2, Wins: 4, Ties: 1,
715 Rank: 5, Dq: 0,
716 },
717 }
718
719 got, err := fixture.db.QueryRankings(125)
720 check(t, err, "Failed QueryRankings()")
721
Philipp Schradereecb8962022-06-01 21:02:42 -0700722 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700723}
724
Alex Perry871eab92022-03-12 17:43:52 -0800725func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800726 fixture := createDatabase(t)
727 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800728
Philipp Schradereecb8962022-06-01 21:02:42 -0700729 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -0800730
Filip Kujawaf947cb42022-11-21 10:00:30 -0800731 err := fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 1", GoodDriving: true, BadDriving: false, SketchyClimb: false, SolidClimb: true, GoodDefense: false, BadDefense: true})
Alex Perry871eab92022-03-12 17:43:52 -0800732 check(t, err, "Failed to add Note")
Filip Kujawaf947cb42022-11-21 10:00:30 -0800733 err = fixture.db.AddNotes(NotesData{TeamNumber: 1235, Notes: "Note 2", GoodDriving: false, BadDriving: true, SketchyClimb: false, SolidClimb: true, GoodDefense: false, BadDefense: false})
Alex Perry871eab92022-03-12 17:43:52 -0800734 check(t, err, "Failed to add Note")
Filip Kujawaf947cb42022-11-21 10:00:30 -0800735 err = fixture.db.AddNotes(NotesData{TeamNumber: 1234, Notes: "Note 3", GoodDriving: true, BadDriving: false, SketchyClimb: false, SolidClimb: true, GoodDefense: true, BadDefense: false})
Alex Perry871eab92022-03-12 17:43:52 -0800736 check(t, err, "Failed to add Note")
737
Philipp Schrader7365d322022-03-06 16:40:08 -0800738 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800739 check(t, err, "Failed to get Notes")
740
741 if !reflect.DeepEqual(expected, actual) {
742 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
743 }
744}
Filip Kujawa210a03b2022-11-24 14:41:11 -0800745
746func TestDriverRanking(t *testing.T) {
747 fixture := createDatabase(t)
748 defer fixture.TearDown()
749
750 expected := []DriverRankingData{
751 {ID: 1, MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
752 {ID: 2, MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
753 }
754
755 err := fixture.db.AddDriverRanking(
756 DriverRankingData{MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
757 )
758 check(t, err, "Failed to add Driver Ranking")
759 err = fixture.db.AddDriverRanking(
760 DriverRankingData{MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
761 )
762 check(t, err, "Failed to add Driver Ranking")
763 err = fixture.db.AddDriverRanking(
764 DriverRankingData{MatchNumber: 13, Rank1: 1235, Rank2: 1234, Rank3: 1236},
765 )
766 check(t, err, "Failed to add Driver Ranking")
767
768 actual, err := fixture.db.QueryDriverRanking(12)
769 check(t, err, "Failed to get Driver Ranking")
770
771 if !reflect.DeepEqual(expected, actual) {
772 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
773 }
774}