Index: Migration/Scripts/src/Migration.Scripts.Data/Migration.Scripts.Data.csproj =================================================================== diff -u -r7050299dc93fba048f82eb9e11d90c86a8508596 -r83fbfb9ccbeaef0916d3485f89d48fdae9b8eb1d --- Migration/Scripts/src/Migration.Scripts.Data/Migration.Scripts.Data.csproj (.../Migration.Scripts.Data.csproj) (revision 7050299dc93fba048f82eb9e11d90c86a8508596) +++ Migration/Scripts/src/Migration.Scripts.Data/Migration.Scripts.Data.csproj (.../Migration.Scripts.Data.csproj) (revision 83fbfb9ccbeaef0916d3485f89d48fdae9b8eb1d) @@ -46,6 +46,7 @@ + True Index: Migration/Scripts/src/Migration.Scripts.Data/MigrationScript.cs =================================================================== diff -u --- Migration/Scripts/src/Migration.Scripts.Data/MigrationScript.cs (revision 0) +++ Migration/Scripts/src/Migration.Scripts.Data/MigrationScript.cs (revision 83fbfb9ccbeaef0916d3485f89d48fdae9b8eb1d) @@ -0,0 +1,102 @@ +// 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 Migration.Scripts.Data.Exceptions; + +namespace Migration.Scripts.Data +{ + /// + /// Class that provides methods for migration a . + /// + public class MigrationScript + { + private readonly CreateScript createScript; + private readonly UpgradeScript upgradeScript; + + /// + /// Creates a new instance of . + /// + /// The create script to use for migrating. + /// The upgrade script to use for migrating. + /// Thrown when any of the input parameters is null. + public MigrationScript(CreateScript createScript, UpgradeScript upgradeScript) + { + if (createScript == null) + { + throw new ArgumentNullException(nameof(createScript)); + } + if (upgradeScript == null) + { + throw new ArgumentNullException(nameof(upgradeScript)); + } + this.createScript = createScript; + this.upgradeScript = upgradeScript; + } + + /// + /// Gets the supported version. + /// + /// The supported version. + public string SupportedVersion() + { + return upgradeScript.FromVersion(); + } + + /// + /// Gets the target version. + /// + /// The target version. + public string TargetVersion() + { + return upgradeScript.ToVersion(); + } + + /// + /// Uses to upgrade to a new . + /// + /// + /// The upgraded . + /// Thrown when is null. + /// Thrown when migration failed. + public VersionedFile Upgrade(VersionedFile sourceVersionedFile) + { + if (sourceVersionedFile == null) + { + throw new ArgumentNullException(nameof(sourceVersionedFile)); + } + var newLocation = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + + try + { + VersionedFile newVersionedFile = createScript.CreateEmptyVersionedFile(newLocation); + upgradeScript.Upgrade(sourceVersionedFile, newVersionedFile); + return newVersionedFile; + } + catch (SQLiteException exception) + { + throw new CriticalDatabaseMigrationException("Migratie is niet gelukt.", exception); + } + } + } +} \ No newline at end of file Index: Migration/Scripts/test/Migration.Scripts.Data.Test/Migration.Scripts.Data.Test.csproj =================================================================== diff -u -r7050299dc93fba048f82eb9e11d90c86a8508596 -r83fbfb9ccbeaef0916d3485f89d48fdae9b8eb1d --- Migration/Scripts/test/Migration.Scripts.Data.Test/Migration.Scripts.Data.Test.csproj (.../Migration.Scripts.Data.Test.csproj) (revision 7050299dc93fba048f82eb9e11d90c86a8508596) +++ Migration/Scripts/test/Migration.Scripts.Data.Test/Migration.Scripts.Data.Test.csproj (.../Migration.Scripts.Data.Test.csproj) (revision 83fbfb9ccbeaef0916d3485f89d48fdae9b8eb1d) @@ -56,6 +56,7 @@ Properties\GlobalAssembly.cs + Index: Migration/Scripts/test/Migration.Scripts.Data.Test/MigrationScriptTest.cs =================================================================== diff -u --- Migration/Scripts/test/Migration.Scripts.Data.Test/MigrationScriptTest.cs (revision 0) +++ Migration/Scripts/test/Migration.Scripts.Data.Test/MigrationScriptTest.cs (revision 83fbfb9ccbeaef0916d3485f89d48fdae9b8eb1d) @@ -0,0 +1,131 @@ +// 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 Migration.Scripts.Data.Exceptions; +using NUnit.Framework; + +namespace Migration.Scripts.Data.Test +{ + [TestFixture] + public class MigrationScriptTest + { + [Test] + public void Constructor_CreateScriptNull_ThrowsArgumentNullException() + { + // Setup + var upgradeScript = new UpgradeScript("1", "2", ";"); + + // Call + TestDelegate call = () => new MigrationScript(null, upgradeScript); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("createScript", paramName); + } + + [Test] + public void Constructor_UpgradeScriptNull_ThrowsArgumentNullException() + { + // Setup + var createScript = new CreateScript("1", ";"); + + // Call + TestDelegate call = () => new MigrationScript(createScript, null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("upgradeScript", paramName); + } + + [Test] + public void Constructor_ValidParameters_ExpectedProperties() + { + // Setup + var createScript = new CreateScript("2", ";"); + var upgradeScript = new UpgradeScript("1", "2", ";"); + + // Call + var migrationScript = new MigrationScript(createScript, upgradeScript); + + // Assert + Assert.AreEqual(upgradeScript.FromVersion(), migrationScript.SupportedVersion()); + Assert.AreEqual(upgradeScript.ToVersion(), migrationScript.TargetVersion()); + } + + [Test] + public void Upgrade_VersionedFileNull_ThrowsArgumentNullException() + { + // Setup + var createScript = new CreateScript("2", ";"); + var upgradeScript = new UpgradeScript("1", "2", ";"); + var migrationScript = new MigrationScript(createScript, upgradeScript); + + // Call + TestDelegate call = () => migrationScript.Upgrade(null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("sourceVersionedFile", paramName); + } + + [Test] + public void Upgrade_UpgradeFails_ThrowsCriticalDatabaseMigrationException() + { + // Setup + var createScript = new CreateScript("2", "THIS WILL FAIL"); + var upgradeScript = new UpgradeScript("1", "2", ";"); + var migrationScript = new MigrationScript(createScript, upgradeScript); + var versionedFile = new VersionedFile("c:\\file.ext"); + + // Call + TestDelegate call = () => migrationScript.Upgrade(versionedFile); + + // Assert + CriticalDatabaseMigrationException exception = Assert.Throws(call); + Assert.AreEqual("Migratie is niet gelukt.", exception.Message); + Assert.IsInstanceOf(exception.InnerException); + } + + [Test] + public void Upgrade_ValidParameters_ExpectedProperties() + { + // Setup + var createScript = new CreateScript("2", ";"); + var upgradeScript = new UpgradeScript("1", "2", ";"); + var migrationScript = new MigrationScript(createScript, upgradeScript); + var versionedFile = new VersionedFile("c:\\file.ext"); + + // Call + VersionedFile upgradedFile = migrationScript.Upgrade(versionedFile); + + // Assert + Assert.IsNotNull(upgradedFile); + using (new FileDisposeHelper(upgradedFile.Location)) + { + Assert.IsTrue(File.Exists(upgradedFile.Location)); + } + } + } +} \ No newline at end of file