// 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.Collections.ObjectModel; 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.HydraRing.Data; namespace Application.Ringtoets.Storage.Test.Persistors { [TestFixture] public class HydraulicBoundaryLocationPersistorTest { private MockRepository mockRepository; [SetUp] public void Setup() { mockRepository = new MockRepository(); } [Test] public void Constructor_NullDataSet_ThrowsAgrumentNullException() { // Call TestDelegate test = () => new HydraulicBoundaryLocationPersistor(null); // Assert var exception = Assert.Throws(test); Assert.AreEqual("ringtoetsContext", exception.ParamName); } [Test] public void Constructor_EmptyDataSet_NewInstance() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); // Call HydraulicBoundaryLocationPersistor persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); // Assert Assert.IsInstanceOf(persistor); mockRepository.VerifyAll(); } [Test] public void LoadModel_NullEntity_ThrowsArgumentNullException() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); // Call TestDelegate test = () => persistor.LoadModel(null); // Assert var exception = Assert.Throws(test); Assert.AreEqual("entities", exception.ParamName); mockRepository.VerifyAll(); } [Test] public void LoadModel_ValidEntityValidModel_EntityAsModel() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); const string name = "test"; const double designWaterLevel = 15.6; const long locationId = 1300001; const long storageId = 1234L; const decimal locationX = 253; const decimal locationY = 123; var entity = new HydraulicLocationEntity() { LocationId = locationId, Name = name, DesignWaterLevel = designWaterLevel, HydraulicLocationEntityId = storageId, LocationX = locationX, LocationY = locationY }; // Call List locations = persistor.LoadModel(new List { entity }).ToList(); // Assert Assert.AreEqual(1, locations.Count); var location = locations[0]; Assert.AreEqual(locationId, location.Id); Assert.AreEqual(name, location.Name); Assert.AreEqual(designWaterLevel, location.DesignWaterLevel); Assert.AreEqual(locationX, location.Location.X); Assert.AreEqual(locationY, location.Location.Y); Assert.AreEqual(storageId, location.StorageId); mockRepository.VerifyAll(); } [Test] public void InsertModel_NullParentNavigationProperty_ThrowsArgumentNullException() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(1, "test", 1, 1)); // Call TestDelegate test = () => persistor.InsertModel(null, hydraulicBoundaryDatabase); // 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 HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); var parentNavigationProperty = new List(); // Call TestDelegate test = () => persistor.InsertModel(parentNavigationProperty, null); // Assert Assert.DoesNotThrow(test); CollectionAssert.AreEquivalent(new List(), parentNavigationProperty); mockRepository.VerifyAll(); } [Test] public void InsertModel_SingleEntityInParentNavigationPropertyHydraulicLocationWithSameStorageId_HydraulicLocationAsEntityInParentNavigationProperty() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); const long storageId = 1234L; HydraulicLocationEntity entityToDelete = new HydraulicLocationEntity { HydraulicLocationEntityId = storageId }; IList parentNavigationProperty = new List { entityToDelete }; HydraulicBoundaryLocation model = new HydraulicBoundaryLocation(13001, "test", 13, 52) { StorageId = storageId }; HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(model); // Call persistor.InsertModel(parentNavigationProperty, hydraulicBoundaryDatabase); // Assert Assert.AreEqual(2, parentNavigationProperty.Count); var parentNavigationPropertyList = parentNavigationProperty.ToList(); var entity = parentNavigationPropertyList[1]; Assert.AreEqual(storageId, entity.HydraulicLocationEntityId); mockRepository.VerifyAll(); } [Test] public void InsertModel_LocationNull_ThrowsArgumentNullException() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List(); HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(null); // Call TestDelegate test = () => persistor.InsertModel(parentNavigationProperty, hydraulicBoundaryDatabase); // Assert Assert.Throws(test); mockRepository.VerifyAll(); } [Test] public void InsertModel_LocationToBig_ThrowsOverflowException() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List(); HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(1, "name", Double.PositiveInfinity, 1)); // Call TestDelegate test = () => persistor.InsertModel(parentNavigationProperty, hydraulicBoundaryDatabase); // Assert Assert.Throws(test); mockRepository.VerifyAll(); } [Test] public void UpdateModel_NullDatasetValidModel_ThrowsArgumentNullException() { // Setup const long storageId = 1234L; var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); HydraulicBoundaryLocation model = new HydraulicBoundaryLocation(13001, "test", 13, 52) { StorageId = storageId }; HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(model); // Call TestDelegate test = () => persistor.UpdateModel(null, hydraulicBoundaryDatabase); // 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 HydraulicBoundaryLocationPersistor(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 HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List(); HydraulicBoundaryLocation model = new HydraulicBoundaryLocation(13001, "test", 13, 52) { StorageId = storageId }; HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(model); // Call TestDelegate test = () => persistor.UpdateModel(parentNavigationProperty, hydraulicBoundaryDatabase); // Assert var expectedMessage = String.Format("Het object 'HydraulicLocationEntity' 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 HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List { new HydraulicLocationEntity { HydraulicLocationEntityId = storageId }, new HydraulicLocationEntity { HydraulicLocationEntityId = storageId } }; HydraulicBoundaryLocation model = new HydraulicBoundaryLocation(13001, "test", 13, 52) { StorageId = storageId }; HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(model); // Call TestDelegate test = () => persistor.UpdateModel(parentNavigationProperty, hydraulicBoundaryDatabase); // Assert var expectedMessage = String.Format("Het object 'HydraulicLocationEntity' met id '{0}' is niet gevonden.", storageId); var exception = Assert.Throws(test); Assert.AreEqual(expectedMessage, exception.Message); mockRepository.VerifyAll(); } [Test] public void UpdateModel_SingleEntityInParentNavigationPropertySingleHydraulicLocationWithStorageId_UpdatedHydraulicLocationAsEntityInParentNavigationProperty() { // Setup const long storageId = 1234L; var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List { new HydraulicLocationEntity { HydraulicLocationEntityId = storageId } }; HydraulicBoundaryLocation model = new HydraulicBoundaryLocation(13001, "test", 13, 52) { StorageId = storageId }; HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(model); // Call persistor.UpdateModel(parentNavigationProperty, hydraulicBoundaryDatabase); // Assert Assert.AreEqual(1, parentNavigationProperty.Count); var parentNavigationPropertyList = parentNavigationProperty.ToList(); var entity = parentNavigationPropertyList[0]; Assert.AreEqual(storageId, entity.HydraulicLocationEntityId); mockRepository.VerifyAll(); } [Test] public void UpdateModel_NoStorageIdSet_InsertNewEntity() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List(); HydraulicBoundaryLocation model = new HydraulicBoundaryLocation(13001, "test", 13, 52) { StorageId = 0 }; HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(model); // Call persistor.UpdateModel(parentNavigationProperty, hydraulicBoundaryDatabase); // Assert Assert.AreEqual(1, parentNavigationProperty.Count); mockRepository.VerifyAll(); } [Test] public void UpdateModel_LocationToBig_ThrowsOverflowException() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); var persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); IList parentNavigationProperty = new List(); HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(1, "name", Double.PositiveInfinity, 1)); // Call TestDelegate test = () => persistor.UpdateModel(parentNavigationProperty, hydraulicBoundaryDatabase); // Assert Assert.Throws(test); mockRepository.VerifyAll(); } [Test] public void UpdateModel_SingleEntityInParentNavigationPropertySingleHydraulicLocationWithoutStorageId_UpdatedHydraulicLocationAsEntityInParentNavigationPropertyAndOthersDeletedInDbSet() { // Setup const long storageId = 0L; // Newly inserted entities have Id = 0 untill they are saved var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); HydraulicLocationEntity entityToDelete = new HydraulicLocationEntity { HydraulicLocationEntityId = 4567L, Name = "Entity to delete" }; ringtoetsEntitiesMock.HydraulicLocationEntities.Add(entityToDelete); var parentNavigationProperty = new List { entityToDelete }; mockRepository.ReplayAll(); HydraulicBoundaryLocationPersistor persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); HydraulicBoundaryLocation location = new HydraulicBoundaryLocation(13001, "test", 13, 52); HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.Add(location); // Call persistor.UpdateModel(parentNavigationProperty, hydraulicBoundaryDatabase); // Assert CollectionAssert.IsEmpty(ringtoetsEntitiesMock.HydraulicLocationEntities); Assert.AreEqual(2, parentNavigationProperty.Count); HydraulicLocationEntity entity = parentNavigationProperty.SingleOrDefault(x => x.HydraulicLocationEntityId == storageId); Assert.IsNotNull(entity); Assert.AreEqual(storageId, entity.HydraulicLocationEntityId); mockRepository.VerifyAll(); } [Test] public void PerformPostSaveActions_NoInserts_DoesNotThrowException() { // Setup var ringtoetsEntitiesMock = RingtoetsEntitiesHelper.Create(mockRepository); mockRepository.ReplayAll(); HydraulicBoundaryLocationPersistor persistor = new HydraulicBoundaryLocationPersistor(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 hydraulicLocations = new List(); for (var i = 0; i < numberOfInserts; i++) { hydraulicLocations.Add(new HydraulicBoundaryLocation(13001, "test", 13, 52) { StorageId = 0L }); } HydraulicBoundaryDatabase hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); hydraulicBoundaryDatabase.Locations.AddRange(hydraulicLocations); HydraulicBoundaryLocationPersistor persistor = new HydraulicBoundaryLocationPersistor(ringtoetsEntitiesMock); try { persistor.UpdateModel(parentNavigationProperty, hydraulicBoundaryDatabase); } catch (Exception) { Assert.Fail("Precondition failed: persistor.UpdateModel"); } // Call for (var i = 0; i < parentNavigationProperty.Count; i++) { parentNavigationProperty[i].HydraulicLocationEntityId = 1L + i; } persistor.PerformPostSaveActions(); // Assert Assert.AreEqual(hydraulicLocations.Count, parentNavigationProperty.Count); foreach (var entity in parentNavigationProperty) { HydraulicBoundaryLocation insertedModel = hydraulicLocations.SingleOrDefault(x => x.StorageId == entity.HydraulicLocationEntityId); Assert.IsNotNull(insertedModel); } mockRepository.VerifyAll(); } } }