// 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();
}
}
}