// 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.Common.Data;
using Ringtoets.Common.Data.AssessmentSection;
using Ringtoets.Integration.Data;
using Ringtoets.Piping.Data;
namespace Application.Ringtoets.Storage.Test.Persistors
{
[TestFixture]
public class PipingFailureMechanismPersistorTest
{
private MockRepository mockRepository;
[SetUp]
public void SetUp()
{
mockRepository = new MockRepository();
}
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void Constructor_NullDataSet_ThrowsArgumentNullException()
{
// Call
PipingFailureMechanismPersistor p = new PipingFailureMechanismPersistor(null);
}
[Test]
public void Constructor_EmptyDataset_NewInstance()
{
// Setup
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
// Call
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
// Assert
Assert.IsInstanceOf(persistor);
mockRepository.VerifyAll();
}
[Test]
public void LoadModel_NullEntity_ThrowsArgumentNullException()
{
// Setup
var ringtoetsEntities = mockRepository.StrictMock();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
// Call
TestDelegate test = () => persistor.LoadModel(null, new Piping());
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("entity", exception.ParamName);
}
[Test]
public void LoadModel_NullAssessmentSection_ThrowsArgumentNullException()
{
// Setup
var ringtoetsEntities = mockRepository.StrictMock();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
FailureMechanismEntity entity = new FailureMechanismEntity();
// Call
TestDelegate test = () => persistor.LoadModel(entity, null);
// Assert
var exception = Assert.Throws(test);
Assert.AreEqual("failureMechanism", exception.ParamName);
}
[Test]
public void LoadModel_EntityWithIncorrectType_ThrowsArgumentException()
{
// Setup
const long storageId = 1234L;
FailureMechanismEntity entity = new FailureMechanismEntity
{
FailureMechanismEntityId = storageId,
FailureMechanismType = (int) FailureMechanismType.StoneRevetmentFailureMechanism,
};
var ringtoetsEntities = mockRepository.StrictMock();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
// Call
TestDelegate test = () => persistor.LoadModel(entity, new Piping());
// Assert
Assert.Throws(test);
}
[Test]
public void LoadModel_ValidEntity_UpdatedModel()
{
// Setup
const long storageId = 1234L;
Piping model = new Piping
{
StorageId = storageId
};
FailureMechanismEntity entity = new FailureMechanismEntity
{
FailureMechanismEntityId = storageId,
FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism,
};
var ringtoetsEntities = mockRepository.StrictMock();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
var assessmentSection = new AssessmentSection(AssessmentSectionComposition.Dike);
// Call
persistor.LoadModel(entity, assessmentSection.Piping);
// Assert
Piping loadedModel = assessmentSection.Piping;
Assert.IsInstanceOf(loadedModel);
Assert.AreEqual(loadedModel.StorageId, entity.FailureMechanismEntityId);
Assert.AreEqual(model.StorageId, loadedModel.StorageId);
}
[Test]
public void InsertModel_NullDataset_ThrowsArgumentNullException()
{
// Setup
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
Piping model = new Piping();
// Call
TestDelegate test = () => persistor.InsertModel(null, model);
// Assert
Assert.Throws(test);
mockRepository.VerifyAll();
}
[Test]
public void InsertModel_EmptyDatasetNullModel_ThrowsArgumentNullException()
{
// Setup
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
IList parentNavigationProperty = new List();
// Call
TestDelegate test = () => persistor.InsertModel(parentNavigationProperty, null);
// Assert
Assert.Throws(test);
mockRepository.VerifyAll();
}
[Test]
public void InsertModel_EmptyDatasetValidModel_ValidEntityInDataModel()
{
// Setup
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
IList parentNavigationProperty = new List();
Piping model = new Piping();
// Call
persistor.InsertModel(parentNavigationProperty, model);
// Assert
Assert.AreEqual(1, parentNavigationProperty.Count);
var entity = parentNavigationProperty[0];
Assert.AreNotEqual(model, entity);
Assert.AreEqual((int) FailureMechanismType.PipingFailureMechanism, entity.FailureMechanismType);
mockRepository.VerifyAll();
}
[Test]
public void InsertModel_SingleEntityInParentNavigationPropertySinglePipingFailureMechanismWithSameStorageId_PipingFailureMechanismAsEntityInParentNavigationProperty()
{
// Setup
const long storageId = 1234L;
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
FailureMechanismEntity entityToDelete = new FailureMechanismEntity
{
FailureMechanismEntityId = storageId,
FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism
};
IList parentNavigationProperty = new List
{
entityToDelete
};
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
Piping piping = new Piping
{
StorageId = storageId
};
// Call
persistor.InsertModel(parentNavigationProperty, piping);
// Assert
Assert.AreEqual(2, parentNavigationProperty.Count);
var parentNavigationPropertyList = parentNavigationProperty.ToList();
var entity = parentNavigationPropertyList[1];
Assert.AreEqual(storageId, entity.FailureMechanismEntityId);
mockRepository.VerifyAll();
}
[Test]
public void UpdateModel_NullDataSetValidModel_ThrowsArgumentNullException()
{
// Setup
const long storageId = 1234L;
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
Piping model = new Piping
{
StorageId = storageId
};
// Call
TestDelegate test = () => persistor.UpdateModel(null, model);
// Assert
Assert.Throws(test);
mockRepository.VerifyAll();
}
[Test]
public void UpdateModel_EmptyDataSetNullModel_ThrowsArgumentNullException()
{
// Setup
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
IList parentNavigationProperty = new List();
// Call
TestDelegate test = () => persistor.UpdateModel(parentNavigationProperty, null);
// Assert
Assert.Throws(test);
mockRepository.VerifyAll();
}
[Test]
public void UpdateModel_EmptyDataset_ThrowsEntityNotFoundException()
{
// Setup
const long storageId = 1234L;
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
IList parentNavigationProperty = new List();
Piping model = new Piping
{
StorageId = storageId
};
// Call
TestDelegate test = () => persistor.UpdateModel(parentNavigationProperty, model);
// Assert
Assert.Throws(test);
mockRepository.VerifyAll();
}
[Test]
public void UpdateModel_DuplicateEntityInDataset_ThrowsEntityNotFoundException()
{
// Setup
const long storageId = 1234L;
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
IList parentNavigationProperty = new List
{
new FailureMechanismEntity
{
FailureMechanismEntityId = storageId,
FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism
},
new FailureMechanismEntity
{
FailureMechanismEntityId = storageId,
FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism
}
};
Piping model = new Piping
{
StorageId = storageId
};
// Call
TestDelegate test = () => persistor.UpdateModel(parentNavigationProperty, model);
// Assert
Assert.Throws(test);
mockRepository.VerifyAll();
}
[Test]
public void UpdateModel_SingleEntityInParentNavigationPropertySinglePipingFailureMechanismWithStorageId_UpdatedPipingFailureMechanismAsEntityInParentNavigationProperty()
{
// Setup
const long storageId = 1234L;
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
ICollection parentNavigationProperty = new List
{
new FailureMechanismEntity
{
FailureMechanismEntityId = storageId,
FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism
}
};
Piping model = new Piping
{
StorageId = storageId
};
// Call
persistor.UpdateModel(parentNavigationProperty, model);
// Assert
Assert.AreEqual(1, parentNavigationProperty.Count);
var parentNavigationPropertyList = parentNavigationProperty.ToList();
var entity = parentNavigationPropertyList[0];
Assert.AreEqual(storageId, entity.FailureMechanismEntityId);
mockRepository.VerifyAll();
}
[Test]
public void UpdateModel_NoStorageIdSet_InsertNewEntity()
{
var mocks = new MockRepository();
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
var persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
IList parentNavigationProperty = new List();
Piping model = new Piping
{
StorageId = 0
};
// Call
persistor.UpdateModel(parentNavigationProperty, model);
// Assert
Assert.AreEqual(1, parentNavigationProperty.Count);
mocks.VerifyAll();
}
[Test]
public void RemoveUnModifiedEntries_SingleEntityInParentNavigationPropertySinglePipingFailureMechanismWithoutStorageId_UpdatedPipingFailureMechanismAsEntityInParentNavigationPropertyAndOthersDeletedInDbSet()
{
// Setup
const long storageId = 0L; // Newly inserted entities have Id = 0 untill they are saved
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
FailureMechanismEntity entityToDelete = new FailureMechanismEntity
{
FailureMechanismEntityId = 4567L,
FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism
};
ObservableCollection parentNavigationProperty = new ObservableCollection
{
entityToDelete
};
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
Piping piping = new Piping
{
StorageId = storageId
};
ringtoetsEntities.FailureMechanismEntities.Add(entityToDelete);
// Precondition
persistor.InsertModel(parentNavigationProperty, piping);
// Call
persistor.RemoveUnModifiedEntries(parentNavigationProperty);
// Assert
CollectionAssert.IsEmpty(ringtoetsEntities.FailureMechanismEntities);
Assert.AreEqual(2, parentNavigationProperty.Count);
var entity = parentNavigationProperty.SingleOrDefault(x => x.FailureMechanismEntityId == storageId);
Assert.IsNotNull(entity);
Assert.AreEqual(storageId, entity.FailureMechanismEntityId);
mockRepository.VerifyAll();
}
[Test]
public void RemoveUnModifiedEntries_MultipleEntitiesInParentNavigationPropertySingleModelStorageId_UpdatedPipingFailureMechanismAsEntityAndOtherDeletedInDbSet()
{
// Setup
const long storageId = 1234L;
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
FailureMechanismEntity entityToUpdate = new FailureMechanismEntity
{
FailureMechanismEntityId = storageId,
FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism
};
FailureMechanismEntity entityToDelete = new FailureMechanismEntity
{
FailureMechanismEntityId = 4567L,
FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism
};
ringtoetsEntities.FailureMechanismEntities.Add(entityToUpdate);
ringtoetsEntities.FailureMechanismEntities.Add(entityToDelete);
ObservableCollection parentNavigationProperty = new ObservableCollection
{
entityToDelete,
entityToUpdate
};
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
Piping piping = new Piping
{
StorageId = storageId
};
TestDelegate updateTest = () => persistor.UpdateModel(parentNavigationProperty, piping);
Assert.DoesNotThrow(updateTest, "Precondition failed: Update should not throw exception.");
// Call
persistor.RemoveUnModifiedEntries(parentNavigationProperty);
// Assert
Assert.AreEqual(1, ringtoetsEntities.FailureMechanismEntities.Count());
var entityUpdated = ringtoetsEntities.FailureMechanismEntities.FirstOrDefault();
Assert.AreEqual(entityToUpdate, entityUpdated);
Assert.AreEqual(2, parentNavigationProperty.Count);
mockRepository.VerifyAll();
}
[Test]
public void RemoveUnModifiedEntries_MultipleEntitiesInParentNavigationPropertyEmptyPipingFailureMechanism_EmptyDatabaseSet()
{
// Setup
FailureMechanismEntity firstEntityToDelete = new FailureMechanismEntity
{
FailureMechanismEntityId = 1234L,
FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism
};
FailureMechanismEntity secondEntityToDelete = new FailureMechanismEntity
{
FailureMechanismEntityId = 4567L,
FailureMechanismType = (int) FailureMechanismType.PipingFailureMechanism
};
ObservableCollection parentNavigationProperty = new ObservableCollection
{
firstEntityToDelete,
secondEntityToDelete
};
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
ringtoetsEntities.FailureMechanismEntities.Add(firstEntityToDelete);
ringtoetsEntities.FailureMechanismEntities.Add(secondEntityToDelete);
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
Piping piping = new Piping();
TestDelegate test = () => persistor.UpdateModel(parentNavigationProperty, piping);
Assert.DoesNotThrow(test, "Precondition failed: UpdateModel");
// Call
persistor.RemoveUnModifiedEntries(parentNavigationProperty);
// Assert
CollectionAssert.IsEmpty(ringtoetsEntities.FailureMechanismEntities);
mockRepository.VerifyAll();
}
[Test]
public void PerformPostSaveActions_NoInserts_DoesNotThrowException()
{
// Setup
var ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
// 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 ringtoetsEntities = RingtoetsEntitiesHelper.Create(mockRepository);
mockRepository.ReplayAll();
var insertedFailureMechanismEntities = new List();
IList pipingFailureMechanisms = new List();
for (var i = 0; i < numberOfInserts; i++)
{
pipingFailureMechanisms.Add(new Piping
{
StorageId = 0L
});
}
PipingFailureMechanismPersistor persistor = new PipingFailureMechanismPersistor(ringtoetsEntities);
mockRepository.ReplayAll();
foreach (var pipingFailureMechanism in pipingFailureMechanisms)
{
try
{
persistor.UpdateModel(insertedFailureMechanismEntities, pipingFailureMechanism);
}
catch (Exception)
{
Assert.Fail("Precondition failed: persistor.UpdateModel");
}
}
// Call
for (var i = 0; i < insertedFailureMechanismEntities.Count; i++)
{
insertedFailureMechanismEntities[i].FailureMechanismEntityId = 1L + i;
}
persistor.PerformPostSaveActions();
// Assert
Assert.AreEqual(pipingFailureMechanisms.Count, insertedFailureMechanismEntities.Count);
foreach (var entity in insertedFailureMechanismEntities)
{
var insertedModel = pipingFailureMechanisms.SingleOrDefault(x => x.StorageId == entity.FailureMechanismEntityId);
Assert.IsInstanceOf(insertedModel);
}
mockRepository.VerifyAll();
}
}
}