Add pre-scouting support in the scouting database

This patch prepares the database to accept pre-scouted data. A future
patch will make sure pre-scouted data gets entered into the database.

Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
Change-Id: Id8967468c2e78b4826a7eb3481e98c7bef158a9c
diff --git a/scouting/db/db_test.go b/scouting/db/db_test.go
index 3c345b0..663a080 100644
--- a/scouting/db/db_test.go
+++ b/scouting/db/db_test.go
@@ -144,7 +144,8 @@
 
 	correct := []Stats2023{
 		Stats2023{
-			TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "6344", MatchNumber: 3, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
 			MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
 			LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
@@ -156,7 +157,8 @@
 			BalanceAttempt: false, CollectedBy: "emma",
 		},
 		Stats2023{
-			TeamNumber: "7454", MatchNumber: 3, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "7454", MatchNumber: 3, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
 			MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
 			LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
@@ -168,7 +170,8 @@
 			BalanceAttempt: false, CollectedBy: "tyler",
 		},
 		Stats2023{
-			TeamNumber: "4354", MatchNumber: 3, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "4354", MatchNumber: 3, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
 			MiddleCubesAuto: 1, HighCubesAuto: 1, CubesDroppedAuto: 0,
 			LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 1,
@@ -180,7 +183,8 @@
 			BalanceAttempt: true, CollectedBy: "isaac",
 		},
 		Stats2023{
-			TeamNumber: "6533", MatchNumber: 3, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "6533", MatchNumber: 3, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
 			MiddleCubesAuto: 2, HighCubesAuto: 1, CubesDroppedAuto: 1,
 			LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
@@ -192,7 +196,8 @@
 			BalanceAttempt: true, CollectedBy: "will",
 		},
 		Stats2023{
-			TeamNumber: "8354", MatchNumber: 3, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "8354", MatchNumber: 3, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
 			MiddleCubesAuto: 1, HighCubesAuto: 2, CubesDroppedAuto: 0,
 			LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 1,
@@ -236,13 +241,47 @@
 	}
 }
 
