summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--database.go18
-rw-r--r--database_test.go43
2 files changed, 61 insertions, 0 deletions
diff --git a/database.go b/database.go
index 44a172d..3651cf2 100644
--- a/database.go
+++ b/database.go
@@ -79,3 +79,21 @@ func UserVersion(db *sql.DB) (int, error) {
return version, nil
}
+
+func MigrateToLatest(db *sql.DB) error {
+ for i := range migrations {
+ v, err := UserVersion(db)
+ if err != nil {
+ return fmt.Errorf("Failed UserVersion() inside MigrateToLatest(): %w", err)
+ }
+
+ if i == v {
+ err = Migrate(db, i)
+ if err != nil {
+ return fmt.Errorf("Failed Migrate() inside MigrateToLatest(): %w", err)
+ }
+ }
+ }
+
+ return nil
+}
diff --git a/database_test.go b/database_test.go
index a9c818b..66ffc37 100644
--- a/database_test.go
+++ b/database_test.go
@@ -1,6 +1,7 @@
package main
import (
+ "database/sql"
"fmt"
"os"
"strings"
@@ -68,3 +69,45 @@ func TestMigrations(t *testing.T) {
}
}
}
+
+func TestMigrateToLatest(t *testing.T) {
+ db, _ := emptyDB(t)
+
+ err := MigrateToLatest(db)
+ if err != nil {
+ t.Fatalf("Could not execute function to test: %v", err)
+ }
+
+ v, err := UserVersion(db)
+ if err != nil {
+ t.Fatalf("Could not get user_version after migration: %v", err)
+ }
+
+ latest := len(migrations)
+ if v != latest {
+ t.Fatalf("Expected user_version %d but got %d.", latest, v)
+ }
+
+ futureUserVersion := 10000
+ err = Transaction(db, func(tx *sql.Tx) error {
+ _, err := tx.Exec(fmt.Sprintf("PRAGMA user_version = %d;", futureUserVersion))
+ if err != nil {
+ return err
+ }
+ return nil
+ })
+
+ err = MigrateToLatest(db)
+ if err != nil {
+ t.Fatalf("Could not execute function to test with future DB: %v", err)
+ }
+
+ v, err = UserVersion(db)
+ if err != nil {
+ t.Fatalf("Could not get user_version after migration with future DB: %v", err)
+ }
+
+ if v != futureUserVersion {
+ t.Fatalf("Expected user_version %d but got %d.", futureUserVersion, v)
+ }
+}