From 52541dd1d497e29c442e42a48585c18d33d9b4bc Mon Sep 17 00:00:00 2001 From: jvandaal Date: Wed, 31 Jan 2024 16:49:42 +0100 Subject: [PATCH] test: add building unit version tests for building unit legacy events --- ...onProjectionsTests-LegacyBuildingEvents.cs | 52 + ...ojectionsTests-LegacyBuildingUnitEvents.cs | 1099 +++++++++++++++++ .../BuildingUnitVersionProjectionsTests.cs | 17 +- 3 files changed, 1154 insertions(+), 14 deletions(-) diff --git a/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests-LegacyBuildingEvents.cs b/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests-LegacyBuildingEvents.cs index 023259efe..946d29ee9 100644 --- a/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests-LegacyBuildingEvents.cs +++ b/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests-LegacyBuildingEvents.cs @@ -44,6 +44,10 @@ public async Task WhenBuildingWasRemoved() new [] { _fixture.Create() }); ((ISetProvenance)buildingWasRemoved).SetProvenance(_fixture.Create()); + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitWasAdded.AddressId)) + .ReturnsAsync(1); + var position = _fixture.Create(); var buildingUnitWasAddedMetadata = new Dictionary @@ -101,6 +105,14 @@ public async Task WhenBuildingWasRetired() x.FindBuildingUnitPersistentLocalId(It.IsAny(), buildingUnitToRetireWasAdded.BuildingUnitId, It.IsAny())) .ReturnsAsync(buildingUnitToRetirePersistentLocalId); + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitToNotRealizeWasAdded.AddressId)) + .ReturnsAsync(1); + + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitToRetireWasAdded.AddressId)) + .ReturnsAsync(2); + var position = _fixture.Create(); var buildingUnitWasAddedMetadata = new Dictionary @@ -168,6 +180,14 @@ public async Task WhenBuildingWasCorrectedToRetired() x.FindBuildingUnitPersistentLocalId(It.IsAny(), buildingUnitToRetireWasAdded.BuildingUnitId, It.IsAny())) .ReturnsAsync(buildingUnitToRetirePersistentLocalId); + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitToNotRealizeWasAdded.AddressId)) + .ReturnsAsync(1); + + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitToRetireWasAdded.AddressId)) + .ReturnsAsync(2); + var position = _fixture.Create(); var buildingUnitWasAddedMetadata = new Dictionary @@ -235,6 +255,14 @@ public async Task WhenBuildingWasNotRealized() x.FindBuildingUnitPersistentLocalId(It.IsAny(), buildingUnitToRetireWasAdded.BuildingUnitId, It.IsAny())) .ReturnsAsync(buildingUnitToRetirePersistentLocalId); + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitToNotRealizeWasAdded.AddressId)) + .ReturnsAsync(1); + + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitToRetireWasAdded.AddressId)) + .ReturnsAsync(2); + var position = _fixture.Create(); var buildingUnitWasAddedMetadata = new Dictionary @@ -302,6 +330,14 @@ public async Task WhenBuildingWasCorrectedToNotRealized() x.FindBuildingUnitPersistentLocalId(It.IsAny(), buildingUnitToRetireWasAdded.BuildingUnitId, It.IsAny())) .ReturnsAsync(buildingUnitToRetirePersistentLocalId); + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitToNotRealizeWasAdded.AddressId)) + .ReturnsAsync(1); + + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitToRetireWasAdded.AddressId)) + .ReturnsAsync(2); + var position = _fixture.Create(); var buildingUnitWasAddedMetadata = new Dictionary @@ -358,6 +394,10 @@ public async Task WhenBuildingGeometryWasRemoved() var buildingUnitPositionWasAppointedByAdministrator = _fixture.Create(); var buildingGeometryWasRemoved = _fixture.Create(); + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitWasAdded.AddressId)) + .ReturnsAsync(1); + var position = _fixture.Create(); var buildingUnitWasAddedMetadata = new Dictionary @@ -410,6 +450,10 @@ public async Task WhenBuildingBecameComplete() var buildingUnitWasAdded = _fixture.Create(); var buildingBecameComplete = _fixture.Create(); + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitWasAdded.AddressId)) + .ReturnsAsync(1); + var position = _fixture.Create(); var buildingUnitWasAddedMetadata = new Dictionary @@ -453,6 +497,10 @@ public async Task WhenBuildingBecameIncomplete() var buildingUnitWasAdded = _fixture.Create(); var buildingBecameIncomplete = _fixture.Create(); + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitWasAdded.AddressId)) + .ReturnsAsync(1); + var position = _fixture.Create(); var buildingUnitWasAddedMetadata = new Dictionary @@ -496,6 +544,10 @@ public async Task WhenBuildingPersistentLocalIdWasAssigned() var buildingUnitWasAdded = _fixture.Create(); var buildingPersistentLocalIdWasAssigned = _fixture.Create(); + _addresses + .Setup(x => x.GetAddressPersistentLocalId(buildingUnitWasAdded.AddressId)) + .ReturnsAsync(1); + var position = _fixture.Create(); var buildingUnitWasAddedMetadata = new Dictionary diff --git a/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests-LegacyBuildingUnitEvents.cs b/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests-LegacyBuildingUnitEvents.cs index 5b7e2a894..44ef40728 100644 --- a/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests-LegacyBuildingUnitEvents.cs +++ b/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests-LegacyBuildingUnitEvents.cs @@ -1,7 +1,1106 @@ namespace BuildingRegistry.Tests.ProjectionTests.Integration.BuildingUnit { + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading; + using System.Threading.Tasks; + using AutoFixture; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore; + using Be.Vlaanderen.Basisregisters.Utilities.HexByteConvertor; + using BuildingRegistry.Building; + using BuildingRegistry.Legacy; + using BuildingRegistry.Legacy.Events; + using FluentAssertions; + using Moq; + using NodaTime; + using Projections.Integration.Converters; + using Tests.Legacy.Autofixture; + using Xunit; + using BuildingId = BuildingRegistry.Legacy.BuildingId; + using BuildingUnitFunction = BuildingRegistry.Building.BuildingUnitFunction; + using BuildingUnitId = BuildingRegistry.Legacy.BuildingUnitId; + using BuildingUnitPositionGeometryMethod = BuildingRegistry.Building.BuildingUnitPositionGeometryMethod; + using ReaddressingBeginDate = BuildingRegistry.Legacy.ReaddressingBeginDate; + public partial class BuildingUnitVersionProjectionsTests { + [Fact] + public async Task WhenBuildingUnitPersistentLocalIdWasAssigned() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitPersistentLocalIdWasAssigned = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitPersistentLocalIdWasAssignedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitPersistentLocalIdWasAssigned, buildingUnitPersistentLocalIdWasAssignedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalIdWasAssigned.PersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.VersionTimestamp.Should().Be(buildingUnitPersistentLocalIdWasAssigned.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitBecameComplete() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitBecameComplete = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitBecameCompleteMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitBecameComplete, buildingUnitBecameCompleteMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.VersionTimestamp.Should().Be(buildingUnitBecameComplete.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitBecameIncomplete() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitBecameIncomplete = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitBecameIncompleteMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitBecameIncomplete, buildingUnitBecameIncompleteMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.VersionTimestamp.Should().Be(buildingUnitBecameIncomplete.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasAdded() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingPersistentLocalId = (int)_fixture.Create(); + var addressPersistentLocalId = (int)_fixture.Create(); + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + + AddBuildingPersistentLocalId(buildingPersistentLocalId); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId, addressPersistentLocalId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.BuildingId.Should().Be(buildingUnitWasAdded.BuildingId); + buildingUnitVersion.BuildingUnitId.Should().Be(buildingUnitWasAdded.BuildingUnitId); + buildingUnitVersion.BuildingPersistentLocalId.Should().Be(buildingPersistentLocalId); + buildingUnitVersion.BuildingUnitPersistentLocalId.Should().Be(buildingUnitPersistentLocalId); + buildingUnitVersion.Function.Should().Be(BuildingUnitFunction.Unknown.Function); + buildingUnitVersion.OsloFunction.Should().Be(BuildingUnitFunction.Unknown.Map()); + buildingUnitVersion.CreatedOnTimestamp.Should().Be(buildingUnitWasAdded.Provenance.Timestamp); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasAdded.Provenance.Timestamp); + buildingUnitVersion.Namespace.Should().Be(BuildingUnitNamespace); + buildingUnitVersion.PuriId.Should().Be($"{BuildingUnitNamespace}/{buildingUnitPersistentLocalId}"); + buildingUnitVersion.Addresses.Should().ContainSingle(); + buildingUnitVersion.Addresses.Single().AddressPersistentLocalId.Should().Be(addressPersistentLocalId); + buildingUnitVersion.Addresses.Single().Position.Should().Be(position); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasReaddedByOtherUnitRemoval() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingPersistentLocalId = (int) _fixture.Create(); + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + var addressPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasReaddedByOtherUnitRemoval = _fixture.Create(); + + AddBuildingPersistentLocalId(buildingPersistentLocalId); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasReaddedByOtherUnitRemoval.AddressId, addressPersistentLocalId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasReaddedByOtherUnitRemoval, buildingUnitWasAddedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.BuildingId.Should().Be(buildingUnitWasReaddedByOtherUnitRemoval.BuildingId); + buildingUnitVersion.BuildingUnitId.Should().Be(buildingUnitWasReaddedByOtherUnitRemoval.BuildingUnitId); + buildingUnitVersion.BuildingPersistentLocalId.Should().Be(buildingPersistentLocalId); + buildingUnitVersion.BuildingUnitPersistentLocalId.Should().Be(buildingUnitPersistentLocalId); + buildingUnitVersion.Function.Should().Be(BuildingUnitFunction.Unknown.Function); + buildingUnitVersion.OsloFunction.Should().Be(BuildingUnitFunction.Unknown.Map()); + buildingUnitVersion.CreatedOnTimestamp.Should().Be(buildingUnitWasReaddedByOtherUnitRemoval.Provenance.Timestamp); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasReaddedByOtherUnitRemoval.Provenance.Timestamp); + buildingUnitVersion.Namespace.Should().Be(BuildingUnitNamespace); + buildingUnitVersion.PuriId.Should().Be($"{BuildingUnitNamespace}/{buildingUnitPersistentLocalId}"); + buildingUnitVersion.Addresses.Should().ContainSingle(); + buildingUnitVersion.Addresses.Single().AddressPersistentLocalId.Should().Be(addressPersistentLocalId); + buildingUnitVersion.Addresses.Single().Position.Should().Be(position); + }); + } + + [Fact] + public async Task WhenCommonBuildingUnitWasAdded() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingPersistentLocalId = (int) _fixture.Create(); + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var commonBuildingUnitWasAdded = _fixture.Create(); + + AddBuildingPersistentLocalId(buildingPersistentLocalId); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + + var position = _fixture.Create(); + + var commonBuildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + + await Sut + .Given( + new Envelope(new Envelope(commonBuildingUnitWasAdded, commonBuildingUnitWasAddedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.BuildingId.Should().Be(commonBuildingUnitWasAdded.BuildingId); + buildingUnitVersion.BuildingUnitId.Should().Be(commonBuildingUnitWasAdded.BuildingUnitId); + buildingUnitVersion.BuildingPersistentLocalId.Should().Be(buildingPersistentLocalId); + buildingUnitVersion.BuildingUnitPersistentLocalId.Should().Be(buildingUnitPersistentLocalId); + buildingUnitVersion.Function.Should().Be(BuildingUnitFunction.Common.Function); + buildingUnitVersion.OsloFunction.Should().Be(BuildingUnitFunction.Common.Map()); + buildingUnitVersion.CreatedOnTimestamp.Should().Be(commonBuildingUnitWasAdded.Provenance.Timestamp); + buildingUnitVersion.VersionTimestamp.Should().Be(commonBuildingUnitWasAdded.Provenance.Timestamp); + buildingUnitVersion.Namespace.Should().Be(BuildingUnitNamespace); + buildingUnitVersion.PuriId.Should().Be($"{BuildingUnitNamespace}/{buildingUnitPersistentLocalId}"); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasRemoved() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasRemoved = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasRemovedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasRemoved, buildingUnitWasRemovedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.IsRemoved.Should().BeTrue(); + buildingUnitVersion.Addresses.Should().BeEmpty(); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasRemoved.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitAddressWasAttached() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + var attachedAddressPersistentLocalId = 2; + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitAddressWasAttached = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + AddAddressPersistentLocalId(buildingUnitAddressWasAttached.AddressId, attachedAddressPersistentLocalId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitAddressWasAttachedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitAddressWasAttached, buildingUnitAddressWasAttachedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Addresses.Should().HaveCount(2); + buildingUnitVersion.Addresses + .SingleOrDefault(x => x.AddressPersistentLocalId == attachedAddressPersistentLocalId).Should().NotBeNull(); + + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitAddressWasAttached.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitAddressWasDetached() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitAddressWasDetached = new BuildingUnitAddressWasDetached( + new BuildingId(buildingUnitWasAdded.BuildingId), + new AddressId(buildingUnitWasAdded.AddressId), + new BuildingUnitId(buildingUnitWasAdded.BuildingUnitId)); + ((ISetProvenance)buildingUnitAddressWasDetached).SetProvenance(_fixture.Create()); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitAddressWasAttachedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitAddressWasDetached, buildingUnitAddressWasAttachedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Addresses.Should().BeEmpty(); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitAddressWasDetached.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasReaddressed() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var newAddressId = new AddressId(Guid.NewGuid()); + var newAddressPersistentLocalId = 2; + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasReaddressed = new BuildingUnitWasReaddressed( + new BuildingId(buildingUnitWasAdded.BuildingId), + new BuildingUnitId(buildingUnitWasAdded.BuildingUnitId), + new AddressId(buildingUnitWasAdded.AddressId), + newAddressId, + new ReaddressingBeginDate(_fixture.Create())); + ((ISetProvenance)buildingUnitWasReaddressed).SetProvenance(_fixture.Create()); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + AddAddressPersistentLocalId(newAddressId, newAddressPersistentLocalId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasReaddressedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasReaddressed, buildingUnitWasReaddressedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Addresses.Should().ContainSingle(); + buildingUnitVersion.Addresses.Single().AddressPersistentLocalId.Should().Be(newAddressPersistentLocalId); + + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasReaddressed.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitPositionWasAppointedByAdministrator() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitPositionWasAppointedByAdministrator = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitPositionWasAppointedByAdministratorMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope( + new Envelope(buildingUnitPositionWasAppointedByAdministrator, buildingUnitPositionWasAppointedByAdministratorMetadata)) + ) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Geometry.Should().BeEquivalentTo( + _wkbReader.Read(buildingUnitPositionWasAppointedByAdministrator.ExtendedWkbGeometry.ToByteArray())); + buildingUnitVersion.GeometryMethod.Should().Be(BuildingUnitPositionGeometryMethod.AppointedByAdministrator.GeometryMethod); + buildingUnitVersion.OsloGeometryMethod.Should().Be(BuildingUnitPositionGeometryMethod.AppointedByAdministrator.Map()); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitPositionWasAppointedByAdministrator.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitPositionWasCorrectedToAppointedByAdministrator() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitPositionWasCorrectedToAppointedByAdministrator = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitPositionWasCorrectedToAppointedByAdministratorMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope( + new Envelope(buildingUnitPositionWasCorrectedToAppointedByAdministrator, buildingUnitPositionWasCorrectedToAppointedByAdministratorMetadata)) + ) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Geometry.Should().BeEquivalentTo( + _wkbReader.Read(buildingUnitPositionWasCorrectedToAppointedByAdministrator.ExtendedWkbGeometry.ToByteArray())); + buildingUnitVersion.GeometryMethod.Should().Be(BuildingUnitPositionGeometryMethod.AppointedByAdministrator.GeometryMethod); + buildingUnitVersion.OsloGeometryMethod.Should().Be(BuildingUnitPositionGeometryMethod.AppointedByAdministrator.Map()); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitPositionWasCorrectedToAppointedByAdministrator.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitPositionWasCorrectedToDerivedFromObject() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitPositionWasCorrectedToDerivedFromObject = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitPositionWasCorrectedToDerivedFromObjectMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope( + new Envelope(buildingUnitPositionWasCorrectedToDerivedFromObject, buildingUnitPositionWasCorrectedToDerivedFromObjectMetadata)) + ) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Geometry.Should().BeEquivalentTo( + _wkbReader.Read(buildingUnitPositionWasCorrectedToDerivedFromObject.ExtendedWkbGeometry.ToByteArray())); + buildingUnitVersion.GeometryMethod.Should().Be(BuildingUnitPositionGeometryMethod.DerivedFromObject.GeometryMethod); + buildingUnitVersion.OsloGeometryMethod.Should().Be(BuildingUnitPositionGeometryMethod.DerivedFromObject.Map()); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitPositionWasCorrectedToDerivedFromObject.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitPositionWasDerivedFromObject() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitPositionWasDerivedFromObject = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitPositionWasDerivedFromObjectMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope( + new Envelope(buildingUnitPositionWasDerivedFromObject, buildingUnitPositionWasDerivedFromObjectMetadata)) + ) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Geometry.Should().BeEquivalentTo( + _wkbReader.Read(buildingUnitPositionWasDerivedFromObject.ExtendedWkbGeometry.ToByteArray())); + buildingUnitVersion.GeometryMethod.Should().Be(BuildingUnitPositionGeometryMethod.DerivedFromObject.GeometryMethod); + buildingUnitVersion.OsloGeometryMethod.Should().Be(BuildingUnitPositionGeometryMethod.DerivedFromObject.Map()); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitPositionWasDerivedFromObject.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitStatusWasRemoved() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasRealized = _fixture.Create(); + var buildingUnitStatusWasRemoved = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasRealizedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + var buildingUnitPositionWasDerivedFromObjectMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 2 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasRealized, buildingUnitWasRealizedMetadata)), + new Envelope(new Envelope(buildingUnitStatusWasRemoved, buildingUnitPositionWasDerivedFromObjectMetadata)) + ) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 2, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().BeNull(); + buildingUnitVersion.OsloStatus.Should().BeNull(); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitStatusWasRemoved.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasRealized() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasRealized = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasRealizedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasRealized, buildingUnitWasRealizedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().Be("Realized"); + buildingUnitVersion.OsloStatus.Should().Be("Gerealiseerd"); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasRealized.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasRetired() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasRetired = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasRetiredMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasRetired, buildingUnitWasRetiredMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().Be("Retired"); + buildingUnitVersion.OsloStatus.Should().Be("Gehistoreerd"); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasRetired.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasRetiredByParent() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasRetiredByParent = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasRetiredByParentMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasRetiredByParent, buildingUnitWasRetiredByParentMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().Be("Retired"); + buildingUnitVersion.OsloStatus.Should().Be("Gehistoreerd"); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasRetiredByParent.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasNotRealized() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasNotRealized = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasNotRealizedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasNotRealized, buildingUnitWasNotRealizedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().Be("NotRealized"); + buildingUnitVersion.OsloStatus.Should().Be("NietGerealiseerd"); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasNotRealized.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasNotRealizedByParent() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasNotRealizedByParent = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasNotRealizedByParentMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasNotRealizedByParent, buildingUnitWasNotRealizedByParentMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().Be("NotRealized"); + buildingUnitVersion.OsloStatus.Should().Be("NietGerealiseerd"); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasNotRealizedByParent.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasPlanned() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasPlanned = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasPlannedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasPlanned, buildingUnitWasPlannedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().Be("Planned"); + buildingUnitVersion.OsloStatus.Should().Be("Gepland"); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasPlanned.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasCorrectedToRealized() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasCorrectedToRealized = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasCorrectedToRealizedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasCorrectedToRealized, buildingUnitWasCorrectedToRealizedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().Be("Realized"); + buildingUnitVersion.OsloStatus.Should().Be("Gerealiseerd"); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasCorrectedToRealized.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasCorrectedToNotRealized() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasCorrectedToNotRealized = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasCorrectedToNotRealizedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasCorrectedToNotRealized, buildingUnitWasCorrectedToNotRealizedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().Be("NotRealized"); + buildingUnitVersion.OsloStatus.Should().Be("NietGerealiseerd"); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasCorrectedToNotRealized.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasCorrectedToRetired() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasCorrectedToRetired = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasCorrectedToRetiredMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasCorrectedToRetired, buildingUnitWasCorrectedToRetiredMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().Be("Retired"); + buildingUnitVersion.OsloStatus.Should().Be("Gehistoreerd"); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasCorrectedToRetired.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBuildingUnitWasCorrectedToPlanned() + { + _fixture.Customize(new WithFixedBuildingUnitIdFromHouseNumber()); + + var buildingUnitPersistentLocalId = (int) _fixture.Create(); + + var buildingUnitWasAdded = _fixture.Create(); + var buildingUnitWasCorrectedToPlanned = _fixture.Create(); + + AddBuildingPersistentLocalId(); + AddBuildingUnitPersistentLocalId(buildingUnitPersistentLocalId); + AddAddressPersistentLocalId(buildingUnitWasAdded.AddressId); + + var position = _fixture.Create(); + + var buildingUnitWasAddedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position } + }; + var buildingUnitWasCorrectedToPlannedMetadata = new Dictionary + { + { Envelope.PositionMetadataKey, position + 1 } + }; + + await Sut + .Given( + new Envelope(new Envelope(buildingUnitWasAdded, buildingUnitWasAddedMetadata)), + new Envelope(new Envelope(buildingUnitWasCorrectedToPlanned, buildingUnitWasCorrectedToPlannedMetadata))) + .Then(async context => + { + var buildingUnitVersion = await context.BuildingUnitVersions.FindAsync(position + 1, buildingUnitPersistentLocalId); + buildingUnitVersion.Should().NotBeNull(); + + buildingUnitVersion!.Status.Should().Be("Planned"); + buildingUnitVersion.OsloStatus.Should().Be("Gepland"); + buildingUnitVersion.VersionTimestamp.Should().Be(buildingUnitWasCorrectedToPlanned.Provenance.Timestamp); + }); + } + + private void AddBuildingUnitPersistentLocalId(Guid buildingUnitId, int buildingUnitPersistentLocalId) + { + _persistentLocalIdFinder + .Setup(x => x.FindBuildingUnitPersistentLocalId(It.IsAny(), buildingUnitId, It.IsAny())) + .ReturnsAsync(buildingUnitPersistentLocalId); + } + + private void AddBuildingUnitPersistentLocalId(int buildingUnitPersistentLocalId) + { + _persistentLocalIdFinder + .Setup(x => x.FindBuildingUnitPersistentLocalId(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(buildingUnitPersistentLocalId); + } + + private void AddBuildingPersistentLocalId(int? buildingPersistentLocalId = null) + { + var persistentLocalId = buildingPersistentLocalId ?? (int) _fixture.Create(); + + _persistentLocalIdFinder + .Setup(x => x.FindBuildingPersistentLocalId(It.IsAny(), It.IsAny())) + .ReturnsAsync(persistentLocalId); + } + private void AddAddressPersistentLocalId(Guid addressId, int addressPersistentLocalId = 1) + { + _addresses + .Setup(x => x.GetAddressPersistentLocalId(addressId)) + .ReturnsAsync(addressPersistentLocalId); + } } } diff --git a/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests.cs b/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests.cs index a29c97024..b845927d5 100644 --- a/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests.cs +++ b/test/BuildingRegistry.Tests/ProjectionTests/Integration/BuildingUnit/BuildingUnitVersionProjectionsTests.cs @@ -1,6 +1,5 @@ namespace BuildingRegistry.Tests.ProjectionTests.Integration.BuildingUnit { - using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -33,12 +32,12 @@ public partial class BuildingUnitVersionProjectionsTests : IntegrationProjection private readonly Fixture _fixture; private readonly WKBReader _wkbReader = WKBReaderFactory.Create(); private readonly Mock _persistentLocalIdFinder; - private readonly FakeAddresses _fakeAddresses; + private readonly Mock _addresses; public BuildingUnitVersionProjectionsTests() { _persistentLocalIdFinder = new Mock(); - _fakeAddresses = new FakeAddresses(); + _addresses = new Mock(); _fixture = new Fixture(); _fixture.Customizations.Add(new WithUniqueInteger()); @@ -1562,17 +1561,7 @@ protected override BuildingUnitVersionProjections CreateProjection() BuildingUnitNamespace = BuildingUnitNamespace, }), _persistentLocalIdFinder.Object, - _fakeAddresses); - } - } - - public class FakeAddresses : IAddresses - { - public const int AddressPersistentLocalId = 1; - - public Task GetAddressPersistentLocalId(Guid addressId) - { - return Task.FromResult(AddressPersistentLocalId as int?); + _addresses.Object); } } }