// 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.Linq; using Application.Ringtoets.Storage.Create; using Application.Ringtoets.Storage.DbContext; using Application.Ringtoets.Storage.Exceptions; using Application.Ringtoets.Storage.TestUtil; using Application.Ringtoets.Storage.Update; using NUnit.Framework; using Rhino.Mocks; using Ringtoets.Common.Data.Calculation; namespace Application.Ringtoets.Storage.Test.Update { [TestFixture] public class CalculationGroupUpdateExtensionsTest { [Test] public void Update_PersistenceRegistryIsNull_ThrowArgumentNullException() { // Setup var mocks = new MockRepository(); IRingtoetsEntities rintoetsEntities = RingtoetsEntitiesHelper.CreateStub(mocks); mocks.ReplayAll(); var calculationGroup = new CalculationGroup { StorageId = 1 }; // Call TestDelegate call = () => calculationGroup.Update(null, rintoetsEntities); // Assert string paramName = Assert.Throws(call).ParamName; Assert.AreEqual("registry", paramName); mocks.VerifyAll(); } [Test] public void Update_RingtoetsEntitiesIsNull_ThrowArgumentNullException() { // Setup var calculationGroup = new CalculationGroup { StorageId = 1 }; var registry = new PersistenceRegistry(); // Call TestDelegate call = () => calculationGroup.Update(registry, null); // Assert string paramName = Assert.Throws(call).ParamName; Assert.AreEqual("context", paramName); } [Test] public void Update_GroupHasNotBeenSaved_ThrowEntityNotFoundException() { // Setup var mocks = new MockRepository(); IRingtoetsEntities ringtoetsEntities = RingtoetsEntitiesHelper.CreateStub(mocks); mocks.ReplayAll(); var calculationGroup = new CalculationGroup { StorageId = 3 }; var registry = new PersistenceRegistry(); // Call TestDelegate call = () => calculationGroup.Update(registry, ringtoetsEntities); // Assert string message = Assert.Throws(call).Message; Assert.AreEqual("Het object 'CalculationGroupEntity' met id '3' is niet gevonden.", message); mocks.VerifyAll(); } [Test] public void Update_GroupPropertiesChanged_EntityUpdated() { // Setup var mocks = new MockRepository(); IRingtoetsEntities ringtoetsEntities = RingtoetsEntitiesHelper.CreateStub(mocks); mocks.ReplayAll(); CalculationGroup calculationGroup = CreateCalculationGroupWithoutChildren(true); var groupEntity = new CalculationGroupEntity { CalculationGroupEntityId = calculationGroup.StorageId, IsEditable = Convert.ToByte(calculationGroup.IsNameEditable), Name = "" }; ringtoetsEntities.CalculationGroupEntities.Add(groupEntity); var registry = new PersistenceRegistry(); // Call calculationGroup.Update(registry, ringtoetsEntities); // Assert Assert.AreEqual(calculationGroup.Name, groupEntity.Name); CollectionAssert.IsEmpty(groupEntity.CalculationGroupEntity1, "No changes to the children expected."); mocks.VerifyAll(); } [Test] public void Update_GroupWithReadonlyNameWithoutChildren_NoChangedToEntity() { // Setup var mocks = new MockRepository(); IRingtoetsEntities ringtoetsEntities = RingtoetsEntitiesHelper.CreateStub(mocks); mocks.ReplayAll(); CalculationGroup calculationGroup = CreateCalculationGroupWithoutChildren(false); byte originalIsEditableValue = Convert.ToByte(calculationGroup.IsNameEditable); var groupEntity = new CalculationGroupEntity { CalculationGroupEntityId = calculationGroup.StorageId, IsEditable = originalIsEditableValue, Name = calculationGroup.Name }; ringtoetsEntities.CalculationGroupEntities.Add(groupEntity); var registry = new PersistenceRegistry(); // Call calculationGroup.Update(registry, ringtoetsEntities); // Assert Assert.AreEqual(calculationGroup.Name, groupEntity.Name); Assert.AreEqual(originalIsEditableValue, groupEntity.IsEditable); CollectionAssert.IsEmpty(groupEntity.CalculationGroupEntity1, "No changes to the children expected."); mocks.VerifyAll(); } [Test] public void Update_ChildGroupsReordered_EntitiesUpdated() { // Setup var mocks = new MockRepository(); IRingtoetsEntities ringtoetsEntities = RingtoetsEntitiesHelper.CreateStub(mocks); mocks.ReplayAll(); CalculationGroup calculationGroup = CreateCalculationGroupWith2ChildGroups(); var childGroupEntity1 = new CalculationGroupEntity { CalculationGroupEntityId = ((CalculationGroup)calculationGroup.Children[0]).StorageId, Name = "A", Order = 1 }; var childGroupEntity2 = new CalculationGroupEntity { CalculationGroupEntityId = ((CalculationGroup)calculationGroup.Children[1]).StorageId, Name = "A", Order = 0 }; var groupEntity = new CalculationGroupEntity { CalculationGroupEntityId = calculationGroup.StorageId, IsEditable = Convert.ToByte(calculationGroup.IsNameEditable), Name = "", CalculationGroupEntity1 = { childGroupEntity1, childGroupEntity2 } }; ringtoetsEntities.CalculationGroupEntities.Add(groupEntity); ringtoetsEntities.CalculationGroupEntities.Add(childGroupEntity1); ringtoetsEntities.CalculationGroupEntities.Add(childGroupEntity2); var registry = new PersistenceRegistry(); // Call calculationGroup.Update(registry, ringtoetsEntities); // Assert Assert.AreEqual(0, childGroupEntity1.Order); Assert.AreEqual(calculationGroup.Children[0].Name, childGroupEntity1.Name); Assert.AreEqual(1, childGroupEntity2.Order); Assert.AreEqual(calculationGroup.Children[1].Name, childGroupEntity2.Name); mocks.VerifyAll(); } [Test] public void Update_ChildGroupInserted_EntitiesUpdatedAndNewEntityCreated() { // Setup var mocks = new MockRepository(); IRingtoetsEntities ringtoetsEntities = RingtoetsEntitiesHelper.CreateStub(mocks); mocks.ReplayAll(); CalculationGroup calculationGroup = CreateCalculationGroupWith2ChildGroups(); CalculationGroupEntity childGroupEntity1 = CreateExpectedEmptyGroupEntity((CalculationGroup)calculationGroup.Children[0], 0); CalculationGroupEntity childGroupEntity2 = CreateExpectedEmptyGroupEntity((CalculationGroup)calculationGroup.Children[1], 1); var groupEntity = new CalculationGroupEntity { CalculationGroupEntityId = calculationGroup.StorageId, IsEditable = Convert.ToByte(calculationGroup.IsNameEditable), Name = "", CalculationGroupEntity1 = { childGroupEntity1, childGroupEntity2 } }; ringtoetsEntities.CalculationGroupEntities.Add(groupEntity); ringtoetsEntities.CalculationGroupEntities.Add(childGroupEntity1); ringtoetsEntities.CalculationGroupEntities.Add(childGroupEntity2); var insertedGroup = new CalculationGroup("", false); const int insertedIndex = 1; calculationGroup.Children.Insert(insertedIndex, insertedGroup); var registry = new PersistenceRegistry(); // Call calculationGroup.Update(registry, ringtoetsEntities); // Assert CalculationGroupEntity[] updatedChildGroupEntities = groupEntity.CalculationGroupEntity1 .OrderBy(cge => cge.Order) .ToArray(); Assert.AreEqual(3, updatedChildGroupEntities.Length); Assert.AreSame(childGroupEntity1, updatedChildGroupEntities[0]); Assert.AreEqual(0, childGroupEntity1.Order); Assert.AreEqual(calculationGroup.Children[0].Name, childGroupEntity1.Name); var newGroupEntity = updatedChildGroupEntities[insertedIndex]; Assert.AreEqual(insertedIndex, newGroupEntity.Order); Assert.AreEqual(insertedGroup.Name, newGroupEntity.Name); Assert.AreEqual(0, newGroupEntity.IsEditable); Assert.AreSame(childGroupEntity2, updatedChildGroupEntities[2]); Assert.AreEqual(2, childGroupEntity2.Order); Assert.AreEqual(calculationGroup.Children[2].Name, childGroupEntity2.Name); mocks.VerifyAll(); } [Test] public void Update_ChildGroupAdded_RootEntityUpdatedAndNewEntityCreated() { // Setup var mocks = new MockRepository(); IRingtoetsEntities ringtoetsEntities = RingtoetsEntitiesHelper.CreateStub(mocks); mocks.ReplayAll(); CalculationGroup calculationGroup = CreateCalculationGroupWithoutChildren(true); CalculationGroupEntity rootGroupEntity = CreateExpectedEmptyGroupEntity(calculationGroup, 0); ringtoetsEntities.CalculationGroupEntities.Add(rootGroupEntity); var newGroup = new CalculationGroup("", false); calculationGroup.Children.Add(newGroup); var registry = new PersistenceRegistry(); // Call calculationGroup.Update(registry, ringtoetsEntities); // Assert CalculationGroupEntity[] updatedChildGroupEntities = rootGroupEntity.CalculationGroupEntity1 .OrderBy(cge => cge.Order) .ToArray(); Assert.AreEqual(1, updatedChildGroupEntities.Length); var newGroupEntity = updatedChildGroupEntities[0]; Assert.AreEqual(0, newGroupEntity.Order); Assert.AreEqual(newGroup.Name, newGroupEntity.Name); Assert.AreEqual(0, newGroupEntity.IsEditable); mocks.VerifyAll(); } [Test] public void Update_ExistingChildGroupDragged_EntitiesUpdated() { // Setup var mocks = new MockRepository(); IRingtoetsEntities ringtoetsEntities = RingtoetsEntitiesHelper.CreateStub(mocks); mocks.ReplayAll(); var draggedGroup = new CalculationGroup("", false) { StorageId = 876 }; CalculationGroup calculationGroup = CreateCalculationGroupWith2ChildGroups(); ((CalculationGroup)calculationGroup.Children[0]).Children.Add(draggedGroup); CalculationGroupEntity childGroup1Entity = CreateExpectedEmptyGroupEntity((CalculationGroup)calculationGroup.Children[0], 0); CalculationGroupEntity childGroup2Entity = CreateExpectedEmptyGroupEntity((CalculationGroup)calculationGroup.Children[1], 1); CalculationGroupEntity fillerGroupEntity = CreateExpectedEmptyGroupEntity(new CalculationGroup(), 0); childGroup2Entity.CalculationGroupEntity1.Add(fillerGroupEntity); CalculationGroupEntity draggedGroupEntity = CreateExpectedEmptyGroupEntity(draggedGroup, 1); childGroup2Entity.CalculationGroupEntity1.Add(draggedGroupEntity); draggedGroupEntity.CalculationGroupEntity2 = childGroup2Entity; CalculationGroupEntity rootGroupEntity = CreateExpectedEmptyGroupEntity(calculationGroup, 0); rootGroupEntity.CalculationGroupEntity1.Add(childGroup1Entity); rootGroupEntity.CalculationGroupEntity1.Add(childGroup2Entity); ringtoetsEntities.CalculationGroupEntities.Add(rootGroupEntity); ringtoetsEntities.CalculationGroupEntities.Add(childGroup1Entity); ringtoetsEntities.CalculationGroupEntities.Add(childGroup2Entity); ringtoetsEntities.CalculationGroupEntities.Add(fillerGroupEntity); ringtoetsEntities.CalculationGroupEntities.Add(draggedGroupEntity); var registry = new PersistenceRegistry(); // Call calculationGroup.Update(registry, ringtoetsEntities); // Assert Assert.AreEqual(0, draggedGroupEntity.Order); CollectionAssert.Contains(childGroup1Entity.CalculationGroupEntity1, draggedGroupEntity); CollectionAssert.DoesNotContain(childGroup2Entity.CalculationGroupEntity1, draggedGroupEntity); Assert.AreEqual(0, fillerGroupEntity.Order); mocks.VerifyAll(); } private static CalculationGroup CreateCalculationGroupWithoutChildren(bool isNameEditable) { return new CalculationGroup("", isNameEditable) { StorageId = 5689467 }; } private CalculationGroup CreateCalculationGroupWith2ChildGroups() { return new CalculationGroup("", true) { StorageId = 98 }, new CalculationGroup("", true) { StorageId = 65 } } }; } private CalculationGroupEntity CreateExpectedEmptyGroupEntity(CalculationGroup group, int order) { return new CalculationGroupEntity { CalculationGroupEntityId = group.StorageId, Name = group.Name, IsEditable = Convert.ToByte(group.IsNameEditable), Order = order }; } } }