blob: 642fb6dcf00f1f2ad7e148335435b853d3b8aeb2 [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
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800237func TestQueryMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800238 fixture := createDatabase(t)
239 defer fixture.TearDown()
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800240
241 testDatabase := []Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700242 Match{MatchNumber: 2, SetNumber: 1, CompLevel: "quals", R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149},
243 Match{MatchNumber: 4, SetNumber: 1, CompLevel: "quals", R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698},
244 Match{MatchNumber: 3, SetNumber: 1, CompLevel: "quals", R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262},
245 Match{MatchNumber: 6, SetNumber: 1, CompLevel: "quals", R1: 191, R2: 132, R3: 773, B1: 994, B2: 435, B3: 696},
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800246 }
247
248 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800249 err := fixture.db.AddToMatch(testDatabase[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800250 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800251 }
252
253 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800254 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700255 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800256 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800257 },
258 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700259 MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800260 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800261 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800262 }
263
Philipp Schrader7365d322022-03-06 16:40:08 -0800264 got, err := fixture.db.QueryMatches(538)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800265 check(t, err, "Failed to query matches for 538")
266
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800267 if !reflect.DeepEqual(correct, got) {
268 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
269 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800270}
271
Milo Lina72e2002022-04-06 20:31:13 -0700272func TestQueryShiftDB(t *testing.T) {
273 fixture := createDatabase(t)
274 defer fixture.TearDown()
275
276 testDatabase := []Shift{
277 Shift{
278 MatchNumber: 1,
279 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
280 },
281 Shift{
282 MatchNumber: 2,
283 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
284 },
285 }
286
287 for i := 0; i < len(testDatabase); i++ {
288 err := fixture.db.AddToShift(testDatabase[i])
289 check(t, err, fmt.Sprint("Failed to add shift", i))
290 }
291
292 correct := []Shift{
293 Shift{
294 MatchNumber: 1,
295 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
296 },
297 }
298
299 got, err := fixture.db.QueryAllShifts(1)
300 check(t, err, "Failed to query shift for match 1")
301
302 if !reflect.DeepEqual(correct, got) {
303 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
304 }
305}
306
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800307func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800308 fixture := createDatabase(t)
309 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800310
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800311 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800312 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700313 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700314 StartingQuadrant: 1,
315 AutoBallPickedUp: [5]bool{false, false, false, false, false},
316 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800317 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700318 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800319 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700320 TeamNumber: 1234, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700321 StartingQuadrant: 2,
322 AutoBallPickedUp: [5]bool{false, false, false, false, true},
323 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800324 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700325 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800326 },
327 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700328 TeamNumber: 1233, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700329 StartingQuadrant: 3,
330 AutoBallPickedUp: [5]bool{false, false, false, false, false},
331 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800332 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700333 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800334 },
335 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700336 TeamNumber: 1232, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700337 StartingQuadrant: 2,
338 AutoBallPickedUp: [5]bool{true, false, false, false, true},
339 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800340 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700341 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800342 },
343 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700344 TeamNumber: 1231, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700345 StartingQuadrant: 3,
346 AutoBallPickedUp: [5]bool{false, false, true, false, false},
347 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800348 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700349 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800350 },
351 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700352 TeamNumber: 1239, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700353 StartingQuadrant: 4,
354 AutoBallPickedUp: [5]bool{false, true, true, false, false},
355 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800356 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700357 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800358 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800359 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800360
Philipp Schrader7365d322022-03-06 16:40:08 -0800361 err := fixture.db.AddToMatch(Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700362 MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800363 R1: 1235, R2: 1234, R3: 1233, B1: 1232, B2: 1231, B3: 1239})
364 check(t, err, "Failed to add match")
365
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800366 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800367 err = fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700368 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800369 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800370
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800371 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800372 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700373 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700374 StartingQuadrant: 1,
375 AutoBallPickedUp: [5]bool{false, false, false, false, false},
376 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800377 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700378 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800379 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800380 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800381
Philipp Schrader7365d322022-03-06 16:40:08 -0800382 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800383 check(t, err, "Failed QueryStats()")
384
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800385 if !reflect.DeepEqual(correct, got) {
386 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
387 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800388}
389
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700390func TestQueryRankingsDB(t *testing.T) {
391 fixture := createDatabase(t)
392 defer fixture.TearDown()
393
394 testDatabase := []Ranking{
395 Ranking{
396 TeamNumber: 123,
397 Losses: 1, Wins: 7, Ties: 2,
398 Rank: 2, Dq: 0,
399 },
400 Ranking{
401 TeamNumber: 124,
402 Losses: 3, Wins: 4, Ties: 0,
403 Rank: 4, Dq: 2,
404 },
405 Ranking{
406 TeamNumber: 125,
407 Losses: 5, Wins: 2, Ties: 0,
408 Rank: 17, Dq: 0,
409 },
410 Ranking{
411 TeamNumber: 126,
412 Losses: 0, Wins: 7, Ties: 0,
413 Rank: 5, Dq: 0,
414 },
415 }
416
417 for i := 0; i < len(testDatabase); i++ {
418 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
419 check(t, err, fmt.Sprint("Failed to add rankings ", i))
420 }
421
422 correct := []Ranking{
423 Ranking{
424 TeamNumber: 126,
425 Losses: 0, Wins: 7, Ties: 0,
426 Rank: 5, Dq: 0,
427 },
428 }
429
430 got, err := fixture.db.QueryRankings(126)
431 check(t, err, "Failed QueryRankings()")
432
433 if !reflect.DeepEqual(correct, got) {
434 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
435 }
436}
437
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800438func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800439 fixture := createDatabase(t)
440 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800441
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800442 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800443 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700444 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800445 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800446 },
447 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700448 MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800449 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800450 },
451 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700452 MatchNumber: 4, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800453 R1: 251, R2: 169, R3: 286, B1: 653, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800454 },
455 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700456 MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800457 R1: 198, R2: 1421, R3: 538, B1: 26, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800458 },
459 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700460 MatchNumber: 6, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800461 R1: 251, R2: 188, R3: 286, B1: 555, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800462 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800463 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800464
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800465 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800466 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800467 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800468 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800469
Philipp Schrader7365d322022-03-06 16:40:08 -0800470 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800471 check(t, err, "Failed ReturnMatches()")
472
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800473 if !reflect.DeepEqual(correct, got) {
474 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
475 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800476}
477
Philipp Schraderfe583842022-04-08 19:47:07 -0700478func TestOverwriteNewMatchData(t *testing.T) {
479 fixture := createDatabase(t)
480 defer fixture.TearDown()
481
482 testDatabase := []Match{
483 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700484 MatchNumber: 1, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700485 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
486 },
487 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700488 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700489 R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698,
490 },
491 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700492 MatchNumber: 1, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700493 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
494 },
495 }
496
497 for i := 0; i < len(testDatabase); i++ {
498 err := fixture.db.AddToMatch(testDatabase[i])
499 check(t, err, fmt.Sprint("Failed to add match", i))
500 }
501
502 correct := []Match{
503 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700504 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700505 R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698,
506 },
507 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700508 MatchNumber: 1, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700509 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
510 },
511 }
512
513 got, err := fixture.db.ReturnMatches()
514 check(t, err, "Failed to get match list")
515
516 if !reflect.DeepEqual(correct, got) {
517 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
518 }
519}
520
Milo Lina72e2002022-04-06 20:31:13 -0700521func TestAddReturnShiftDB(t *testing.T) {
522 fixture := createDatabase(t)
523 defer fixture.TearDown()
524
525 correct := []Shift{
526 Shift{
527 MatchNumber: 1,
528 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
529 },
530 Shift{
531 MatchNumber: 2,
532 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
533 },
534 }
535
536 for i := 0; i < len(correct); i++ {
537 err := fixture.db.AddToShift(correct[i])
538 check(t, err, fmt.Sprint("Failed to add shift", i))
539 }
540
541 got, err := fixture.db.ReturnAllShifts()
542 check(t, err, "Failed ReturnAllShifts()")
543
544 if !reflect.DeepEqual(correct, got) {
545 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
546 }
547}
548
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700549func TestReturnRankingsDB(t *testing.T) {
550 fixture := createDatabase(t)
551 defer fixture.TearDown()
552
553 correct := []Ranking{
554 Ranking{
555 TeamNumber: 123,
556 Losses: 1, Wins: 7, Ties: 2,
557 Rank: 2, Dq: 0,
558 },
559 Ranking{
560 TeamNumber: 124,
561 Losses: 3, Wins: 4, Ties: 0,
562 Rank: 4, Dq: 2,
563 },
564 Ranking{
565 TeamNumber: 125,
566 Losses: 5, Wins: 2, Ties: 0,
567 Rank: 17, Dq: 0,
568 },
569 Ranking{
570 TeamNumber: 126,
571 Losses: 0, Wins: 7, Ties: 0,
572 Rank: 5, Dq: 0,
573 },
574 }
575
576 for i := 0; i < len(correct); i++ {
577 err := fixture.db.AddOrUpdateRankings(correct[i])
578 check(t, err, fmt.Sprint("Failed to add rankings", i))
579 }
580
581 got, err := fixture.db.ReturnRankings()
582 check(t, err, "Failed ReturnRankings()")
583
584 if !reflect.DeepEqual(correct, got) {
585 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
586 }
587}
588
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800589func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800590 fixture := createDatabase(t)
591 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800592
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800593 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800594 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700595 TeamNumber: 1235, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700596 StartingQuadrant: 1,
597 AutoBallPickedUp: [5]bool{false, false, false, false, false},
598 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800599 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700600 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800601 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700602 TeamNumber: 1236, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700603 StartingQuadrant: 2,
604 AutoBallPickedUp: [5]bool{false, false, false, false, true},
605 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800606 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700607 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800608 },
609 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700610 TeamNumber: 1237, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700611 StartingQuadrant: 3,
612 AutoBallPickedUp: [5]bool{false, false, false, false, false},
613 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800614 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700615 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800616 },
617 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700618 TeamNumber: 1238, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700619 StartingQuadrant: 2,
620 AutoBallPickedUp: [5]bool{true, false, false, false, true},
621 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800622 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700623 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800624 },
625 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700626 TeamNumber: 1239, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700627 StartingQuadrant: 3,
628 AutoBallPickedUp: [5]bool{false, false, true, false, false},
629 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800630 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700631 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800632 },
633 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700634 TeamNumber: 1233, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700635 StartingQuadrant: 4,
636 AutoBallPickedUp: [5]bool{false, true, true, false, false},
637 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800638 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700639 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800640 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800641 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800642
Philipp Schrader7365d322022-03-06 16:40:08 -0800643 err := fixture.db.AddToMatch(Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700644 MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800645 R1: 1235, R2: 1236, R3: 1237, B1: 1238, B2: 1239, B3: 1233})
646 check(t, err, "Failed to add match")
647
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800648 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800649 err = fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700650 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800651 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800652
Philipp Schrader7365d322022-03-06 16:40:08 -0800653 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800654 check(t, err, "Failed ReturnStats()")
655
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800656 if !reflect.DeepEqual(correct, got) {
657 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
658 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800659}
Alex Perry871eab92022-03-12 17:43:52 -0800660
Sabina Leaver759090b2023-01-14 20:42:56 -0800661func TestReturnActionsDB(t *testing.T) {
662 fixture := createDatabase(t)
663 defer fixture.TearDown()
664 correct := []Action{
665 Action{
666 TeamNumber: "1235", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
667 CompletedAction: []byte(""), TimeStamp: 0000, CollectedBy: "",
668 },
669 Action{
670 TeamNumber: "1236", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
671 CompletedAction: []byte(""), TimeStamp: 0321, CollectedBy: "",
672 },
673 Action{
674 TeamNumber: "1237", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
675 CompletedAction: []byte(""), TimeStamp: 0222, CollectedBy: "",
676 },
677 Action{
678 TeamNumber: "1238", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
679 CompletedAction: []byte(""), TimeStamp: 0110, CollectedBy: "",
680 },
681 Action{
682 TeamNumber: "1239", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
683 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
684 },
685 Action{
686 TeamNumber: "1233", MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
687 CompletedAction: []byte(""), TimeStamp: 0004, CollectedBy: "",
688 },
689 }
690
691 err := fixture.db.AddToMatch(Match{
692 MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
693 R1: 1235, R2: 1236, R3: 1237, B1: 1238, B2: 1239, B3: 1233})
694 check(t, err, "Failed to add match")
695
696 for i := 0; i < len(correct); i++ {
697 err = fixture.db.AddAction(correct[i])
698 check(t, err, fmt.Sprint("Failed to add to actions ", i))
699 }
700
701 got, err := fixture.db.ReturnActions()
702 check(t, err, "Failed ReturnActions()")
703
704 if !reflect.DeepEqual(correct, got) {
705 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
706 }
707}
708
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700709func TestRankingsDbUpdate(t *testing.T) {
710 fixture := createDatabase(t)
711 defer fixture.TearDown()
712
713 testDatabase := []Ranking{
714 Ranking{
715 TeamNumber: 123,
716 Losses: 1, Wins: 7, Ties: 2,
717 Rank: 2, Dq: 0,
718 },
719 Ranking{
720 TeamNumber: 124,
721 Losses: 3, Wins: 4, Ties: 0,
722 Rank: 4, Dq: 2,
723 },
724 Ranking{
725 TeamNumber: 125,
726 Losses: 5, Wins: 2, Ties: 0,
727 Rank: 17, Dq: 0,
728 },
729 Ranking{
730 TeamNumber: 126,
731 Losses: 0, Wins: 7, Ties: 0,
732 Rank: 5, Dq: 0,
733 },
734 Ranking{
735 TeamNumber: 125,
736 Losses: 2, Wins: 4, Ties: 1,
737 Rank: 5, Dq: 0,
738 },
739 }
740
741 for i := 0; i < len(testDatabase); i++ {
742 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
743 check(t, err, fmt.Sprint("Failed to add rankings ", i))
744 }
745
746 correct := []Ranking{
747 Ranking{
748 TeamNumber: 125,
749 Losses: 2, Wins: 4, Ties: 1,
750 Rank: 5, Dq: 0,
751 },
752 }
753
754 got, err := fixture.db.QueryRankings(125)
755 check(t, err, "Failed QueryRankings()")
756
Philipp Schradereecb8962022-06-01 21:02:42 -0700757 checkDeepEqual(t, correct, got)
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700758}
759
Alex Perry871eab92022-03-12 17:43:52 -0800760func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800761 fixture := createDatabase(t)
762 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800763
Philipp Schradereecb8962022-06-01 21:02:42 -0700764 expected := []string{"Note 1", "Note 3"}
Alex Perry871eab92022-03-12 17:43:52 -0800765
Filip Kujawaf947cb42022-11-21 10:00:30 -0800766 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 -0800767 check(t, err, "Failed to add Note")
Filip Kujawaf947cb42022-11-21 10:00:30 -0800768 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 -0800769 check(t, err, "Failed to add Note")
Filip Kujawaf947cb42022-11-21 10:00:30 -0800770 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 -0800771 check(t, err, "Failed to add Note")
772
Philipp Schrader7365d322022-03-06 16:40:08 -0800773 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800774 check(t, err, "Failed to get Notes")
775
776 if !reflect.DeepEqual(expected, actual) {
777 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
778 }
779}
Filip Kujawa210a03b2022-11-24 14:41:11 -0800780
781func TestDriverRanking(t *testing.T) {
782 fixture := createDatabase(t)
783 defer fixture.TearDown()
784
785 expected := []DriverRankingData{
786 {ID: 1, MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
787 {ID: 2, MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
788 }
789
790 err := fixture.db.AddDriverRanking(
791 DriverRankingData{MatchNumber: 12, Rank1: 1234, Rank2: 1235, Rank3: 1236},
792 )
793 check(t, err, "Failed to add Driver Ranking")
794 err = fixture.db.AddDriverRanking(
795 DriverRankingData{MatchNumber: 12, Rank1: 1236, Rank2: 1235, Rank3: 1234},
796 )
797 check(t, err, "Failed to add Driver Ranking")
798 err = fixture.db.AddDriverRanking(
799 DriverRankingData{MatchNumber: 13, Rank1: 1235, Rank2: 1234, Rank3: 1236},
800 )
801 check(t, err, "Failed to add Driver Ranking")
802
803 actual, err := fixture.db.QueryDriverRanking(12)
804 check(t, err, "Failed to get Driver Ranking")
805
806 if !reflect.DeepEqual(expected, actual) {
807 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
808 }
809}