// 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.Collections.Generic; using System.Linq; using Application.Ringtoets.Storage.DbContext; using Application.Ringtoets.Storage.Exceptions; using Application.Ringtoets.Storage.Persistors; using Application.Ringtoets.Storage.TestUtil; using NUnit.Framework; using Rhino.Mocks; using Ringtoets.Piping.Data; using Ringtoets.Piping.KernelWrapper.TestUtil; using Ringtoets.Piping.Primitives; namespace Application.Ringtoets.Storage.Test.Persistors { [TestFixture] public class StochasticSoilModelPersistorTest { private MockRepository mockRepository; [SetUp] public void Setup() { mockRepository = new MockRepository(); } [Test] public void Constructor_EmptyDataSet_NewInstance() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); // Call StochasticSoilModelPersistor persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); // Assert Assert.IsInstanceOf(persistor); mockRepository.VerifyAll(); } [Test] public void Constructor_NullDataSet_ThrowsAgrumentNullException() { // Call TestDelegate test = () => new StochasticSoilModelPersistor(null); // Assert var exception = Assert.Throws(test); Assert.AreEqual("ringtoetsContext", exception.ParamName); } [Test] public void LoadModel_NullEntity_ThrowsArgumentNullException() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); // Call TestDelegate test = () => persistor.LoadModel(null); // Assert var exception = Assert.Throws(test); Assert.AreEqual("entity", exception.ParamName); mockRepository.VerifyAll(); } [Test] public void LoadModel_ValidEntityValidModel_EntityAsModel() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); const string name = "someName"; const string segmentName = "someSegmentName"; long storageId = new Random(21).Next(); var entity = new StochasticSoilModelEntity { Name = name, SegmentName = segmentName, StochasticSoilModelEntityId = storageId }; // Call StochasticSoilModel model = persistor.LoadModel(entity); // Assert Assert.AreEqual(name, model.Name); Assert.AreEqual(segmentName, model.SegmentName); Assert.AreEqual(storageId, model.StorageId); mockRepository.VerifyAll(); } [Test] public void LoadModel_ValidEntityValidModelWithStochasticProfiles_EntityAsModel() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); const string name = "someName"; const string segmentName = "someSegmentName"; long storageId = new Random(21).Next(); var entity = new StochasticSoilModelEntity { Name = name, SegmentName = segmentName, StochasticSoilModelEntityId = storageId, StochasticSoilProfileEntities = new List { new StochasticSoilProfileEntity { Probability = Convert.ToDecimal(0.5), SoilProfileEntity = new SoilProfileEntity { Bottom = Convert.ToDecimal(-1.5), SoilLayerEntities = new[] { new SoilLayerEntity { Top = Convert.ToDecimal(1.0) } } } } } }; // Call StochasticSoilModel model = persistor.LoadModel(entity); // Assert var stochasticProfile = model.StochasticSoilProfiles.ElementAt(0); var soilProfile = stochasticProfile.SoilProfile; Assert.AreEqual(-1.5, soilProfile.Bottom); Assert.AreEqual(1, soilProfile.Layers.Count()); var soilLayer = soilProfile.Layers.ElementAt(0); Assert.AreEqual(1.0, soilLayer.Top); mockRepository.VerifyAll(); } [Test] public void InsertModel_NullParentNavigationProperty_ThrowsArgumentNullException() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); // Call TestDelegate test = () => persistor.InsertModel(null, new StochasticSoilModel(-1, string.Empty, string.Empty)); // Assert var exception = Assert.Throws(test); Assert.AreEqual("parentNavigationProperty", exception.ParamName); mockRepository.VerifyAll(); } [Test] public void InsertModel_NullModel_DoesNotAddEntityInParentNavigationProperty() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); var parentNavigationProperty = new List(); // Call TestDelegate test = () => persistor.InsertModel(parentNavigationProperty, null); // Assert Assert.DoesNotThrow(test); Assert.IsEmpty(parentNavigationProperty); mockRepository.VerifyAll(); } [Test] public void InsertModel_SingleEntityInParentNavigationPropertyStochasticSoilModelWithSameStorageId_StochasticSoilModelAsEntityInParentNavigationProperty() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); const long storageId = 1234L; StochasticSoilModelEntity entityToDelete = new StochasticSoilModelEntity { StochasticSoilModelEntityId = storageId }; IList parentNavigationProperty = new List { entityToDelete }; StochasticSoilModel model = new StochasticSoilModel(-1, string.Empty, string.Empty) { StorageId = storageId }; // Call persistor.InsertModel(parentNavigationProperty, model); // Assert Assert.AreEqual(2, parentNavigationProperty.Count); var parentNavigationPropertyList = parentNavigationProperty.ToList(); var entity = parentNavigationPropertyList[1]; Assert.AreEqual(storageId, entity.StochasticSoilModelEntityId); mockRepository.VerifyAll(); } [Test] public void InsertModel_SingleStochasticSoilModelWithStochasticSoilProfiles_StochasticSoilModelAsEntityInParentNavigationProperty() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); const long storageId = 1234L; StochasticSoilModelEntity entityToDelete = new StochasticSoilModelEntity { StochasticSoilModelEntityId = storageId }; IList parentNavigationProperty = new List { entityToDelete }; StochasticSoilModel model = new StochasticSoilModel(-1, string.Empty, string.Empty) { StorageId = storageId, StochasticSoilProfiles = { new StochasticSoilProfile(0.2, SoilProfileType.SoilProfile1D, -1) { SoilProfile = new TestPipingSoilProfile() } } }; // Call persistor.InsertModel(parentNavigationProperty, model); // Assert Assert.AreEqual(2, parentNavigationProperty.Count); var parentNavigationPropertyList = parentNavigationProperty.ToList(); var entity = parentNavigationPropertyList[1]; Assert.AreEqual(storageId, entity.StochasticSoilModelEntityId); mockRepository.VerifyAll(); } [Test] public void UpdateModel_NullDatasetValidModel_ThrowsArgumentNullException() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); var soilModel = new StochasticSoilModel(-1, string.Empty, string.Empty); // Call TestDelegate test = () => persistor.UpdateModel(null, soilModel); // Assert var exception = Assert.Throws(test); Assert.AreEqual("parentNavigationProperty", exception.ParamName); mockRepository.VerifyAll(); } [Test] public void UpdateModel_EmptyDatasetNullModel_DoesNotThrow() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List(); // Call TestDelegate test = () => persistor.UpdateModel(parentNavigationProperty, null); // Assert Assert.DoesNotThrow(test); } [Test] public void UpdateModel_EmptyDataset_ThrowsEntityNotFoundException() { // Setup const long storageId = 1234L; var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List(); var soilModel = new StochasticSoilModel(-1, string.Empty, string.Empty) { StorageId = storageId }; // Call TestDelegate test = () => persistor.UpdateModel(parentNavigationProperty, soilModel); // Assert var expectedMessage = String.Format("Het object 'StochasticSoilModelEntity' met id '{0}' is niet gevonden.", storageId); var exception = Assert.Throws(test); Assert.AreEqual(expectedMessage, exception.Message); mockRepository.VerifyAll(); } [Test] public void UpdateModel_DuplicateEntityInDataset_ThrowsEntityNotFoundException() { // Setup const long storageId = 1234L; var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List { new StochasticSoilModelEntity { StochasticSoilModelEntityId = storageId }, new StochasticSoilModelEntity { StochasticSoilModelEntityId = storageId } }; var soilModel = new StochasticSoilModel(-1, string.Empty, string.Empty) { StorageId = storageId }; // Call TestDelegate test = () => persistor.UpdateModel(parentNavigationProperty, soilModel); // Assert var expectedMessage = String.Format("Het object 'StochasticSoilModelEntity' met id '{0}' is niet gevonden.", storageId); var exception = Assert.Throws(test); Assert.AreEqual(expectedMessage, exception.Message); mockRepository.VerifyAll(); } [Test] public void UpdateModel_SingleEntityInParentNavigationPropertySingleStochasticSoilModelWithStorageId_UpdatedStochasticSoilModelAsEntityInParentNavigationProperty() { // Setup const long storageId = 1234L; var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); var parentNavigationProperty = new [] { new StochasticSoilModelEntity { StochasticSoilModelEntityId = storageId } }; var name = "someName"; var segmentName = "someSegmentName"; var soilModel = new StochasticSoilModel(-1, name, segmentName) { StorageId = storageId }; // Call persistor.UpdateModel(parentNavigationProperty, soilModel); // Assert Assert.AreEqual(1, parentNavigationProperty.Length); var parentNavigationPropertyList = parentNavigationProperty.ToList(); var entity = parentNavigationPropertyList[0]; Assert.AreEqual(storageId, entity.StochasticSoilModelEntityId); Assert.AreEqual(name, entity.Name); Assert.AreEqual(segmentName, entity.SegmentName); mockRepository.VerifyAll(); } [Test] public void UpdateModel_NoStorageIdSet_InsertNewEntity() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List(); var name = "someName"; var segmentName = "someSegmentName"; var soilModel = new StochasticSoilModel(-1, name, segmentName) { StorageId = 0 }; // Call persistor.UpdateModel(parentNavigationProperty, soilModel); // Assert Assert.AreEqual(1, parentNavigationProperty.Count); mockRepository.VerifyAll(); } [Test] public void UpdateModel_SingleEntityInParentNavigationPropertySingleStochasticSoilModelWithoutStorageId_UpdatedStochasticSoilModelAsEntityInParentNavigationProperty() { // Setup const long storageId = 0L; // Newly inserted entities have Id = 0 untill they are saved var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); StochasticSoilModelEntity entityToDelete = new StochasticSoilModelEntity { StochasticSoilModelEntityId = 4567L, Name = "Entity to delete" }; ringtoetsEntitiesMock.StochasticSoilModelEntities.Add(entityToDelete); var parentNavigationProperty = new List { entityToDelete }; mockRepository.ReplayAll(); StochasticSoilModelPersistor persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); var name = "someName"; var segmentName = "someSegmentName"; var soilModel = new StochasticSoilModel(-1, name, segmentName); // Call persistor.UpdateModel(parentNavigationProperty, soilModel); // Assert Assert.AreEqual(2, parentNavigationProperty.Count); StochasticSoilModelEntity entity = parentNavigationProperty.SingleOrDefault(x => x.StochasticSoilModelEntityId == storageId); Assert.IsNotNull(entity); Assert.AreEqual(storageId, entity.StochasticSoilModelEntityId); Assert.AreEqual(name, entity.Name); Assert.AreEqual(segmentName, entity.SegmentName); mockRepository.VerifyAll(); } [Test] public void RemoveUnModifiedEntries_SingleEntityInParentNavigationPropertySingleStochasticSoilModelWithoutStorageId_DbSetCleared() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); StochasticSoilModelEntity entityToDelete = new StochasticSoilModelEntity { StochasticSoilModelEntityId = 4567L, Name = "Entity to delete" }; ringtoetsEntitiesMock.StochasticSoilModelEntities.Add(entityToDelete); var parentNavigationProperty = new List { entityToDelete }; mockRepository.ReplayAll(); StochasticSoilModelPersistor persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); var name = "someName"; var segmentName = "someSegmentName"; var soilModel = new StochasticSoilModel(-1, name, segmentName); persistor.UpdateModel(parentNavigationProperty, soilModel); // Call persistor.RemoveUnModifiedEntries(parentNavigationProperty); // Assert Assert.IsEmpty(ringtoetsEntitiesMock.StochasticSoilModelEntities); mockRepository.VerifyAll(); } [Test] public void PerformPostSaveActions_NoInserts_DoesNotThrowException() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); // Call TestDelegate test = () => persistor.PerformPostSaveActions(); // Assert Assert.DoesNotThrow(test); mockRepository.VerifyAll(); } [Test] [TestCase(0)] [TestCase(1)] [TestCase(2)] public void PerformPostSaveActions_MultipleModelsInsertedWithoutStorageId_ModelsWithStorageId(int numberOfInserts) { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var parentNavigationProperty = new List(); IList stochasticSoilModel = new List(); var persistor = new StochasticSoilModelPersistor(ringtoetsEntitiesMock); try { for (var i = 0; i < numberOfInserts; i++) { var soilModel = new StochasticSoilModel(-1, string.Empty, string.Empty) { StorageId = 0L }; stochasticSoilModel.Add(soilModel); persistor.UpdateModel(parentNavigationProperty, soilModel); } } catch (Exception) { Assert.Fail("Precondition failed: persistor.UpdateModel"); } // Call for (var i = 0; i < parentNavigationProperty.Count; i++) { parentNavigationProperty[i].StochasticSoilModelEntityId = 1L + i; } persistor.PerformPostSaveActions(); // Assert Assert.AreEqual(stochasticSoilModel.Count, parentNavigationProperty.Count); foreach (var entity in parentNavigationProperty) { StochasticSoilModel insertedModel = stochasticSoilModel.SingleOrDefault(x => x.StorageId == entity.StochasticSoilModelEntityId); Assert.IsNotNull(insertedModel); } mockRepository.VerifyAll(); } } }