blob: 391f336a4870b98fa1e15330f54527bd94654958 [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,
68 Round: 1,
69 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 Schrader83fc2722022-03-10 21:59:20 -0800177 MatchNumber: 7, Round: 1, CompLevel: "quals",
178 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{
210 MatchNumber: 7, Round: 1, CompLevel: "quals",
211 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 Schrader1e6c0a92022-02-27 23:30:57 -0800234 Match{MatchNumber: 2, Round: 1, CompLevel: "quals", R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149},
235 Match{MatchNumber: 4, Round: 1, CompLevel: "quals", R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698},
236 Match{MatchNumber: 3, Round: 1, CompLevel: "quals", R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262},
237 Match{MatchNumber: 6, Round: 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{
247 MatchNumber: 2, Round: 1, CompLevel: "quals",
248 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800249 },
250 Match{
251 MatchNumber: 3, Round: 1, CompLevel: "quals",
252 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
264func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800265 fixture := createDatabase(t)
266 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800267
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800268 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800269 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700270 TeamNumber: 1235, MatchNumber: 94, Round: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700271 StartingQuadrant: 1,
272 AutoBallPickedUp: [5]bool{false, false, false, false, false},
273 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800274 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700275 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800276 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700277 TeamNumber: 1234, MatchNumber: 94, Round: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700278 StartingQuadrant: 2,
279 AutoBallPickedUp: [5]bool{false, false, false, false, true},
280 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800281 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700282 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800283 },
284 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700285 TeamNumber: 1233, MatchNumber: 94, Round: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700286 StartingQuadrant: 3,
287 AutoBallPickedUp: [5]bool{false, false, false, false, false},
288 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800289 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700290 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800291 },
292 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700293 TeamNumber: 1232, MatchNumber: 94, Round: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700294 StartingQuadrant: 2,
295 AutoBallPickedUp: [5]bool{true, false, false, false, true},
296 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800297 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700298 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800299 },
300 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700301 TeamNumber: 1231, MatchNumber: 94, Round: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700302 StartingQuadrant: 3,
303 AutoBallPickedUp: [5]bool{false, false, true, false, false},
304 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800305 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700306 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800307 },
308 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700309 TeamNumber: 1239, MatchNumber: 94, Round: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700310 StartingQuadrant: 4,
311 AutoBallPickedUp: [5]bool{false, true, true, false, false},
312 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800313 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700314 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800315 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800316 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800317
Philipp Schrader7365d322022-03-06 16:40:08 -0800318 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800319 MatchNumber: 94, Round: 1, CompLevel: "quals",
320 R1: 1235, R2: 1234, R3: 1233, B1: 1232, B2: 1231, B3: 1239})
321 check(t, err, "Failed to add match")
322
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800323 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800324 err = fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700325 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800326 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800327
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800328 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800329 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700330 TeamNumber: 1235, MatchNumber: 94, Round: 2, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700331 StartingQuadrant: 1,
332 AutoBallPickedUp: [5]bool{false, false, false, false, false},
333 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800334 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700335 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800336 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800337 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800338
Philipp Schrader7365d322022-03-06 16:40:08 -0800339 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800340 check(t, err, "Failed QueryStats()")
341
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800342 if !reflect.DeepEqual(correct, got) {
343 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
344 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800345}
346
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700347func TestQueryRankingsDB(t *testing.T) {
348 fixture := createDatabase(t)
349 defer fixture.TearDown()
350
351 testDatabase := []Ranking{
352 Ranking{
353 TeamNumber: 123,
354 Losses: 1, Wins: 7, Ties: 2,
355 Rank: 2, Dq: 0,
356 },
357 Ranking{
358 TeamNumber: 124,
359 Losses: 3, Wins: 4, Ties: 0,
360 Rank: 4, Dq: 2,
361 },
362 Ranking{
363 TeamNumber: 125,
364 Losses: 5, Wins: 2, Ties: 0,
365 Rank: 17, Dq: 0,
366 },
367 Ranking{
368 TeamNumber: 126,
369 Losses: 0, Wins: 7, Ties: 0,
370 Rank: 5, Dq: 0,
371 },
372 }
373
374 for i := 0; i < len(testDatabase); i++ {
375 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
376 check(t, err, fmt.Sprint("Failed to add rankings ", i))
377 }
378
379 correct := []Ranking{
380 Ranking{
381 TeamNumber: 126,
382 Losses: 0, Wins: 7, Ties: 0,
383 Rank: 5, Dq: 0,
384 },
385 }
386
387 got, err := fixture.db.QueryRankings(126)
388 check(t, err, "Failed QueryRankings()")
389
390 if !reflect.DeepEqual(correct, got) {
391 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
392 }
393}
394
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800395func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800396 fixture := createDatabase(t)
397 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800398
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800399 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800400 Match{
401 MatchNumber: 2, Round: 1, CompLevel: "quals",
402 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800403 },
404 Match{
405 MatchNumber: 3, Round: 1, CompLevel: "quals",
406 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800407 },
408 Match{
409 MatchNumber: 4, Round: 1, CompLevel: "quals",
410 R1: 251, R2: 169, R3: 286, B1: 653, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800411 },
412 Match{
413 MatchNumber: 5, Round: 1, CompLevel: "quals",
414 R1: 198, R2: 1421, R3: 538, B1: 26, B2: 448, B3: 262,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800415 },
416 Match{
417 MatchNumber: 6, Round: 1, CompLevel: "quals",
418 R1: 251, R2: 188, R3: 286, B1: 555, B2: 538, B3: 149,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800419 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800420 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800421
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800422 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800423 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800424 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800425 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800426
Philipp Schrader7365d322022-03-06 16:40:08 -0800427 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800428 check(t, err, "Failed ReturnMatches()")
429
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800430 if !reflect.DeepEqual(correct, got) {
431 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
432 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800433}
434
Philipp Schraderfe583842022-04-08 19:47:07 -0700435func TestOverwriteNewMatchData(t *testing.T) {
436 fixture := createDatabase(t)
437 defer fixture.TearDown()
438
439 testDatabase := []Match{
440 Match{
441 MatchNumber: 1, Round: 1, CompLevel: "quals",
442 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
443 },
444 Match{
445 MatchNumber: 2, Round: 1, CompLevel: "quals",
446 R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698,
447 },
448 Match{
449 MatchNumber: 1, Round: 1, CompLevel: "quals",
450 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
451 },
452 }
453
454 for i := 0; i < len(testDatabase); i++ {
455 err := fixture.db.AddToMatch(testDatabase[i])
456 check(t, err, fmt.Sprint("Failed to add match", i))
457 }
458
459 correct := []Match{
460 Match{
461 MatchNumber: 2, Round: 1, CompLevel: "quals",
462 R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698,
463 },
464 Match{
465 MatchNumber: 1, Round: 1, CompLevel: "quals",
466 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
467 },
468 }
469
470 got, err := fixture.db.ReturnMatches()
471 check(t, err, "Failed to get match list")
472
473 if !reflect.DeepEqual(correct, got) {
474 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
475 }
476}
477
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700478func TestReturnRankingsDB(t *testing.T) {
479 fixture := createDatabase(t)
480 defer fixture.TearDown()
481
482 correct := []Ranking{
483 Ranking{
484 TeamNumber: 123,
485 Losses: 1, Wins: 7, Ties: 2,
486 Rank: 2, Dq: 0,
487 },
488 Ranking{
489 TeamNumber: 124,
490 Losses: 3, Wins: 4, Ties: 0,
491 Rank: 4, Dq: 2,
492 },
493 Ranking{
494 TeamNumber: 125,
495 Losses: 5, Wins: 2, Ties: 0,
496 Rank: 17, Dq: 0,
497 },
498 Ranking{
499 TeamNumber: 126,
500 Losses: 0, Wins: 7, Ties: 0,
501 Rank: 5, Dq: 0,
502 },
503 }
504
505 for i := 0; i < len(correct); i++ {
506 err := fixture.db.AddOrUpdateRankings(correct[i])
507 check(t, err, fmt.Sprint("Failed to add rankings", i))
508 }
509
510 got, err := fixture.db.ReturnRankings()
511 check(t, err, "Failed ReturnRankings()")
512
513 if !reflect.DeepEqual(correct, got) {
514 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
515 }
516}
517
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800518func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800519 fixture := createDatabase(t)
520 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800521
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800522 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800523 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700524 TeamNumber: 1235, MatchNumber: 94, Round: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700525 StartingQuadrant: 1,
526 AutoBallPickedUp: [5]bool{false, false, false, false, false},
527 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800528 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700529 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800530 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700531 TeamNumber: 1236, MatchNumber: 94, Round: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700532 StartingQuadrant: 2,
533 AutoBallPickedUp: [5]bool{false, false, false, false, true},
534 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800535 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700536 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800537 },
538 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700539 TeamNumber: 1237, MatchNumber: 94, Round: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700540 StartingQuadrant: 3,
541 AutoBallPickedUp: [5]bool{false, false, false, false, false},
542 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800543 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700544 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800545 },
546 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700547 TeamNumber: 1238, MatchNumber: 94, Round: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700548 StartingQuadrant: 2,
549 AutoBallPickedUp: [5]bool{true, false, false, false, true},
550 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800551 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700552 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800553 },
554 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700555 TeamNumber: 1239, MatchNumber: 94, Round: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700556 StartingQuadrant: 3,
557 AutoBallPickedUp: [5]bool{false, false, true, false, false},
558 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800559 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700560 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800561 },
562 Stats{
Philipp Schraderf117fae2022-04-08 20:14:57 -0700563 TeamNumber: 1233, MatchNumber: 94, Round: 1, CompLevel: "quals",
Philipp Schraderfee07e12022-03-17 22:19:47 -0700564 StartingQuadrant: 4,
565 AutoBallPickedUp: [5]bool{false, true, true, false, false},
566 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800567 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700568 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800569 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800570 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800571
Philipp Schrader7365d322022-03-06 16:40:08 -0800572 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800573 MatchNumber: 94, Round: 1, CompLevel: "quals",
574 R1: 1235, R2: 1236, R3: 1237, B1: 1238, B2: 1239, B3: 1233})
575 check(t, err, "Failed to add match")
576
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800577 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800578 err = fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700579 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800580 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800581
Philipp Schrader7365d322022-03-06 16:40:08 -0800582 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800583 check(t, err, "Failed ReturnStats()")
584
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800585 if !reflect.DeepEqual(correct, got) {
586 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
587 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800588}
Alex Perry871eab92022-03-12 17:43:52 -0800589
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700590func TestRankingsDbUpdate(t *testing.T) {
591 fixture := createDatabase(t)
592 defer fixture.TearDown()
593
594 testDatabase := []Ranking{
595 Ranking{
596 TeamNumber: 123,
597 Losses: 1, Wins: 7, Ties: 2,
598 Rank: 2, Dq: 0,
599 },
600 Ranking{
601 TeamNumber: 124,
602 Losses: 3, Wins: 4, Ties: 0,
603 Rank: 4, Dq: 2,
604 },
605 Ranking{
606 TeamNumber: 125,
607 Losses: 5, Wins: 2, Ties: 0,
608 Rank: 17, Dq: 0,
609 },
610 Ranking{
611 TeamNumber: 126,
612 Losses: 0, Wins: 7, Ties: 0,
613 Rank: 5, Dq: 0,
614 },
615 Ranking{
616 TeamNumber: 125,
617 Losses: 2, Wins: 4, Ties: 1,
618 Rank: 5, Dq: 0,
619 },
620 }
621
622 for i := 0; i < len(testDatabase); i++ {
623 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
624 check(t, err, fmt.Sprint("Failed to add rankings ", i))
625 }
626
627 correct := []Ranking{
628 Ranking{
629 TeamNumber: 125,
630 Losses: 2, Wins: 4, Ties: 1,
631 Rank: 5, Dq: 0,
632 },
633 }
634
635 got, err := fixture.db.QueryRankings(125)
636 check(t, err, "Failed QueryRankings()")
637
638 if !reflect.DeepEqual(correct, got) {
639 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
640 }
641}
642
Alex Perry871eab92022-03-12 17:43:52 -0800643func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800644 fixture := createDatabase(t)
645 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800646
647 expected := NotesData{
648 TeamNumber: 1234,
649 Notes: []string{"Note 1", "Note 3"},
650 }
651
Philipp Schrader7365d322022-03-06 16:40:08 -0800652 err := fixture.db.AddNotes(NotesData{1234, []string{"Note 1"}})
Alex Perry871eab92022-03-12 17:43:52 -0800653 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800654 err = fixture.db.AddNotes(NotesData{1235, []string{"Note 2"}})
Alex Perry871eab92022-03-12 17:43:52 -0800655 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800656 err = fixture.db.AddNotes(NotesData{1234, []string{"Note 3"}})
Alex Perry871eab92022-03-12 17:43:52 -0800657 check(t, err, "Failed to add Note")
658
Philipp Schrader7365d322022-03-06 16:40:08 -0800659 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800660 check(t, err, "Failed to get Notes")
661
662 if !reflect.DeepEqual(expected, actual) {
663 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
664 }
665}