Index: Migration/Scripts/src/Migration.Scripts.Data/Migration.Scripts.Data.csproj
===================================================================
diff -u -r818656bda5265c4053d1d7a3bec2d0259080e2e0 -r7050299dc93fba048f82eb9e11d90c86a8508596
--- Migration/Scripts/src/Migration.Scripts.Data/Migration.Scripts.Data.csproj (.../Migration.Scripts.Data.csproj) (revision 818656bda5265c4053d1d7a3bec2d0259080e2e0)
+++ Migration/Scripts/src/Migration.Scripts.Data/Migration.Scripts.Data.csproj (.../Migration.Scripts.Data.csproj) (revision 7050299dc93fba048f82eb9e11d90c86a8508596)
@@ -56,6 +56,7 @@
+
Index: Migration/Scripts/src/Migration.Scripts.Data/UpgradeScript.cs
===================================================================
diff -u
--- Migration/Scripts/src/Migration.Scripts.Data/UpgradeScript.cs (revision 0)
+++ Migration/Scripts/src/Migration.Scripts.Data/UpgradeScript.cs (revision 7050299dc93fba048f82eb9e11d90c86a8508596)
@@ -0,0 +1,115 @@
+// Copyright (C) Stichting Deltares 2016. All rights reserved.
+//
+// This file is part of Ringtoets.
+//
+// Ringtoets is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+// All names, logos, and references to "Deltares" are registered trademarks of
+// Stichting Deltares and remain full property of Stichting Deltares at all times.
+// All rights reserved.
+
+using System;
+using System.Data.SQLite;
+
+namespace Migration.Scripts.Data
+{
+ ///
+ /// Class that provides methods for the upgrading a for a specific version.
+ ///
+ public class UpgradeScript
+ {
+ private readonly string fromVersion;
+ private readonly string toVersion;
+ private readonly string upgradeQuery;
+
+ ///
+ /// Creates a new instance of the class.
+ ///
+ /// The source version was designed for.
+ /// The target version was designed for.
+ /// The SQL query to upgrade from to .
+ /// Thrown when:
+ ///
+ /// - is empty or null,
+ /// - is empty or null,
+ /// - is empty, null, or consists out of only whitespace characters.
+ ///
+ public UpgradeScript(string fromVersion, string toVersion, string query)
+ {
+ if (string.IsNullOrEmpty(fromVersion))
+ {
+ throw new ArgumentException(@"FromVersion must have a value.", nameof(fromVersion));
+ }
+ if (string.IsNullOrEmpty(toVersion))
+ {
+ throw new ArgumentException(@"ToVersion must have a value.", nameof(toVersion));
+ }
+ if (string.IsNullOrWhiteSpace(query))
+ {
+ throw new ArgumentException(@"Query must have a value.", nameof(query));
+ }
+ this.fromVersion = fromVersion;
+ this.toVersion = toVersion;
+ upgradeQuery = query;
+ }
+
+ ///
+ /// The source version of .
+ ///
+ /// The version.
+ public string FromVersion()
+ {
+ return fromVersion;
+ }
+
+ ///
+ /// The target version of .
+ ///
+ /// The version.
+ public string ToVersion()
+ {
+ return toVersion;
+ }
+
+ ///
+ /// Uses to upgrade to .
+ ///
+ /// The source file to upgrade from.
+ /// The target file to upgrade to.
+ /// Thrown when:
+ ///
+ /// - is null,
+ /// - is null.
+ ///
+ /// Thrown when executing query failed.
+ public void Upgrade(VersionedFile source, VersionedFile target)
+ {
+ if (source == null)
+ {
+ throw new ArgumentNullException(nameof(source));
+ }
+ if (target == null)
+ {
+ throw new ArgumentNullException(nameof(target));
+ }
+ var query = string.Format(upgradeQuery, source.Location);
+
+ using (var databaseFile = new RingtoetsDatabaseFile(target.Location))
+ {
+ databaseFile.OpenDatabaseConnection();
+ databaseFile.ExecuteMigration(query);
+ }
+ }
+ }
+}
\ No newline at end of file
Index: Migration/Scripts/test/Migration.Scripts.Data.Test/Migration.Scripts.Data.Test.csproj
===================================================================
diff -u -r818656bda5265c4053d1d7a3bec2d0259080e2e0 -r7050299dc93fba048f82eb9e11d90c86a8508596
--- Migration/Scripts/test/Migration.Scripts.Data.Test/Migration.Scripts.Data.Test.csproj (.../Migration.Scripts.Data.Test.csproj) (revision 818656bda5265c4053d1d7a3bec2d0259080e2e0)
+++ Migration/Scripts/test/Migration.Scripts.Data.Test/Migration.Scripts.Data.Test.csproj (.../Migration.Scripts.Data.Test.csproj) (revision 7050299dc93fba048f82eb9e11d90c86a8508596)
@@ -57,6 +57,7 @@
+
Index: Migration/Scripts/test/Migration.Scripts.Data.Test/UpgradeScriptTest.cs
===================================================================
diff -u
--- Migration/Scripts/test/Migration.Scripts.Data.Test/UpgradeScriptTest.cs (revision 0)
+++ Migration/Scripts/test/Migration.Scripts.Data.Test/UpgradeScriptTest.cs (revision 7050299dc93fba048f82eb9e11d90c86a8508596)
@@ -0,0 +1,185 @@
+// Copyright (C) Stichting Deltares 2016. All rights reserved.
+//
+// This file is part of Ringtoets.
+//
+// Ringtoets is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+// All names, logos, and references to "Deltares" are registered trademarks of
+// Stichting Deltares and remain full property of Stichting Deltares at all times.
+// All rights reserved.
+
+using System;
+using System.Data.SQLite;
+using System.IO;
+using Core.Common.TestUtil;
+using NUnit.Framework;
+
+namespace Migration.Scripts.Data.Test
+{
+ [TestFixture]
+ public class UpgradeScriptTest
+ {
+ [Test]
+ [TestCase("")]
+ [TestCase(null)]
+ public void Constructor_InvalidFromVersion_ThrowsArgumentException(string fromVersion)
+ {
+ // Setup
+ const string query = "Valid query";
+ const string toVersion = "toVersion";
+
+ // Call
+ TestDelegate call = () => new UpgradeScript(fromVersion, toVersion, query);
+
+ // Assert
+ string paramName = Assert.Throws(call).ParamName;
+ Assert.AreEqual("fromVersion", paramName);
+ }
+
+ [Test]
+ [TestCase("")]
+ [TestCase(null)]
+ public void Constructor_InvalidToVersion_ThrowsArgumentException(string toVersion)
+ {
+ // Setup
+ const string fromVersion = "fromVersion";
+ const string query = "Valid query";
+
+ // Call
+ TestDelegate call = () => new UpgradeScript(fromVersion, toVersion, query);
+
+ // Assert
+ string paramName = Assert.Throws(call).ParamName;
+ Assert.AreEqual("toVersion", paramName);
+ }
+
+ [Test]
+ [TestCase("")]
+ [TestCase(" ")]
+ [TestCase(null)]
+ public void Constructor_InvalidQuery_ThrowsArgumentException(string query)
+ {
+ // Setup
+ const string fromVersion = "fromVersion";
+ const string toVersion = "toVersion";
+
+ // Call
+ TestDelegate call = () => new UpgradeScript(fromVersion, toVersion, query);
+
+ // Assert
+ string paramName = Assert.Throws(call).ParamName;
+ Assert.AreEqual("query", paramName);
+ }
+
+ [Test]
+ public void Constructor_ValidParameters_ReturnsExpectedValues()
+ {
+ // Setup
+ const string fromVersion = "fromVersion";
+ const string toVersion = "toVersion";
+ const string query = ";";
+
+ // Call
+ var upgradeScript = new UpgradeScript(fromVersion, toVersion, query);
+
+ // Assert
+ Assert.AreEqual(fromVersion, upgradeScript.FromVersion());
+ Assert.AreEqual(toVersion, upgradeScript.ToVersion());
+ }
+
+ [Test]
+ public void Upgrade_SourceNull_ThrowsArgumentNullException()
+ {
+ // Setup
+ const string fromVersion = "fromVersion";
+ const string toVersion = "toVersion";
+ const string query = ";";
+ var upgradeScript = new UpgradeScript(fromVersion, toVersion, query);
+
+ string filename = Path.GetRandomFileName();
+ string filePath = TestHelper.GetTestDataPath(TestDataPath.Migration.Core.Storage, filename);
+
+ var targetVersionedFile = new VersionedFile(filePath);
+
+ // Call
+ TestDelegate call = () => upgradeScript.Upgrade(null, targetVersionedFile);
+
+ // Assert
+ string paramName = Assert.Throws(call).ParamName;
+ Assert.AreEqual("source", paramName);
+ }
+
+ [Test]
+ public void Upgrade_TargetNull_ThrowsArgumentNullException()
+ {
+ // Setup
+ const string fromVersion = "fromVersion";
+ const string toVersion = "toVersion";
+ const string query = ";";
+ var upgradeScript = new UpgradeScript(fromVersion, toVersion, query);
+
+ string filename = Path.GetRandomFileName();
+ string filePath = TestHelper.GetTestDataPath(TestDataPath.Migration.Core.Storage, filename);
+
+ var sourceVersionedFile = new VersionedFile(filePath);
+
+ // Call
+ TestDelegate call = () => upgradeScript.Upgrade(sourceVersionedFile, null);
+
+ // Assert
+ string paramName = Assert.Throws(call).ParamName;
+ Assert.AreEqual("target", paramName);
+ }
+
+ [Test]
+ public void Upgrade_UpgradeFails_ThrowsSQLiteException()
+ {
+ // Setup
+ var upgradeScript = new UpgradeScript("1", "2", "THIS WILL FAIL");
+ var sourceVersionedFile = new VersionedFile("c:\\file.ext");
+
+ string filename = Path.GetRandomFileName();
+ string filePath = TestHelper.GetTestDataPath(TestDataPath.Migration.Core.Storage, filename);
+ var targetVersionedFile = new VersionedFile(filePath);
+
+ // Call
+ TestDelegate call = () => upgradeScript.Upgrade(sourceVersionedFile, targetVersionedFile);
+
+ // Assert
+ Assert.Throws(call);
+ }
+
+ [Test]
+ public void Upgrade_ValidParameters_ExpectedProperties()
+ {
+ // Setup
+ var upgradeScript = new UpgradeScript("1", "2", ";");
+ var sourceVersionedFile = new VersionedFile("c:\\file.ext");
+
+ string filename = Path.GetRandomFileName();
+ string filePath = TestHelper.GetTestDataPath(TestDataPath.Migration.Core.Storage, filename);
+ var targetVersionedFile = new VersionedFile(filePath);
+
+ // Call
+ upgradeScript.Upgrade(sourceVersionedFile, targetVersionedFile);
+
+ // Assert
+ Assert.IsNotNull(targetVersionedFile);
+ using (new FileDisposeHelper(targetVersionedFile.Location))
+ {
+ Assert.IsTrue(File.Exists(targetVersionedFile.Location));
+ }
+ }
+ }
+}
\ No newline at end of file