From 267db50fb04cd98f4ad40662a7808b8c8f18727e Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Mon, 3 May 2021 16:04:55 -0400
Subject: [PATCH] Support partial upgrades too.  Prove it with tests.

---
 src/PaymentServer/Persistence.hs |  8 ++++----
 test/Persistence.hs              | 24 ++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/src/PaymentServer/Persistence.hs b/src/PaymentServer/Persistence.hs
index 1b5ee93..478821e 100644
--- a/src/PaymentServer/Persistence.hs
+++ b/src/PaymentServer/Persistence.hs
@@ -452,14 +452,14 @@ upgradeSchema targetVersion conn = do
       case compareVersion targetVersion currentVersion of
         Lesser -> return $ Left DatabaseSchemaTooNew
         Equal -> return $ Right ()
-        Greater -> runUpgrades currentVersion
+        Greater -> runUpgrades currentVersion targetVersion
 
   where
-    runUpgrades :: Int -> IO (Either UpgradeError ())
-    runUpgrades currentVersion =
+    runUpgrades :: Int -> Int -> IO (Either UpgradeError ())
+    runUpgrades currentVersion targetVersion =
       let
         upgrades :: [[Sqlite.Query]]
-        upgrades = drop currentVersion updateVersions
+        upgrades = drop currentVersion $ take targetVersion updateVersions
 
         oneStep :: [Sqlite.Query] -> IO [()]
         oneStep = mapM $ Sqlite.execute_ conn
diff --git a/test/Persistence.hs b/test/Persistence.hs
index 37f4c8e..f5af378 100644
--- a/test/Persistence.hs
+++ b/test/Persistence.hs
@@ -247,4 +247,28 @@ sqlite3DatabaseSchemaTests =
       let expected = Right latestVersion
       actual <- readVersion conn
       assertEqual "The recorded schema version should be the latest value" expected actual
+
+  , testCase "identify version 0" $
+    -- readVersion identifies an empty database schema as version 0
+    Sqlite.withConnection ":memory:" $ \conn -> do
+      let expected = Right 0
+      actual <- readVersion conn
+      assertEqual "An empty database schema is version 0" expected actual
+
+  , testCase "identify version 1" $
+    -- readVersion identifies schema version 1
+    Sqlite.withConnection ":memory:" $ \conn -> do
+      upgradeSchema 1 conn
+      let expected = Right 1
+      actual <- readVersion conn
+      assertEqual "readVersion identifies database schema version 1" expected actual
+
+  , testCase "identify version 2" $
+    -- readVersion identifies schema version 1
+    Sqlite.withConnection ":memory:" $ \conn -> do
+      upgradeSchema 2 conn
+      let expected = Right 2
+      actual <- readVersion conn
+      assertEqual "readVersion identifies database schema version 2" expected actual
+
   ]
-- 
GitLab