public async Task CreateDigitizedEvent_ShouldReturnInvalidRouteSegmentOperation_OnEndRouteNodeCountBeingTwoOrMore() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegment = A.Fake <RouteSegment>(); A.CallTo(() => applicationSettings.Value) .Returns(new ApplicationSetting { ApplicationName = "GDB_INTEGRATOR" }); A.CallTo(() => routeSegmentValidator.LineIsValid(routeSegment.GetLineString())).Returns(true); A.CallTo(() => geoDatabase.GetIntersectingEndRouteNodes(routeSegment)).Returns(new List <RouteNode> { A.Fake <RouteNode>(), A.Fake <RouteNode>() }); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = await factory.CreateDigitizedEvent(routeSegment); using (var scope = new AssertionScope()) { result.Count().Should().Be(1); result.First().Should().BeOfType(typeof(InvalidRouteSegmentOperation)); } }
public async Task CreateUpdatedEvent_ShouldThrowException_OnEndRouteNodeCountBeingTwoOrMore() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegmentBefore = A.Fake <RouteSegment>(); var routeSegmentAfter = A.Fake <RouteSegment>(); var routeSegmentShadowTable = A.Fake <RouteSegment>(); A.CallTo(() => applicationSettings.Value) .Returns(new ApplicationSetting { ApplicationName = "GDB_INTEGRATOR" }); A.CallTo(() => routeSegmentAfter.GetLineString()).Returns(A.Fake <LineString>()); A.CallTo(() => routeSegmentAfter.GetGeoJsonCoordinate()).Returns("LINESTRING(578223.64355838 6179284.23759438, 578238.4182511 6179279.78494725)"); A.CallTo(() => routeSegmentShadowTable.GetGeoJsonCoordinate()).Returns("LINESTRING(578223.64355838 6179284.23759438, 378238.4182511 6179279.78494725)"); A.CallTo(() => routeSegmentAfter.MarkAsDeleted).Returns(false); A.CallTo(() => routeSegmentShadowTable.MarkAsDeleted).Returns(false); A.CallTo(() => routeSegmentValidator.LineIsValid(routeSegmentAfter.GetLineString())).Returns(true); A.CallTo(() => geoDatabase.GetIntersectingEndRouteNodes(routeSegmentAfter)).Returns(new List <RouteNode> { A.Fake <RouteNode>(), A.Fake <RouteNode>() }); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); Func <Task> act = async() => await factory.CreateUpdatedEvent(routeSegmentBefore, routeSegmentAfter); await act.Should().ThrowExactlyAsync <Exception>("Has more than 2 intersecting start or end nodes."); }
public async Task CreateDigitizedEvent_ShouldCallInsertRouteSegmentIntegrator_OnPassingMethodValidationChecks() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegment = A.Fake <RouteSegment>(); var lineString = A.Fake <LineString>(); var intersectingStartNodes = new List <RouteNode> { A.Fake <RouteNode>() }; var intersectingEndNodes = new List <RouteNode> { A.Fake <RouteNode>() }; A.CallTo(() => applicationSettings.Value) .Returns(new ApplicationSetting { ApplicationName = "GDB_INTEGRATOR" }); A.CallTo(() => routeSegment.GetLineString()).Returns(lineString); A.CallTo(() => routeSegmentValidator.LineIsValid(lineString)).Returns(true); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = (NewRouteSegmentDigitized)(await factory.CreateDigitizedEvent(routeSegment)).First(); using (var scope = new AssertionScope()) { A.CallTo(() => geoDatabase.InsertRouteSegmentShadowTable(routeSegment)); } }
public async Task CreateDigitizedEvent_ShouldReturnInvalidRouteSegmentOperation_OnRouteSegmentLineStringBeingInvalid() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegment = A.Fake <RouteSegment>(); var lineString = A.Fake <LineString>(); A.CallTo(() => applicationSettings.Value) .Returns(new ApplicationSetting { ApplicationName = "GDB_INTEGRATOR" }); A.CallTo(() => routeSegment.GetLineString()).Returns(lineString); A.CallTo(() => routeSegmentValidator.LineIsValid(lineString)).Returns(false); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = (InvalidRouteSegmentOperation)(await factory.CreateDigitizedEvent(routeSegment)).First(); using (var scope = new AssertionScope()) { result.Should().BeOfType <InvalidRouteSegmentOperation>(); result.RouteSegment.Should().Be(routeSegment); } }
public async Task CreateUpdatedEvent_ShouldThrowException_OnGeometryBeingInvalid() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegmentBefore = A.Fake <RouteSegment>(); var routeSegmentAfter = A.Fake <RouteSegment>(); var routeSegmentShadowTable = A.Fake <RouteSegment>(); A.CallTo(() => routeSegmentAfter.Mrid).Returns(Guid.NewGuid()); A.CallTo(() => geoDatabase.GetRouteSegmentShadowTable(routeSegmentAfter.Mrid, false)).Returns(routeSegmentShadowTable); A.CallTo(() => routeSegmentShadowTable.Mrid).Returns(routeSegmentAfter.Mrid); A.CallTo(() => routeSegmentAfter.GetLineString()).Returns(A.Fake <LineString>()); A.CallTo(() => routeSegmentAfter.GetGeoJsonCoordinate()).Returns("LINESTRING(578223.64355838 6179284.23759438, 578238.4182511 6179279.78494725)"); A.CallTo(() => routeSegmentShadowTable.GetGeoJsonCoordinate()).Returns("LINESTRING(578223.64355838 6179284.23759438, 378238.4182511 6179279.78494725)"); A.CallTo(() => routeSegmentAfter.MarkAsDeleted).Returns(false); A.CallTo(() => routeSegmentShadowTable.MarkAsDeleted).Returns(false); A.CallTo(() => routeSegmentValidator.LineIsValid(routeSegmentAfter.GetLineString())).Returns(false); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); Func <Task> act = async() => await factory.CreateUpdatedEvent(routeSegmentBefore, routeSegmentAfter); await act.Should().ThrowExactlyAsync <Exception>("Linestring is not valid."); }
public async Task CreateUpdatedEvent_ShouldReturnRouteSegmentMarkedForDeletion_OnRouteSegmentAfterMarkedToBeDeletedTrueAndHasRelatedEquipmentFalse() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegmentBefore = A.Fake <RouteSegment>(); var routeSegmentAfter = A.Fake <RouteSegment>(); A.CallTo(() => routeSegmentAfter.GetLineString()).Returns(A.Fake <LineString>()); A.CallTo(() => routeSegmentValidator.LineIsValid(routeSegmentAfter.GetLineString())).Returns(true); A.CallTo(() => routeSegmentAfter.MarkAsDeleted).Returns(true); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = await factory.CreateUpdatedEvent(routeSegmentBefore, routeSegmentAfter); var routeSegmentDeleted = (RouteSegmentDeleted)result.First(); using (var scope = new AssertionScope()) { result.Count().Should().Be(1); routeSegmentDeleted.RouteSegment.Should().Be(routeSegmentAfter); } }
public async Task CreateDigitizedEvent_ShouldContainEndCreateExistingRouteSegmentSplittedForStartNode_OnEndSegmentCountBeingOneAndStartNodesCountBeingZero() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeSegment = A.Fake <RouteSegment>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var endNode = A.Fake <RouteNode>(); var lineString = A.Fake <LineString>(); var intersectingStartNodes = new List <RouteNode>(); var intersectingEndNodes = new List <RouteNode>(); var intersectingStartSegments = new List <RouteSegment>(); var intersectingEndSegments = new List <RouteSegment> { A.Fake <RouteSegment>() }; var endPoint = A.Fake <Point>(); A.CallTo(() => applicationSettings.Value) .Returns(new ApplicationSetting { ApplicationName = "GDB_INTEGRATOR" }); A.CallTo(() => routeSegment.GetLineString()).Returns(lineString); A.CallTo(() => routeSegmentValidator.LineIsValid(lineString)).Returns(true); A.CallTo(() => geoDatabase.GetIntersectingStartRouteNodes(routeSegment)) .Returns(intersectingStartNodes); A.CallTo(() => geoDatabase.GetIntersectingEndRouteNodes(routeSegment)) .Returns(intersectingEndNodes); A.CallTo(() => geoDatabase.GetIntersectingStartRouteSegments(routeSegment)) .Returns(intersectingStartSegments); A.CallTo(() => geoDatabase.GetIntersectingEndRouteSegments(routeSegment)) .Returns(intersectingEndSegments); A.CallTo(() => routeSegment.FindEndPoint()).Returns(endPoint); A.CallTo(() => routeNodeFactory.Create(endPoint)).Returns(endNode); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = await factory.CreateDigitizedEvent(routeSegment); var existingRouteSegmentSplitted = (ExistingRouteSegmentSplitted)result.ToList()[0]; var newRouteSegmentDigitized = (NewRouteSegmentDigitized)result.ToList()[1]; using (var scope = new AssertionScope()) { existingRouteSegmentSplitted.RouteNode.Should().Be(endNode); existingRouteSegmentSplitted.RouteSegmentDigitizedByUser.Should().Be(routeSegment); newRouteSegmentDigitized.RouteSegment.Should().Be(routeSegment); } }
public async Task CreateDigitizedEvent_ShouldThrowArgumentNullException_OnBeingPassedNullRouteSegment() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); Func <Task> act = async() => await factory.CreateDigitizedEvent(null); await act.Should().ThrowExactlyAsync <ArgumentNullException>(); }
public async Task CreateDigitizedEvent_ShouldReturnNewSegmentAndSplittedRouteSegments_OnRouteSegmentIntersectingWithRouteNodesInGeometry() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var validationService = A.Fake <IValidationService>(); var routeSegment = A.Fake <RouteSegment>(); var lineString = A.Fake <LineString>(); var allIntersectingRouteNodes = new List <RouteNode> { A.Fake <RouteNode>(), A.Fake <RouteNode>() }; A.CallTo(() => applicationSettings.Value) .Returns(new ApplicationSetting { ApplicationName = "GDB_INTEGRATOR" }); A.CallTo(() => routeSegment.GetLineString()).Returns(lineString); A.CallTo(() => routeSegmentValidator.LineIsValid(lineString)).Returns(true); A.CallTo(() => geoDatabase.GetAllIntersectingRouteNodesNotIncludingEdges(routeSegment)) .Returns(allIntersectingRouteNodes); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = (await factory.CreateDigitizedEvent(routeSegment)).ToList(); var newSegmentNotification = (NewRouteSegmentDigitized)result[0]; var splittedRouteSegmentNotificationOne = (ExistingRouteSegmentSplitted)result[1]; var splittedRouteSegmentNotificationTwo = (ExistingRouteSegmentSplitted)result[2]; using (var scope = new AssertionScope()) { result.Count().Should().Be(3); newSegmentNotification.RouteSegment.Should().BeEquivalentTo(routeSegment); splittedRouteSegmentNotificationOne.RouteNode.Should().BeEquivalentTo(allIntersectingRouteNodes[0]); splittedRouteSegmentNotificationOne.RouteSegmentDigitizedByUser.Should().BeNull(); splittedRouteSegmentNotificationTwo.RouteNode.Should().BeEquivalentTo(allIntersectingRouteNodes[1]); splittedRouteSegmentNotificationTwo.RouteSegmentDigitizedByUser.Should().BeNull(); } }
public async Task CreateDigitizedEvent_ShouldReturnNewRouteSegmentDigitized_OnIntersectingStartAndEndNodeCountBeingOne() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegment = A.Fake <RouteSegment>(); var lineString = A.Fake <LineString>(); var intersectingStartNodes = new List <RouteNode> { A.Fake <RouteNode>() }; var intersectingEndNodes = new List <RouteNode> { A.Fake <RouteNode>() }; var allIntersectingRouteNodes = new List <RouteNode>(); A.CallTo(() => geoDatabase.GetAllIntersectingRouteNodesNotIncludingEdges(routeSegment)) .Returns(allIntersectingRouteNodes); A.CallTo(() => applicationSettings.Value) .Returns(new ApplicationSetting { ApplicationName = "GDB_INTEGRATOR" }); A.CallTo(() => routeSegment.GetLineString()).Returns(lineString); A.CallTo(() => routeSegmentValidator.LineIsValid(lineString)).Returns(true); A.CallTo(() => geoDatabase.GetIntersectingStartRouteNodes(routeSegment)) .Returns(intersectingStartNodes); A.CallTo(() => geoDatabase.GetIntersectingEndRouteNodes(routeSegment)) .Returns(intersectingEndNodes); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = await factory.CreateDigitizedEvent(routeSegment); var newRouteSegmentDigitized = (NewRouteSegmentDigitized)result.ToList()[0]; using (var scope = new AssertionScope()) { result.Count().Should().Be(1); newRouteSegmentDigitized.Should().BeOfType <NewRouteSegmentDigitized>(); newRouteSegmentDigitized.RouteSegment.Should().Be(routeSegment); } }
public async Task CreateUpdatedEvent_ShouldReturnDoNothing_OnGetRouteSegmentFromShadowTableBeingNull() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegmentBefore = A.Fake <RouteSegment>(); var routeSegmentAfter = A.Fake <RouteSegment>(); RouteSegment routeSegmentShadowTable = null; A.CallTo(() => geoDatabase.GetRouteSegmentShadowTable(routeSegmentAfter.Mrid, false)).Returns(routeSegmentShadowTable); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = (DoNothing)(await factory.CreateUpdatedEvent(routeSegmentBefore, routeSegmentAfter)).First(); result.Should().BeOfType(typeof(DoNothing)); }
public async Task CreateUpdatedEvent_ShouldReturnTwoSplitEventsAndConnectivityChanged_OnRouteSegmentBeingValidAndIntersectsWithOtherRouteSegmentNotEdge() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegmentBefore = A.Fake <RouteSegment>(); var routeSegmentAfter = A.Fake <RouteSegment>(); var routeSegmentShadowTable = A.Fake <RouteSegment>(); A.CallTo(() => routeSegmentAfter.Mrid).Returns(Guid.NewGuid()); A.CallTo(() => geoDatabase.GetRouteSegmentShadowTable(routeSegmentAfter.Mrid, false)).Returns(routeSegmentShadowTable); A.CallTo(() => routeSegmentShadowTable.Mrid).Returns(routeSegmentAfter.Mrid); A.CallTo(() => routeSegmentAfter.GetLineString()).Returns(A.Fake <LineString>()); A.CallTo(() => routeSegmentAfter.GetGeoJsonCoordinate()).Returns("LINESTRING(578223.64355838 6179284.23759438, 578238.4182511 6179279.78494725)"); A.CallTo(() => routeSegmentShadowTable.GetGeoJsonCoordinate()).Returns("LINESTRING(578223.64355838 6179284.23759438, 378238.4182511 6179279.78494725)"); A.CallTo(() => routeSegmentAfter.MarkAsDeleted).Returns(false); A.CallTo(() => routeSegmentShadowTable.MarkAsDeleted).Returns(false); A.CallTo(() => routeSegmentValidator.LineIsValid(routeSegmentAfter.GetLineString())).Returns(true); A.CallTo(() => geoDatabase.GetIntersectingStartRouteSegments(routeSegmentAfter)).Returns(new List <RouteSegment> { A.Fake <RouteSegment>() }); A.CallTo(() => geoDatabase.GetIntersectingEndRouteSegments(routeSegmentAfter)).Returns(new List <RouteSegment> { A.Fake <RouteSegment>() }); A.CallTo(() => geoDatabase.GetIntersectingStartRouteNodes(routeSegmentAfter)).Returns(new List <RouteNode>()); A.CallTo(() => geoDatabase.GetIntersectingEndRouteNodes(routeSegmentAfter)).Returns(new List <RouteNode>()); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = (await factory.CreateUpdatedEvent(routeSegmentBefore, routeSegmentAfter)).ToList(); using (var scope = new AssertionScope()) { result.Count().Should().Be(3); result[0].Should().BeOfType(typeof(ExistingRouteSegmentSplitted)); result[1].Should().BeOfType(typeof(ExistingRouteSegmentSplitted)); result[2].Should().BeOfType(typeof(RouteSegmentConnectivityChanged)); } }
public async Task CreateDigitizedEvent_ShouldReturnNull_OnRouteSegmentApplicationNameBeingEqualToSettingsApplicationName() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegment = new RouteSegment { ApplicationName = "GDB_INTEGRATOR" }; A.CallTo(() => applicationSettings.Value) .Returns(new ApplicationSetting { ApplicationName = "GDB_INTEGRATOR" }); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = await factory.CreateDigitizedEvent(routeSegment); result.Should().BeEmpty(); }
public async Task CreateUpdatedEvent_ShouldReturnDoNothing_OnRouteSegmentAfterAndShadowTableBeforeBeingEqual() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegmentBefore = A.Fake <RouteSegment>(); var routeSegmentAfter = A.Fake <RouteSegment>(); var routeSegmentShadowTable = A.Fake <RouteSegment>(); A.CallTo(() => routeSegmentAfter.Mrid).Returns(Guid.NewGuid()); A.CallTo(() => routeSegmentShadowTable.Mrid).Returns(routeSegmentAfter.Mrid); A.CallTo(() => geoDatabase.GetRouteSegmentShadowTable(routeSegmentAfter.Mrid, false)).Returns(routeSegmentShadowTable); A.CallTo(() => routeSegmentAfter.GetGeoJsonCoordinate()).Returns("LINESTRING(578223.64355838 6179284.23759438, 578238.4182511 6179279.78494725)"); A.CallTo(() => routeSegmentShadowTable.GetGeoJsonCoordinate()).Returns("LINESTRING(578223.64355838 6179284.23759438, 578238.4182511 6179279.78494725)"); A.CallTo(() => routeSegmentShadowTable.MarkAsDeleted).Returns(false); A.CallTo(() => routeSegmentAfter.MarkAsDeleted).Returns(false); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = (DoNothing)(await factory.CreateUpdatedEvent(routeSegmentBefore, routeSegmentAfter)).First(); result.Should().BeOfType(typeof(DoNothing)); }
public async Task CreateUpdatedEvent_ShouldReturnRouteSegmentLocationChanged_OnGeometryChangedAndNodesBeingSameAsBeforeUpdate() { var applicationSettings = A.Fake <IOptions <ApplicationSetting> >(); var routeSegmentValidator = A.Fake <IRouteSegmentValidator>(); var geoDatabase = A.Fake <IGeoDatabase>(); var routeNodeFactory = A.Fake <IRouteNodeFactory>(); var routeSegmentBefore = A.Fake <RouteSegment>(); var routeSegmentAfter = A.Fake <RouteSegment>(); var routeSegmentShadowTable = A.Fake <RouteSegment>(); var currentStartNode = A.Fake <RouteNode>(); var currentEndNode = A.Fake <RouteNode>(); var previousStartNode = A.Fake <RouteNode>(); var previousEndNode = A.Fake <RouteNode>(); A.CallTo(() => routeSegmentAfter.Mrid).Returns(Guid.NewGuid()); A.CallTo(() => geoDatabase.GetRouteSegmentShadowTable(routeSegmentAfter.Mrid, false)).Returns(routeSegmentShadowTable); A.CallTo(() => routeSegmentShadowTable.Mrid).Returns(routeSegmentAfter.Mrid); A.CallTo(() => routeSegmentAfter.GetLineString()).Returns(A.Fake <LineString>()); A.CallTo(() => routeSegmentAfter.GetGeoJsonCoordinate()).Returns("LINESTRING(578223.64355838 6179284.23759438, 578238.4182511 6179279.78494725)"); A.CallTo(() => routeSegmentShadowTable.GetGeoJsonCoordinate()).Returns("LINESTRING(578223.64355838 6179284.23759438, 378238.4182511 6179279.78494725)"); A.CallTo(() => routeSegmentAfter.MarkAsDeleted).Returns(false); A.CallTo(() => routeSegmentShadowTable.MarkAsDeleted).Returns(false); A.CallTo(() => routeSegmentValidator.LineIsValid(routeSegmentAfter.GetLineString())).Returns(true); A.CallTo(() => geoDatabase.GetIntersectingStartRouteSegments(routeSegmentAfter)).Returns(new List <RouteSegment> { A.Fake <RouteSegment>() }); A.CallTo(() => geoDatabase.GetIntersectingEndRouteSegments(routeSegmentAfter)).Returns(new List <RouteSegment> { A.Fake <RouteSegment>() }); // Important for this test var startNodeMrid = Guid.NewGuid(); var endNodeMrId = Guid.NewGuid(); A.CallTo(() => geoDatabase.GetIntersectingStartRouteNodes(routeSegmentAfter)).Returns(new List <RouteNode> { currentStartNode }); A.CallTo(() => geoDatabase.GetIntersectingEndRouteNodes(routeSegmentAfter)).Returns(new List <RouteNode> { currentEndNode }); A.CallTo(() => currentStartNode.Mrid).Returns(startNodeMrid); A.CallTo(() => currentEndNode.Mrid).Returns(endNodeMrId); A.CallTo(() => geoDatabase.GetIntersectingStartRouteNodes(routeSegmentShadowTable.Coord)).Returns(new List <RouteNode> { previousStartNode }); A.CallTo(() => geoDatabase.GetIntersectingEndRouteNodes(routeSegmentShadowTable.Coord)).Returns(new List <RouteNode> { previousEndNode }); A.CallTo(() => previousStartNode.Mrid).Returns(startNodeMrid); A.CallTo(() => previousEndNode.Mrid).Returns(endNodeMrId); var factory = new RouteSegmentCommandFactory(applicationSettings, routeSegmentValidator, geoDatabase, routeNodeFactory); var result = (RouteSegmentLocationChanged)(await factory.CreateUpdatedEvent(routeSegmentBefore, routeSegmentAfter)).First(); using (var scope = new AssertionScope()) { result.Should().BeOfType(typeof(RouteSegmentLocationChanged)); result.RouteSegment.Should().Be(routeSegmentAfter); } }