blob: 438e52e3a64a01086679a2ced077bc29420e129e [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"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080012)
13
Philipp Schrader83fc2722022-03-10 21:59:20 -080014// Shortcut for error checking. If the specified error is non-nil, print the
15// error message and exit the test.
16func check(t *testing.T, err error, message string) {
17 if err != nil {
18 t.Fatal(message, ":", err)
19 }
20}
21
Philipp Schrader7365d322022-03-06 16:40:08 -080022type dbFixture struct {
23 db *Database
24 server *exec.Cmd
25}
26
27func (fixture dbFixture) TearDown() {
28 fixture.db.Delete()
29 fixture.db.Close()
30 log.Println("Shutting down testdb")
31 fixture.server.Process.Signal(os.Interrupt)
32 fixture.server.Process.Wait()
33 log.Println("Successfully shut down testdb")
34}
35
36func createDatabase(t *testing.T) dbFixture {
37 var fixture dbFixture
38
39 log.Println("Starting up postgres.")
40 fixture.server = exec.Command("testdb_server/testdb_server_/testdb_server")
41 fixture.server.Stdout = os.Stdout
42 fixture.server.Stderr = os.Stderr
43 err := fixture.server.Start()
44 check(t, err, "Failed to run postgres")
45
46 // Wait until the server is ready. We cannot rely on the TCP socket
47 // alone because postgres creates the socket before it's actually ready
48 // to service requests.
49 for {
50 fixture.db, err = NewDatabase("test", "password", 5432)
51 if err == nil {
52 break
53 }
54 time.Sleep(50 * time.Millisecond)
55 }
56 log.Println("Connected to postgres.")
57
58 return fixture
Philipp Schrader4953cc32022-02-25 18:09:02 -080059}
60
61func TestAddToMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080062 fixture := createDatabase(t)
63 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080064
Philipp Schrader83fc2722022-03-10 21:59:20 -080065 correct := []Match{
66 Match{
67 MatchNumber: 7,
Philipp Schrader30b4a682022-04-16 14:36:17 -070068 SetNumber: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -080069 CompLevel: "quals",
70 R1: 9999, R2: 1000, R3: 777, B1: 0000, B2: 4321, B3: 1234,
Philipp Schrader83fc2722022-03-10 21:59:20 -080071 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -080072 }
Philipp Schrader83fc2722022-03-10 21:59:20 -080073
Philipp Schrader7365d322022-03-06 16:40:08 -080074 err := fixture.db.AddToMatch(correct[0])
Philipp Schrader83fc2722022-03-10 21:59:20 -080075 check(t, err, "Failed to add match data")
76
Philipp Schrader7365d322022-03-06 16:40:08 -080077 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -080078 check(t, err, "Failed ReturnMatches()")
79
Sabina Leaverc5fd2772022-01-29 17:00:23 -080080 if !reflect.DeepEqual(correct, got) {
81 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
82 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -080083}
84
Yash Chainanibcd1bb32022-04-02 17:10:24 -070085func TestAddOrUpdateRankingsDB(t *testing.T) {
86 fixture := createDatabase(t)
87 defer fixture.TearDown()
88
89 correct := []Ranking{
90 Ranking{
91 TeamNumber: 123,
92 Losses: 1, Wins: 7, Ties: 0,
93 Rank: 2, Dq: 0,
94 },
95 Ranking{
96 TeamNumber: 125,
97 Losses: 2, Wins: 4, Ties: 0,
98 Rank: 2, Dq: 0,
99 },
100 }
101
102 for i := 0; i < len(correct); i++ {
103 err := fixture.db.AddOrUpdateRankings(correct[i])
104 check(t, err, "Failed to add ranking data")
105 }
106
107 got, err := fixture.db.ReturnRankings()
108 check(t, err, "Failed ReturnRankings()")
109
110 if !reflect.DeepEqual(correct, got) {
111 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
112 }
113}
114
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800115func TestAddToStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800116 fixture := createDatabase(t)
117 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800118
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800119 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800120 Stats{
121 TeamNumber: 1236, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700122 StartingQuadrant: 2,
123 AutoBallPickedUp: [5]bool{false, false, false, true, false},
124 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800125 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700126 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
127 Comment: "this is a comment", CollectedBy: "josh",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800128 },
129 Stats{
130 TeamNumber: 1001, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700131 StartingQuadrant: 3,
132 AutoBallPickedUp: [5]bool{true, false, true, true, false},
133 ShotsMissed: 6, UpperGoalShots: 9, LowerGoalShots: 9,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800134 ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700135 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
136 Comment: "another comment", CollectedBy: "rupert",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800137 },
138 Stats{
139 TeamNumber: 777, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700140 StartingQuadrant: 4,
141 AutoBallPickedUp: [5]bool{false, true, true, true, false},
142 ShotsMissed: 5, UpperGoalShots: 7, LowerGoalShots: 12,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800143 ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700144 PlayedDefense: 0, DefenseReceivedScore: 3, Climbing: 0,
145 Comment: "and another", CollectedBy: "felix",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800146 },
147 Stats{
148 TeamNumber: 1000, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700149 StartingQuadrant: 1,
150 AutoBallPickedUp: [5]bool{false, false, false, false, false},
151 ShotsMissed: 12, UpperGoalShots: 6, LowerGoalShots: 10,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800152 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700153 PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
154 Comment: "and another one", CollectedBy: "thea",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800155 },
156 Stats{
157 TeamNumber: 4321, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700158 StartingQuadrant: 2,
159 AutoBallPickedUp: [5]bool{true, false, false, false, false},
160 ShotsMissed: 14, UpperGoalShots: 12, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800161 ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700162 PlayedDefense: 0, DefenseReceivedScore: 0, Climbing: 0,
163 Comment: "more comment", CollectedBy: "amy",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800164 },
165 Stats{
166 TeamNumber: 1234, MatchNumber: 7,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700167 StartingQuadrant: 3,
168 AutoBallPickedUp: [5]bool{false, false, false, false, true},
169 ShotsMissed: 3, UpperGoalShots: 4, LowerGoalShots: 0,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800170 ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700171 PlayedDefense: 0, DefenseReceivedScore: 5, Climbing: 0,
172 Comment: "final comment", CollectedBy: "beth",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800173 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800174 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800175
Philipp Schrader7365d322022-03-06 16:40:08 -0800176 err := fixture.db.AddToMatch(Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700177 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800178 R1: 1236, R2: 1001, R3: 777, B1: 1000, B2: 4321, B3: 1234,
Philipp Schrader7365d322022-03-06 16:40:08 -0800179 })
Philipp Schrader83fc2722022-03-10 21:59:20 -0800180 check(t, err, "Failed to add match")
181
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800182 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800183 err = fixture.db.AddToStats(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800184 check(t, err, "Failed to add stats to DB")
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800185 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800186
Philipp Schrader7365d322022-03-06 16:40:08 -0800187 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800188 check(t, err, "Failed ReturnStats()")
189
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800190 if !reflect.DeepEqual(correct, got) {
191 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
192 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800193}
194
Philipp Schraderf117fae2022-04-08 20:14:57 -0700195func TestAddDuplicateStats(t *testing.T) {
196 fixture := createDatabase(t)
197 defer fixture.TearDown()
198
199 stats := Stats{
200 TeamNumber: 1236, MatchNumber: 7,
201 StartingQuadrant: 2,
202 AutoBallPickedUp: [5]bool{false, false, false, true, false},
203 ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
204 ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
205 PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
206 Comment: "this is a comment", CollectedBy: "josh",
207 }
208
209 err := fixture.db.AddToMatch(Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700210 MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
Philipp Schraderf117fae2022-04-08 20:14:57 -0700211 R1: 1236, R2: 1001, R3: 777, B1: 1000, B2: 4321, B3: 1234,
212 })
213 check(t, err, "Failed to add match")
214
215 // Add stats. This should succeed.
216 err = fixture.db.AddToStats(stats)
217 check(t, err, "Failed to add stats to DB")
218
219 // Try again. It should fail this time.
220 err = fixture.db.AddToStats(stats)
221 if err == nil {
222 t.Fatal("Failed to get error when adding duplicate stats.")
223 }
224 if !strings.Contains(err.Error(), "ERROR: duplicate key value violates unique constraint") {
225 t.Fatal("Expected error message to be complain about duplicate key value, but got ", err)
226 }
227}
228
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800229func TestQueryMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800230 fixture := createDatabase(t)
231 defer fixture.TearDown()
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800232
233 testDatabase := []Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700234 Match{MatchNumber: 2, SetNumber: 1, CompLevel: "quals", R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149},
235 Match{MatchNumber: 4, SetNumber: 1, CompLevel: "quals", R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698},
236 Match{MatchNumber: 3, SetNumber: 1, CompLevel: "quals", R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262},
237 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 -0800238 }
239
240 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800241 err := fixture.db.AddToMatch(testDatabase[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800242 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800243 }
244
245 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800246 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700247 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800248 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800249 },
250 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700251 MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800252 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800253 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800254 }
255
Philipp Schrader7365d322022-03-06 16:40:08 -0800256 got, err := fixture.db.QueryMatches(538)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800257 check(t, err, "Failed to query matches for 538")
258
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800259 if !reflect.DeepEqual(correct, got) {
260 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
261 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800262}
263
Milo Lina72e2002022-04-06 20:31:13 -0700264func TestQueryShiftDB(t *testing.T) {
265 fixture := createDatabase(t)
266 defer fixture.TearDown()
267
268 testDatabase := []Shift{
269 Shift{
270 MatchNumber: 1,
271 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
272 },
273 Shift{
274 MatchNumber: 2,
275 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
276 },
277 }
278
279 for i := 0; i < len(testDatabase); i++ {
280 err := fixture.db.AddToShift(testDatabase[i])
281 check(t, err, fmt.Sprint("Failed to add shift", i))
282 }
283
284 correct := []Shift{
285 Shift{
286 MatchNumber: 1,
287 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
288 },
289 }
290
291 got, err := fixture.db.QueryAllShifts(1)
292 check(t, err, "Failed to query shift for match 1")
293
294 if !reflect.DeepEqual(correct, got) {
295 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
296 }
297}
298
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800299func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800300 fixture := createDatabase(t)
301 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800302
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800303 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800304 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700305 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700306 StartingQuadrant: 1,
307 AutoBallPickedUp: [5]bool{false, false, false, false, false},
308 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800309 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700310 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800311 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700312 TeamNumber: 1234, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700313 StartingQuadrant: 2,
314 AutoBallPickedUp: [5]bool{false, false, false, false, true},
315 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800316 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700317 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800318 },
319 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700320 TeamNumber: 1233, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700321 StartingQuadrant: 3,
322 AutoBallPickedUp: [5]bool{false, false, false, false, false},
323 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800324 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700325 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800326 },
327 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700328 TeamNumber: 1232, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700329 StartingQuadrant: 2,
330 AutoBallPickedUp: [5]bool{true, false, false, false, true},
331 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800332 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700333 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800334 },
335 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700336 TeamNumber: 1231, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700337 StartingQuadrant: 3,
338 AutoBallPickedUp: [5]bool{false, false, true, false, false},
339 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800340 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700341 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800342 },
343 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700344 TeamNumber: 1239, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700345 StartingQuadrant: 4,
346 AutoBallPickedUp: [5]bool{false, true, true, false, false},
347 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800348 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700349 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800350 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800351 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800352
Philipp Schrader7365d322022-03-06 16:40:08 -0800353 err := fixture.db.AddToMatch(Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700354 MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800355 R1: 1235, R2: 1234, R3: 1233, B1: 1232, B2: 1231, B3: 1239})
356 check(t, err, "Failed to add match")
357
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800358 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800359 err = fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700360 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800361 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800362
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800363 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800364 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700365 TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700366 StartingQuadrant: 1,
367 AutoBallPickedUp: [5]bool{false, false, false, false, false},
368 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800369 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700370 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800371 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800372 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800373
Philipp Schrader7365d322022-03-06 16:40:08 -0800374 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800375 check(t, err, "Failed QueryStats()")
376
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800377 if !reflect.DeepEqual(correct, got) {
378 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
379 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800380}
381
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700382func TestQueryRankingsDB(t *testing.T) {
383 fixture := createDatabase(t)
384 defer fixture.TearDown()
385
386 testDatabase := []Ranking{
387 Ranking{
388 TeamNumber: 123,
389 Losses: 1, Wins: 7, Ties: 2,
390 Rank: 2, Dq: 0,
391 },
392 Ranking{
393 TeamNumber: 124,
394 Losses: 3, Wins: 4, Ties: 0,
395 Rank: 4, Dq: 2,
396 },
397 Ranking{
398 TeamNumber: 125,
399 Losses: 5, Wins: 2, Ties: 0,
400 Rank: 17, Dq: 0,
401 },
402 Ranking{
403 TeamNumber: 126,
404 Losses: 0, Wins: 7, Ties: 0,
405 Rank: 5, Dq: 0,
406 },
407 }
408
409 for i := 0; i < len(testDatabase); i++ {
410 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
411 check(t, err, fmt.Sprint("Failed to add rankings ", i))
412 }
413
414 correct := []Ranking{
415 Ranking{
416 TeamNumber: 126,
417 Losses: 0, Wins: 7, Ties: 0,
418 Rank: 5, Dq: 0,
419 },
420 }
421
422 got, err := fixture.db.QueryRankings(126)
423 check(t, err, "Failed QueryRankings()")
424
425 if !reflect.DeepEqual(correct, got) {
426 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
427 }
428}
429
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800430func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800431 fixture := createDatabase(t)
432 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800433
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800434 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800435 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700436 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800437 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800438 },
439 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700440 MatchNumber: 3, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800441 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800442 },
443 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700444 MatchNumber: 4, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800445 R1: 251, R2: 169, R3: 286, B1: 653, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800446 },
447 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700448 MatchNumber: 5, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800449 R1: 198, R2: 1421, R3: 538, B1: 26, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800450 },
451 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700452 MatchNumber: 6, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800453 R1: 251, R2: 188, R3: 286, B1: 555, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800454 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800455 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800456
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800457 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800458 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800459 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800460 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800461
Philipp Schrader7365d322022-03-06 16:40:08 -0800462 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800463 check(t, err, "Failed ReturnMatches()")
464
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800465 if !reflect.DeepEqual(correct, got) {
466 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
467 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800468}
469
Philipp Schraderfe583842022-04-08 19:47:07 -0700470func TestOverwriteNewMatchData(t *testing.T) {
471 fixture := createDatabase(t)
472 defer fixture.TearDown()
473
474 testDatabase := []Match{
475 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700476 MatchNumber: 1, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700477 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
478 },
479 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700480 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700481 R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698,
482 },
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: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
486 },
487 }
488
489 for i := 0; i < len(testDatabase); i++ {
490 err := fixture.db.AddToMatch(testDatabase[i])
491 check(t, err, fmt.Sprint("Failed to add match", i))
492 }
493
494 correct := []Match{
495 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700496 MatchNumber: 2, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700497 R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698,
498 },
499 Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700500 MatchNumber: 1, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfe583842022-04-08 19:47:07 -0700501 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
502 },
503 }
504
505 got, err := fixture.db.ReturnMatches()
506 check(t, err, "Failed to get match list")
507
508 if !reflect.DeepEqual(correct, got) {
509 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
510 }
511}
512
Milo Lina72e2002022-04-06 20:31:13 -0700513func TestAddReturnShiftDB(t *testing.T) {
514 fixture := createDatabase(t)
515 defer fixture.TearDown()
516
517 correct := []Shift{
518 Shift{
519 MatchNumber: 1,
520 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
521 },
522 Shift{
523 MatchNumber: 2,
524 R1scouter: "Bob1", R2scouter: "Bob2", R3scouter: "Bob3", B1scouter: "Alice1", B2scouter: "Alice2", B3scouter: "Alice3",
525 },
526 }
527
528 for i := 0; i < len(correct); i++ {
529 err := fixture.db.AddToShift(correct[i])
530 check(t, err, fmt.Sprint("Failed to add shift", i))
531 }
532
533 got, err := fixture.db.ReturnAllShifts()
534 check(t, err, "Failed ReturnAllShifts()")
535
536 if !reflect.DeepEqual(correct, got) {
537 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
538 }
539}
540
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700541func TestReturnRankingsDB(t *testing.T) {
542 fixture := createDatabase(t)
543 defer fixture.TearDown()
544
545 correct := []Ranking{
546 Ranking{
547 TeamNumber: 123,
548 Losses: 1, Wins: 7, Ties: 2,
549 Rank: 2, Dq: 0,
550 },
551 Ranking{
552 TeamNumber: 124,
553 Losses: 3, Wins: 4, Ties: 0,
554 Rank: 4, Dq: 2,
555 },
556 Ranking{
557 TeamNumber: 125,
558 Losses: 5, Wins: 2, Ties: 0,
559 Rank: 17, Dq: 0,
560 },
561 Ranking{
562 TeamNumber: 126,
563 Losses: 0, Wins: 7, Ties: 0,
564 Rank: 5, Dq: 0,
565 },
566 }
567
568 for i := 0; i < len(correct); i++ {
569 err := fixture.db.AddOrUpdateRankings(correct[i])
570 check(t, err, fmt.Sprint("Failed to add rankings", i))
571 }
572
573 got, err := fixture.db.ReturnRankings()
574 check(t, err, "Failed ReturnRankings()")
575
576 if !reflect.DeepEqual(correct, got) {
577 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
578 }
579}
580
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800581func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800582 fixture := createDatabase(t)
583 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800584
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800585 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800586 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700587 TeamNumber: 1235, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700588 StartingQuadrant: 1,
589 AutoBallPickedUp: [5]bool{false, false, false, false, false},
590 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800591 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700592 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800593 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700594 TeamNumber: 1236, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700595 StartingQuadrant: 2,
596 AutoBallPickedUp: [5]bool{false, false, false, false, true},
597 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800598 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700599 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800600 },
601 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700602 TeamNumber: 1237, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700603 StartingQuadrant: 3,
604 AutoBallPickedUp: [5]bool{false, false, false, false, false},
605 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800606 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700607 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800608 },
609 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700610 TeamNumber: 1238, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700611 StartingQuadrant: 2,
612 AutoBallPickedUp: [5]bool{true, false, false, false, true},
613 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800614 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700615 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800616 },
617 Stats{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700618 TeamNumber: 1239, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700619 StartingQuadrant: 3,
620 AutoBallPickedUp: [5]bool{false, false, true, false, false},
621 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800622 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
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: 1233, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700627 StartingQuadrant: 4,
628 AutoBallPickedUp: [5]bool{false, true, true, false, false},
629 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800630 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700631 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800632 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800633 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800634
Philipp Schrader7365d322022-03-06 16:40:08 -0800635 err := fixture.db.AddToMatch(Match{
Philipp Schrader30b4a682022-04-16 14:36:17 -0700636 MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
Philipp Schrader83fc2722022-03-10 21:59:20 -0800637 R1: 1235, R2: 1236, R3: 1237, B1: 1238, B2: 1239, B3: 1233})
638 check(t, err, "Failed to add match")
639
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800640 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800641 err = fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700642 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800643 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800644
Philipp Schrader7365d322022-03-06 16:40:08 -0800645 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800646 check(t, err, "Failed ReturnStats()")
647
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800648 if !reflect.DeepEqual(correct, got) {
649 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
650 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800651}
Alex Perry871eab92022-03-12 17:43:52 -0800652
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700653func TestRankingsDbUpdate(t *testing.T) {
654 fixture := createDatabase(t)
655 defer fixture.TearDown()
656
657 testDatabase := []Ranking{
658 Ranking{
659 TeamNumber: 123,
660 Losses: 1, Wins: 7, Ties: 2,
661 Rank: 2, Dq: 0,
662 },
663 Ranking{
664 TeamNumber: 124,
665 Losses: 3, Wins: 4, Ties: 0,
666 Rank: 4, Dq: 2,
667 },
668 Ranking{
669 TeamNumber: 125,
670 Losses: 5, Wins: 2, Ties: 0,
671 Rank: 17, Dq: 0,
672 },
673 Ranking{
674 TeamNumber: 126,
675 Losses: 0, Wins: 7, Ties: 0,
676 Rank: 5, Dq: 0,
677 },
678 Ranking{
679 TeamNumber: 125,
680 Losses: 2, Wins: 4, Ties: 1,
681 Rank: 5, Dq: 0,
682 },
683 }
684
685 for i := 0; i < len(testDatabase); i++ {
686 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
687 check(t, err, fmt.Sprint("Failed to add rankings ", i))
688 }
689
690 correct := []Ranking{
691 Ranking{
692 TeamNumber: 125,
693 Losses: 2, Wins: 4, Ties: 1,
694 Rank: 5, Dq: 0,
695 },
696 }
697
698 got, err := fixture.db.QueryRankings(125)
699 check(t, err, "Failed QueryRankings()")
700
701 if !reflect.DeepEqual(correct, got) {
702 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
703 }
704}
705
Alex Perry871eab92022-03-12 17:43:52 -0800706func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800707 fixture := createDatabase(t)
708 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800709
710 expected := NotesData{
711 TeamNumber: 1234,
712 Notes: []string{"Note 1", "Note 3"},
713 }
714
Philipp Schrader7365d322022-03-06 16:40:08 -0800715 err := fixture.db.AddNotes(NotesData{1234, []string{"Note 1"}})
Alex Perry871eab92022-03-12 17:43:52 -0800716 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800717 err = fixture.db.AddNotes(NotesData{1235, []string{"Note 2"}})
Alex Perry871eab92022-03-12 17:43:52 -0800718 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800719 err = fixture.db.AddNotes(NotesData{1234, []string{"Note 3"}})
Alex Perry871eab92022-03-12 17:43:52 -0800720 check(t, err, "Failed to add Note")
721
Philipp Schrader7365d322022-03-06 16:40:08 -0800722 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800723 check(t, err, "Failed to get Notes")
724
725 if !reflect.DeepEqual(expected, actual) {
726 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
727 }
728}