Let users customize the path to the scouting database

I want to write a script that runs the scouting webserver. For that to
work elegantly, I need to be able to customize the database path.
Otherwise it gets created in the runfiles tree.

Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
Change-Id: I6f06f9b82ca2d3476c76d795ad57b06f7b360ba8
diff --git a/scouting/db/db_test.go b/scouting/db/db_test.go
index 3c6d9c5..39f12e3 100644
--- a/scouting/db/db_test.go
+++ b/scouting/db/db_test.go
@@ -1,16 +1,28 @@
 package db
 
 import (
-	"fmt"
+	"os"
+	"path/filepath"
 	"reflect"
 	"testing"
 )
 
-func TestAddToMatchDB(t *testing.T) {
-	db, error_ := NewDatabase()
-	if error_ != nil {
-		t.Fatalf(error_.Error())
+// Creates a database in TEST_TMPDIR so that we don't accidentally write it
+// into the runfiles directory.
+func createDatabase(t *testing.T) *Database {
+	// Get the path to our temporary writable directory.
+	testTmpdir := os.Getenv("TEST_TMPDIR")
+	db, err := NewDatabase(filepath.Join(testTmpdir, "scouting.db"))
+	if err != nil {
+		t.Fatal("Failed to create a new database: ", err)
 	}
+	return db
+}
+
+func TestAddToMatchDB(t *testing.T) {
+	db := createDatabase(t)
+	defer db.Delete()
+
 	correct := []Match{Match{matchNumber: 7, round: 1, compLevel: "quals", r1: 9999, r2: 1000, r3: 777, b1: 0000, b2: 4321, b3: 1234, r1ID: 1, r2ID: 2, r3ID: 3, b1ID: 4, b2ID: 5, b3ID: 6}}
 	db.AddToMatch(correct[0])
 	got, error_ := db.ReturnMatches()
@@ -20,14 +32,12 @@
 	if !reflect.DeepEqual(correct, got) {
 		t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
 	}
-	db.Delete()
 }
 
 func TestAddToStatsDB(t *testing.T) {
-	db, error_ := NewDatabase()
-	if error_ != nil {
-		t.Fatalf(error_.Error())
-	}
+	db := createDatabase(t)
+	defer db.Delete()
+
 	correct := []Stats{
 		Stats{teamNumber: 1236, matchNumber: 7, shotsMissed: 9, upperGoalShots: 5, lowerGoalShots: 4, shotsMissedAuto: 3, upperGoalAuto: 2, lowerGoalAuto: 1, playedDefense: 2, climbing: 3},
 		Stats{teamNumber: 1001, matchNumber: 7, shotsMissed: 6, upperGoalShots: 9, lowerGoalShots: 9, shotsMissedAuto: 0, upperGoalAuto: 0, lowerGoalAuto: 0, playedDefense: 0, climbing: 0},
@@ -47,15 +57,11 @@
 	if !reflect.DeepEqual(correct, got) {
 		t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
 	}
-	db.Delete()
 }
 
 func TestQueryMatchDB(t *testing.T) {
-	db, error_ := NewDatabase()
-	if error_ != nil {
-		t.Fatalf(error_.Error())
-		fmt.Println("Error creating new database")
-	}
+	db := createDatabase(t)
+	defer db.Delete()
 
 	testDatabase := []Match{
 		Match{matchNumber: 2, round: 1, compLevel: "quals", r1: 251, r2: 169, r3: 286, b1: 253, b2: 538, b3: 149},
@@ -74,17 +80,18 @@
 	}
 
 	got, error_ := db.QueryMatches(538)
+	if error_ != nil {
+		t.Fatal("Failed to query matches for 538: ", error_)
+	}
 	if !reflect.DeepEqual(correct, got) {
 		t.Fatalf("Got %#v,\nbut expected %#v.", got, correct)
 	}
-	db.Delete()
 }
 
 func TestQueryStatsDB(t *testing.T) {
-	db, error_ := NewDatabase()
-	if error_ != nil {
-		t.Fatalf(error_.Error())
-	}
+	db := createDatabase(t)
+	defer db.Delete()
+
 	testDatabase := []Stats{
 		Stats{teamNumber: 1235, matchNumber: 94, shotsMissed: 2, upperGoalShots: 2, lowerGoalShots: 2, shotsMissedAuto: 2, upperGoalAuto: 2, lowerGoalAuto: 2, playedDefense: 2, climbing: 2},
 		Stats{teamNumber: 1234, matchNumber: 94, shotsMissed: 4, upperGoalShots: 4, lowerGoalShots: 4, shotsMissedAuto: 4, upperGoalAuto: 4, lowerGoalAuto: 4, playedDefense: 7, climbing: 2},
@@ -107,14 +114,12 @@
 	if !reflect.DeepEqual(correct, got) {
 		t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
 	}
-	db.Delete()
 }
 
 func TestReturnMatchDB(t *testing.T) {
-	db, error_ := NewDatabase()
-	if error_ != nil {
-		t.Fatalf(error_.Error())
-	}
+	db := createDatabase(t)
+	defer db.Delete()
+
 	correct := []Match{
 		Match{matchNumber: 2, round: 1, compLevel: "quals", r1: 251, r2: 169, r3: 286, b1: 253, b2: 538, b3: 149, r1ID: 1, r2ID: 2, r3ID: 3, b1ID: 4, b2ID: 5, b3ID: 6},
 		Match{matchNumber: 3, round: 1, compLevel: "quals", r1: 147, r2: 421, r3: 538, b1: 126, b2: 448, b3: 262, r1ID: 7, r2ID: 8, r3ID: 9, b1ID: 10, b2ID: 11, b3ID: 12},
@@ -132,14 +137,12 @@
 	if !reflect.DeepEqual(correct, got) {
 		t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
 	}
-	db.Delete()
 }
 
 func TestReturnStatsDB(t *testing.T) {
-	db, error_ := NewDatabase()
-	if error_ != nil {
-		t.Fatalf(error_.Error())
-	}
+	db := createDatabase(t)
+	defer db.Delete()
+
 	correct := []Stats{
 		Stats{teamNumber: 1235, matchNumber: 94, shotsMissed: 2, upperGoalShots: 2, lowerGoalShots: 2, shotsMissedAuto: 2, upperGoalAuto: 2, lowerGoalAuto: 2, playedDefense: 2, climbing: 2},
 		Stats{teamNumber: 1236, matchNumber: 94, shotsMissed: 4, upperGoalShots: 4, lowerGoalShots: 4, shotsMissedAuto: 4, upperGoalAuto: 4, lowerGoalAuto: 4, playedDefense: 7, climbing: 2},
@@ -159,5 +162,4 @@
 	if !reflect.DeepEqual(correct, got) {
 		t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
 	}
-	db.Delete()
 }