blob: 5725dcb46ad411bde928f83a91487cab605422bf [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"
9 "testing"
Philipp Schrader7365d322022-03-06 16:40:08 -080010 "time"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080011)
12
Philipp Schrader83fc2722022-03-10 21:59:20 -080013// Shortcut for error checking. If the specified error is non-nil, print the
14// error message and exit the test.
15func check(t *testing.T, err error, message string) {
16 if err != nil {
17 t.Fatal(message, ":", err)
18 }
19}
20
Philipp Schrader7365d322022-03-06 16:40:08 -080021type dbFixture struct {
22 db *Database
23 server *exec.Cmd
24}
25
26func (fixture dbFixture) TearDown() {
27 fixture.db.Delete()
28 fixture.db.Close()
29 log.Println("Shutting down testdb")
30 fixture.server.Process.Signal(os.Interrupt)
31 fixture.server.Process.Wait()
32 log.Println("Successfully shut down testdb")
33}
34
35func createDatabase(t *testing.T) dbFixture {
36 var fixture dbFixture
37
38 log.Println("Starting up postgres.")
39 fixture.server = exec.Command("testdb_server/testdb_server_/testdb_server")
40 fixture.server.Stdout = os.Stdout
41 fixture.server.Stderr = os.Stderr
42 err := fixture.server.Start()
43 check(t, err, "Failed to run postgres")
44
45 // Wait until the server is ready. We cannot rely on the TCP socket
46 // alone because postgres creates the socket before it's actually ready
47 // to service requests.
48 for {
49 fixture.db, err = NewDatabase("test", "password", 5432)
50 if err == nil {
51 break
52 }
53 time.Sleep(50 * time.Millisecond)
54 }
55 log.Println("Connected to postgres.")
56
57 return fixture
Philipp Schrader4953cc32022-02-25 18:09:02 -080058}
59
60func TestAddToMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -080061 fixture := createDatabase(t)
62 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -080063
Philipp Schrader83fc2722022-03-10 21:59:20 -080064 correct := []Match{
65 Match{
66 MatchNumber: 7,
67 Round: 1,
68 CompLevel: "quals",
69 R1: 9999, R2: 1000, R3: 777, B1: 0000, B2: 4321, B3: 1234,
70 r1ID: 1, r2ID: 2, r3ID: 3, b1ID: 4, b2ID: 5, b3ID: 6,
71 },
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 r1ID: 1, r2ID: 2, r3ID: 3, b1ID: 4, b2ID: 5, b3ID: 6,
180 })
Philipp Schrader83fc2722022-03-10 21:59:20 -0800181 check(t, err, "Failed to add match")
182
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800183 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800184 err = fixture.db.AddToStats(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800185 check(t, err, "Failed to add stats to DB")
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800186 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800187
Philipp Schrader7365d322022-03-06 16:40:08 -0800188 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800189 check(t, err, "Failed ReturnStats()")
190
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800191 if !reflect.DeepEqual(correct, got) {
192 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
193 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800194}
195
196func TestQueryMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800197 fixture := createDatabase(t)
198 defer fixture.TearDown()
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800199
200 testDatabase := []Match{
Philipp Schrader1e6c0a92022-02-27 23:30:57 -0800201 Match{MatchNumber: 2, Round: 1, CompLevel: "quals", R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149},
202 Match{MatchNumber: 4, Round: 1, CompLevel: "quals", R1: 198, R2: 135, R3: 777, B1: 999, B2: 434, B3: 698},
203 Match{MatchNumber: 3, Round: 1, CompLevel: "quals", R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262},
204 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 -0800205 }
206
207 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800208 err := fixture.db.AddToMatch(testDatabase[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800209 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800210 }
211
212 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800213 Match{
214 MatchNumber: 2, Round: 1, CompLevel: "quals",
215 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
216 r1ID: 1, r2ID: 2, r3ID: 3, b1ID: 4, b2ID: 5, b3ID: 6,
217 },
218 Match{
219 MatchNumber: 3, Round: 1, CompLevel: "quals",
220 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
221 r1ID: 13, r2ID: 14, r3ID: 15, b1ID: 16, b2ID: 17, b3ID: 18,
222 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800223 }
224
Philipp Schrader7365d322022-03-06 16:40:08 -0800225 got, err := fixture.db.QueryMatches(538)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800226 check(t, err, "Failed to query matches for 538")
227
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800228 if !reflect.DeepEqual(correct, got) {
229 t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
230 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800231}
232
233func TestQueryStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800234 fixture := createDatabase(t)
235 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800236
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800237 testDatabase := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800238 Stats{
239 TeamNumber: 1235, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700240 StartingQuadrant: 1,
241 AutoBallPickedUp: [5]bool{false, false, false, false, false},
242 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800243 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700244 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800245 Stats{
246 TeamNumber: 1234, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700247 StartingQuadrant: 2,
248 AutoBallPickedUp: [5]bool{false, false, false, false, true},
249 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800250 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700251 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800252 },
253 Stats{
254 TeamNumber: 1233, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700255 StartingQuadrant: 3,
256 AutoBallPickedUp: [5]bool{false, false, false, false, false},
257 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800258 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700259 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800260 },
261 Stats{
262 TeamNumber: 1232, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700263 StartingQuadrant: 2,
264 AutoBallPickedUp: [5]bool{true, false, false, false, true},
265 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800266 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700267 PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800268 },
269 Stats{
270 TeamNumber: 1231, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700271 StartingQuadrant: 3,
272 AutoBallPickedUp: [5]bool{false, false, true, false, false},
273 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800274 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700275 PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800276 },
277 Stats{
278 TeamNumber: 1239, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700279 StartingQuadrant: 4,
280 AutoBallPickedUp: [5]bool{false, true, true, false, false},
281 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800282 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700283 PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800284 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800285 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800286
Philipp Schrader7365d322022-03-06 16:40:08 -0800287 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800288 MatchNumber: 94, Round: 1, CompLevel: "quals",
289 R1: 1235, R2: 1234, R3: 1233, B1: 1232, B2: 1231, B3: 1239})
290 check(t, err, "Failed to add match")
291
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800292 for i := 0; i < len(testDatabase); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800293 err = fixture.db.AddToStats(testDatabase[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700294 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800295 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800296
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800297 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800298 Stats{
299 TeamNumber: 1235, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700300 StartingQuadrant: 1,
301 AutoBallPickedUp: [5]bool{false, false, false, false, false},
302 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800303 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700304 PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800305 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800306 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800307
Philipp Schrader7365d322022-03-06 16:40:08 -0800308 got, err := fixture.db.QueryStats(1235)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800309 check(t, err, "Failed QueryStats()")
310
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800311 if !reflect.DeepEqual(correct, got) {
312 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
313 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800314}
315
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700316func TestQueryRankingsDB(t *testing.T) {
317 fixture := createDatabase(t)
318 defer fixture.TearDown()
319
320 testDatabase := []Ranking{
321 Ranking{
322 TeamNumber: 123,
323 Losses: 1, Wins: 7, Ties: 2,
324 Rank: 2, Dq: 0,
325 },
326 Ranking{
327 TeamNumber: 124,
328 Losses: 3, Wins: 4, Ties: 0,
329 Rank: 4, Dq: 2,
330 },
331 Ranking{
332 TeamNumber: 125,
333 Losses: 5, Wins: 2, Ties: 0,
334 Rank: 17, Dq: 0,
335 },
336 Ranking{
337 TeamNumber: 126,
338 Losses: 0, Wins: 7, Ties: 0,
339 Rank: 5, Dq: 0,
340 },
341 }
342
343 for i := 0; i < len(testDatabase); i++ {
344 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
345 check(t, err, fmt.Sprint("Failed to add rankings ", i))
346 }
347
348 correct := []Ranking{
349 Ranking{
350 TeamNumber: 126,
351 Losses: 0, Wins: 7, Ties: 0,
352 Rank: 5, Dq: 0,
353 },
354 }
355
356 got, err := fixture.db.QueryRankings(126)
357 check(t, err, "Failed QueryRankings()")
358
359 if !reflect.DeepEqual(correct, got) {
360 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
361 }
362}
363
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800364func TestReturnMatchDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800365 fixture := createDatabase(t)
366 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800367
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800368 correct := []Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800369 Match{
370 MatchNumber: 2, Round: 1, CompLevel: "quals",
371 R1: 251, R2: 169, R3: 286, B1: 253, B2: 538, B3: 149,
372 r1ID: 1, r2ID: 2, r3ID: 3, b1ID: 4, b2ID: 5, b3ID: 6,
373 },
374 Match{
375 MatchNumber: 3, Round: 1, CompLevel: "quals",
376 R1: 147, R2: 421, R3: 538, B1: 126, B2: 448, B3: 262,
377 r1ID: 7, r2ID: 8, r3ID: 9, b1ID: 10, b2ID: 11, b3ID: 12,
378 },
379 Match{
380 MatchNumber: 4, Round: 1, CompLevel: "quals",
381 R1: 251, R2: 169, R3: 286, B1: 653, B2: 538, B3: 149,
382 r1ID: 13, r2ID: 14, r3ID: 15, b1ID: 16, b2ID: 17, b3ID: 18,
383 },
384 Match{
385 MatchNumber: 5, Round: 1, CompLevel: "quals",
386 R1: 198, R2: 1421, R3: 538, B1: 26, B2: 448, B3: 262,
387 r1ID: 19, r2ID: 20, r3ID: 21, b1ID: 22, b2ID: 23, b3ID: 24,
388 },
389 Match{
390 MatchNumber: 6, Round: 1, CompLevel: "quals",
391 R1: 251, R2: 188, R3: 286, B1: 555, B2: 538, B3: 149,
392 r1ID: 25, r2ID: 26, r3ID: 27, b1ID: 28, b2ID: 29, b3ID: 30,
393 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800394 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800395
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800396 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800397 err := fixture.db.AddToMatch(correct[i])
Philipp Schrader83fc2722022-03-10 21:59:20 -0800398 check(t, err, fmt.Sprint("Failed to add match", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800399 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800400
Philipp Schrader7365d322022-03-06 16:40:08 -0800401 got, err := fixture.db.ReturnMatches()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800402 check(t, err, "Failed ReturnMatches()")
403
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800404 if !reflect.DeepEqual(correct, got) {
405 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
406 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800407}
408
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700409func TestReturnRankingsDB(t *testing.T) {
410 fixture := createDatabase(t)
411 defer fixture.TearDown()
412
413 correct := []Ranking{
414 Ranking{
415 TeamNumber: 123,
416 Losses: 1, Wins: 7, Ties: 2,
417 Rank: 2, Dq: 0,
418 },
419 Ranking{
420 TeamNumber: 124,
421 Losses: 3, Wins: 4, Ties: 0,
422 Rank: 4, Dq: 2,
423 },
424 Ranking{
425 TeamNumber: 125,
426 Losses: 5, Wins: 2, Ties: 0,
427 Rank: 17, Dq: 0,
428 },
429 Ranking{
430 TeamNumber: 126,
431 Losses: 0, Wins: 7, Ties: 0,
432 Rank: 5, Dq: 0,
433 },
434 }
435
436 for i := 0; i < len(correct); i++ {
437 err := fixture.db.AddOrUpdateRankings(correct[i])
438 check(t, err, fmt.Sprint("Failed to add rankings", i))
439 }
440
441 got, err := fixture.db.ReturnRankings()
442 check(t, err, "Failed ReturnRankings()")
443
444 if !reflect.DeepEqual(correct, got) {
445 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
446 }
447}
448
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800449func TestReturnStatsDB(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800450 fixture := createDatabase(t)
451 defer fixture.TearDown()
Philipp Schrader4953cc32022-02-25 18:09:02 -0800452
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800453 correct := []Stats{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800454 Stats{
455 TeamNumber: 1235, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700456 StartingQuadrant: 1,
457 AutoBallPickedUp: [5]bool{false, false, false, false, false},
458 ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800459 ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700460 PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
Philipp Schrader83fc2722022-03-10 21:59:20 -0800461 Stats{
462 TeamNumber: 1236, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700463 StartingQuadrant: 2,
464 AutoBallPickedUp: [5]bool{false, false, false, false, true},
465 ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800466 ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700467 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800468 },
469 Stats{
470 TeamNumber: 1237, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700471 StartingQuadrant: 3,
472 AutoBallPickedUp: [5]bool{false, false, false, false, false},
473 ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800474 ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700475 PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800476 },
477 Stats{
478 TeamNumber: 1238, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700479 StartingQuadrant: 2,
480 AutoBallPickedUp: [5]bool{true, false, false, false, true},
481 ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800482 ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700483 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800484 },
485 Stats{
486 TeamNumber: 1239, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700487 StartingQuadrant: 3,
488 AutoBallPickedUp: [5]bool{false, false, true, false, false},
489 ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800490 ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700491 PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800492 },
493 Stats{
494 TeamNumber: 1233, MatchNumber: 94,
Philipp Schraderfee07e12022-03-17 22:19:47 -0700495 StartingQuadrant: 4,
496 AutoBallPickedUp: [5]bool{false, true, true, false, false},
497 ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800498 ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
Philipp Schraderfa45d742022-03-18 19:29:05 -0700499 PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
Philipp Schrader83fc2722022-03-10 21:59:20 -0800500 },
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800501 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800502
Philipp Schrader7365d322022-03-06 16:40:08 -0800503 err := fixture.db.AddToMatch(Match{
Philipp Schrader83fc2722022-03-10 21:59:20 -0800504 MatchNumber: 94, Round: 1, CompLevel: "quals",
505 R1: 1235, R2: 1236, R3: 1237, B1: 1238, B2: 1239, B3: 1233})
506 check(t, err, "Failed to add match")
507
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800508 for i := 0; i < len(correct); i++ {
Philipp Schrader7365d322022-03-06 16:40:08 -0800509 err = fixture.db.AddToStats(correct[i])
Philipp Schraderfee07e12022-03-17 22:19:47 -0700510 check(t, err, fmt.Sprint("Failed to add stats ", i))
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800511 }
Philipp Schrader83fc2722022-03-10 21:59:20 -0800512
Philipp Schrader7365d322022-03-06 16:40:08 -0800513 got, err := fixture.db.ReturnStats()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800514 check(t, err, "Failed ReturnStats()")
515
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800516 if !reflect.DeepEqual(correct, got) {
517 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
518 }
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800519}
Alex Perry871eab92022-03-12 17:43:52 -0800520
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700521func TestRankingsDbUpdate(t *testing.T) {
522 fixture := createDatabase(t)
523 defer fixture.TearDown()
524
525 testDatabase := []Ranking{
526 Ranking{
527 TeamNumber: 123,
528 Losses: 1, Wins: 7, Ties: 2,
529 Rank: 2, Dq: 0,
530 },
531 Ranking{
532 TeamNumber: 124,
533 Losses: 3, Wins: 4, Ties: 0,
534 Rank: 4, Dq: 2,
535 },
536 Ranking{
537 TeamNumber: 125,
538 Losses: 5, Wins: 2, Ties: 0,
539 Rank: 17, Dq: 0,
540 },
541 Ranking{
542 TeamNumber: 126,
543 Losses: 0, Wins: 7, Ties: 0,
544 Rank: 5, Dq: 0,
545 },
546 Ranking{
547 TeamNumber: 125,
548 Losses: 2, Wins: 4, Ties: 1,
549 Rank: 5, Dq: 0,
550 },
551 }
552
553 for i := 0; i < len(testDatabase); i++ {
554 err := fixture.db.AddOrUpdateRankings(testDatabase[i])
555 check(t, err, fmt.Sprint("Failed to add rankings ", i))
556 }
557
558 correct := []Ranking{
559 Ranking{
560 TeamNumber: 125,
561 Losses: 2, Wins: 4, Ties: 1,
562 Rank: 5, Dq: 0,
563 },
564 }
565
566 got, err := fixture.db.QueryRankings(125)
567 check(t, err, "Failed QueryRankings()")
568
569 if !reflect.DeepEqual(correct, got) {
570 t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
571 }
572}
573
Alex Perry871eab92022-03-12 17:43:52 -0800574func TestNotes(t *testing.T) {
Philipp Schrader7365d322022-03-06 16:40:08 -0800575 fixture := createDatabase(t)
576 defer fixture.TearDown()
Alex Perry871eab92022-03-12 17:43:52 -0800577
578 expected := NotesData{
579 TeamNumber: 1234,
580 Notes: []string{"Note 1", "Note 3"},
581 }
582
Philipp Schrader7365d322022-03-06 16:40:08 -0800583 err := fixture.db.AddNotes(NotesData{1234, []string{"Note 1"}})
Alex Perry871eab92022-03-12 17:43:52 -0800584 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800585 err = fixture.db.AddNotes(NotesData{1235, []string{"Note 2"}})
Alex Perry871eab92022-03-12 17:43:52 -0800586 check(t, err, "Failed to add Note")
Philipp Schrader7365d322022-03-06 16:40:08 -0800587 err = fixture.db.AddNotes(NotesData{1234, []string{"Note 3"}})
Alex Perry871eab92022-03-12 17:43:52 -0800588 check(t, err, "Failed to add Note")
589
Philipp Schrader7365d322022-03-06 16:40:08 -0800590 actual, err := fixture.db.QueryNotes(1234)
Alex Perry871eab92022-03-12 17:43:52 -0800591 check(t, err, "Failed to get Notes")
592
593 if !reflect.DeepEqual(expected, actual) {
594 t.Errorf("Got %#v,\nbut expected %#v.", actual, expected)
595 }
596}