+func TestInsertPreScoutedStats(t *testing.T) {
+	fixture := createDatabase(t)
+	defer fixture.TearDown()
+
+	stats := Stats2023{
+		PreScouting: false,
+		TeamNumber:  "6344", MatchNumber: 3, SetNumber: 1,
+		CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
+		MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
+		LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
+		ConesDroppedAuto: 0, LowCubes: 1, MiddleCubes: 2,
+		HighCubes: 1, CubesDropped: 0, LowCones: 0,
+		MiddleCones: 2, HighCones: 1, ConesDropped: 1, SuperchargedPieces: 0,
+		AvgCycle: 0, Mobility: true, DockedAuto: true, EngagedAuto: false,
+		BalanceAttemptAuto: false, Docked: false, Engaged: false,
+		BalanceAttempt: false, CollectedBy: "emma",
+	}
+
+	// Attempt to insert the non-pre-scouted data and make sure it fails.
+	err := fixture.db.AddToStats2023(stats)
+	if err == nil {
+		t.Fatal("Expected error from inserting the stats.")
+	}
+	if err.Error() != "Failed to find team 6344 in match 3 in the schedule." {
+		t.Fatal("Got:", err.Error())
+	}
+
+	// Mark the data as pre-scouting data. It should now succeed.
+	stats.PreScouting = true
+	err = fixture.db.AddToStats2023(stats)
+	check(t, err, "Failed to add prescouted stats to DB")
+}
+
 func TestQueryingStats2023ByTeam(t *testing.T) {
 	fixture := createDatabase(t)
 	defer fixture.TearDown()
 
 	stats := []Stats2023{
 		Stats2023{
-			TeamNumber: "6344", MatchNumber: 3, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "6344", MatchNumber: 3, SetNumber: 1,
 			CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
 			MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
 			LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
@@ -254,7 +293,8 @@
 			BalanceAttempt: false, CollectedBy: "emma",
 		},
 		Stats2023{
-			TeamNumber: "7454", MatchNumber: 4, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "7454", MatchNumber: 4, SetNumber: 1,
 			CompLevel: "qm", StartingQuadrant: 2, LowCubesAuto: 1,
 			MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 0,
 			LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
@@ -266,7 +306,8 @@
 			BalanceAttempt: false, CollectedBy: "tyler",
 		},
 		Stats2023{
-			TeamNumber: "6344", MatchNumber: 5, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "6344", MatchNumber: 5, SetNumber: 1,
 			CompLevel: "qm", StartingQuadrant: 1, LowCubesAuto: 0,
 			MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
 			LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 2,
@@ -323,7 +364,8 @@
 
 	startingStats := []Stats2023{
 		Stats2023{
-			TeamNumber: "1111", MatchNumber: 5, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "1111", MatchNumber: 5, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 2,
 			MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
 			LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
@@ -335,7 +377,8 @@
 			BalanceAttempt: false, CollectedBy: "unknown",
 		},
 		Stats2023{
-			TeamNumber: "2314", MatchNumber: 5, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "2314", MatchNumber: 5, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 1,
 			MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
 			LowConesAuto: 0, MiddleConesAuto: 1, HighConesAuto: 0,
@@ -347,7 +390,8 @@
 			BalanceAttempt: false, CollectedBy: "simon",
 		},
 		Stats2023{
-			TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "3242", MatchNumber: 5, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
 			MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
 			LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
@@ -359,7 +403,8 @@
 			BalanceAttempt: false, CollectedBy: "eliza",
 		},
 		Stats2023{
-			TeamNumber: "1742", MatchNumber: 5, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "1742", MatchNumber: 5, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 1,
 			MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 0,
 			LowConesAuto: 0, MiddleConesAuto: 2, HighConesAuto: 0,
@@ -370,7 +415,8 @@
 			Docked: false, Engaged: false, CollectedBy: "isaac",
 		},
 		Stats2023{
-			TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "2454", MatchNumber: 5, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
 			MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
 			LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
@@ -385,7 +431,8 @@
 
 	correct := []Stats2023{
 		Stats2023{
-			TeamNumber: "3242", MatchNumber: 5, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "3242", MatchNumber: 5, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
 			MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
 			LowConesAuto: 1, MiddleConesAuto: 0, HighConesAuto: 0,
@@ -397,7 +444,8 @@
 			BalanceAttempt: false, CollectedBy: "eliza",
 		},
 		Stats2023{
-			TeamNumber: "2454", MatchNumber: 5, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "2454", MatchNumber: 5, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 0,
 			MiddleCubesAuto: 0, HighCubesAuto: 0, CubesDroppedAuto: 0,
 			LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
@@ -677,7 +725,8 @@
 
 	correct := []Stats2023{
 		Stats2023{
-			TeamNumber: "2343", MatchNumber: 2, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "2343", MatchNumber: 2, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 1, LowCubesAuto: 1,
 			MiddleCubesAuto: 2, HighCubesAuto: 2, CubesDroppedAuto: 1,
 			LowConesAuto: 0, MiddleConesAuto: 0, HighConesAuto: 2,
@@ -689,7 +738,8 @@
 			BalanceAttempt: true, CollectedBy: "isaac",
 		},
 		Stats2023{
-			TeamNumber: "5443", MatchNumber: 2, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "5443", MatchNumber: 2, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 2, LowCubesAuto: 1,
 			MiddleCubesAuto: 1, HighCubesAuto: 0, CubesDroppedAuto: 1,
 			LowConesAuto: 1, MiddleConesAuto: 1, HighConesAuto: 0,
@@ -701,7 +751,8 @@
 			BalanceAttempt: false, CollectedBy: "jack",
 		},
 		Stats2023{
-			TeamNumber: "5436", MatchNumber: 2, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "5436", MatchNumber: 2, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 3, LowCubesAuto: 0,
 			MiddleCubesAuto: 2, HighCubesAuto: 0, CubesDroppedAuto: 1,
 			LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,
@@ -713,7 +764,8 @@
 			BalanceAttempt: true, CollectedBy: "martin",
 		},
 		Stats2023{
-			TeamNumber: "5643", MatchNumber: 2, SetNumber: 1,
+			PreScouting: false,
+			TeamNumber:  "5643", MatchNumber: 2, SetNumber: 1,
 			CompLevel: "quals", StartingQuadrant: 4, LowCubesAuto: 0,
 			MiddleCubesAuto: 0, HighCubesAuto: 1, CubesDroppedAuto: 1,
 			LowConesAuto: 2, MiddleConesAuto: 0, HighConesAuto: 0,