Index: Ringtoets.sln =================================================================== diff -u -rcb34c291af8d3610db019c4107eec6191b12371e -r5da9e26c544c8e3be801086ac660bc787a31b6cf --- Ringtoets.sln (.../Ringtoets.sln) (revision cb34c291af8d3610db019c4107eec6191b12371e) +++ Ringtoets.sln (.../Ringtoets.sln) (revision 5da9e26c544c8e3be801086ac660bc787a31b6cf) @@ -1952,7 +1952,7 @@ {C90B77DA-E421-43CC-B82E-529651BC21AC} = {C90B77DA-E421-43CC-B82E-529651BC21AC} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Riskeer.Migration.Test", "Ringtoets\Migration\test\Ringtoets.Migration.Test\Riskeer.Migration.Test.csproj", "{408F6A6B-7BF7-4F59-A5D4-893A777921D3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Riskeer.Migration.Test", "Ringtoets\Migration\test\Riskeer.Migration.Test\Riskeer.Migration.Test.csproj", "{408F6A6B-7BF7-4F59-A5D4-893A777921D3}" ProjectSection(ProjectDependencies) = postProject {C90B77DA-E421-43CC-B82E-529651BC21AC} = {C90B77DA-E421-43CC-B82E-529651BC21AC} EndProjectSection Fisheye: Tag 5da9e26c544c8e3be801086ac660bc787a31b6cf refers to a dead (removed) revision in file `Ringtoets/Migration/test/Ringtoets.Migration.Test/Properties/AssemblyInfo.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 5da9e26c544c8e3be801086ac660bc787a31b6cf refers to a dead (removed) revision in file `Ringtoets/Migration/test/Ringtoets.Migration.Test/RingtoetsProjectMigratorTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 5da9e26c544c8e3be801086ac660bc787a31b6cf refers to a dead (removed) revision in file `Ringtoets/Migration/test/Ringtoets.Migration.Test/Riskeer.Migration.Test.csproj'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 5da9e26c544c8e3be801086ac660bc787a31b6cf refers to a dead (removed) revision in file `Ringtoets/Migration/test/Ringtoets.Migration.Test/packages.config'. Fisheye: No comparison available. Pass `N' to diff? Index: Ringtoets/Migration/test/Riskeer.Migration.Test/Properties/AssemblyInfo.cs =================================================================== diff -u --- Ringtoets/Migration/test/Riskeer.Migration.Test/Properties/AssemblyInfo.cs (revision 0) +++ Ringtoets/Migration/test/Riskeer.Migration.Test/Properties/AssemblyInfo.cs (revision 5da9e26c544c8e3be801086ac660bc787a31b6cf) @@ -0,0 +1,25 @@ +// Copyright (C) Stichting Deltares 2018. 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.Reflection; + +[assembly: AssemblyTitle("Riskeer.Migration.Test")] +[assembly: AssemblyProduct("Riskeer.Migration.Test")] \ No newline at end of file Index: Ringtoets/Migration/test/Riskeer.Migration.Test/RingtoetsProjectMigratorTest.cs =================================================================== diff -u --- Ringtoets/Migration/test/Riskeer.Migration.Test/RingtoetsProjectMigratorTest.cs (revision 0) +++ Ringtoets/Migration/test/Riskeer.Migration.Test/RingtoetsProjectMigratorTest.cs (revision 5da9e26c544c8e3be801086ac660bc787a31b6cf) @@ -0,0 +1,721 @@ +// Copyright (C) Stichting Deltares 2018. 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.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Core.Common.Base.Storage; +using Core.Common.Gui; +using Core.Common.TestUtil; +using Core.Common.Util; +using Core.Common.Util.TestUtil.Settings; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.Common.Util; +using Riskeer.Migration.Core; +using Riskeer.Migration.Core.TestUtil; + +namespace Riskeer.Migration.Test +{ + [TestFixture] + public class RingtoetsProjectMigratorTest + { + private const string testDirectory = nameof(RingtoetsProjectMigratorTest); + private readonly string currentDatabaseVersion = RingtoetsVersionHelper.GetCurrentDatabaseVersion(); + private DirectoryDisposeHelper directoryDisposeHelper; + + [SetUp] + public void Setup() + { + directoryDisposeHelper = new DirectoryDisposeHelper(TestHelper.GetScratchPadPath(), testDirectory); + } + + [TearDown] + public void TearDown() + { + directoryDisposeHelper.Dispose(); + } + + [Test] + public void Constructor_InquiryHelperNull_ThrowsArgumentNullException() + { + // Call + TestDelegate call = () => new RingtoetsProjectMigrator(null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("inquiryHelper", paramName); + } + + [Test] + public void Constructor_ReturnsExpectedProperties() + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + // Call + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + // Assert + Assert.IsInstanceOf(migrator); + + mocks.VerifyAll(); + } + + [Test] + public void ShouldMigrate_FilePathNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + // Call + TestDelegate call = () => migrator.ShouldMigrate(null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("filePath", paramName); + + mocks.VerifyAll(); + } + + [Test] + [TestCaseSource(typeof(InvalidPathHelper), nameof(InvalidPathHelper.InvalidPaths))] + public void ShouldMigrate_InvalidFilePath_ThrowsArgumentException(string invalidFilePath) + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + // Call + TestDelegate call = () => migrator.ShouldMigrate(invalidFilePath); + + // Assert + string paramName = TestHelper.AssertThrowsArgumentExceptionAndTestMessage( + call, "Bronprojectpad moet een geldig projectpad zijn.") + .ParamName; + Assert.AreEqual("filePath", paramName); + + mocks.VerifyAll(); + } + + [Test] + public void ShouldMigrate_OutdatedProjectUnsupported_ReturnsAbortedAndGeneratesLogMessages() + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + string sourceFilePath = RingtoetsProjectMigrationTestHelper.GetOutdatedUnSupportedProjectFilePath(); + var versionedFile = new RingtoetsVersionedFile(sourceFilePath); + string fileVersion = versionedFile.GetVersion(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + var shouldMigrate = MigrationRequired.Yes; + + // Call + Action call = () => shouldMigrate = migrator.ShouldMigrate(sourceFilePath); + + // Assert + string expectedMessage = $"Het migreren van een projectbestand met versie '{fileVersion}' naar versie '{currentDatabaseVersion}' is niet ondersteund."; + TestHelper.AssertLogMessageIsGenerated(call, expectedMessage); + Assert.AreEqual(MigrationRequired.Aborted, shouldMigrate); + + mocks.VerifyAll(); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void ShouldMigrate_OutdatedProjectSupported_AskMigrationConfirmationAndReturnBasedOnConfirmation(bool confirmContinuation) + { + // Setup + string question = "Het project dat u wilt openen is opgeslagen in het formaat van een eerdere versie van Ringtoets." + + $"{Environment.NewLine}{Environment.NewLine}" + + $"Weet u zeker dat u het bestand wilt migreren naar het formaat van uw huidige Ringtoetsversie ({currentDatabaseVersion})?"; + var mocks = new MockRepository(); + var inquiryHelper = mocks.StrictMock(); + inquiryHelper.Expect(h => h.InquireContinuation(question)).Return(confirmContinuation); + mocks.ReplayAll(); + + string sourceFilePath = RingtoetsProjectMigrationTestHelper.GetOutdatedSupportedProjectFilePath(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + // Call + var shouldMigrate = MigrationRequired.No; + Action call = () => shouldMigrate = migrator.ShouldMigrate(sourceFilePath); + + // Assert + var expectedLogMessages = new List>(); + if (!confirmContinuation) + { + expectedLogMessages.Add(Tuple.Create($"Het migreren van het projectbestand '{sourceFilePath}' is geannuleerd.", + LogLevelConstant.Warn)); + } + + TestHelper.AssertLogMessagesWithLevelAreGenerated(call, expectedLogMessages, expectedLogMessages.Count); + + MigrationRequired expectedResult = confirmContinuation ? MigrationRequired.Yes : MigrationRequired.Aborted; + Assert.AreEqual(expectedResult, shouldMigrate); + + mocks.VerifyAll(); + } + + [Test] + public void ShouldMigrate_LatestProjectVersion_ReturnsFalse() + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + string sourceFilePath = RingtoetsProjectMigrationTestHelper.GetLatestProjectFilePath(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + // Call + MigrationRequired shouldMigrate = migrator.ShouldMigrate(sourceFilePath); + + // Assert + Assert.AreEqual(MigrationRequired.No, shouldMigrate); + mocks.VerifyAll(); + } + + [Test] + public void DetermineMigrationLocation_OriginalFilePathNull_ThrowArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + // Call + TestDelegate call = () => migrator.DetermineMigrationLocation(null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("originalFilePath", paramName); + + mocks.VerifyAll(); + } + + [Test] + [TestCaseSource(typeof(InvalidPathHelper), nameof(InvalidPathHelper.InvalidPaths))] + public void DetermineMigrationLocation_InvalidOriginalFilePath_ThrowsArgumentException(string invalidFilePath) + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + // Call + TestDelegate call = () => migrator.DetermineMigrationLocation(invalidFilePath); + + // Assert + string paramName = TestHelper.AssertThrowsArgumentExceptionAndTestMessage( + call, "Bronprojectpad moet een geldig projectpad zijn.") + .ParamName; + Assert.AreEqual("originalFilePath", paramName); + + mocks.VerifyAll(); + } + + [Test] + public void DetermineMigrationLocation_ValidPath_AsksUserForTargetPathAndReturnsIt() + { + // Setup + const string originalFileName = "Im_a_valid_file_path"; + const string expectedFileExtension = "rtd"; + + string validFilePath = TestHelper.GetScratchPadPath($"{originalFileName}.{expectedFileExtension}"); + + string versionWithDashes = RingtoetsVersionHelper.GetCurrentDatabaseVersion().Replace('.', '-'); + var expectedFileFilter = new FileFilterGenerator(expectedFileExtension, "Ringtoets project"); + string expectedSuggestedFileName = $"{originalFileName}_{versionWithDashes}"; + + string expectedReturnPath = TestHelper.GetScratchPadPath("Im_a_file_path_to_the_migrated_file.rtd"); + + var mocks = new MockRepository(); + var inquiryHelper = mocks.StrictMock(); + inquiryHelper.Expect(h => h.GetTargetFileLocation(expectedFileFilter.Filter, expectedSuggestedFileName)) + .Return(expectedReturnPath); + mocks.ReplayAll(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + // Call + string targetFilePath = migrator.DetermineMigrationLocation(validFilePath); + + // Assert + Assert.AreEqual(expectedReturnPath, targetFilePath); + mocks.VerifyAll(); + } + + [Test] + public void DetermineMigrationLocation_TargetFilePathIsEmpty_LogsMessageAndReturnsEmptyTargetPath() + { + // Setup + const string originalFileName = "Im_a_valid_file_path"; + const string expectedFileExtension = "rtd"; + + string validFilePath = TestHelper.GetScratchPadPath($"{originalFileName}.{expectedFileExtension}"); + + var expectedFileFilter = new FileFilterGenerator(expectedFileExtension, "Ringtoets project"); + string versionWithDashes = RingtoetsVersionHelper.GetCurrentDatabaseVersion().Replace('.', '-'); + string expectedSuggestedFileName = $"{originalFileName}_{versionWithDashes}"; + + var mocks = new MockRepository(); + var inquiryHelper = mocks.StrictMock(); + inquiryHelper.Expect(h => h.GetTargetFileLocation(expectedFileFilter.Filter, expectedSuggestedFileName)) + .Return(null); + mocks.ReplayAll(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + var targetFilePath = "arbitraryPath"; + + // Call + Action call = () => targetFilePath = migrator.DetermineMigrationLocation(validFilePath); + + // Assert + Tuple expectedLogMessage = Tuple.Create($"Het migreren van het projectbestand '{validFilePath}' is geannuleerd.", + LogLevelConstant.Warn); + + TestHelper.AssertLogMessageWithLevelIsGenerated(call, expectedLogMessage, 1); + + Assert.IsNull(targetFilePath); + mocks.VerifyAll(); + } + + [Test] + public void Migrate_SourcePathNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + string targetFileName = $"{nameof(RingtoetsProjectMigratorTest)}." + + $"{nameof(Migrate_SourcePathNull_ThrowsArgumentNullException)}.rtd"; + string targetFilePath = TestHelper.GetScratchPadPath(targetFileName); + + // Call + TestDelegate call = () => migrator.Migrate(null, targetFilePath); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("sourceFilePath", paramName); + } + + [Test] + public void Migrate_TargetPathNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + string sourceFilePath = RingtoetsProjectMigrationTestHelper.GetOutdatedSupportedProjectFilePath(); + + // Call + TestDelegate call = () => migrator.Migrate(sourceFilePath, null); + + // Assert + string paramName = Assert.Throws(call).ParamName; + Assert.AreEqual("targetFilePath", paramName); + } + + [Test] + [TestCaseSource(typeof(InvalidPathHelper), nameof(InvalidPathHelper.InvalidPaths))] + public void Migrate_InvalidSourceFilePath_ThrowsArgumentException(string invalidFilePath) + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + string targetFileName = $"{nameof(RingtoetsProjectMigratorTest)}." + + $"{nameof(Migrate_InvalidSourceFilePath_ThrowsArgumentException)}.rtd"; + string targetFilePath = TestHelper.GetScratchPadPath(targetFileName); + + // Call + TestDelegate call = () => migrator.Migrate(invalidFilePath, targetFilePath); + + // Assert + string paramName = TestHelper.AssertThrowsArgumentExceptionAndTestMessage( + call, "Bronprojectpad moet een geldig projectpad zijn.") + .ParamName; + Assert.AreEqual("sourceFilePath", paramName); + + mocks.VerifyAll(); + } + + [Test] + [TestCaseSource(typeof(InvalidPathHelper), nameof(InvalidPathHelper.InvalidPaths))] + public void Migrate_InvalidTargetFilePath_ThrowsArgumentException(string invalidFilePath) + { + // Setup + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + string sourceFilePath = RingtoetsProjectMigrationTestHelper.GetOutdatedSupportedProjectFilePath(); + + // Call + TestDelegate call = () => migrator.Migrate(sourceFilePath, invalidFilePath); + + // Assert + string paramName = TestHelper.AssertThrowsArgumentExceptionAndTestMessage( + call, "Doelprojectpad moet een geldig projectpad zijn.") + .ParamName; + Assert.AreEqual("targetFilePath", paramName); + + mocks.VerifyAll(); + } + + [Test] + public void GivenMigratorAndSupportedFile_WhenValidTargetLocationGiven_ThenFileSuccessfullyMigrates() + { + // Given + string sourceFilePath = RingtoetsProjectMigrationTestHelper.GetOutdatedSupportedProjectFilePath(); + + string targetFile = $"{nameof(RingtoetsProjectMigratorTest)}." + + $"{nameof(GivenMigratorAndSupportedFile_WhenValidTargetLocationGiven_ThenFileSuccessfullyMigrates)}.rtd"; + string targetFilePath = Path.Combine(TestHelper.GetScratchPadPath(), testDirectory, targetFile); + + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + string logDirectory = $"{nameof(GivenMigratorAndSupportedFile_WhenValidTargetLocationGiven_ThenFileSuccessfullyMigrates)}_log"; + using (new DirectoryDisposeHelper(TestHelper.GetScratchPadPath(), logDirectory)) + using (new UseCustomSettingsHelper(new TestSettingsHelper + { + TempPath = TestHelper.GetScratchPadPath(logDirectory) + })) + { + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + var migrationSuccessful = false; + + // When + Action call = () => migrationSuccessful = migrator.Migrate(sourceFilePath, targetFilePath); + + // Then + string expectedMessage = $"Het projectbestand '{sourceFilePath}' is succesvol gemigreerd naar '{targetFilePath}' " + + $"(versie {currentDatabaseVersion})."; + var migrationLog = new StringBuilder(); + migrationLog.AppendLine("Door de migratie is het project aangepast. Bekijk het migratierapport door op details te klikken."); + migrationLog.AppendLine("Gevolgen van de migratie van versie 16.4 naar versie 17.1:"); + migrationLog.AppendLine("* Alle berekende resultaten zijn verwijderd."); + migrationLog.AppendLine("* Traject: 'assessmentSection'"); + migrationLog.AppendLine(" + Toetsspoor: 'Grasbekleding erosie kruin en binnentalud'"); + migrationLog.AppendLine(" - De naam van dijkprofiel '1' is veranderd naar '102' en wordt ook gebruikt als ID."); + migrationLog.AppendLine(" - De naam van dijkprofiel '10' is veranderd naar '104' en wordt ook gebruikt als ID."); + migrationLog.AppendLine("Gevolgen van de migratie van versie 17.1 naar versie 17.2:"); + migrationLog.AppendLine("* Traject: 'assessmentSection'"); + migrationLog.AppendLine(" + De ondergrens is gelijk gesteld aan 1/30000."); + migrationLog.AppendLine(" + De signaleringswaarde is gelijk gesteld aan 1/30000 (voorheen de waarde van de norm)."); + migrationLog.AppendLine(" + De norm van het dijktraject is gelijk gesteld aan de signaleringswaarde."); + migrationLog.AppendLine(" + Toetsspoor: 'Hoogte kunstwerk'"); + migrationLog.AppendLine(" - Het ID van kunstwerk 'Id' is veranderd naar 'Id00003'."); + migrationLog.AppendLine(" - Het ID van voorlandprofiel 'FP' is veranderd naar 'FP7'."); + migrationLog.AppendLine(" + Toetsspoor: 'Betrouwbaarheid sluiting kunstwerk'"); + migrationLog.AppendLine(" - Het ID van kunstwerk 'id' is veranderd naar 'id00002'."); + migrationLog.AppendLine(" - Het ID van voorlandprofiel 'FP' is veranderd naar 'FP8'."); + migrationLog.AppendLine(" + Toetsspoor: 'Golfklappen op asfaltbekleding'"); + migrationLog.AppendLine(" - Het ID van voorlandprofiel 'FP' is veranderd naar 'FP9'."); + migrationLog.AppendLine(" + Toetsspoor: 'Grasbekleding erosie buitentalud'"); + migrationLog.AppendLine(" - Het ID van voorlandprofiel 'FP' is veranderd naar 'FP10'."); + migrationLog.AppendLine(" + Toetsspoor: 'Stabiliteit steenzetting'"); + migrationLog.AppendLine(" - Het ID van voorlandprofiel 'FP' is veranderd naar 'FP11'."); + migrationLog.AppendLine(" + Toetsspoor: 'Sterkte en stabiliteit puntconstructies'"); + migrationLog.AppendLine(" - Het ID van kunstwerk 'anId' is veranderd naar 'anId000000002'."); + migrationLog.AppendLine(" - Het ID van voorlandprofiel 'FP' is veranderd naar 'FP12'."); + migrationLog.AppendLine("* Traject: 'Demo traject'"); + migrationLog.AppendLine(" + De ondergrens is gelijk gesteld aan 1/1000."); + migrationLog.AppendLine(" + De signaleringswaarde is gelijk gesteld aan 1/30000 (voorheen de waarde van de norm)."); + migrationLog.AppendLine(" + De norm van het dijktraject is gelijk gesteld aan de signaleringswaarde."); + migrationLog.AppendLine("Gevolgen van de migratie van versie 17.2 naar versie 17.3:"); + migrationLog.AppendLine("* Geen aanpassingen."); + migrationLog.AppendLine("Gevolgen van de migratie van versie 17.3 naar versie 18.1:"); + migrationLog.AppendLine("* Traject: 'assessmentSection'"); + migrationLog.AppendLine(" + Toetsspoor: 'Piping'"); + migrationLog.AppendLine(" - De waarde '3.2' voor de verschuiving van parameter 'Verzadigd gewicht' van ondergrondlaag 'HotPinkLayer' is ongeldig en is veranderd naar NaN."); + migrationLog.AppendLine(" + Toetsspoor: 'Sterkte en stabiliteit langsconstructies'"); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Technische innovaties'"); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Wateroverdruk bij asfaltbekleding'"); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Betrouwbaarheid sluiting kunstwerk'"); + migrationLog.AppendLine(" - De waarde van '0' van parameter 'Aantal identieke doorstroomopeningen' van berekening 'Nieuwe berekening' is ongeldig en is veranderd naar 1."); + migrationLog.AppendLine(" + Toetsspoor: 'Macrostabiliteit buitenwaarts'"); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Golfklappen op asfaltbekleding'"); + migrationLog.AppendLine(" - Alle resultaten voor de gedetailleerde toets van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Grasbekleding erosie buitentalud'"); + migrationLog.AppendLine(" - Alle resultaten voor de gedetailleerde toets van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Grasbekleding afschuiven binnentalud'"); + migrationLog.AppendLine(" - Alle resultaten voor de gedetailleerde toets van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Grasbekleding afschuiven buitentalud'"); + migrationLog.AppendLine(" - Alle resultaten voor de gedetailleerde toets van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Microstabiliteit'"); + migrationLog.AppendLine(" - Alle resultaten voor de gedetailleerde toets van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Piping bij kunstwerk'"); + migrationLog.AppendLine(" - Alle resultaten voor de gedetailleerde toets van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Stabiliteit steenzetting'"); + migrationLog.AppendLine(" - Alle resultaten voor de gedetailleerde toets van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" + Toetsspoor: 'Duinafslag'"); + migrationLog.AppendLine(" - Alle resultaten voor de gedetailleerde toets van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine(" - Alle resultaten voor de toets op maat van dit toetsspoor konden niet worden omgezet naar een geldig resultaat en zijn verwijderd."); + migrationLog.AppendLine("Gevolgen van de migratie van versie 18.1 naar versie 19.1:"); + migrationLog.AppendLine("* Traject: 'assessmentSection'"); + migrationLog.AppendLine(" + Er worden standaardwaarden conform WBI2017 voor de HLCD bestand informatie gebruikt."); + migrationLog.AppendLine(" + De waarde voor de transparantie van de achtergrondkaart is aangepast naar 0.60."); + migrationLog.AppendLine("* Traject: 'Demo traject'"); + migrationLog.AppendLine(" + Er worden standaardwaarden conform WBI2017 voor de HLCD bestand informatie gebruikt."); + migrationLog.AppendLine(" + De waarde voor de transparantie van de achtergrondkaart is aangepast naar 0.60."); + + Tuple[] expectedLogMessagesAndLevel = + { + Tuple.Create(expectedMessage, LogLevelConstant.Info), + Tuple.Create(migrationLog.ToString(), LogLevelConstant.Info) + }; + TestHelper.AssertLogMessagesWithLevelAreGenerated(call, expectedLogMessagesAndLevel, 2); + + Assert.IsTrue(migrationSuccessful); + + var toVersionedFile = new RingtoetsVersionedFile(targetFilePath); + Assert.AreEqual(currentDatabaseVersion, toVersionedFile.GetVersion()); + } + + string logPath = Path.Combine(TestHelper.GetScratchPadPath(), logDirectory, "RingtoetsMigrationLog.sqlite"); + Assert.IsFalse(File.Exists(logPath)); + + mocks.VerifyAll(); + } + + [Test] + public void Migrate_MigrationLogDatabaseInUse_MigrationFailsAndLogsError() + { + // Setup + string sourceFilePath = RingtoetsProjectMigrationTestHelper.GetOutdatedSupportedProjectFilePath(); + string targetFile = $"{nameof(RingtoetsProjectMigratorTest)}." + + $"{nameof(Migrate_MigrationLogDatabaseInUse_MigrationFailsAndLogsError)}.rtd"; + string targetFilePath = Path.Combine(TestHelper.GetScratchPadPath(), testDirectory, targetFile); + + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + string logDirectory = $"{nameof(Migrate_MigrationLogDatabaseInUse_MigrationFailsAndLogsError)}_log"; + + string logPath = Path.Combine(TestHelper.GetScratchPadPath(), logDirectory, "RingtoetsMigrationLog.sqlite"); + + using (new DirectoryDisposeHelper(TestHelper.GetScratchPadPath(), logDirectory)) + using (new UseCustomSettingsHelper(new TestSettingsHelper + { + TempPath = TestHelper.GetScratchPadPath(logDirectory) + })) + using (var fileDisposeHelper = new FileDisposeHelper(logPath)) + { + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + fileDisposeHelper.LockFiles(); + + var migrationSuccessful = true; + + // Call + Action call = () => migrationSuccessful = migrator.Migrate(sourceFilePath, targetFilePath); + + // Assert + Tuple logMessage = Tuple.Create( + $"Het is niet mogelijk om het Ringtoets logbestand '{logPath}' aan te maken.", + LogLevelConstant.Error); + TestHelper.AssertLogMessageWithLevelIsGenerated(call, logMessage); + Assert.IsFalse(migrationSuccessful); + + Assert.IsTrue(File.Exists(logPath)); + } + + mocks.VerifyAll(); + } + + [Test] + public void Migrate_UnableToSaveAtTargetFilePath_MigrationFailsAndLogsError() + { + // Setup + string sourceFilePath = RingtoetsProjectMigrationTestHelper.GetOutdatedSupportedProjectFilePath(); + string targetFile = $"{nameof(RingtoetsProjectMigratorTest)}." + + $"{nameof(Migrate_UnableToSaveAtTargetFilePath_MigrationFailsAndLogsError)}.rtd"; + string targetFilePath = Path.Combine(TestHelper.GetScratchPadPath(), testDirectory, targetFile); + + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + string logDirectory = $"{nameof(Migrate_UnableToSaveAtTargetFilePath_MigrationFailsAndLogsError)}_log"; + using (new DirectoryDisposeHelper(TestHelper.GetScratchPadPath(), logDirectory)) + using (new UseCustomSettingsHelper(new TestSettingsHelper + { + TempPath = TestHelper.GetScratchPadPath(logDirectory) + })) + using (var fileDisposeHelper = new FileDisposeHelper(targetFilePath)) + { + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + fileDisposeHelper.LockFiles(); + + var migrationSuccessful = true; + + // Call + Action call = () => migrationSuccessful = migrator.Migrate(sourceFilePath, targetFilePath); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + string[] msgs = messages.ToArray(); + Assert.AreEqual(1, msgs.Length); + StringAssert.StartsWith($"Het migreren van het projectbestand '{sourceFilePath}' is mislukt: ", msgs[0]); + }); + Assert.IsFalse(migrationSuccessful); + + string logPath = Path.Combine(TestHelper.GetScratchPadPath(), logDirectory, "RingtoetsMigrationLog.sqlite"); + Assert.IsFalse(File.Exists(logPath)); + } + + mocks.VerifyAll(); + } + + [Test] + public void Migrate_UnsupportedSourceFileVersion_MigrationFailsAndLogsError() + { + // Setup + string sourceFilePath = RingtoetsProjectMigrationTestHelper.GetOutdatedUnSupportedProjectFilePath(); + string targetFile = $"{nameof(RingtoetsProjectMigratorTest)}." + + $"{nameof(Migrate_UnsupportedSourceFileVersion_MigrationFailsAndLogsError)}"; + string targetFilePath = Path.Combine(TestHelper.GetScratchPadPath(), testDirectory, targetFile); + + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + string logDirectory = $"{nameof(Migrate_UnsupportedSourceFileVersion_MigrationFailsAndLogsError)}_log"; + using (new DirectoryDisposeHelper(TestHelper.GetScratchPadPath(), logDirectory)) + using (new UseCustomSettingsHelper(new TestSettingsHelper + { + TempPath = TestHelper.GetScratchPadPath(logDirectory) + })) + { + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + var migrationSuccessful = true; + + // Call + Action call = () => migrationSuccessful = migrator.Migrate(sourceFilePath, targetFilePath); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + string[] msgs = messages.ToArray(); + Assert.AreEqual(1, msgs.Length); + StringAssert.StartsWith($"Het migreren van het projectbestand '{sourceFilePath}' is mislukt: ", msgs[0]); + }); + Assert.IsFalse(migrationSuccessful); + + string logPath = Path.Combine(TestHelper.GetScratchPadPath(logDirectory), "RingtoetsMigrationLog.sqlite"); + Assert.IsFalse(File.Exists(logPath)); + } + + mocks.VerifyAll(); + } + + [Test] + public void Migrate_TargetFileSameAsSourceFile_MigrationFailsAndLogsError() + { + // Setup + string sourceFilePath = RingtoetsProjectMigrationTestHelper.GetOutdatedSupportedProjectFilePath(); + + var mocks = new MockRepository(); + var inquiryHelper = mocks.Stub(); + mocks.ReplayAll(); + + string logDirectory = $"{nameof(Migrate_TargetFileSameAsSourceFile_MigrationFailsAndLogsError)}_log"; + using (new DirectoryDisposeHelper(TestHelper.GetScratchPadPath(), logDirectory)) + using (new UseCustomSettingsHelper(new TestSettingsHelper + { + TempPath = TestHelper.GetScratchPadPath(logDirectory) + })) + { + var migrator = new RingtoetsProjectMigrator(inquiryHelper); + + var migrationSuccessful = true; + + // Call + Action call = () => migrationSuccessful = migrator.Migrate(sourceFilePath, sourceFilePath); + + // Assert + TestHelper.AssertLogMessages(call, messages => + { + string[] msgs = messages.ToArray(); + Assert.AreEqual(1, msgs.Length); + StringAssert.StartsWith($"Het migreren van het projectbestand '{sourceFilePath}' is mislukt: ", msgs[0]); + }); + Assert.IsFalse(migrationSuccessful); + + string logPath = Path.Combine(TestHelper.GetScratchPadPath(), logDirectory, "RingtoetsMigrationLog.sqlite"); + Assert.IsFalse(File.Exists(logPath)); + } + + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Ringtoets/Migration/test/Riskeer.Migration.Test/Riskeer.Migration.Test.csproj =================================================================== diff -u --- Ringtoets/Migration/test/Riskeer.Migration.Test/Riskeer.Migration.Test.csproj (revision 0) +++ Ringtoets/Migration/test/Riskeer.Migration.Test/Riskeer.Migration.Test.csproj (revision 5da9e26c544c8e3be801086ac660bc787a31b6cf) @@ -0,0 +1,80 @@ + + + + {408F6A6B-7BF7-4F59-A5D4-893A777921D3} + Riskeer.Migration.Test + Riskeer.Migration.Test + + + + + ..\..\..\..\packages\NUnit.3.8.1\lib\net40\nunit.framework.dll + True + + + ..\..\..\..\packages\RhinoMocks.3.6.1\lib\net\Rhino.Mocks.dll + True + + + + + + + + + + + Copying.licenseheader + + + + + + {3BBFD65B-B277-4E50-AE6D-BD24C3434609} + Core.Common.Base + + + {30E4C2AE-719E-4D70-9FA9-668A9767FBFA} + Core.Common.Gui + + + {f49bd8b2-332a-4c91-a196-8cce0a2c7d98} + Core.Common.Util + + + {D749EE4C-CE50-4C17-BF01-9A953028C126} + Core.Common.TestUtil + + + {45193749-ECE8-40C4-8C4B-0C783AFFACB5} + Core.Common.Util.TestUtil + + + {d08db9e2-6861-44c8-a725-71a70274cc77} + Migration.Scripts.Data + + + {6A074D65-A81C-4C1C-8E24-F36C916E4ED7} + Ringtoets.Common.Util + + + {AC4F7F48-F674-4E32-AB35-9C726605F684} + Riskeer.Migration + + + {fac55b92-e259-43d6-b9a1-5bda6c834359} + Riskeer.Migration.Core + + + {C98D99C5-2ADD-4693-916C-71BF78750412} + Riskeer.Migration.Core.TestUtil + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file Index: Ringtoets/Migration/test/Riskeer.Migration.Test/packages.config =================================================================== diff -u --- Ringtoets/Migration/test/Riskeer.Migration.Test/packages.config (revision 0) +++ Ringtoets/Migration/test/Riskeer.Migration.Test/packages.config (revision 5da9e26c544c8e3be801086ac660bc787a31b6cf) @@ -0,0 +1,27 @@ + + + + + + \ No newline at end of file