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