From 45eb3d8c2c0f2e9fdcfe3f2643573ebc00e086f1 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Tue, 4 Feb 2025 11:52:17 +0100 Subject: [PATCH 01/13] api --- .../ChangeRoadSegmentAttributesRequest.cs | 2 + .../ChangeAttributeParameters.cs | 18 ++++++- .../ChangeAttributeParametersValidator.cs | 19 ++++++++ .../ChangeRoadSegmentAttributesParameters.cs | 24 +++++----- ...RoadSegmentsController-ChangeAttributes.cs | 13 +++++ .../Extensions/RuleBuilderExtensions.cs | 11 +++-- .../Extensions/StringExtensions.cs | 5 ++ .../Core/ProblemCodes/RoadSegment.cs | 2 + .../StreetNameLocalId.cs | 47 ++++++++++++++++++- 9 files changed, 123 insertions(+), 18 deletions(-) diff --git a/src/RoadRegistry.BackOffice.Abstractions/RoadSegments/ChangeRoadSegmentAttributesRequest.cs b/src/RoadRegistry.BackOffice.Abstractions/RoadSegments/ChangeRoadSegmentAttributesRequest.cs index cf6b3f009..a2505e70e 100644 --- a/src/RoadRegistry.BackOffice.Abstractions/RoadSegments/ChangeRoadSegmentAttributesRequest.cs +++ b/src/RoadRegistry.BackOffice.Abstractions/RoadSegments/ChangeRoadSegmentAttributesRequest.cs @@ -38,6 +38,8 @@ public class ChangeRoadSegmentAttributeRequest public ICollection? EuropeanRoads { get; set; } public ICollection? NationalRoads { get; set; } public ICollection? NumberedRoads { get; set; } + public StreetNameLocalId? LeftSideStreetNameId { get; set; } + public StreetNameLocalId? RightSideStreetNameId { get; set; } } public class ChangeRoadSegmentNumberedRoadAttribute diff --git a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParameters.cs b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParameters.cs index 0e4bcd5fa..4bb7922f4 100644 --- a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParameters.cs +++ b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParameters.cs @@ -1,9 +1,9 @@ namespace RoadRegistry.BackOffice.Api.RoadSegments.ChangeAttributes; +using System.Runtime.Serialization; +using Infrastructure; using Infrastructure.Controllers.Attributes; using Newtonsoft.Json; -using RoadRegistry.BackOffice.Api.Infrastructure; -using System.Runtime.Serialization; public record ChangeAttributeParameters { @@ -73,6 +73,20 @@ public record ChangeAttributeParameters [DataMember(Name = "GenummerdeWegen", Order = 9)] [JsonProperty("genummerdeWegen")] public ChangeAttributeNumberedRoad[] GenummerdeWegen { get; set; } + + /// + /// De unieke en persistente identificator van de straatnaam aan de linkerzijde van het wegsegment of "niet gekend" of "niet van toepassing". + /// + [DataMember(Name = "LinkerstraatnaamId", Order = 10)] + [JsonProperty("linkerstraatnaamId")] + public string? LinkerstraatnaamId { get; set; } + + /// + /// De unieke en persistente identificator van de straatnaam aan de rechterzijde van het wegsegment of "niet gekend" of "niet van toepassing". + /// + [DataMember(Name = "RechterstraatnaamId", Order = 11)] + [JsonProperty("rechterstraatnaamId")] + public string? RechterstraatnaamId { get; set; } } [DataContract(Name = "EuropeseWeg", Namespace = "")] diff --git a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParametersValidator.cs b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParametersValidator.cs index 227c606c9..d0020fdac 100644 --- a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParametersValidator.cs +++ b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParametersValidator.cs @@ -11,6 +11,7 @@ namespace RoadRegistry.BackOffice.Api.RoadSegments.ChangeAttributes; using System.Linq; using System.Threading; using System.Threading.Tasks; +using RoadRegistry.BackOffice.Handlers.Extensions; public class ChangeAttributeParametersValidator : AbstractValidator { @@ -28,6 +29,8 @@ protected override bool PreValidate(ValidationContext && context.InstanceToValidate.EuropeseWegen is null && context.InstanceToValidate.NationaleWegen is null && context.InstanceToValidate.GenummerdeWegen is null + && context.InstanceToValidate.LinkerstraatnaamId is null + && context.InstanceToValidate.RechterstraatnaamId is null ) { context.AddFailure(new ValidationFailure @@ -127,6 +130,22 @@ public ChangeAttributeParametersValidator(EditorContext editorContext, IOrganiza RuleForEach(x => x.GenummerdeWegen) .SetValidator(new ChangeAttributeNumberedRoadValidator()); }); + + When(x => x.LinkerstraatnaamId is not null, () => + { + RuleFor(x => x.LinkerstraatnaamId) + .Cascade(CascadeMode.Stop) + .MustBeValidStreetNameId(allowSystemValues: true) + .WithProblemCode(ProblemCode.RoadSegment.StreetName.Left.NotValid); + }); + + When(x => x.RechterstraatnaamId is not null, () => + { + RuleFor(x => x.RechterstraatnaamId) + .Cascade(CascadeMode.Stop) + .MustBeValidStreetNameId(allowSystemValues: true) + .WithProblemCode(ProblemCode.RoadSegment.StreetName.Right.NotValid); + }); } private Task BeExistingNonRemovedRoadSegment(int[] ids, CancellationToken cancellationToken) diff --git a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeRoadSegmentAttributesParameters.cs b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeRoadSegmentAttributesParameters.cs index 8b0fae14d..3c1635ba0 100644 --- a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeRoadSegmentAttributesParameters.cs +++ b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeRoadSegmentAttributesParameters.cs @@ -19,38 +19,40 @@ public ChangeRoadSegmentAttributesParameters GetExamples() { new() { - Wegsegmenten = new[] { 481110, 481111 }, + Wegsegmenten = [481110, 481111], Wegbeheerder = "AWV112" }, new() { - Wegsegmenten = new[] { 481111 }, + Wegsegmenten = [481111], Wegsegmentstatus = RoadSegmentStatus.OutOfUse.ToDutchString(), MorfologischeWegklasse = RoadSegmentMorphology.PrimitiveRoad.ToDutchString(), Wegbeheerder = "AWV114", - EuropeseWegen = new[] - { + EuropeseWegen = + [ new ChangeAttributeEuropeanRoad { EuNummer = "E40" } - }, - NationaleWegen = new[] - { + ], + NationaleWegen = + [ new ChangeAttributeNationalRoad { Ident2 = "N180" } - }, - GenummerdeWegen = new[] - { + ], + GenummerdeWegen = + [ new ChangeAttributeNumberedRoad { Ident8 = "N0080001", Richting = RoadSegmentNumberedRoadDirection.Forward.ToDutchString(), Volgnummer = new RoadSegmentNumberedRoadOrdinal(2686).ToDutchString() } - } + ], + LinkerstraatnaamId = "https://data.vlaanderen.be/id/straatnaam/1", + RechterstraatnaamId = StreetNameLocalId.NotApplicable.ToDutchString() // todo-rik valideren met Erik } }; } diff --git a/src/RoadRegistry.BackOffice.Api/RoadSegments/RoadSegmentsController-ChangeAttributes.cs b/src/RoadRegistry.BackOffice.Api/RoadSegments/RoadSegmentsController-ChangeAttributes.cs index a9619bf57..a4f710f9d 100644 --- a/src/RoadRegistry.BackOffice.Api/RoadSegments/RoadSegmentsController-ChangeAttributes.cs +++ b/src/RoadRegistry.BackOffice.Api/RoadSegments/RoadSegmentsController-ChangeAttributes.cs @@ -4,6 +4,7 @@ namespace RoadRegistry.BackOffice.Api.RoadSegments; using System.Threading; using System.Threading.Tasks; using Abstractions.RoadSegments; +using BackOffice.Handlers.Extensions; using BackOffice.Handlers.Sqs.RoadSegments; using Be.Vlaanderen.Basisregisters.Api.Exceptions; using Be.Vlaanderen.Basisregisters.Auth.AcmIdm; @@ -138,6 +139,18 @@ ChangeRoadSegmentAttributesRequest TranslateParametersIntoTypedBackOfficeRequest Ordinal = RoadSegmentNumberedRoadOrdinal.ParseUsingDutchName(numberedRoad.Volgnummer) }).ToArray(); } + + if (attributesChange.LinkerstraatnaamId is not null) + { + var identifier = attributesChange.LinkerstraatnaamId.GetIdentifierPartFromPuri(); + roadSegment.LeftSideStreetNameId = StreetNameLocalId.ParseUsingDutchName(identifier); + } + + if (attributesChange.RechterstraatnaamId is not null) + { + var identifier = attributesChange.RechterstraatnaamId.GetIdentifierPartFromPuri(); + roadSegment.RightSideStreetNameId = StreetNameLocalId.ParseUsingDutchName(identifier); + } }); } diff --git a/src/RoadRegistry.BackOffice.Handlers/Extensions/RuleBuilderExtensions.cs b/src/RoadRegistry.BackOffice.Handlers/Extensions/RuleBuilderExtensions.cs index 51059f2b5..e7c1c9551 100644 --- a/src/RoadRegistry.BackOffice.Handlers/Extensions/RuleBuilderExtensions.cs +++ b/src/RoadRegistry.BackOffice.Handlers/Extensions/RuleBuilderExtensions.cs @@ -2,11 +2,11 @@ namespace RoadRegistry.BackOffice.Handlers.Extensions; using FluentValidation; -internal static class RuleBuilderExtensions +public static class RuleBuilderExtensions { private const string StreetNameIdPrefix = "https://data.vlaanderen.be/id/straatnaam/"; - public static IRuleBuilderOptions MustBeValidStreetNameId(this IRuleBuilder ruleBuilder) + public static IRuleBuilderOptions MustBeValidStreetNameId(this IRuleBuilder ruleBuilder, bool allowSystemValues = false) { return ruleBuilder.Must(value => { @@ -15,12 +15,17 @@ public static IRuleBuilderOptions MustBeValidStreetNameId(this IRu return true; } + if (allowSystemValues && StreetNameLocalId.TryParseUsingDutchName(value, out _)) + { + return true; + } + if (!value.StartsWith(StreetNameIdPrefix)) { return false; } - var identifier = value.Substring(StreetNameIdPrefix.Length); + var identifier = value[StreetNameIdPrefix.Length..]; return int.TryParse(identifier, out _); }); } diff --git a/src/RoadRegistry.BackOffice.Handlers/Extensions/StringExtensions.cs b/src/RoadRegistry.BackOffice.Handlers/Extensions/StringExtensions.cs index 65e2db29e..899ed4327 100644 --- a/src/RoadRegistry.BackOffice.Handlers/Extensions/StringExtensions.cs +++ b/src/RoadRegistry.BackOffice.Handlers/Extensions/StringExtensions.cs @@ -15,4 +15,9 @@ public static int GetIdentifierFromPuri(this string puri) return 0; } + + public static string GetIdentifierPartFromPuri(this string puri) + { + return puri.Split('/').Last(); + } } diff --git a/src/RoadRegistry.BackOffice/Core/ProblemCodes/RoadSegment.cs b/src/RoadRegistry.BackOffice/Core/ProblemCodes/RoadSegment.cs index 60b0432d3..139c31728 100644 --- a/src/RoadRegistry.BackOffice/Core/ProblemCodes/RoadSegment.cs +++ b/src/RoadRegistry.BackOffice/Core/ProblemCodes/RoadSegment.cs @@ -184,12 +184,14 @@ public static class Left { public static readonly ProblemCode NotLinked = new("RoadSegmentStreetNameLeftNotLinked"); public static readonly ProblemCode NotUnlinked = new("RoadSegmentStreetNameLeftNotUnlinked"); + public static readonly ProblemCode NotValid = new("RoadSegmentStreetNameLeftNotValid"); } public static class Right { public static readonly ProblemCode NotLinked = new("RoadSegmentStreetNameRightNotLinked"); public static readonly ProblemCode NotUnlinked = new("RoadSegmentStreetNameRightNotUnlinked"); + public static readonly ProblemCode NotValid = new("RoadSegmentStreetNameRightNotValid"); } } diff --git a/src/RoadRegistry.BackOffice/StreetNameLocalId.cs b/src/RoadRegistry.BackOffice/StreetNameLocalId.cs index fefdcca76..1f6760a55 100644 --- a/src/RoadRegistry.BackOffice/StreetNameLocalId.cs +++ b/src/RoadRegistry.BackOffice/StreetNameLocalId.cs @@ -1,11 +1,12 @@ namespace RoadRegistry.BackOffice; using System; +using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; using Framework; -public readonly struct StreetNameLocalId : IEquatable +public readonly struct StreetNameLocalId : IEquatable, IDutchToString { private const int UnknownValue = -8; private const int NotApplicableValue = -9; @@ -30,7 +31,7 @@ public static bool IsEmpty(StreetNameLocalId? value) public static bool Accepts(int value) { - return value == UnknownValue || value == NotApplicableValue || value > 0; + return value is UnknownValue or NotApplicableValue or > 0; } public static StreetNameLocalId? FromValue(int? value) @@ -40,12 +41,54 @@ public static bool Accepts(int value) : new StreetNameLocalId?(); } + private static readonly IDictionary DutchNameMapping = new Dictionary() + { + { "niet gekend", Unknown }, + { "niet van toepassing", NotApplicable } + }; + [Pure] public int ToInt32() { return _value; } + public static StreetNameLocalId ParseUsingDutchName(string value) + { + if (!TryParseUsingDutchName(value.ThrowIfNull(), out var parsed)) + throw new FormatException($"The value {value} is not a well known street name local id."); + return parsed; + } + + public static bool TryParseUsingDutchName(string value, out StreetNameLocalId parsed) + { + if (DutchNameMapping.TryGetValue(value, out parsed)) + { + return true; + } + + if (int.TryParse(value, out var valueAsInt) && Accepts(valueAsInt)) + { + parsed = new StreetNameLocalId(valueAsInt); + return true; + } + + return false; + } + + public string ToDutchString() + { + foreach (var item in DutchNameMapping) + { + if (item.Value == this) + { + return item.Key; + } + } + + return ToString(); + } + public bool Equals(StreetNameLocalId other) { return _value == other._value; From 4af6af244b12f0258994623446df59c70fd1d746 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Tue, 4 Feb 2025 15:00:01 +0100 Subject: [PATCH 02/13] api tests --- .../Fixtures/WhenChangeAttributesFixture.cs | 77 ------- .../WhenChangeAttributesWithInvalidRequest.cs | 45 ---- .../WhenChangeAttributesWithValidRequest.cs | 31 --- .../ChangeAttributesTestBase.cs | 119 +++++++++++ ...angeAttributesWithInvalidRequestFixture.cs | 13 -- ...ChangeAttributesWithValidRequestFixture.cs | 73 ------- ...henChangeAttributesWithInvalidAttribuut.cs | 26 --- ...hangeAttributesWithInvalidEuropeseWegen.cs | 65 ------ ...ngeAttributesWithInvalidGenummerdeWegen.cs | 157 -------------- ...ibutesWithInvalidMorfologischeWegklasse.cs | 27 --- ...angeAttributesWithInvalidNationaleWegen.cs | 65 ------ ...eAttributesWithInvalidToegangsbeperking.cs | 27 --- ...ChangeAttributesWithInvalidWegbeheerder.cs | 44 ---- ...ChangeAttributesWithInvalidWegcategorie.cs | 27 --- ...geAttributesWithInvalidWegsegmentStatus.cs | 27 --- ...ChangeAttributesWithInvalidWegsegmenten.cs | 43 ---- .../WhenChangeAttributesWithValidRequest.cs | 13 -- .../WhenChangeAttributes/WhenEuropeseWegen.cs | 87 ++++++++ .../WhenGenummerdeWegen.cs | 200 ++++++++++++++++++ .../WhenMorfologischeWegklasse.cs | 43 ++++ .../WhenNationaleWegen.cs | 87 ++++++++ .../WhenChangeAttributes/WhenNoAttribuut.cs | 18 ++ .../WhenToegangsbeperking.cs | 43 ++++ .../WhenChangeAttributes/WhenWegbeheerder.cs | 59 ++++++ .../WhenChangeAttributes/WhenWegcategorie.cs | 43 ++++ .../WhenWegsegmentStatus.cs | 43 ++++ .../WhenChangeAttributes/WithWegsegmenten.cs | 35 +++ 27 files changed, 777 insertions(+), 760 deletions(-) delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributesWithInvalidRequest.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributesWithValidRequest.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/ChangeAttributesTestBase.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithInvalidRequestFixture.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidAttribuut.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidEuropeseWegen.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidGenummerdeWegen.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidMorfologischeWegklasse.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidNationaleWegen.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidToegangsbeperking.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegbeheerder.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegcategorie.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegsegmentStatus.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegsegmenten.cs delete mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenEuropeseWegen.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenGenummerdeWegen.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenMorfologischeWegklasse.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenNationaleWegen.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenNoAttribuut.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenToegangsbeperking.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegbeheerder.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegcategorie.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegsegmentStatus.cs create mode 100644 test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WithWegsegmenten.cs diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs deleted file mode 100644 index 6f582514f..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs +++ /dev/null @@ -1,77 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes.Abstractions.Fixtures; - -using Api.RoadSegments; -using Api.RoadSegments.ChangeAttributes; -using AutoFixture; -using BackOffice.Extracts.Dbase.Organizations; -using Editor.Schema; -using Infrastructure; -using MediatR; -using Messages; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using RoadRegistry.Tests.BackOffice; -using RoadRegistry.Tests.BackOffice.Extracts; -using RoadRegistry.Tests.BackOffice.Scenarios; - -public abstract class WhenChangeAttributesFixture : ControllerActionFixture -{ - private readonly EditorContext _editorContext; - private readonly IMediator _mediator; - public readonly RoadNetworkTestData TestData = new(); - - private IOrganizationCache _organizationCache; - - protected WhenChangeAttributesFixture(IMediator mediator, EditorContext editorContext) - { - _mediator = mediator; - _editorContext = editorContext; - - TestData.CopyCustomizationsTo(ObjectProvider); - - ObjectProvider.CustomizeRoadSegmentOutlineMorphology(); - ObjectProvider.CustomizeRoadSegmentOutlineStatus(); - _organizationCache = new FakeOrganizationCache(); - } - - protected override async Task GetResultAsync(ChangeRoadSegmentAttributesParameters parameters) - { - var controller = new RoadSegmentsController(new FakeTicketingOptions(), _mediator) - { - ControllerContext = new ControllerContext - { - HttpContext = new DefaultHttpContext() - } - }; - - return await controller.ChangeAttributes( - parameters, - new ChangeRoadSegmentAttributesParametersValidator(), - new ChangeRoadSegmentAttributesParametersWrapperValidator(_editorContext, _organizationCache), - CancellationToken.None - ); - } - - public void CustomizeOrganizationCache(IOrganizationCache organizationCache) - { - _organizationCache = organizationCache.ThrowIfNull(); - } - - protected override async Task SetupAsync() - { - await _editorContext.Organizations.AddAsync(new OrganizationRecord - { - Code = TestData.ChangedByOrganization, - SortableCode = TestData.ChangedByOrganization, - DbaseRecord = Array.Empty(), - DbaseSchemaVersion = WellKnownDbaseSchemaVersions.V2 - }, CancellationToken.None); - - var message = ObjectProvider - .Create() - .WithAcceptedChanges(TestData.Segment1Added); - - await _editorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, message.When)); - await _editorContext.SaveChangesAsync(CancellationToken.None); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributesWithInvalidRequest.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributesWithInvalidRequest.cs deleted file mode 100644 index df06aaeb2..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributesWithInvalidRequest.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes.Abstractions; - -using Api.RoadSegments.ChangeAttributes; -using Extensions; -using Fixtures; -using FluentValidation; -using FluentValidation.Results; -using Xunit.Abstractions; - -public abstract class WhenChangeAttributesWithInvalidRequest : IClassFixture - where TFixture : WhenChangeAttributesFixture -{ - protected readonly TFixture Fixture; - protected readonly ITestOutputHelper OutputHelper; - - protected WhenChangeAttributesWithInvalidRequest(TFixture fixture, ITestOutputHelper outputHelper) - { - Fixture = fixture; - OutputHelper = outputHelper; - } - - protected async Task ItShouldHaveExpectedError(ChangeRoadSegmentAttributesParameters request, string expectedErrorCode, string expectedErrorMessagePrefix) - { - await Fixture.ExecuteAsync(request); - - var errors = ItShouldHaveValidationException().ToArray(); - - if (expectedErrorCode is not null) - { - Assert.Contains(expectedErrorCode, errors.Select(x => x.ErrorCode)); - } - - if (expectedErrorMessagePrefix is not null) - { - Assert.True(errors != null && errors.Any(x => x.ErrorMessage.StartsWith(expectedErrorMessagePrefix))); - } - } - - private IEnumerable ItShouldHaveValidationException() - { - var ex = Assert.IsType(Fixture.Exception); - var err = Assert.IsAssignableFrom>(ex.Errors); - return err.TranslateToDutch(); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributesWithValidRequest.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributesWithValidRequest.cs deleted file mode 100644 index bbb7fc820..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributesWithValidRequest.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes.Abstractions; - -using Fixtures; -using Microsoft.AspNetCore.Mvc; -using Newtonsoft.Json; -using Xunit.Abstractions; - -public abstract class WhenChangeAttributesWithValidRequest : IClassFixture - where TFixture : WhenChangeAttributesFixture -{ - protected readonly TFixture Fixture; - protected readonly ITestOutputHelper OutputHelper; - - protected WhenChangeAttributesWithValidRequest(TFixture fixture, ITestOutputHelper outputHelper) - { - Fixture = fixture; - OutputHelper = outputHelper; - } - - [Fact] - public void ItShouldSucceed() - { - if (Fixture.Exception is not null) - { - OutputHelper.WriteLine($"{nameof(Fixture.Request)}: {JsonConvert.SerializeObject(Fixture.Request)}"); - OutputHelper.WriteLine(Fixture.Exception.ToString()); - } - - Assert.IsType(Fixture.Result); - } -} \ No newline at end of file diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/ChangeAttributesTestBase.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/ChangeAttributesTestBase.cs new file mode 100644 index 000000000..0e19140e7 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/ChangeAttributesTestBase.cs @@ -0,0 +1,119 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments; +using Api.RoadSegments.ChangeAttributes; +using AutoFixture; +using BackOffice.Extracts.Dbase.Organizations; +using BackOffice.Handlers.Sqs.RoadSegments; +using Be.Vlaanderen.Basisregisters.Sqs.Requests; +using Editor.Schema; +using Extensions; +using FluentValidation; +using FluentValidation.Results; +using MediatR; +using Messages; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Moq; +using RoadRegistry.Tests.BackOffice; +using RoadRegistry.Tests.BackOffice.Extracts; +using RoadRegistry.Tests.BackOffice.Scenarios; + +public abstract class ChangeAttributesTestBase +{ + protected readonly FakeOrganizationCache OrganizationCache; + protected readonly RoadNetworkTestData TestData; + protected IFixture Fixture => TestData.ObjectProvider; + + private readonly Mock _mediator; + private readonly EditorContext _editorContext; + + protected ChangeAttributesTestBase() + { + _mediator = new Mock(); + _mediator + .Setup(x => x.Send(It.IsAny(), It.IsAny())) + .ReturnsAsync(Fixture.Create()); + _editorContext = new FakeEditorContextFactory().CreateDbContext(); + OrganizationCache = new FakeOrganizationCache(); + + TestData = new RoadNetworkTestData(x => + { + x.CustomizeRoadSegmentOutlineMorphology(); + x.CustomizeRoadSegmentOutlineStatus(); + }); + } + + protected async Task ItShouldHaveExpectedError( + ChangeRoadSegmentAttributesParameters request, + string expectedErrorCode, + string expectedErrorMessagePrefix) + { + Exception exception; + try + { + await GetResultAsync(request); + exception = null; + } + catch (Exception ex) + { + exception = ex; + } + + var errors = ItShouldHaveValidationException(exception).ToArray(); + + if (expectedErrorCode is not null) + { + Assert.Contains(expectedErrorCode, errors.Select(x => x.ErrorCode)); + } + + if (expectedErrorMessagePrefix is not null) + { + Assert.True(errors != null && errors.Any(x => x.ErrorMessage.StartsWith(expectedErrorMessagePrefix))); + } + } + + private static IEnumerable ItShouldHaveValidationException(Exception exception) + { + var ex = Assert.IsType(exception); + var err = Assert.IsAssignableFrom>(ex.Errors); + return err.TranslateToDutch(); + } + + protected async Task GivenRoadNetwork() + { + await _editorContext.Organizations.AddAsync(new OrganizationRecord + { + Code = TestData.ChangedByOrganization, + SortableCode = TestData.ChangedByOrganization, + DbaseRecord = [], + DbaseSchemaVersion = WellKnownDbaseSchemaVersions.V2 + }, CancellationToken.None); + + var roadNetworkChangesAccepted = Fixture + .Create() + .WithAcceptedChanges(TestData.Segment1Added); + + await _editorContext.RoadSegments + .AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, roadNetworkChangesAccepted.When)); + await _editorContext.SaveChangesAsync(CancellationToken.None); + } + + protected async Task GetResultAsync(ChangeRoadSegmentAttributesParameters parameters) + { + var controller = new RoadSegmentsController(new FakeTicketingOptions(), _mediator.Object) + { + ControllerContext = new ControllerContext + { + HttpContext = new DefaultHttpContext() + } + }; + + return await controller.ChangeAttributes( + parameters, + new ChangeRoadSegmentAttributesParametersValidator(), + new ChangeRoadSegmentAttributesParametersWrapperValidator(_editorContext, OrganizationCache), + CancellationToken.None + ); + } +} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithInvalidRequestFixture.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithInvalidRequestFixture.cs deleted file mode 100644 index 09a346d0f..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithInvalidRequestFixture.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes.Fixtures; - -using Abstractions.Fixtures; -using Editor.Schema; -using MediatR; - -public class WhenChangeAttributesWithInvalidRequestFixture : WhenChangeAttributesFixture -{ - public WhenChangeAttributesWithInvalidRequestFixture(IMediator mediator, EditorContext editorContext) - : base(mediator, editorContext) - { - } -} \ No newline at end of file diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs deleted file mode 100644 index ab8ca1953..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs +++ /dev/null @@ -1,73 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes.Fixtures; - -using Abstractions.Fixtures; -using Api.RoadSegments.ChangeAttributes; -using AutoFixture; -using Editor.Schema; -using MediatR; - -public class WhenChangeAttributesWithValidRequestFixture : WhenChangeAttributesFixture -{ - public WhenChangeAttributesWithValidRequestFixture(IMediator mediator, EditorContext editorContext) - : base(mediator, editorContext) - { - } - - protected override ChangeRoadSegmentAttributesParameters CreateRequest() - { - return new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegbeheerder = TestData.ChangedByOrganization, - Wegsegmenten = new[] { TestData.Segment1Added.Id } - }, - new() - { - MorfologischeWegklasse = ObjectProvider.Create().ToDutchString(), - Wegsegmenten = new[] { TestData.Segment1Added.Id } - }, - new() - { - Wegcategorie = ObjectProvider.Create().ToDutchString(), - Wegsegmenten = new[] { TestData.Segment1Added.Id } - }, - new() - { - Wegsegmentstatus = ObjectProvider.Create().ToDutchString(), - Wegsegmenten = new[] { TestData.Segment1Added.Id } - }, - new() - { - Toegangsbeperking = ObjectProvider.Create().ToDutchString(), - Wegsegmenten = new[] { TestData.Segment1Added.Id } - }, - new() - { - EuropeseWegen = new [] { new ChangeAttributeEuropeanRoad - { - EuNummer = ObjectProvider.Create().ToString() - } }, - Wegsegmenten = new[] { TestData.Segment1Added.Id } - }, - new() - { - NationaleWegen = new [] { new ChangeAttributeNationalRoad - { - Ident2 = ObjectProvider.Create().ToString() - } }, - Wegsegmenten = new[] { TestData.Segment1Added.Id } - }, - new() - { - GenummerdeWegen = new [] { new ChangeAttributeNumberedRoad - { - Ident8 = ObjectProvider.Create().ToString(), - Richting = ObjectProvider.Create().ToDutchString(), - Volgnummer = ObjectProvider.Create().ToString() - } }, - Wegsegmenten = new[] { TestData.Segment1Added.Id } - } - }; - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidAttribuut.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidAttribuut.cs deleted file mode 100644 index e69bbb65d..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidAttribuut.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Api.RoadSegments.ChangeAttributes; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithInvalidAttribuut : WhenChangeAttributesWithInvalidRequest -{ - public WhenChangeAttributesWithInvalidAttribuut(WhenChangeAttributesWithInvalidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Fact] - public async Task Attribuut_JsonInvalid() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id } - } - }, "JsonInvalid", null); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidEuropeseWegen.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidEuropeseWegen.cs deleted file mode 100644 index 844c01db5..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidEuropeseWegen.cs +++ /dev/null @@ -1,65 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Api.RoadSegments.ChangeAttributes; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithInvalidEuropeseWegen : WhenChangeAttributesWithInvalidRequest -{ - public WhenChangeAttributesWithInvalidEuropeseWegen(WhenChangeAttributesWithInvalidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Fact] - public async Task EuropeseWegen_NietUniek() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - EuropeseWegen = new[] - { - new ChangeAttributeEuropeanRoad { EuNummer = "E40" }, - new ChangeAttributeEuropeanRoad { EuNummer = "E40" } - } - } - }, "EuropeseWegenNietUniek", null); - } - - [Theory] - [InlineData(null)] - [InlineData("")] - public async Task EuropeseWegen_EuNummerVerplicht(string nummer) - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - EuropeseWegen = new[] - { - new ChangeAttributeEuropeanRoad { EuNummer = nummer } - } - } - }, "EuropeseWegEuNummerVerplicht", null); - } - - [Fact] - public async Task EuropeseWegen_EuNummerNietCorrect() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - EuropeseWegen = new[] - { - new ChangeAttributeEuropeanRoad { EuNummer = "-" } - } - } - }, "EuropeseWegEuNummerNietCorrect", null); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidGenummerdeWegen.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidGenummerdeWegen.cs deleted file mode 100644 index 94ed0df16..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidGenummerdeWegen.cs +++ /dev/null @@ -1,157 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Api.RoadSegments.ChangeAttributes; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithInvalidGenummerdeWegen : WhenChangeAttributesWithInvalidRequest -{ - public WhenChangeAttributesWithInvalidGenummerdeWegen(WhenChangeAttributesWithInvalidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Fact] - public async Task GenummerdeWegen_NietUniek() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - GenummerdeWegen = new[] { - new ChangeAttributeNumberedRoad - { - Ident8 = "A0010001", - Richting = "gelijklopend met de digitalisatiezin", - Volgnummer = "1" - }, - new ChangeAttributeNumberedRoad - { - Ident8 = "A0010001", - Richting = "gelijklopend met de digitalisatiezin", - Volgnummer = "1" - } - } - } - }, "GenummerdeWegenNietUniek", null); - } - - [Theory] - [InlineData(null)] - [InlineData("")] - public async Task GenummerdeWegen_Ident8Verplicht(string ident8) - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - GenummerdeWegen = new[] { new ChangeAttributeNumberedRoad - { - Ident8 = ident8, - Richting = "gelijklopend met de digitalisatiezin", - Volgnummer = "1" - } } - } - }, "GenummerdeWegIdent8Verplicht", null); - } - - [Fact] - public async Task GenummerdeWegen_Ident8NietCorrect() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - GenummerdeWegen = new[] { new ChangeAttributeNumberedRoad - { - Ident8 = "-", - Richting = "gelijklopend met de digitalisatiezin", - Volgnummer = "1" - } } - } - }, "GenummerdeWegIdent8NietCorrect", null); - } - - [Theory] - [InlineData(null)] - [InlineData("")] - public async Task GenummerdeWegen_RichtingVerplicht(string richting) - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - GenummerdeWegen = new[] { new ChangeAttributeNumberedRoad - { - Ident8 = "A0010001", - Richting = richting, - Volgnummer = "1" - } } - } - }, "GenummerdeWegRichtingVerplicht", null); - } - - [Fact] - public async Task GenummerdeWegen_RichtingNietCorrect() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - GenummerdeWegen = new[] { new ChangeAttributeNumberedRoad - { - Ident8 = "A0010001", - Richting = "-", - Volgnummer = "1" - } } - } - }, "GenummerdeWegRichtingNietCorrect", null); - } - - [Theory] - [InlineData(null)] - [InlineData("")] - public async Task GenummerdeWegen_VolgnummerVerplicht(string volgnummer) - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - GenummerdeWegen = new[] { new ChangeAttributeNumberedRoad - { - Ident8 = "A0010001", - Richting = "gelijklopend met de digitalisatiezin", - Volgnummer = volgnummer - } } - } - }, "GenummerdeWegVolgnummerVerplicht", null); - } - - [Theory] - [InlineData("-")] - [InlineData("a")] - [InlineData("-1")] - public async Task GenummerdeWegen_VolgnummerNietCorrect(string volgnummer) - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - GenummerdeWegen = new[] { new ChangeAttributeNumberedRoad - { - Ident8 = "A0010001", - Richting = "gelijklopend met de digitalisatiezin", - Volgnummer = volgnummer - } } - } - }, "GenummerdeWegVolgnummerNietCorrect", null); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidMorfologischeWegklasse.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidMorfologischeWegklasse.cs deleted file mode 100644 index f3b4e6257..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidMorfologischeWegklasse.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Api.RoadSegments.ChangeAttributes; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithInvalidMorfologischeWegklasse : WhenChangeAttributesWithInvalidRequest -{ - public WhenChangeAttributesWithInvalidMorfologischeWegklasse(WhenChangeAttributesWithInvalidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Fact] - public async Task MorfologischeWegklasse_MorfologischeWegklasseNietCorrect() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - MorfologischeWegklasse = string.Empty, - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id } - } - }, "MorfologischeWegklasseNietCorrect", null); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidNationaleWegen.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidNationaleWegen.cs deleted file mode 100644 index 5dfa7d589..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidNationaleWegen.cs +++ /dev/null @@ -1,65 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Api.RoadSegments.ChangeAttributes; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithInvalidNationaleWegen : WhenChangeAttributesWithInvalidRequest -{ - public WhenChangeAttributesWithInvalidNationaleWegen(WhenChangeAttributesWithInvalidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Fact] - public async Task NationaleWegen_NietUniek() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - NationaleWegen = new[] - { - new ChangeAttributeNationalRoad { Ident2 = "N1" }, - new ChangeAttributeNationalRoad { Ident2 = "N1" } - } - } - }, "NationaleWegenNietUniek", null); - } - - [Theory] - [InlineData(null)] - [InlineData("")] - public async Task NationaleWegen_Ident2Verplicht(string ident2) - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - NationaleWegen = new[] - { - new ChangeAttributeNationalRoad { Ident2 = ident2 } - } - } - }, "NationaleWegIdent2Verplicht", null); - } - - [Fact] - public async Task NationaleWegen_Ident2NietCorrect() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id }, - NationaleWegen = new[] - { - new ChangeAttributeNationalRoad { Ident2 = "-" } - } - } - }, "NationaleWegIdent2NietCorrect", null); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidToegangsbeperking.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidToegangsbeperking.cs deleted file mode 100644 index bb8dfd35f..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidToegangsbeperking.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Api.RoadSegments.ChangeAttributes; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithInvalidToegangsbeperking : WhenChangeAttributesWithInvalidRequest -{ - public WhenChangeAttributesWithInvalidToegangsbeperking(WhenChangeAttributesWithInvalidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Fact] - public async Task Toegangsbeperking_ToegangsbeperkingNietCorrect() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Toegangsbeperking = string.Empty, - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id } - } - }, "ToegangsbeperkingNietCorrect", null); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegbeheerder.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegbeheerder.cs deleted file mode 100644 index 44c44d623..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegbeheerder.cs +++ /dev/null @@ -1,44 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Api.RoadSegments.ChangeAttributes; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithInvalidWegbeheerder : WhenChangeAttributesWithInvalidRequest -{ - public WhenChangeAttributesWithInvalidWegbeheerder(WhenChangeAttributesWithInvalidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Fact] - public async Task Wegbeheerder_WegbeheerderNietCorrect() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegbeheerder = string.Empty, - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id } - } - }, "WegbeheerderNietCorrect", null); - } - - [Fact] - public async Task Wegbeheerder_WegbeheerderNietGekend() - { - var wegbeheerder = new OrganizationId(Fixture.TestData.Segment1Added.MaintenanceAuthority.Code); - - Fixture.CustomizeOrganizationCache(new FakeOrganizationCache().Seed(wegbeheerder, null)); - - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegbeheerder = wegbeheerder, - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id } - } - }, "WegbeheerderNietGekend", null); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegcategorie.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegcategorie.cs deleted file mode 100644 index 5c36c6839..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegcategorie.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Api.RoadSegments.ChangeAttributes; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithInvalidWegcategorie : WhenChangeAttributesWithInvalidRequest -{ - public WhenChangeAttributesWithInvalidWegcategorie(WhenChangeAttributesWithInvalidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Fact] - public async Task Wegcategorie_WegcategorieNietCorrect() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegcategorie = string.Empty, - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id } - } - }, "WegcategorieNietCorrect", null); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegsegmentStatus.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegsegmentStatus.cs deleted file mode 100644 index b908004fa..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegsegmentStatus.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Api.RoadSegments.ChangeAttributes; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithInvalidWegsegmentStatus : WhenChangeAttributesWithInvalidRequest -{ - public WhenChangeAttributesWithInvalidWegsegmentStatus(WhenChangeAttributesWithInvalidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Fact] - public async Task WegsegmentStatus_WegsegmentStatusNietCorrect() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegsegmentstatus = string.Empty, - Wegsegmenten = new[] { Fixture.TestData.Segment1Added.Id } - } - }, "WegsegmentStatusNietCorrect", null); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegsegmenten.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegsegmenten.cs deleted file mode 100644 index fac51c19a..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithInvalidWegsegmenten.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Api.RoadSegments.ChangeAttributes; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithInvalidWegsegmenten : WhenChangeAttributesWithInvalidRequest -{ - public WhenChangeAttributesWithInvalidWegsegmenten(WhenChangeAttributesWithInvalidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Theory] - [InlineData(null)] - [InlineData(new int[0])] - [InlineData(new[] { 0 })] - public async Task Wegsegmenten_JsonInvalid(int[] wegsegmenten) - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegbeheerder = Fixture.TestData.ChangedByOrganization, - Wegsegmenten = wegsegmenten - } - }, "JsonInvalid", null); - } - - [Fact] - public async Task Wegsegmenten_NotFound() - { - await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters - { - new() - { - Wegbeheerder = Fixture.TestData.ChangedByOrganization, - Wegsegmenten = new[] { int.MaxValue } - } - }, "NotFound", null); - } -} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs deleted file mode 100644 index 9452969a5..000000000 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithValidRequest : WhenChangeAttributesWithValidRequest -{ - public WhenChangeAttributesWithValidRequest(WhenChangeAttributesWithValidRequestFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } -} \ No newline at end of file diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenEuropeseWegen.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenEuropeseWegen.cs new file mode 100644 index 000000000..062536850 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenEuropeseWegen.cs @@ -0,0 +1,87 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments.ChangeAttributes; +using AutoFixture; +using Microsoft.AspNetCore.Mvc; + +public class WhenEuropeseWegen : ChangeAttributesTestBase +{ + [Fact] + public async Task ThenAcceptedResult() + { + // Arrange + await GivenRoadNetwork(); + + var request = new ChangeRoadSegmentAttributesParameters + { + new() + { + EuropeseWegen = + [ + new ChangeAttributeEuropeanRoad + { + EuNummer = Fixture.Create().ToString() + } + ], + Wegsegmenten = [TestData.Segment1Added.Id] + } + }; + + // Act + var result = await GetResultAsync(request); + + // Assert + Assert.IsType(result); + } + + [Fact] + public async Task WithNietUniek_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + EuropeseWegen = + [ + new ChangeAttributeEuropeanRoad { EuNummer = "E40" }, + new ChangeAttributeEuropeanRoad { EuNummer = "E40" } + ] + } + }, "EuropeseWegenNietUniek", null); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public async Task WithOntbrekendEuNummer_ThenBadRequest(string nummer) + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + EuropeseWegen = + [ + new ChangeAttributeEuropeanRoad { EuNummer = nummer } + ] + } + }, "EuropeseWegEuNummerVerplicht", null); + } + + [Fact] + public async Task WithEuNummerNietCorrect_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + EuropeseWegen = + [ + new ChangeAttributeEuropeanRoad { EuNummer = "-" } + ] + } + }, "EuropeseWegEuNummerNietCorrect", null); + } +} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenGenummerdeWegen.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenGenummerdeWegen.cs new file mode 100644 index 000000000..a6b21c839 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenGenummerdeWegen.cs @@ -0,0 +1,200 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments.ChangeAttributes; +using AutoFixture; +using Microsoft.AspNetCore.Mvc; + +public class WhenGenummerdeWegen : ChangeAttributesTestBase +{ + [Fact] + public async Task ThenAcceptedResult() + { + // Arrange + await GivenRoadNetwork(); + + var request = new ChangeRoadSegmentAttributesParameters + { + new() + { + GenummerdeWegen = + [ + new ChangeAttributeNumberedRoad + { + Ident8 = Fixture.Create().ToString(), + Richting = Fixture.Create().ToDutchString(), + Volgnummer = Fixture.Create().ToString() + } + ], + Wegsegmenten = [TestData.Segment1Added.Id] + } + }; + + // Act + var result = await GetResultAsync(request); + + // Assert + Assert.IsType(result); + } + + [Fact] + public async Task WithNietUniek_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + GenummerdeWegen = + [ + new ChangeAttributeNumberedRoad + { + Ident8 = "A0010001", + Richting = "gelijklopend met de digitalisatiezin", + Volgnummer = "1" + }, + new ChangeAttributeNumberedRoad + { + Ident8 = "A0010001", + Richting = "gelijklopend met de digitalisatiezin", + Volgnummer = "1" + } + ] + } + }, "GenummerdeWegenNietUniek", null); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public async Task WithLegeIdent8_ThenBadRequest(string ident8) + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + GenummerdeWegen = + [ + new ChangeAttributeNumberedRoad + { + Ident8 = ident8, + Richting = "gelijklopend met de digitalisatiezin", + Volgnummer = "1" + } + ] + } + }, "GenummerdeWegIdent8Verplicht", null); + } + + [Fact] + public async Task WithIdent8NietCorrect_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + GenummerdeWegen = + [ + new ChangeAttributeNumberedRoad + { + Ident8 = "-", + Richting = "gelijklopend met de digitalisatiezin", + Volgnummer = "1" + } + ] + } + }, "GenummerdeWegIdent8NietCorrect", null); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public async Task WithLegeRichting_ThenBadRequest(string richting) + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + GenummerdeWegen = + [ + new ChangeAttributeNumberedRoad + { + Ident8 = "A0010001", + Richting = richting, + Volgnummer = "1" + } + ] + } + }, "GenummerdeWegRichtingVerplicht", null); + } + + [Fact] + public async Task WithRichtingNietCorrect_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + GenummerdeWegen = + [ + new ChangeAttributeNumberedRoad + { + Ident8 = "A0010001", + Richting = "-", + Volgnummer = "1" + } + ] + } + }, "GenummerdeWegRichtingNietCorrect", null); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public async Task WithLeegVolgnummer_ThenBadRequest(string volgnummer) + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + GenummerdeWegen = + [ + new ChangeAttributeNumberedRoad + { + Ident8 = "A0010001", + Richting = "gelijklopend met de digitalisatiezin", + Volgnummer = volgnummer + } + ] + } + }, "GenummerdeWegVolgnummerVerplicht", null); + } + + [Theory] + [InlineData("-")] + [InlineData("a")] + [InlineData("-1")] + public async Task WithVolgnummerNietCorrect_ThenBadRequest(string volgnummer) + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + GenummerdeWegen = + [ + new ChangeAttributeNumberedRoad + { + Ident8 = "A0010001", + Richting = "gelijklopend met de digitalisatiezin", + Volgnummer = volgnummer + } + ] + } + }, "GenummerdeWegVolgnummerNietCorrect", null); + } +} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenMorfologischeWegklasse.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenMorfologischeWegklasse.cs new file mode 100644 index 000000000..b5d67e1a8 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenMorfologischeWegklasse.cs @@ -0,0 +1,43 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments.ChangeAttributes; +using AutoFixture; +using Microsoft.AspNetCore.Mvc; + +public class WhenMorfologischeWegklasse : ChangeAttributesTestBase +{ + [Fact] + public async Task ThenAcceptedResult() + { + // Arrange + await GivenRoadNetwork(); + + var request = new ChangeRoadSegmentAttributesParameters + { + new() + { + MorfologischeWegklasse = Fixture.Create().ToDutchString(), + Wegsegmenten = [TestData.Segment1Added.Id] + } + }; + + // Act + var result = await GetResultAsync(request); + + // Assert + Assert.IsType(result); + } + + [Fact] + public async Task WithMorfologischeWegklasseNietCorrect_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + MorfologischeWegklasse = string.Empty, + Wegsegmenten = [TestData.Segment1Added.Id] + } + }, "MorfologischeWegklasseNietCorrect", null); + } +} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenNationaleWegen.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenNationaleWegen.cs new file mode 100644 index 000000000..3d51ba1f2 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenNationaleWegen.cs @@ -0,0 +1,87 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments.ChangeAttributes; +using AutoFixture; +using Microsoft.AspNetCore.Mvc; + +public class WhenNationaleWegen : ChangeAttributesTestBase +{ + [Fact] + public async Task ThenAcceptedResult() + { + // Arrange + await GivenRoadNetwork(); + + var request = new ChangeRoadSegmentAttributesParameters + { + new() + { + NationaleWegen = + [ + new ChangeAttributeNationalRoad + { + Ident2 = Fixture.Create().ToString() + } + ], + Wegsegmenten = [TestData.Segment1Added.Id] + } + }; + + // Act + var result = await GetResultAsync(request); + + // Assert + Assert.IsType(result); + } + + [Fact] + public async Task WithNietUniek_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + NationaleWegen = + [ + new ChangeAttributeNationalRoad { Ident2 = "N1" }, + new ChangeAttributeNationalRoad { Ident2 = "N1" } + ] + } + }, "NationaleWegenNietUniek", null); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public async Task WithLegeIdent8_ThenBadRequest(string ident2) + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + NationaleWegen = + [ + new ChangeAttributeNationalRoad { Ident2 = ident2 } + ] + } + }, "NationaleWegIdent2Verplicht", null); + } + + [Fact] + public async Task WithIdent2NietCorrect_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id], + NationaleWegen = + [ + new ChangeAttributeNationalRoad { Ident2 = "-" } + ] + } + }, "NationaleWegIdent2NietCorrect", null); + } +} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenNoAttribuut.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenNoAttribuut.cs new file mode 100644 index 000000000..78eed5d12 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenNoAttribuut.cs @@ -0,0 +1,18 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments.ChangeAttributes; + +public class WhenNoAttribuut : ChangeAttributesTestBase +{ + [Fact] + public async Task ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmenten = [TestData.Segment1Added.Id] + } + }, "JsonInvalid", null); + } +} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenToegangsbeperking.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenToegangsbeperking.cs new file mode 100644 index 000000000..81aaed240 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenToegangsbeperking.cs @@ -0,0 +1,43 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments.ChangeAttributes; +using AutoFixture; +using Microsoft.AspNetCore.Mvc; + +public class WhenToegangsbeperking : ChangeAttributesTestBase +{ + [Fact] + public async Task ThenAcceptedResult() + { + // Arrange + await GivenRoadNetwork(); + + var request = new ChangeRoadSegmentAttributesParameters + { + new() + { + Toegangsbeperking = Fixture.Create().ToDutchString(), + Wegsegmenten = [TestData.Segment1Added.Id] + } + }; + + // Act + var result = await GetResultAsync(request); + + // Assert + Assert.IsType(result); + } + + [Fact] + public async Task WithLegeToegangsbeperking_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Toegangsbeperking = string.Empty, + Wegsegmenten = [TestData.Segment1Added.Id] + } + }, "ToegangsbeperkingNietCorrect", null); + } +} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegbeheerder.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegbeheerder.cs new file mode 100644 index 000000000..0248d1a81 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegbeheerder.cs @@ -0,0 +1,59 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments.ChangeAttributes; +using Microsoft.AspNetCore.Mvc; + +public class WhenWegbeheerder : ChangeAttributesTestBase +{ + [Fact] + public async Task ThenAcceptedResult() + { + // Arrange + await GivenRoadNetwork(); + + var request = new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegbeheerder = TestData.ChangedByOrganization, + Wegsegmenten = [TestData.Segment1Added.Id] + } + }; + + // Act + var result = await GetResultAsync(request); + + // Assert + Assert.IsType(result); + } + + [Fact] + public async Task WithLegeWegbeheerder_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegbeheerder = string.Empty, + Wegsegmenten = [TestData.Segment1Added.Id] + } + }, "WegbeheerderNietCorrect", null); + } + + [Fact] + public async Task WithWegbeheerderNietGekend_ThenBadRequest() + { + var wegbeheerder = new OrganizationId(TestData.Segment1Added.MaintenanceAuthority.Code); + + OrganizationCache.Seed(wegbeheerder, null); + + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegbeheerder = wegbeheerder, + Wegsegmenten = [TestData.Segment1Added.Id] + } + }, "WegbeheerderNietGekend", null); + } +} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegcategorie.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegcategorie.cs new file mode 100644 index 000000000..59d8cfefb --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegcategorie.cs @@ -0,0 +1,43 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments.ChangeAttributes; +using AutoFixture; +using Microsoft.AspNetCore.Mvc; + +public class WhenWegcategorie : ChangeAttributesTestBase +{ + [Fact] + public async Task ThenAcceptedResult() + { + // Arrange + await GivenRoadNetwork(); + + var request = new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegcategorie = Fixture.Create().ToDutchString(), + Wegsegmenten = [TestData.Segment1Added.Id] + } + }; + + // Act + var result = await GetResultAsync(request); + + // Assert + Assert.IsType(result); + } + + [Fact] + public async Task WithLegeWegcategorie_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegcategorie = string.Empty, + Wegsegmenten = [TestData.Segment1Added.Id] + } + }, "WegcategorieNietCorrect", null); + } +} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegsegmentStatus.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegsegmentStatus.cs new file mode 100644 index 000000000..619897a81 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WhenWegsegmentStatus.cs @@ -0,0 +1,43 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments.ChangeAttributes; +using AutoFixture; +using Microsoft.AspNetCore.Mvc; + +public class WhenWegsegmentStatus : ChangeAttributesTestBase +{ + [Fact] + public async Task ThenAcceptedResult() + { + // Arrange + await GivenRoadNetwork(); + + var request = new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmentstatus = Fixture.Create().ToDutchString(), + Wegsegmenten = [TestData.Segment1Added.Id] + } + }; + + // Act + var result = await GetResultAsync(request); + + // Assert + Assert.IsType(result); + } + + [Fact] + public async Task WithLegeWegsegmentStatus_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegsegmentstatus = string.Empty, + Wegsegmenten = [TestData.Segment1Added.Id] + } + }, "WegsegmentStatusNietCorrect", null); + } +} diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WithWegsegmenten.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WithWegsegmenten.cs new file mode 100644 index 000000000..0ab980f28 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/WithWegsegmenten.cs @@ -0,0 +1,35 @@ +namespace RoadRegistry.BackOffice.Api.Tests.RoadSegments.WhenChangeAttributes; + +using Api.RoadSegments.ChangeAttributes; + +public class WithWegsegmenten : ChangeAttributesTestBase +{ + [Theory] + [InlineData(null)] + [InlineData(new int[0])] + [InlineData(new[] { 0 })] + public async Task WithInvalidWegsegmenten_ThenBadRequest(int[] wegsegmenten) + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegbeheerder = TestData.ChangedByOrganization, + Wegsegmenten = wegsegmenten + } + }, "JsonInvalid", null); + } + + [Fact] + public async Task WithUnknownWegsegmenten_ThenBadRequest() + { + await ItShouldHaveExpectedError(new ChangeRoadSegmentAttributesParameters + { + new() + { + Wegbeheerder = TestData.ChangedByOrganization, + Wegsegmenten = [int.MaxValue] + } + }, "NotFound", null); + } +} From 1a3d91df7898118300bee2deaa879d81c337be1c Mon Sep 17 00:00:00 2001 From: jvandaal Date: Tue, 4 Feb 2025 16:25:26 +0100 Subject: [PATCH 03/13] lambda --- ...egmentAttributesSqsLambdaRequestHandler.cs | 121 ++++++++++++++---- ...adSegmentStreetNameNotProposedOrCurrent.cs | 4 + .../Core/StreetNameNotFound.cs | 5 + .../DutchTranslations/ProblemTranslator.cs | 10 +- .../Uploads/ModifyRoadSegmentAttributes.cs | 4 +- 5 files changed, 113 insertions(+), 31 deletions(-) diff --git a/src/RoadRegistry.BackOffice.Handlers.Sqs.Lambda/Handlers/ChangeRoadSegmentAttributesSqsLambdaRequestHandler.cs b/src/RoadRegistry.BackOffice.Handlers.Sqs.Lambda/Handlers/ChangeRoadSegmentAttributesSqsLambdaRequestHandler.cs index 5024253f3..030cbc5fd 100644 --- a/src/RoadRegistry.BackOffice.Handlers.Sqs.Lambda/Handlers/ChangeRoadSegmentAttributesSqsLambdaRequestHandler.cs +++ b/src/RoadRegistry.BackOffice.Handlers.Sqs.Lambda/Handlers/ChangeRoadSegmentAttributesSqsLambdaRequestHandler.cs @@ -15,6 +15,7 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Handlers; using Microsoft.Extensions.Logging; using Microsoft.IO; using Requests; +using StreetName; using TicketingService.Abstractions; using AddRoadSegmentToEuropeanRoad = BackOffice.Uploads.AddRoadSegmentToEuropeanRoad; using AddRoadSegmentToNationalRoad = BackOffice.Uploads.AddRoadSegmentToNationalRoad; @@ -29,6 +30,7 @@ public sealed class ChangeRoadSegmentAttributesSqsLambdaRequestHandler : SqsLamb private readonly IChangeRoadNetworkDispatcher _changeRoadNetworkDispatcher; private readonly EditorContext _editorContext; private readonly IOrganizationCache _organizationCache; + private readonly IStreetNameClient _streetNameClient; public ChangeRoadSegmentAttributesSqsLambdaRequestHandler( SqsLambdaHandlerOptions options, @@ -41,6 +43,7 @@ public ChangeRoadSegmentAttributesSqsLambdaRequestHandler( RecyclableMemoryStreamManager manager, FileEncoding fileEncoding, IOrganizationCache organizationCache, + IStreetNameClient streetNameClient, ILogger logger) : base( options, @@ -53,6 +56,7 @@ public ChangeRoadSegmentAttributesSqsLambdaRequestHandler( _changeRoadNetworkDispatcher = changeRoadNetworkDispatcher; _editorContext = editorContext; _organizationCache = organizationCache; + _streetNameClient = streetNameClient; } protected override async Task InnerHandle(ChangeRoadSegmentAttributesSqsLambdaRequest request, CancellationToken cancellationToken) @@ -65,9 +69,9 @@ await _changeRoadNetworkDispatcher.DispatchAsync(request, "Attributen wijzigen", foreach (var change in request.Request.ChangeRequests) { - var roadSegmentId = new RoadSegmentId(change.Id); + var roadSegmentId = change.Id; - var editorRoadSegment = await _editorContext.RoadSegments.IncludeLocalSingleOrDefaultAsync(x => x.Id == change.Id, cancellationToken); + var editorRoadSegment = await _editorContext.RoadSegments.IncludeLocalSingleOrDefaultAsync(x => x.Id == roadSegmentId, cancellationToken); if (editorRoadSegment is null) { problems = problems.Add(new RoadSegmentNotFound(roadSegmentId)); @@ -97,7 +101,28 @@ await _changeRoadNetworkDispatcher.DispatchAsync(request, "Attributen wijzigen", return new ChangeRoadSegmentAttributesResponse(); } - private async Task<(TranslatedChanges, Problems)> AppendChange(TranslatedChanges changes, Problems problems, RoadSegment roadSegment, ChangeRoadSegmentAttributeRequest change, CancellationToken cancellationToken) + private async Task<(TranslatedChanges, Problems)> AppendChange( + TranslatedChanges changes, + Problems problems, + RoadSegment roadSegment, + ChangeRoadSegmentAttributeRequest change, + CancellationToken cancellationToken) + { + (changes, problems) = await AppendAttributeChanges(changes, problems, roadSegment, change, cancellationToken); + + changes = AppendEuropeanRoadChanges(changes, roadSegment, change.EuropeanRoads); + changes = AppendNationalRoadChanges(changes, roadSegment, change.NationalRoads); + changes = AppendNumberedRoadChanges(changes, roadSegment, change.NumberedRoads); + + return (changes, problems); + } + + private async Task<(TranslatedChanges changes, Problems problems)> AppendAttributeChanges( + TranslatedChanges changes, + Problems problems, + RoadSegment roadSegment, + ChangeRoadSegmentAttributeRequest change, + CancellationToken cancellationToken) { var maintenanceAuthority = change.MaintenanceAuthority; if (maintenanceAuthority is not null) @@ -106,37 +131,51 @@ await _changeRoadNetworkDispatcher.DispatchAsync(request, "Attributen wijzigen", problems += maintenanceAuthorityProblems; } - if (new object?[] { maintenanceAuthority, change.Morphology, change.Status, change.Category, change.AccessRestriction }.Any(x => x is not null)) + if (new object?[] + { + maintenanceAuthority, change.Morphology, change.Status, change.Category, change.AccessRestriction, + change.LeftSideStreetNameId, change.RightSideStreetNameId, + }.All(x => x is null)) { - if (change.Category is not null - && roadSegment.AttributeHash.GeometryDrawMethod == RoadSegmentGeometryDrawMethod.Measured - && RoadSegmentCategory.IsUpgraded(roadSegment.AttributeHash.Category)) + return (changes, problems); + } + + if (change.Category is not null + && roadSegment.AttributeHash.GeometryDrawMethod == RoadSegmentGeometryDrawMethod.Measured + && RoadSegmentCategory.IsUpgraded(roadSegment.AttributeHash.Category)) + { + var allowedCategories = RoadSegmentCategory.All.Except(RoadSegmentCategory.Obsolete).ToArray(); + if (!allowedCategories.Contains(change.Category)) { - var allowedCategories = RoadSegmentCategory.All.Except(RoadSegmentCategory.Obsolete).ToArray(); - if (!allowedCategories.Contains(change.Category)) - { - problems += new RoadSegmentCategoryNotChangedBecauseCurrentIsNewerVersion(roadSegment.Id); - } + problems += new RoadSegmentCategoryNotChangedBecauseCurrentIsNewerVersion(roadSegment.Id); } + } - changes = changes.AppendChange(new ModifyRoadSegmentAttributes(RecordNumber.Initial, roadSegment.Id, roadSegment.AttributeHash.GeometryDrawMethod) - { - MaintenanceAuthority = maintenanceAuthority, - Morphology = change.Morphology, - Status = change.Status, - Category = change.Category, - AccessRestriction = change.AccessRestriction - }); + if (change.LeftSideStreetNameId is not null) + { + problems = await ValidateStreetName(change.Id, change.LeftSideStreetNameId.Value, problems, cancellationToken); } - changes = AppendChange(changes, roadSegment, change.EuropeanRoads); - changes = AppendChange(changes, roadSegment, change.NationalRoads); - changes = AppendChange(changes, roadSegment, change.NumberedRoads); + if (change.RightSideStreetNameId is not null) + { + problems = await ValidateStreetName(change.Id, change.RightSideStreetNameId.Value, problems, cancellationToken); + } + + changes = changes.AppendChange(new ModifyRoadSegmentAttributes(RecordNumber.Initial, roadSegment.Id, roadSegment.AttributeHash.GeometryDrawMethod) + { + MaintenanceAuthority = maintenanceAuthority, + Morphology = change.Morphology, + Status = change.Status, + Category = change.Category, + AccessRestriction = change.AccessRestriction, + LeftSideStreetNameId = change.LeftSideStreetNameId, + RightSideStreetNameId = change.RightSideStreetNameId + }); return (changes, problems); } - private TranslatedChanges AppendChange(TranslatedChanges changes, RoadSegment roadSegment, ICollection? europeanRoadNumbers) + private TranslatedChanges AppendEuropeanRoadChanges(TranslatedChanges changes, RoadSegment roadSegment, ICollection? europeanRoadNumbers) { if (europeanRoadNumbers is null) { @@ -190,7 +229,7 @@ private TranslatedChanges AppendChange(TranslatedChanges changes, RoadSegment ro return changes; } - private static TranslatedChanges AppendChange(TranslatedChanges changes, RoadSegment roadSegment, ICollection? nationalRoadNumbers) + private static TranslatedChanges AppendNationalRoadChanges(TranslatedChanges changes, RoadSegment roadSegment, ICollection? nationalRoadNumbers) { if (nationalRoadNumbers is null) { @@ -244,7 +283,7 @@ private static TranslatedChanges AppendChange(TranslatedChanges changes, RoadSeg return changes; } - private TranslatedChanges AppendChange(TranslatedChanges changes, RoadSegment roadSegment, ICollection? numberedRoads) + private TranslatedChanges AppendNumberedRoadChanges(TranslatedChanges changes, RoadSegment roadSegment, ICollection? numberedRoads) { if (numberedRoads is null) { @@ -329,4 +368,34 @@ private TranslatedChanges AppendChange(TranslatedChanges changes, RoadSegment ro return (organizationId, problems); } + + private async Task ValidateStreetName( + RoadSegmentId roadSegmentId, + StreetNameLocalId streetNameId, + Problems problems, + CancellationToken cancellationToken) + { + try + { + var streetName = await _streetNameClient.GetAsync(streetNameId, cancellationToken); + if (streetName is null) + { + return problems.Add(new StreetNameNotFound(roadSegmentId)); + } + + string[] activeStreetNameStatus = [StreetNameStatus.Current, StreetNameStatus.Proposed]; + if (activeStreetNameStatus.All(status => !string.Equals(streetName.Status, status, StringComparison.InvariantCultureIgnoreCase))) + { + return problems.Add(new RoadSegmentStreetNameNotProposedOrCurrent(roadSegmentId)); + } + } + catch (StreetNameRegistryUnexpectedStatusCodeException ex) + { + Logger.LogError(ex.Message); + + problems += new StreetNameRegistryUnexpectedError((int)ex.StatusCode); + } + + return problems; + } } diff --git a/src/RoadRegistry.BackOffice/Core/RoadSegmentStreetNameNotProposedOrCurrent.cs b/src/RoadRegistry.BackOffice/Core/RoadSegmentStreetNameNotProposedOrCurrent.cs index 14024a3aa..2e125b339 100644 --- a/src/RoadRegistry.BackOffice/Core/RoadSegmentStreetNameNotProposedOrCurrent.cs +++ b/src/RoadRegistry.BackOffice/Core/RoadSegmentStreetNameNotProposedOrCurrent.cs @@ -8,4 +8,8 @@ public RoadSegmentStreetNameNotProposedOrCurrent() : base(ProblemCode.RoadSegment.StreetName.NotProposedOrCurrent) { } + public RoadSegmentStreetNameNotProposedOrCurrent(RoadSegmentId roadSegmentId) + : base(ProblemCode.RoadSegment.StreetName.NotProposedOrCurrent, new ProblemParameter("SegmentId", roadSegmentId.ToString())) + { + } } diff --git a/src/RoadRegistry.BackOffice/Core/StreetNameNotFound.cs b/src/RoadRegistry.BackOffice/Core/StreetNameNotFound.cs index 8ec87e312..9486cd01a 100644 --- a/src/RoadRegistry.BackOffice/Core/StreetNameNotFound.cs +++ b/src/RoadRegistry.BackOffice/Core/StreetNameNotFound.cs @@ -8,4 +8,9 @@ public StreetNameNotFound() : base(ProblemCode.StreetName.NotFound) { } + + public StreetNameNotFound(RoadSegmentId roadSegmentId) + : base(ProblemCode.StreetName.NotFound, new ProblemParameter("SegmentId", roadSegmentId.ToString())) + { + } } diff --git a/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs b/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs index 7a71c489d..0de6444d0 100644 --- a/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs +++ b/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs @@ -230,8 +230,9 @@ public static class ProblemTranslator $"Wegsegment status is foutief. '{problem.Parameters[0].Value}' is geen geldige waarde.") }, {ProblemCode.RoadSegment.Status.IsRequired, problem => new(problem.Severity, "WegsegmentStatusVerplicht", "Wegsegment status is verplicht.") }, - {ProblemCode.RoadSegment.StreetName.NotProposedOrCurrent, problem => new(problem.Severity, "WegsegmentStraatnaamNietVoorgesteldOfInGebruik", - "Deze actie is enkel toegelaten voor straatnamen met status 'voorgesteld' of 'in gebruik'.") }, + {ProblemCode.RoadSegment.StreetName.NotProposedOrCurrent, problem => new(problem.Severity, "WegsegmentStraatnaamNietVoorgesteldOfInGebruik", problem.HasParameter("SegmentId") + ? $"De straatnaam voor wegsegment met id {problem.GetParameterValue("Identifier")} moet status 'voorgesteld' of 'in gebruik' hebben." + : "Deze actie is enkel toegelaten voor straatnamen met status 'voorgesteld' of 'in gebruik'.") }, {ProblemCode.RoadSegment.StreetName.Left.NotLinked, problem => new(problem.Severity, "LinkerstraatnaamNietGekoppeld", $"Het wegsegment met id {problem.Parameters[0].Value} is niet gekoppeld aan de linkerstraatnaam '{problem.Parameters[1].Value}'") }, {ProblemCode.RoadSegment.StreetName.Left.NotUnlinked, problem => new(problem.Severity, "LinkerstraatnaamNietOntkoppeld", @@ -292,8 +293,9 @@ public static class ProblemTranslator {ProblemCode.ShapeFile.InvalidPolygonShellOrientation, problem => new(problem.Severity, problem.Reason, "De orientatie van de polygoon moet in wijzerzin zijn.")}, - {ProblemCode.StreetName.NotFound, problem => new(problem.Severity, "StraatnaamNietGekend", - "De straatnaam is niet gekend in het Straatnamenregister.")}, + {ProblemCode.StreetName.NotFound, problem => new(problem.Severity, "StraatnaamNietGekend", problem.HasParameter("SegmentId") + ? $"De straatnaam voor het wegsegment met id {problem.GetParameterValue("SegmentId")} is niet gekend in het Straatnamenregister." + : "De straatnaam is niet gekend in het Straatnamenregister.")}, {ProblemCode.StreetName.RegistryUnexpectedError, problem => new(problem.Severity, "StraatnamenregisterOnverwachteFout", $"Het Straatnamenregister gaf een onverwachte fout {problem.GetParameterValue("StatusCode")}.")}, diff --git a/src/RoadRegistry.BackOffice/Uploads/ModifyRoadSegmentAttributes.cs b/src/RoadRegistry.BackOffice/Uploads/ModifyRoadSegmentAttributes.cs index 3569d5fb7..47caa272c 100644 --- a/src/RoadRegistry.BackOffice/Uploads/ModifyRoadSegmentAttributes.cs +++ b/src/RoadRegistry.BackOffice/Uploads/ModifyRoadSegmentAttributes.cs @@ -16,7 +16,7 @@ public ModifyRoadSegmentAttributes( Id = id; GeometryDrawMethod = geometryDrawMethod; } - + public RecordNumber RecordNumber { get; } public RoadSegmentId Id { get; } public RoadSegmentGeometryDrawMethod GeometryDrawMethod { get; } @@ -29,6 +29,8 @@ public ModifyRoadSegmentAttributes( public RoadSegmentLaneAttribute[] Lanes { get; init; } public RoadSegmentSurfaceAttribute[] Surfaces { get; init; } public RoadSegmentWidthAttribute[] Widths { get; init; } + public StreetNameLocalId? LeftSideStreetNameId { get; init; } + public StreetNameLocalId? RightSideStreetNameId { get; init; } public void TranslateTo(RequestedChange message) { From d6141ac49b2752ade179395ca27b4626a0735a71 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Tue, 4 Feb 2025 16:55:08 +0100 Subject: [PATCH 04/13] lambda test beginning --- .../ProductionStreetNameClient.cs | 21 -- .../Fixtures/WhenChangeAttributesFixture.cs | 18 +- ...ChangeAttributesWithValidRequestFixture.cs | 2 + .../WhenChangeAttributesWithValidRequest.cs | 204 +++++++++++++++++- 4 files changed, 212 insertions(+), 33 deletions(-) delete mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/ProductionStreetNameClient.cs diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/ProductionStreetNameClient.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/ProductionStreetNameClient.cs deleted file mode 100644 index 484d9ba6a..000000000 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/ProductionStreetNameClient.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests; - -using RoadRegistry.StreetName; - -public class ProductionStreetNameClient : IStreetNameClient -{ - private readonly IStreetNameClient _client; - - public ProductionStreetNameClient(IHttpClientFactory httpClientFactory) - { - _client = new StreetNameApiClient(httpClientFactory, new StreetNameRegistryOptions - { - StreetNameRegistryBaseUrl = "https://api.basisregisters.vlaanderen.be" - }); - } - - public Task GetAsync(int id, CancellationToken cancellationToken) - { - return _client.GetAsync(id, cancellationToken); - } -} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs index 2107d0886..e117b1c7e 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs @@ -6,6 +6,7 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenCha using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Infrastructure; using Core; +using FeatureToggles; using Framework; using Handlers; using Hosts; @@ -14,8 +15,7 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenCha using Microsoft.IO; using NodaTime; using Requests; -using RoadRegistry.BackOffice.FeatureToggles; -using RoadRegistry.Tests.BackOffice; +using RoadRegistry.StreetName; using Sqs.RoadSegments; public abstract class WhenChangeAttributesFixture : SqsLambdaHandlerFixture @@ -52,6 +52,12 @@ protected WhenChangeAttributesFixture(IConfiguration configuration, ICustomRetry new RecyclableMemoryStreamManager(), FileEncoding.UTF8, new FakeOrganizationCache(), + new StreetNameCacheClient(new FakeStreetNameCache() + .AddStreetName(WellKnownStreetNameIds.Proposed, "Proposed street", "voorgesteld") + .AddStreetName(WellKnownStreetNameIds.Current, "Current street", "inGebruik") + .AddStreetName(WellKnownStreetNameIds.Retired, "Retired street", "gehistoreerd") + .AddStreetName(WellKnownStreetNameIds.Null, "Not found street", null) + ), new NullLogger() ); @@ -71,4 +77,12 @@ protected override CommandHandlerDispatcher BuildCommandHandlerDispatcher() ) }), ApplicationMetadata); } + + protected static class WellKnownStreetNameIds + { + public const int Proposed = 1; + public const int Current = 2; + public const int Retired = 3; + public const int Null = 4; + } } diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs index 7300a1922..2b855a355 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs @@ -8,9 +8,11 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenCha using Hosts; using Messages; using Microsoft.Extensions.Configuration; +using Moq; using NodaTime; using NodaTime.Text; using RoadRegistry.Tests.BackOffice.Extracts; +using TicketingService.Abstractions; using AcceptedChange = Messages.AcceptedChange; public class WhenChangeAttributesWithValidRequestFixture : WhenChangeAttributesFixture diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs index fd7e6e825..9dc243b48 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs @@ -1,23 +1,207 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes; -using Abstractions; -using Fixtures; -using Xunit.Abstractions; +using AutoFixture; +using BackOffice.Abstractions.RoadSegments; +using BackOffice.Framework; +using Be.Vlaanderen.Basisregisters.EventHandling; +using Be.Vlaanderen.Basisregisters.GrAr.Provenance; +using Core; +using Editor.Schema; +using Messages; +using Moq; +using Newtonsoft.Json; +using NodaTime; +using NodaTime.Testing; +using NodaTime.Text; +using RoadRegistry.Tests.BackOffice.Extracts; +using RoadRegistry.Tests.BackOffice.Scenarios; +using SqlStreamStore; +using TicketingService.Abstractions; +using AcceptedChange = Messages.AcceptedChange; -public class WhenChangeAttributesWithValidRequest : WhenChangeAttributes +public class WhenChangeAttributesWithValidRequest //: WhenChangeAttributes { - public WhenChangeAttributesWithValidRequest(WhenChangeAttributesWithValidRequestFixture fixture, ITestOutputHelper outputHelper) : base(fixture, outputHelper) + private readonly RoadNetworkTestData _testData; + private readonly Mock _ticketingMock; + private readonly IStreamStore _store; + private Fixture ObjectProvider => _testData.ObjectProvider; + private readonly FakeEditorContext _editorContext = new FakeEditorContextFactory().CreateDbContext(); + private Organisation Organisation { get; } + + public WhenChangeAttributesWithValidRequest() { + _testData = new RoadNetworkTestData(); + _ticketingMock = new Mock(); + _store = new InMemoryStreamStore(); + + Organisation = ObjectProvider.Create(); } [Fact] - public void ItShouldSucceed() + public async Task ItShouldSucceed() { - if (Fixture.Exception is not null) + var request = new ChangeRoadSegmentAttributesRequest() + .Add(new RoadSegmentId(_testData.Segment1Added.Id), change => + { + change.AccessRestriction = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentAccessRestriction.Parse(_testData.Segment1Added.AccessRestriction)); + change.Category = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentCategory.Parse(_testData.Segment1Added.Category)); + change.MaintenanceAuthority = _testData.ChangedByOrganization; + change.Morphology = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentMorphology.Parse(_testData.Segment1Added.Morphology)); + change.Status = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentStatus.Parse(_testData.Segment1Added.Status)); + + change.EuropeanRoads = ObjectProvider.CreateMany(1).ToArray(); + change.NationalRoads = ObjectProvider.CreateMany(1).ToArray(); + change.NumberedRoads = ObjectProvider.CreateMany(1) + .Select(number => new ChangeRoadSegmentNumberedRoadAttribute + { + Number = number, + Direction = ObjectProvider.Create(), + Ordinal = ObjectProvider.Create() + }) + .ToArray(); + }); + + await Given(Organizations.ToStreamName(new OrganizationId(Organisation.ToString())), new ImportedOrganization { - OutputHelper.WriteLine(Fixture.Exception.ToString()); + Code = Organisation.ToString(), + Name = Organisation.ToString(), + When = InstantPattern.ExtendedIso.Format(new FakeClock(NodaConstants.UnixEpoch).GetCurrentInstant()) + }); + + await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted + { + RequestId = _testData.RequestId, + Reason = _testData.ReasonForChange, + Operator = _testData.ChangedByOperator, + OrganizationId = _testData.ChangedByOrganization, + Organization = _testData.ChangedByOrganizationName, + Changes = + [ + new AcceptedChange + { + RoadSegmentAdded = _testData.Segment1Added + }, + new AcceptedChange + { + RoadSegmentAddedToEuropeanRoad = new RoadSegmentAddedToEuropeanRoad + { + AttributeId = 1, + TemporaryAttributeId = 1, + SegmentId = _testData.Segment1Added.Id, + Number = ObjectProvider.CreateWhichIsDifferentThan(request.ChangeRequests.Single().EuropeanRoads!.Single()) + } + }, + new AcceptedChange + { + RoadSegmentAddedToNationalRoad = new RoadSegmentAddedToNationalRoad + { + AttributeId = 1, + TemporaryAttributeId = 1, + SegmentId = _testData.Segment1Added.Id, + Number = ObjectProvider.CreateWhichIsDifferentThan(request.ChangeRequests.Single().NationalRoads!.Single()) + } + }, + new AcceptedChange + { + RoadSegmentAddedToNumberedRoad = new RoadSegmentAddedToNumberedRoad + { + AttributeId = 1, + TemporaryAttributeId = 1, + SegmentId = _testData.Segment1Added.Id, + Number = request.ChangeRequests.Single().NumberedRoads!.Single().Number, + Direction = ObjectProvider.CreateWhichIsDifferentThan(request.ChangeRequests.Single().NumberedRoads!.Single().Direction), + Ordinal = ObjectProvider.Create() + } + }, + new AcceptedChange + { + RoadSegmentAddedToNumberedRoad = new RoadSegmentAddedToNumberedRoad + { + AttributeId = 2, + TemporaryAttributeId = 2, + SegmentId = _testData.Segment1Added.Id, + Number = ObjectProvider.CreateWhichIsDifferentThan(request.ChangeRequests.Single().NumberedRoads!.Single().Number), + Direction = ObjectProvider.Create(), + Ordinal = ObjectProvider.Create() + } + } + ], + When = InstantPattern.ExtendedIso.Format(new FakeClock(NodaConstants.UnixEpoch).GetCurrentInstant()) + }); + + await _editorContext.RoadSegments.AddAsync(_testData.Segment1Added.ToRoadSegmentRecord(_testData.ChangedByOrganization, new FakeClock(NodaConstants.UnixEpoch))); + await _editorContext.SaveChangesAsync(); + + var result = await VerifyTicketAsync(request); + + Assert.True(result); + } + + protected async Task VerifyTicketAsync(ChangeRoadSegmentAttributesRequest request) + { + var rejectCommand = await _store.GetLastMessageIfTypeIs(); + if (rejectCommand != null) + { + var problems = rejectCommand.Changes.SelectMany(change => change.Problems).ToArray(); + if (problems.Any()) + { + throw new Exception(string.Join(Environment.NewLine, problems.Select(x => x.ToString()))); + } } - Assert.True(Fixture.Result); + var roadSegmentId = new RoadSegmentId(_testData.Segment1Added.Id); + + VerifyThatTicketHasCompleted(new ChangeRoadSegmentAttributesResponse()); + + var change = request.ChangeRequests.Single(); + + var command = await _store.GetLastMessage(); + Assert.Equal(8, command.Changes.Length); + + var attributesModified = command.Changes[0].RoadSegmentAttributesModified; + var attributesModifiedIsCorrect = attributesModified.Id == roadSegmentId + && attributesModified.AccessRestriction == change.AccessRestriction + && attributesModified.Category == change.Category + && attributesModified.MaintenanceAuthority?.Code == change.MaintenanceAuthority + && attributesModified.Morphology == change.Morphology + && attributesModified.Status == change.Status; + + var europeanRoadsIsCorrect = command.Changes[1].RoadSegmentAddedToEuropeanRoad.Number == change.EuropeanRoads!.Single() + && command.Changes[4].RoadSegmentRemovedFromEuropeanRoad.SegmentId == change.Id; + var nationalRoadsIsCorrect = command.Changes[2].RoadSegmentAddedToNationalRoad.Number == change.NationalRoads!.Single() + && command.Changes[5].RoadSegmentRemovedFromNationalRoad.SegmentId == change.Id; + var numberedRoadsIsCorrect = command.Changes[3].RoadSegmentAddedToNumberedRoad.Number == change.NumberedRoads!.Single().Number + && command.Changes[6].RoadSegmentRemovedFromNumberedRoad.SegmentId == change.Id + && command.Changes[7].RoadSegmentRemovedFromNumberedRoad.SegmentId == change.Id; + + return attributesModifiedIsCorrect + && europeanRoadsIsCorrect + && nationalRoadsIsCorrect + && numberedRoadsIsCorrect; + } + + private void VerifyThatTicketHasCompleted(object response) + { + _ticketingMock.Verify(x => + x.Complete( + It.IsAny(), + new TicketResult(response), + CancellationToken.None + ) + ); + } + + + private static readonly EventMapping Mapping = + new(EventMapping.DiscoverEventNamesInAssembly(typeof(RoadNetworkEvents).Assembly)); + + private static readonly JsonSerializerSettings Settings = + EventsJsonSerializerSettingsProvider.CreateSerializerSettings(); + + private static readonly StreamNameConverter StreamNameConverter = StreamNameConversions.PassThru; + + private Task Given(StreamName streamName, params object[] events) + { + return _store.Given(Mapping, Settings, StreamNameConverter, streamName, events); } -} \ No newline at end of file +} From 9f627d87091abfa7f6f208fc85591b42b44c2d75 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Wed, 5 Feb 2025 10:37:06 +0100 Subject: [PATCH 05/13] lambda first test --- .../Framework/BackOfficeLambdaTest.cs | 23 ++- .../Framework/SqsLambdaHandlerTests.cs | 6 - .../LinkUnlinkStreetNameTestsBase.cs | 6 +- .../LinkStreetNameRequestHandlerTests.cs | 6 - .../UnlinkStreetNameRequestHandlerTests.cs | 6 - .../WhenChangeAttributesTestBase.cs | 80 ++++++++ .../WhenChangeAttributesWithValidRequest.cs | 194 +++++++----------- .../GivenOrganizationExists.cs | 3 - .../GivenOrganizationExists.cs | 3 - 9 files changed, 165 insertions(+), 162 deletions(-) create mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesTestBase.cs diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs index bf5c43b1b..c4805d2d2 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs @@ -2,7 +2,6 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.Framework; using Abstractions; using Autofac; -using Autofac.Core.Lifetime; using AutoFixture; using BackOffice.Extracts.Dbase.Organizations; using BackOffice.Extracts.Dbase.Organizations.V1; @@ -32,14 +31,15 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.Framework; using RoadRegistry.Tests.BackOffice; using RoadRegistry.Tests.BackOffice.Scenarios; using TicketingService.Abstractions; -using Xunit.Abstractions; +using Xunit.Sdk; using AcceptedChange = Messages.AcceptedChange; -using GeometryTranslator = BackOffice.GeometryTranslator; +using GeometryTranslator = GeometryTranslator; using LineString = NetTopologySuite.Geometries.LineString; using MessageMetadata = Be.Vlaanderen.Basisregisters.Aws.Lambda.MessageMetadata; using Point = NetTopologySuite.Geometries.Point; using Problem = Messages.Problem; using RoadSegmentLaneAttributes = Messages.RoadSegmentLaneAttributes; +using RoadSegmentSideAttributes = Messages.RoadSegmentSideAttributes; using RoadSegmentSurfaceAttributes = Messages.RoadSegmentSurfaceAttributes; using RoadSegmentWidthAttributes = Messages.RoadSegmentWidthAttributes; @@ -64,8 +64,7 @@ public abstract class BackOfficeLambdaTest: RoadNetworkTestBase protected SqsLambdaHandlerOptions SqsLambdaHandlerOptions { get; } - protected BackOfficeLambdaTest(ITestOutputHelper testOutputHelper) - : base(testOutputHelper) + protected BackOfficeLambdaTest() : base(new TestOutputHelper()) { SqsLambdaHandlerOptions = new FakeSqsLambdaHandlerOptions(); RecyclableMemoryStreamManager = new RecyclableMemoryStreamManager(); @@ -244,11 +243,11 @@ protected async Task AddMeasuredRoadSegment(RoadSegmentId roadSegmentId) Code = ObjectProvider.Create(), Name = ObjectProvider.Create() }, - LeftSide = new Messages.RoadSegmentSideAttributes + LeftSide = new RoadSegmentSideAttributes { StreetNameId = ObjectProvider.Create() }, - RightSide = new Messages.RoadSegmentSideAttributes + RightSide = new RoadSegmentSideAttributes { StreetNameId = ObjectProvider.Create() }, @@ -364,11 +363,11 @@ protected async Task AddOutlinedRoadSegment(RoadSegmentId roadSegmentId) Code = ObjectProvider.Create(), Name = ObjectProvider.Create() }, - LeftSide = new Messages.RoadSegmentSideAttributes + LeftSide = new RoadSegmentSideAttributes { StreetNameId = ObjectProvider.Create() }, - RightSide = new Messages.RoadSegmentSideAttributes + RightSide = new RoadSegmentSideAttributes { StreetNameId = ObjectProvider.Create() }, @@ -439,10 +438,11 @@ protected async Task VerifyThatTicketHasCompleted(RoadSegmentId roadSegmentId) VerifyThatTicketHasCompleted(string.Format(ConfigurationDetailUrl, roadSegmentId), roadSegment?.LastEventHash ?? string.Empty); } - protected void VerifyThatTicketHasCompleted(string location, string eTag) + private void VerifyThatTicketHasCompleted(string location, string eTag) { VerifyThatTicketHasCompleted(TicketingMock, location, eTag); } + protected void VerifyThatTicketHasCompleted(object response) { VerifyThatTicketHasCompleted(TicketingMock, response); @@ -452,7 +452,8 @@ protected void VerifyThatTicketHasCompleted(Mock ticketing, string l { VerifyThatTicketHasCompleted(ticketing, new ETagResponse(location, eTag)); } - protected void VerifyThatTicketHasCompleted(Mock ticketing, object response) + + private void VerifyThatTicketHasCompleted(Mock ticketing, object response) { ticketing.Verify(x => x.Complete( diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/SqsLambdaHandlerTests.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/SqsLambdaHandlerTests.cs index 1d8facdfc..45ce59569 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/SqsLambdaHandlerTests.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/SqsLambdaHandlerTests.cs @@ -18,15 +18,9 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.Framework; using RoadRegistry.Tests.Framework; using Sqs.RoadSegments; using TicketingService.Abstractions; -using Xunit.Abstractions; public sealed class SqsLambdaHandlerTests : BackOfficeLambdaTest { - public SqsLambdaHandlerTests(ITestOutputHelper testOutputHelper) - : base(testOutputHelper) - { - } - [Fact] public async Task TicketShouldBeUpdatedToPendingAndCompleted() { diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/LinkUnlinkStreetNameTestsBase.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/LinkUnlinkStreetNameTestsBase.cs index 53d69b553..58787b4a9 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/LinkUnlinkStreetNameTestsBase.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/LinkUnlinkStreetNameTestsBase.cs @@ -8,15 +8,11 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.StreetN using Messages; using NodaTime.Text; using RoadRegistry.StreetName; -using Xunit.Abstractions; using AcceptedChange = Messages.AcceptedChange; public abstract class LinkUnlinkStreetNameTestsBase : BackOfficeLambdaTest { - protected readonly ApplicationMetadata ApplicationMetadata = new(RoadRegistryApplication.Lambda); - - protected LinkUnlinkStreetNameTestsBase(ITestOutputHelper testOutputHelper) - : base(testOutputHelper) + protected LinkUnlinkStreetNameTestsBase() { StreetNameClient = new StreetNameCacheClient(new FakeStreetNameCache() .AddStreetName(WellKnownStreetNameIds.Proposed, "Proposed street", "voorgesteld") diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/WhenLinking/LinkStreetNameRequestHandlerTests.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/WhenLinking/LinkStreetNameRequestHandlerTests.cs index 8833d5c7f..ba8cfb26e 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/WhenLinking/LinkStreetNameRequestHandlerTests.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/WhenLinking/LinkStreetNameRequestHandlerTests.cs @@ -18,15 +18,9 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.StreetN using RoadRegistry.Tests.Framework; using Sqs.RoadSegments; using TicketingService.Abstractions; -using Xunit.Abstractions; public class LinkStreetNameRequestHandlerTests : LinkUnlinkStreetNameTestsBase { - public LinkStreetNameRequestHandlerTests(ITestOutputHelper testOutputHelper) - : base(testOutputHelper) - { - } - private async Task HandleRequest(ITicketing ticketing, LinkStreetNameRequest request) { var handler = new LinkStreetNameSqsLambdaRequestHandler( diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/WhenUnlinking/UnlinkStreetNameRequestHandlerTests.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/WhenUnlinking/UnlinkStreetNameRequestHandlerTests.cs index a2dcf2e1d..0cc91f08f 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/WhenUnlinking/UnlinkStreetNameRequestHandlerTests.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/StreetName/WhenUnlinking/UnlinkStreetNameRequestHandlerTests.cs @@ -18,15 +18,9 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.StreetN using RoadRegistry.Tests.Framework; using Sqs.RoadSegments; using TicketingService.Abstractions; -using Xunit.Abstractions; public class UnlinkStreetNameRequestHandlerTests : LinkUnlinkStreetNameTestsBase { - public UnlinkStreetNameRequestHandlerTests(ITestOutputHelper testOutputHelper) - : base(testOutputHelper) - { - } - private async Task HandleRequest(ITicketing ticketing, UnlinkStreetNameRequest request) { var handler = new UnlinkStreetNameSqsLambdaRequestHandler( diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesTestBase.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesTestBase.cs new file mode 100644 index 000000000..77c4b9833 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesTestBase.cs @@ -0,0 +1,80 @@ +namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes; + +using AutoFixture; +using BackOffice.Abstractions.RoadSegments; +using BackOffice.Uploads; +using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; +using Be.Vlaanderen.Basisregisters.GrAr.Provenance; +using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Requests; +using Core; +using Framework; +using Handlers; +using Hosts; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.IO; +using Moq; +using Requests; +using RoadRegistry.StreetName; +using RoadRegistry.Tests.Framework; +using Sqs.RoadSegments; + +public class WhenChangeAttributesTestBase : BackOfficeLambdaTest +{ + protected async Task> HandleRequest(ChangeRoadSegmentAttributesRequest request) + { + var sqsRequest = new ChangeRoadSegmentAttributesSqsRequest + { + Request = request, + TicketId = Guid.NewGuid(), + Metadata = new Dictionary(), + ProvenanceData = ObjectProvider.Create() + }; + + var sqsLambdaRequest = new ChangeRoadSegmentAttributesSqsLambdaRequest(RoadNetwork.Identifier.ToString(), sqsRequest); + + var translatedChanges = TranslatedChanges.Empty; + var changeRoadNetworkDispatcherMock = new Mock(); + changeRoadNetworkDispatcherMock + .Setup(x => x.DispatchAsync( + It.IsAny(), + It.IsAny(), + It.IsAny>>(), + It.IsAny())) + .Callback( + (SqsLambdaRequest _, string _, Func> builder, CancellationToken _) => + { + translatedChanges = builder(translatedChanges).GetAwaiter().GetResult(); + }); + + var sqsLambdaRequestHandler = new ChangeRoadSegmentAttributesSqsLambdaRequestHandler( + SqsLambdaHandlerOptions, + new FakeRetryPolicy(), + TicketingMock.Object, + Mock.Of(), + RoadRegistryContext, + changeRoadNetworkDispatcherMock.Object, + EditorContext, + new RecyclableMemoryStreamManager(), + FileEncoding.UTF8, + OrganizationCache, + new StreetNameCacheClient(new FakeStreetNameCache() + .AddStreetName(WellKnownStreetNameIds.Proposed, "Proposed street", "voorgesteld") + .AddStreetName(WellKnownStreetNameIds.Current, "Current street", "inGebruik") + .AddStreetName(WellKnownStreetNameIds.Retired, "Retired street", "gehistoreerd") + .AddStreetName(WellKnownStreetNameIds.Null, "Not found street", null) + ), + new NullLogger()); + + await sqsLambdaRequestHandler.Handle(sqsLambdaRequest, CancellationToken.None); + + return translatedChanges.ToList(); + } + + private static class WellKnownStreetNameIds + { + public const int Proposed = 1; + public const int Current = 2; + public const int Retired = 3; + public const int Null = 4; + } +} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs index 9dc243b48..dff3cdc69 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs @@ -2,52 +2,41 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenCha using AutoFixture; using BackOffice.Abstractions.RoadSegments; -using BackOffice.Framework; -using Be.Vlaanderen.Basisregisters.EventHandling; -using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using Core; -using Editor.Schema; +using FluentAssertions; using Messages; -using Moq; -using Newtonsoft.Json; -using NodaTime; -using NodaTime.Testing; using NodaTime.Text; using RoadRegistry.Tests.BackOffice.Extracts; -using RoadRegistry.Tests.BackOffice.Scenarios; -using SqlStreamStore; -using TicketingService.Abstractions; using AcceptedChange = Messages.AcceptedChange; - -public class WhenChangeAttributesWithValidRequest //: WhenChangeAttributes +using AddRoadSegmentToEuropeanRoad = BackOffice.Uploads.AddRoadSegmentToEuropeanRoad; +using AddRoadSegmentToNationalRoad = BackOffice.Uploads.AddRoadSegmentToNationalRoad; +using AddRoadSegmentToNumberedRoad = BackOffice.Uploads.AddRoadSegmentToNumberedRoad; +using ModifyRoadSegmentAttributes = BackOffice.Uploads.ModifyRoadSegmentAttributes; +using RemoveRoadSegmentFromEuropeanRoad = BackOffice.Uploads.RemoveRoadSegmentFromEuropeanRoad; +using RemoveRoadSegmentFromNationalRoad = BackOffice.Uploads.RemoveRoadSegmentFromNationalRoad; +using RemoveRoadSegmentFromNumberedRoad = BackOffice.Uploads.RemoveRoadSegmentFromNumberedRoad; + +public class WhenChangeAttributesWithValidRequest : WhenChangeAttributesTestBase { - private readonly RoadNetworkTestData _testData; - private readonly Mock _ticketingMock; - private readonly IStreamStore _store; - private Fixture ObjectProvider => _testData.ObjectProvider; - private readonly FakeEditorContext _editorContext = new FakeEditorContextFactory().CreateDbContext(); - private Organisation Organisation { get; } - - public WhenChangeAttributesWithValidRequest() - { - _testData = new RoadNetworkTestData(); - _ticketingMock = new Mock(); - _store = new InMemoryStreamStore(); - - Organisation = ObjectProvider.Create(); - } - [Fact] - public async Task ItShouldSucceed() + public async Task ThenRoadNetworkChangesAccepted() { + // Arrange + await Given(Organizations.ToStreamName(new OrganizationId(OrganizationDbaseRecord.ORG.Value)), new ImportedOrganization + { + Code = OrganizationDbaseRecord.ORG.Value, + Name = OrganizationDbaseRecord.ORG.Value, + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + var request = new ChangeRoadSegmentAttributesRequest() - .Add(new RoadSegmentId(_testData.Segment1Added.Id), change => + .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => { - change.AccessRestriction = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentAccessRestriction.Parse(_testData.Segment1Added.AccessRestriction)); - change.Category = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentCategory.Parse(_testData.Segment1Added.Category)); - change.MaintenanceAuthority = _testData.ChangedByOrganization; - change.Morphology = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentMorphology.Parse(_testData.Segment1Added.Morphology)); - change.Status = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentStatus.Parse(_testData.Segment1Added.Status)); + change.AccessRestriction = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentAccessRestriction.Parse(TestData.Segment1Added.AccessRestriction)); + change.Category = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentCategory.Parse(TestData.Segment1Added.Category)); + change.MaintenanceAuthority = TestData.ChangedByOrganization; + change.Morphology = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentMorphology.Parse(TestData.Segment1Added.Morphology)); + change.Status = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentStatus.Parse(TestData.Segment1Added.Status)); change.EuropeanRoads = ObjectProvider.CreateMany(1).ToArray(); change.NationalRoads = ObjectProvider.CreateMany(1).ToArray(); @@ -60,26 +49,20 @@ public async Task ItShouldSucceed() }) .ToArray(); }); - - await Given(Organizations.ToStreamName(new OrganizationId(Organisation.ToString())), new ImportedOrganization - { - Code = Organisation.ToString(), - Name = Organisation.ToString(), - When = InstantPattern.ExtendedIso.Format(new FakeClock(NodaConstants.UnixEpoch).GetCurrentInstant()) - }); + var change = request.ChangeRequests.Single(); await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted { - RequestId = _testData.RequestId, - Reason = _testData.ReasonForChange, - Operator = _testData.ChangedByOperator, - OrganizationId = _testData.ChangedByOrganization, - Organization = _testData.ChangedByOrganizationName, + RequestId = TestData.RequestId, + Reason = TestData.ReasonForChange, + Operator = TestData.ChangedByOperator, + OrganizationId = TestData.ChangedByOrganization, + Organization = TestData.ChangedByOrganizationName, Changes = [ new AcceptedChange { - RoadSegmentAdded = _testData.Segment1Added + RoadSegmentAdded = TestData.Segment1Added }, new AcceptedChange { @@ -87,8 +70,8 @@ public async Task ItShouldSucceed() { AttributeId = 1, TemporaryAttributeId = 1, - SegmentId = _testData.Segment1Added.Id, - Number = ObjectProvider.CreateWhichIsDifferentThan(request.ChangeRequests.Single().EuropeanRoads!.Single()) + SegmentId = TestData.Segment1Added.Id, + Number = ObjectProvider.CreateWhichIsDifferentThan(change.EuropeanRoads!.Single()) } }, new AcceptedChange @@ -97,8 +80,8 @@ public async Task ItShouldSucceed() { AttributeId = 1, TemporaryAttributeId = 1, - SegmentId = _testData.Segment1Added.Id, - Number = ObjectProvider.CreateWhichIsDifferentThan(request.ChangeRequests.Single().NationalRoads!.Single()) + SegmentId = TestData.Segment1Added.Id, + Number = ObjectProvider.CreateWhichIsDifferentThan(change.NationalRoads!.Single()) } }, new AcceptedChange @@ -107,9 +90,9 @@ public async Task ItShouldSucceed() { AttributeId = 1, TemporaryAttributeId = 1, - SegmentId = _testData.Segment1Added.Id, - Number = request.ChangeRequests.Single().NumberedRoads!.Single().Number, - Direction = ObjectProvider.CreateWhichIsDifferentThan(request.ChangeRequests.Single().NumberedRoads!.Single().Direction), + SegmentId = TestData.Segment1Added.Id, + Number = change.NumberedRoads!.Single().Number, + Direction = ObjectProvider.CreateWhichIsDifferentThan(change.NumberedRoads!.Single().Direction), Ordinal = ObjectProvider.Create() } }, @@ -119,89 +102,56 @@ public async Task ItShouldSucceed() { AttributeId = 2, TemporaryAttributeId = 2, - SegmentId = _testData.Segment1Added.Id, - Number = ObjectProvider.CreateWhichIsDifferentThan(request.ChangeRequests.Single().NumberedRoads!.Single().Number), + SegmentId = TestData.Segment1Added.Id, + Number = ObjectProvider.CreateWhichIsDifferentThan(change.NumberedRoads!.Single().Number), Direction = ObjectProvider.Create(), Ordinal = ObjectProvider.Create() } } ], - When = InstantPattern.ExtendedIso.Format(new FakeClock(NodaConstants.UnixEpoch).GetCurrentInstant()) + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) }); - await _editorContext.RoadSegments.AddAsync(_testData.Segment1Added.ToRoadSegmentRecord(_testData.ChangedByOrganization, new FakeClock(NodaConstants.UnixEpoch))); - await _editorContext.SaveChangesAsync(); + await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); + await EditorContext.SaveChangesAsync(); - var result = await VerifyTicketAsync(request); - - Assert.True(result); - } - - protected async Task VerifyTicketAsync(ChangeRoadSegmentAttributesRequest request) - { - var rejectCommand = await _store.GetLastMessageIfTypeIs(); - if (rejectCommand != null) - { - var problems = rejectCommand.Changes.SelectMany(change => change.Problems).ToArray(); - if (problems.Any()) - { - throw new Exception(string.Join(Environment.NewLine, problems.Select(x => x.ToString()))); - } - } - - var roadSegmentId = new RoadSegmentId(_testData.Segment1Added.Id); + // Act + var translatedChanges = await HandleRequest(request); + // Assert VerifyThatTicketHasCompleted(new ChangeRoadSegmentAttributesResponse()); - var change = request.ChangeRequests.Single(); + translatedChanges.Should().HaveCount(8); + var roadSegmentId = change.Id; - var command = await _store.GetLastMessage(); - Assert.Equal(8, command.Changes.Length); - - var attributesModified = command.Changes[0].RoadSegmentAttributesModified; - var attributesModifiedIsCorrect = attributesModified.Id == roadSegmentId - && attributesModified.AccessRestriction == change.AccessRestriction - && attributesModified.Category == change.Category - && attributesModified.MaintenanceAuthority?.Code == change.MaintenanceAuthority - && attributesModified.Morphology == change.Morphology - && attributesModified.Status == change.Status; - - var europeanRoadsIsCorrect = command.Changes[1].RoadSegmentAddedToEuropeanRoad.Number == change.EuropeanRoads!.Single() - && command.Changes[4].RoadSegmentRemovedFromEuropeanRoad.SegmentId == change.Id; - var nationalRoadsIsCorrect = command.Changes[2].RoadSegmentAddedToNationalRoad.Number == change.NationalRoads!.Single() - && command.Changes[5].RoadSegmentRemovedFromNationalRoad.SegmentId == change.Id; - var numberedRoadsIsCorrect = command.Changes[3].RoadSegmentAddedToNumberedRoad.Number == change.NumberedRoads!.Single().Number - && command.Changes[6].RoadSegmentRemovedFromNumberedRoad.SegmentId == change.Id - && command.Changes[7].RoadSegmentRemovedFromNumberedRoad.SegmentId == change.Id; - - return attributesModifiedIsCorrect - && europeanRoadsIsCorrect - && nationalRoadsIsCorrect - && numberedRoadsIsCorrect; - } + var modifyRoadSegmentAttributes = Xunit.Assert.IsType(translatedChanges[0]); + modifyRoadSegmentAttributes.Id.Should().Be(roadSegmentId); + modifyRoadSegmentAttributes.AccessRestriction.Should().Be(change.AccessRestriction); + modifyRoadSegmentAttributes.Category.Should().Be(change.Category); + modifyRoadSegmentAttributes.MaintenanceAuthority.Should().Be(change.MaintenanceAuthority); + modifyRoadSegmentAttributes.Morphology.Should().Be(change.Morphology); + modifyRoadSegmentAttributes.Status.Should().Be(change.Status); - private void VerifyThatTicketHasCompleted(object response) - { - _ticketingMock.Verify(x => - x.Complete( - It.IsAny(), - new TicketResult(response), - CancellationToken.None - ) - ); - } + var addRoadSegmentToEuropeanRoad = Xunit.Assert.IsType(translatedChanges[1]); + addRoadSegmentToEuropeanRoad.Number.Should().Be(change.EuropeanRoads!.Single()); + var removeRoadSegmentFromEuropeanRoad = Xunit.Assert.IsType(translatedChanges[2]); + removeRoadSegmentFromEuropeanRoad.SegmentId.Should().Be(roadSegmentId); - private static readonly EventMapping Mapping = - new(EventMapping.DiscoverEventNamesInAssembly(typeof(RoadNetworkEvents).Assembly)); + var addRoadSegmentToNationalRoad = Xunit.Assert.IsType(translatedChanges[3]); + addRoadSegmentToNationalRoad.Number.Should().Be(change.NationalRoads!.Single()); - private static readonly JsonSerializerSettings Settings = - EventsJsonSerializerSettingsProvider.CreateSerializerSettings(); + var removeRoadSegmentFromNationalRoad = Xunit.Assert.IsType(translatedChanges[4]); + removeRoadSegmentFromNationalRoad.SegmentId.Should().Be(roadSegmentId); - private static readonly StreamNameConverter StreamNameConverter = StreamNameConversions.PassThru; + var removeRoadSegmentFromNumberedRoadReplacement = Xunit.Assert.IsType(translatedChanges[5]); + removeRoadSegmentFromNumberedRoadReplacement.SegmentId.Should().Be(roadSegmentId); + removeRoadSegmentFromNumberedRoadReplacement.Number.Should().Be(change.NumberedRoads!.Single().Number); - private Task Given(StreamName streamName, params object[] events) - { - return _store.Given(Mapping, Settings, StreamNameConverter, streamName, events); + var addRoadSegmentToNumberedRoadReplacement = Xunit.Assert.IsType(translatedChanges[6]); + addRoadSegmentToNumberedRoadReplacement.Number.Should().Be(change.NumberedRoads!.Single().Number); + + var removeRoadSegmentFromNumberedRoad = Xunit.Assert.IsType(translatedChanges[7]); + removeRoadSegmentFromNumberedRoad.SegmentId.Should().Be(roadSegmentId); } } diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangingOutlineGeometry/GivenOrganizationExists.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangingOutlineGeometry/GivenOrganizationExists.cs index c613f1d46..d3d717554 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangingOutlineGeometry/GivenOrganizationExists.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangingOutlineGeometry/GivenOrganizationExists.cs @@ -21,7 +21,6 @@ using Requests; using RoadRegistry.Tests.BackOffice; using Sqs.RoadSegments; -using Xunit.Abstractions; using GeometryTranslator = GeometryTranslator; using LineString = NetTopologySuite.Geometries.LineString; @@ -30,9 +29,7 @@ public class GivenOrganizationExists: BackOfficeLambdaTest public ICustomRetryPolicy CustomRetryPolicy { get; } public GivenOrganizationExists( - ITestOutputHelper testOutputHelper, ICustomRetryPolicy customRetryPolicy) - : base(testOutputHelper) { CustomRetryPolicy = customRetryPolicy; diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenCreatingOutline/GivenOrganizationExists.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenCreatingOutline/GivenOrganizationExists.cs index 286626b0e..8c548bc59 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenCreatingOutline/GivenOrganizationExists.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenCreatingOutline/GivenOrganizationExists.cs @@ -21,7 +21,6 @@ using Requests; using RoadRegistry.Tests.BackOffice; using Sqs.RoadSegments; -using Xunit.Abstractions; using GeometryTranslator = GeometryTranslator; using LineString = NetTopologySuite.Geometries.LineString; @@ -30,9 +29,7 @@ public class GivenOrganizationExists: BackOfficeLambdaTest public ICustomRetryPolicy CustomRetryPolicy { get; } public GivenOrganizationExists( - ITestOutputHelper testOutputHelper, ICustomRetryPolicy customRetryPolicy) - : base(testOutputHelper) { CustomRetryPolicy = customRetryPolicy; From f3662f47fa8d75895afd6a2740cd44e45e42f347 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Wed, 5 Feb 2025 11:16:34 +0100 Subject: [PATCH 06/13] lambda test streetnames --- .../Fixtures/WhenChangeAttributesFixture.cs | 88 --------- .../Abstractions/WhenChangeAttributes.cs | 17 -- ...ategoryForOutlined_ThenSucceededFixture.cs | 99 ----------- ...AttributesWithDowngradedCategoryFixture.cs | 85 --------- ...eAttributesWithOnlyEuropeanRoadsFixture.cs | 98 ---------- ...ChangeAttributesWithValidRequestFixture.cs | 167 ------------------ ...gradedCategoryForOutlined_ThenSucceeded.cs | 24 --- .../WhenChangeAttributesTestBase.cs | 2 +- ...AttributesWithDowngradedCategoryRequest.cs | 23 --- ...eAttributesWithOnlyEuropeanRoadsRequest.cs | 23 --- .../WhenDowngradingCategory.cs | 125 +++++++++++++ ...ithValidRequest.cs => WithValidRequest.cs} | 23 ++- .../Scenarios/RoadNetworkTestBase.cs | 10 +- 13 files changed, 149 insertions(+), 635 deletions(-) delete mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs delete mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributes.cs delete mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/GivenDowngradedCategoryForOutlined_ThenSucceededFixture.cs delete mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithDowngradedCategoryFixture.cs delete mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithOnlyEuropeanRoadsFixture.cs delete mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs delete mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/GivenDowngradedCategoryForOutlined_ThenSucceeded.cs delete mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithDowngradedCategoryRequest.cs delete mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithOnlyEuropeanRoadsRequest.cs create mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenDowngradingCategory.cs rename test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/{WhenChangeAttributesWithValidRequest.cs => WithValidRequest.cs} (93%) diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs deleted file mode 100644 index e117b1c7e..000000000 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/Fixtures/WhenChangeAttributesFixture.cs +++ /dev/null @@ -1,88 +0,0 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes.Abstractions.Fixtures; - -using AutoFixture; -using BackOffice.Abstractions.RoadSegments; -using BackOffice.Framework; -using Be.Vlaanderen.Basisregisters.GrAr.Provenance; -using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Infrastructure; -using Core; -using FeatureToggles; -using Framework; -using Handlers; -using Hosts; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.IO; -using NodaTime; -using Requests; -using RoadRegistry.StreetName; -using Sqs.RoadSegments; - -public abstract class WhenChangeAttributesFixture : SqsLambdaHandlerFixture -{ - protected readonly ApplicationMetadata ApplicationMetadata = new(RoadRegistryApplication.Lambda); - - protected WhenChangeAttributesFixture(IConfiguration configuration, ICustomRetryPolicy customRetryPolicy, IClock clock, SqsLambdaHandlerOptions options) - : base(configuration, customRetryPolicy, clock, options) - { - Organisation = ObjectProvider.Create(); - } - - protected Organisation Organisation { get; } - protected abstract ChangeRoadSegmentAttributesRequest Request { get; } - - protected override ChangeRoadSegmentAttributesSqsRequest SqsRequest => new() - { - Request = Request, - TicketId = Guid.NewGuid(), - Metadata = new Dictionary(), - ProvenanceData = ObjectProvider.Create() - }; - - protected override ChangeRoadSegmentAttributesSqsLambdaRequest SqsLambdaRequest => new(RoadNetwork.Identifier.ToString(), SqsRequest); - - protected override ChangeRoadSegmentAttributesSqsLambdaRequestHandler SqsLambdaRequestHandler => new( - Options, - CustomRetryPolicy, - TicketingMock.Object, - IdempotentCommandHandler, - RoadRegistryContext, - ChangeRoadNetworkDispatcher, - EditorContext, - new RecyclableMemoryStreamManager(), - FileEncoding.UTF8, - new FakeOrganizationCache(), - new StreetNameCacheClient(new FakeStreetNameCache() - .AddStreetName(WellKnownStreetNameIds.Proposed, "Proposed street", "voorgesteld") - .AddStreetName(WellKnownStreetNameIds.Current, "Current street", "inGebruik") - .AddStreetName(WellKnownStreetNameIds.Retired, "Retired street", "gehistoreerd") - .AddStreetName(WellKnownStreetNameIds.Null, "Not found street", null) - ), - new NullLogger() - ); - - protected override CommandHandlerDispatcher BuildCommandHandlerDispatcher() - { - return Dispatch.Using(Resolve.WhenEqualToMessage( - new CommandHandlerModule[] - { - new RoadNetworkCommandModule( - Store, - LifetimeScope, - new FakeRoadNetworkSnapshotReader(), - Clock, - new UseOvoCodeInChangeRoadNetworkFeatureToggle(true), - new FakeExtractUploadFailedEmailClient(), - LoggerFactory - ) - }), ApplicationMetadata); - } - - protected static class WellKnownStreetNameIds - { - public const int Proposed = 1; - public const int Current = 2; - public const int Retired = 3; - public const int Null = 4; - } -} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributes.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributes.cs deleted file mode 100644 index 1d3727340..000000000 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Abstractions/WhenChangeAttributes.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes.Abstractions; - -using Fixtures; -using Xunit.Abstractions; - -public abstract class WhenChangeAttributes : IClassFixture - where TFixture : WhenChangeAttributesFixture -{ - protected TFixture Fixture; - protected ITestOutputHelper OutputHelper; - - protected WhenChangeAttributes(TFixture fixture, ITestOutputHelper testOutputHelper) - { - Fixture = fixture; - OutputHelper = testOutputHelper; - } -} \ No newline at end of file diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/GivenDowngradedCategoryForOutlined_ThenSucceededFixture.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/GivenDowngradedCategoryForOutlined_ThenSucceededFixture.cs deleted file mode 100644 index 29c02c8de..000000000 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/GivenDowngradedCategoryForOutlined_ThenSucceededFixture.cs +++ /dev/null @@ -1,99 +0,0 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes.Fixtures; - -using Abstractions.Fixtures; -using AutoFixture; -using BackOffice.Abstractions.RoadSegments; -using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Infrastructure; -using Core; -using Hosts; -using Messages; -using Microsoft.Extensions.Configuration; -using NodaTime; -using NodaTime.Text; -using RoadRegistry.Tests.BackOffice; -using RoadRegistry.Tests.BackOffice.Extracts; -using AcceptedChange = Messages.AcceptedChange; - -public class GivenDowngradedCategoryForOutlined_ThenSucceededFixture : WhenChangeAttributesFixture -{ - public GivenDowngradedCategoryForOutlined_ThenSucceededFixture( - IConfiguration configuration, - ICustomRetryPolicy customRetryPolicy, - IClock clock, - SqsLambdaHandlerOptions options) - : base(configuration, customRetryPolicy, clock, options) - { - } - - protected override void CustomizeTestData(Fixture fixture) - { - base.CustomizeTestData(fixture); - - fixture.CustomizeRoadSegmentOutline(); - } - - protected override ChangeRoadSegmentAttributesRequest Request => new ChangeRoadSegmentAttributesRequest() - .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => - { - change.Category = RoadSegmentCategory.MainRoad; - }); - - protected override async Task SetupAsync() - { - await Given(Organizations.ToStreamName(new OrganizationId(Organisation.ToString())), new ImportedOrganization - { - Code = Organisation.ToString(), - Name = Organisation.ToString(), - When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) - }); - - TestData.Segment1Added.Category = RoadSegmentCategory.EuropeanMainRoad; - - await Given(RoadNetworkStreamNameProvider.ForOutlinedRoadSegment(new RoadSegmentId(TestData.Segment1Added.Id)), new RoadNetworkChangesAccepted - { - RequestId = TestData.RequestId, - Reason = TestData.ReasonForChange, - Operator = TestData.ChangedByOperator, - OrganizationId = TestData.ChangedByOrganization, - Organization = TestData.ChangedByOrganizationName, - Changes = - [ - new AcceptedChange - { - RoadSegmentAdded = TestData.Segment1Added - } - ], - When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) - }); - - await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); - await EditorContext.SaveChangesAsync(); - } - - protected override async Task VerifyTicketAsync() - { - var rejectCommand = await Store.GetLastMessageIfTypeIs(); - if (rejectCommand != null) - { - var problems = rejectCommand.Changes.SelectMany(change => change.Problems).ToArray(); - if (problems.Any()) - { - throw new Exception(string.Join(Environment.NewLine, problems.Select(x => x.ToString()))); - } - } - - var roadSegmentId = new RoadSegmentId(TestData.Segment1Added.Id); - - VerifyThatTicketHasCompleted(new ChangeRoadSegmentAttributesResponse()); - - var change = Request.ChangeRequests.Single(); - - var command = await Store.GetLastMessage(); - var attributesModified = Assert.Single(command.Changes).RoadSegmentAttributesModified; - - var attributesModifiedIsCorrect = attributesModified.Id == roadSegmentId - && attributesModified.Category == change.Category; - - return attributesModifiedIsCorrect; - } -} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithDowngradedCategoryFixture.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithDowngradedCategoryFixture.cs deleted file mode 100644 index ecd9ecc39..000000000 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithDowngradedCategoryFixture.cs +++ /dev/null @@ -1,85 +0,0 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes.Fixtures; - -using Abstractions.Fixtures; -using BackOffice.Abstractions.RoadSegments; -using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Infrastructure; -using Core; -using Hosts; -using Messages; -using Microsoft.Extensions.Configuration; -using Moq; -using NodaTime; -using NodaTime.Text; -using RoadRegistry.Tests.BackOffice.Extracts; -using TicketingService.Abstractions; -using AcceptedChange = Messages.AcceptedChange; - -public class WhenChangeAttributesWithDowngradedCategoryFixture : WhenChangeAttributesFixture -{ - public WhenChangeAttributesWithDowngradedCategoryFixture( - IConfiguration configuration, - ICustomRetryPolicy customRetryPolicy, - IClock clock, - SqsLambdaHandlerOptions options) - : base(configuration, customRetryPolicy, clock, options) - { - Request = new ChangeRoadSegmentAttributesRequest() - .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => - { - change.Category = RoadSegmentCategory.MainRoad; - }); - } - - protected override ChangeRoadSegmentAttributesRequest Request { get; } - - protected override async Task SetupAsync() - { - await Given(Organizations.ToStreamName(new OrganizationId(Organisation.ToString())), new ImportedOrganization - { - Code = Organisation.ToString(), - Name = Organisation.ToString(), - When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) - }); - - TestData.Segment1Added.Category = RoadSegmentCategory.EuropeanMainRoad; - - await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted - { - RequestId = TestData.RequestId, - Reason = TestData.ReasonForChange, - Operator = TestData.ChangedByOperator, - OrganizationId = TestData.ChangedByOrganization, - Organization = TestData.ChangedByOrganizationName, - Changes = - [ - new AcceptedChange - { - RoadSegmentAdded = TestData.Segment1Added - } - ], - When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) - }); - - await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); - await EditorContext.SaveChangesAsync(); - } - - protected override Task VerifyTicketAsync() - { - if (Exception is not null) - { - throw Exception; - } - - var ticketError = new TicketError([ - new TicketError("Wegcategorie werd niet gewijzigd voor wegsegment 1 omdat het record reeds een recentere versie bevat.", "WegcategorieNietVeranderdHuidigeBevatRecentereVersie") - ]); - - TicketingMock.Verify(x => - x.Error(It.IsAny(), - ticketError, - CancellationToken.None)); - - return Task.FromResult(true); - } -} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithOnlyEuropeanRoadsFixture.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithOnlyEuropeanRoadsFixture.cs deleted file mode 100644 index 4c74db5f6..000000000 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithOnlyEuropeanRoadsFixture.cs +++ /dev/null @@ -1,98 +0,0 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes.Fixtures; - -using Abstractions.Fixtures; -using AutoFixture; -using BackOffice.Abstractions.RoadSegments; -using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Infrastructure; -using Core; -using Hosts; -using Messages; -using Microsoft.Extensions.Configuration; -using NodaTime; -using NodaTime.Text; -using RoadRegistry.Tests.BackOffice.Extracts; -using AcceptedChange = Messages.AcceptedChange; - -public class WhenChangeAttributesWithOnlyEuropeanRoadsFixture : WhenChangeAttributesFixture -{ - public WhenChangeAttributesWithOnlyEuropeanRoadsFixture( - IConfiguration configuration, - ICustomRetryPolicy customRetryPolicy, - IClock clock, - SqsLambdaHandlerOptions options) - : base(configuration, customRetryPolicy, clock, options) - { - Request = new ChangeRoadSegmentAttributesRequest() - .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => - { - change.EuropeanRoads = ObjectProvider.CreateMany(1).ToArray(); - }); - } - - protected override ChangeRoadSegmentAttributesRequest Request { get; } - - protected override async Task SetupAsync() - { - await Given(Organizations.ToStreamName(new OrganizationId(Organisation.ToString())), new ImportedOrganization - { - Code = Organisation.ToString(), - Name = Organisation.ToString(), - When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) - }); - - await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted - { - RequestId = TestData.RequestId, - Reason = TestData.ReasonForChange, - Operator = TestData.ChangedByOperator, - OrganizationId = TestData.ChangedByOrganization, - Organization = TestData.ChangedByOrganizationName, - Changes = - [ - new AcceptedChange - { - RoadSegmentAdded = TestData.Segment1Added - }, - new AcceptedChange - { - RoadSegmentAddedToEuropeanRoad = new RoadSegmentAddedToEuropeanRoad - { - AttributeId = 1, - TemporaryAttributeId = 1, - SegmentId = TestData.Segment1Added.Id, - Number = ObjectProvider.CreateWhichIsDifferentThan(Request.ChangeRequests.Single().EuropeanRoads!.Single()) - } - } - ], - When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) - }); - - await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); - await EditorContext.SaveChangesAsync(); - } - - protected override async Task VerifyTicketAsync() - { - var rejectCommand = await Store.GetLastMessageIfTypeIs(); - if (rejectCommand != null) - { - var problems = rejectCommand.Changes.SelectMany(change => change.Problems).ToArray(); - if (problems.Any()) - { - throw new Exception(string.Join(Environment.NewLine, problems.Select(x => x.ToString()))); - } - } - - VerifyThatTicketHasCompleted(new ChangeRoadSegmentAttributesResponse()); - - var change = Request.ChangeRequests.Single(); - - var command = await Store.GetLastMessage(); - Assert.Equal(2, command.Changes.Length); - - var europeanRoadsIsCorrect = command.Changes[0].RoadSegmentAddedToEuropeanRoad.Number == change.EuropeanRoads!.Single() - && command.Changes[1].RoadSegmentRemovedFromEuropeanRoad.SegmentId == change.Id; - - return europeanRoadsIsCorrect; - } -} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs deleted file mode 100644 index 2b855a355..000000000 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/Fixtures/WhenChangeAttributesWithValidRequestFixture.cs +++ /dev/null @@ -1,167 +0,0 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes.Fixtures; - -using Abstractions.Fixtures; -using AutoFixture; -using BackOffice.Abstractions.RoadSegments; -using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Infrastructure; -using Core; -using Hosts; -using Messages; -using Microsoft.Extensions.Configuration; -using Moq; -using NodaTime; -using NodaTime.Text; -using RoadRegistry.Tests.BackOffice.Extracts; -using TicketingService.Abstractions; -using AcceptedChange = Messages.AcceptedChange; - -public class WhenChangeAttributesWithValidRequestFixture : WhenChangeAttributesFixture -{ - public WhenChangeAttributesWithValidRequestFixture( - IConfiguration configuration, - ICustomRetryPolicy customRetryPolicy, - IClock clock, - SqsLambdaHandlerOptions options) - : base(configuration, customRetryPolicy, clock, options) - { - Request = new ChangeRoadSegmentAttributesRequest() - .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => - { - change.AccessRestriction = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentAccessRestriction.Parse(TestData.Segment1Added.AccessRestriction)); - change.Category = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentCategory.Parse(TestData.Segment1Added.Category)); - change.MaintenanceAuthority = TestData.ChangedByOrganization; - change.Morphology = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentMorphology.Parse(TestData.Segment1Added.Morphology)); - change.Status = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentStatus.Parse(TestData.Segment1Added.Status)); - - change.EuropeanRoads = ObjectProvider.CreateMany(1).ToArray(); - change.NationalRoads = ObjectProvider.CreateMany(1).ToArray(); - change.NumberedRoads = ObjectProvider.CreateMany(1) - .Select(number => new ChangeRoadSegmentNumberedRoadAttribute - { - Number = number, - Direction = ObjectProvider.Create(), - Ordinal = ObjectProvider.Create() - }) - .ToArray(); - }); - } - - protected override ChangeRoadSegmentAttributesRequest Request { get; } - - protected override async Task SetupAsync() - { - await Given(Organizations.ToStreamName(new OrganizationId(Organisation.ToString())), new ImportedOrganization - { - Code = Organisation.ToString(), - Name = Organisation.ToString(), - When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) - }); - - await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted - { - RequestId = TestData.RequestId, - Reason = TestData.ReasonForChange, - Operator = TestData.ChangedByOperator, - OrganizationId = TestData.ChangedByOrganization, - Organization = TestData.ChangedByOrganizationName, - Changes = - [ - new AcceptedChange - { - RoadSegmentAdded = TestData.Segment1Added - }, - new AcceptedChange - { - RoadSegmentAddedToEuropeanRoad = new RoadSegmentAddedToEuropeanRoad - { - AttributeId = 1, - TemporaryAttributeId = 1, - SegmentId = TestData.Segment1Added.Id, - Number = ObjectProvider.CreateWhichIsDifferentThan(Request.ChangeRequests.Single().EuropeanRoads!.Single()) - } - }, - new AcceptedChange - { - RoadSegmentAddedToNationalRoad = new RoadSegmentAddedToNationalRoad - { - AttributeId = 1, - TemporaryAttributeId = 1, - SegmentId = TestData.Segment1Added.Id, - Number = ObjectProvider.CreateWhichIsDifferentThan(Request.ChangeRequests.Single().NationalRoads!.Single()) - } - }, - new AcceptedChange - { - RoadSegmentAddedToNumberedRoad = new RoadSegmentAddedToNumberedRoad - { - AttributeId = 1, - TemporaryAttributeId = 1, - SegmentId = TestData.Segment1Added.Id, - Number = Request.ChangeRequests.Single().NumberedRoads!.Single().Number, - Direction = ObjectProvider.CreateWhichIsDifferentThan(Request.ChangeRequests.Single().NumberedRoads!.Single().Direction), - Ordinal = ObjectProvider.Create() - } - }, - new AcceptedChange - { - RoadSegmentAddedToNumberedRoad = new RoadSegmentAddedToNumberedRoad - { - AttributeId = 2, - TemporaryAttributeId = 2, - SegmentId = TestData.Segment1Added.Id, - Number = ObjectProvider.CreateWhichIsDifferentThan(Request.ChangeRequests.Single().NumberedRoads!.Single().Number), - Direction = ObjectProvider.Create(), - Ordinal = ObjectProvider.Create() - } - } - ], - When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) - }); - - await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); - await EditorContext.SaveChangesAsync(); - } - - protected override async Task VerifyTicketAsync() - { - var rejectCommand = await Store.GetLastMessageIfTypeIs(); - if (rejectCommand != null) - { - var problems = rejectCommand.Changes.SelectMany(change => change.Problems).ToArray(); - if (problems.Any()) - { - throw new Exception(string.Join(Environment.NewLine, problems.Select(x => x.ToString()))); - } - } - - var roadSegmentId = new RoadSegmentId(TestData.Segment1Added.Id); - - VerifyThatTicketHasCompleted(new ChangeRoadSegmentAttributesResponse()); - - var change = Request.ChangeRequests.Single(); - - var command = await Store.GetLastMessage(); - Assert.Equal(8, command.Changes.Length); - - var attributesModified = command.Changes[0].RoadSegmentAttributesModified; - var attributesModifiedIsCorrect = attributesModified.Id == roadSegmentId - && attributesModified.AccessRestriction == change.AccessRestriction - && attributesModified.Category == change.Category - && attributesModified.MaintenanceAuthority?.Code == change.MaintenanceAuthority - && attributesModified.Morphology == change.Morphology - && attributesModified.Status == change.Status; - - var europeanRoadsIsCorrect = command.Changes[1].RoadSegmentAddedToEuropeanRoad.Number == change.EuropeanRoads!.Single() - && command.Changes[4].RoadSegmentRemovedFromEuropeanRoad.SegmentId == change.Id; - var nationalRoadsIsCorrect = command.Changes[2].RoadSegmentAddedToNationalRoad.Number == change.NationalRoads!.Single() - && command.Changes[5].RoadSegmentRemovedFromNationalRoad.SegmentId == change.Id; - var numberedRoadsIsCorrect = command.Changes[3].RoadSegmentAddedToNumberedRoad.Number == change.NumberedRoads!.Single().Number - && command.Changes[6].RoadSegmentRemovedFromNumberedRoad.SegmentId == change.Id - && command.Changes[7].RoadSegmentRemovedFromNumberedRoad.SegmentId == change.Id; - - return attributesModifiedIsCorrect - && europeanRoadsIsCorrect - && nationalRoadsIsCorrect - && numberedRoadsIsCorrect; - } -} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/GivenDowngradedCategoryForOutlined_ThenSucceeded.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/GivenDowngradedCategoryForOutlined_ThenSucceeded.cs deleted file mode 100644 index b3dccb2c8..000000000 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/GivenDowngradedCategoryForOutlined_ThenSucceeded.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Fixtures; -using Xunit.Abstractions; - -public class GivenDowngradedCategoryForOutlined_ThenSucceeded : WhenChangeAttributes -{ - public GivenDowngradedCategoryForOutlined_ThenSucceeded(GivenDowngradedCategoryForOutlined_ThenSucceededFixture fixture, ITestOutputHelper outputHelper) - : base(fixture, outputHelper) - { - } - - [Fact] - public void ItShouldSucceed() - { - if (Fixture.Exception is not null) - { - OutputHelper.WriteLine(Fixture.Exception.ToString()); - } - - Assert.True(Fixture.Result); - } -} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesTestBase.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesTestBase.cs index 77c4b9833..9661d04fc 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesTestBase.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesTestBase.cs @@ -70,7 +70,7 @@ protected async Task> HandleRequest(ChangeRoadS return translatedChanges.ToList(); } - private static class WellKnownStreetNameIds + protected static class WellKnownStreetNameIds { public const int Proposed = 1; public const int Current = 2; diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithDowngradedCategoryRequest.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithDowngradedCategoryRequest.cs deleted file mode 100644 index 13b0c5130..000000000 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithDowngradedCategoryRequest.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithDowngradedCategoryRequest : WhenChangeAttributes -{ - public WhenChangeAttributesWithDowngradedCategoryRequest(WhenChangeAttributesWithDowngradedCategoryFixture fixture, ITestOutputHelper outputHelper) : base(fixture, outputHelper) - { - } - - [Fact] - public void ItShouldSucceed() - { - if (Fixture.Exception is not null) - { - OutputHelper.WriteLine(Fixture.Exception.ToString()); - } - - Assert.True(Fixture.Result); - } -} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithOnlyEuropeanRoadsRequest.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithOnlyEuropeanRoadsRequest.cs deleted file mode 100644 index 589fc45fd..000000000 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithOnlyEuropeanRoadsRequest.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes; - -using Abstractions; -using Fixtures; -using Xunit.Abstractions; - -public class WhenChangeAttributesWithOnlyEuropeanRoadsRequest : WhenChangeAttributes -{ - public WhenChangeAttributesWithOnlyEuropeanRoadsRequest(WhenChangeAttributesWithOnlyEuropeanRoadsFixture fixture, ITestOutputHelper outputHelper) : base(fixture, outputHelper) - { - } - - [Fact] - public void ItShouldSucceed() - { - if (Fixture.Exception is not null) - { - OutputHelper.WriteLine(Fixture.Exception.ToString()); - } - - Assert.True(Fixture.Result); - } -} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenDowngradingCategory.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenDowngradingCategory.cs new file mode 100644 index 000000000..1d120fbdd --- /dev/null +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenDowngradingCategory.cs @@ -0,0 +1,125 @@ +namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes; + +using BackOffice.Abstractions.RoadSegments; +using Core; +using FluentAssertions; +using Messages; +using Moq; +using NodaTime.Text; +using RoadRegistry.Tests.BackOffice.Extracts; +using TicketingService.Abstractions; +using AcceptedChange = Messages.AcceptedChange; +using ModifyRoadSegmentAttributes = BackOffice.Uploads.ModifyRoadSegmentAttributes; + +public class WhenDowngradingCategory : WhenChangeAttributesTestBase +{ + [Fact] + public async Task GivenOutlinedRoadSegment_ThenSucceeded() + { + // Arrange + var request = new ChangeRoadSegmentAttributesRequest() + .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => + { + change.Category = RoadSegmentCategory.MainRoad; + }); + var change = request.ChangeRequests.Single(); + + await Given(Organizations.ToStreamName(new OrganizationId(OrganizationDbaseRecord.ORG.Value)), new ImportedOrganization + { + Code = OrganizationDbaseRecord.ORG.Value, + Name = OrganizationDbaseRecord.ORG.Value, + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + TestData.Segment1Added.Category = RoadSegmentCategory.EuropeanMainRoad; + TestData.Segment1Added.GeometryDrawMethod = RoadSegmentGeometryDrawMethod.Outlined; + + await Given(RoadNetworkStreamNameProvider.ForOutlinedRoadSegment(new RoadSegmentId(TestData.Segment1Added.Id)), new RoadNetworkChangesAccepted + { + RequestId = TestData.RequestId, + Reason = TestData.ReasonForChange, + Operator = TestData.ChangedByOperator, + OrganizationId = TestData.ChangedByOrganization, + Organization = TestData.ChangedByOrganizationName, + Changes = + [ + new AcceptedChange + { + RoadSegmentAdded = TestData.Segment1Added + } + ], + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); + await EditorContext.SaveChangesAsync(); + + // Act + var translatedChanges = await HandleRequest(request); + + // Assert + VerifyThatTicketHasCompleted(new ChangeRoadSegmentAttributesResponse()); + + translatedChanges.Should().HaveCount(1); + var roadSegmentId = change.Id; + + var modifyRoadSegmentAttributes = Xunit.Assert.IsType(translatedChanges[0]); + modifyRoadSegmentAttributes.Id.Should().Be(roadSegmentId); + modifyRoadSegmentAttributes.Category.Should().Be(change.Category); + } + + [Fact] + public async Task GivenMeasuredRoadSegment_ThenFailed() + { + // Arrange + var request = new ChangeRoadSegmentAttributesRequest() + .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => + { + change.Category = RoadSegmentCategory.MainRoad; + }); + + await Given(Organizations.ToStreamName(new OrganizationId(OrganizationDbaseRecord.ORG.Value)), new ImportedOrganization + { + Code = OrganizationDbaseRecord.ORG.Value, + Name = OrganizationDbaseRecord.ORG.Value, + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + TestData.Segment1Added.Category = RoadSegmentCategory.EuropeanMainRoad; + + await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted + { + RequestId = TestData.RequestId, + Reason = TestData.ReasonForChange, + Operator = TestData.ChangedByOperator, + OrganizationId = TestData.ChangedByOrganization, + Organization = TestData.ChangedByOrganizationName, + Changes = + [ + new AcceptedChange + { + RoadSegmentAdded = TestData.Segment1Added + } + ], + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); + await EditorContext.SaveChangesAsync(); + + // Act + await HandleRequest(request); + + // Assert + var ticketError = new TicketError([ + new TicketError( + "Wegcategorie werd niet gewijzigd voor wegsegment 1 omdat het record reeds een recentere versie bevat.", + "WegcategorieNietVeranderdHuidigeBevatRecentereVersie") + ]); + + TicketingMock.Verify(x => + x.Error(It.IsAny(), + ticketError, + CancellationToken.None)); + } +} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WithValidRequest.cs similarity index 93% rename from test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs rename to test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WithValidRequest.cs index dff3cdc69..e81f414b4 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenChangeAttributesWithValidRequest.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WithValidRequest.cs @@ -19,16 +19,9 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenCha public class WhenChangeAttributesWithValidRequest : WhenChangeAttributesTestBase { [Fact] - public async Task ThenRoadNetworkChangesAccepted() + public async Task ThenSucceeded() { // Arrange - await Given(Organizations.ToStreamName(new OrganizationId(OrganizationDbaseRecord.ORG.Value)), new ImportedOrganization - { - Code = OrganizationDbaseRecord.ORG.Value, - Name = OrganizationDbaseRecord.ORG.Value, - When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) - }); - var request = new ChangeRoadSegmentAttributesRequest() .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => { @@ -37,6 +30,8 @@ public async Task ThenRoadNetworkChangesAccepted() change.MaintenanceAuthority = TestData.ChangedByOrganization; change.Morphology = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentMorphology.Parse(TestData.Segment1Added.Morphology)); change.Status = ObjectProvider.CreateWhichIsDifferentThan(RoadSegmentStatus.Parse(TestData.Segment1Added.Status)); + change.LeftSideStreetNameId = new StreetNameLocalId(WellKnownStreetNameIds.Proposed); + change.RightSideStreetNameId = new StreetNameLocalId(WellKnownStreetNameIds.Current); change.EuropeanRoads = ObjectProvider.CreateMany(1).ToArray(); change.NationalRoads = ObjectProvider.CreateMany(1).ToArray(); @@ -51,6 +46,16 @@ public async Task ThenRoadNetworkChangesAccepted() }); var change = request.ChangeRequests.Single(); + await Given(Organizations.ToStreamName(new OrganizationId(OrganizationDbaseRecord.ORG.Value)), new ImportedOrganization + { + Code = OrganizationDbaseRecord.ORG.Value, + Name = OrganizationDbaseRecord.ORG.Value, + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + TestData.Segment1Added.LeftSide.StreetNameId = null; + TestData.Segment1Added.RightSide.StreetNameId = null; + await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted { RequestId = TestData.RequestId, @@ -131,6 +136,8 @@ public async Task ThenRoadNetworkChangesAccepted() modifyRoadSegmentAttributes.MaintenanceAuthority.Should().Be(change.MaintenanceAuthority); modifyRoadSegmentAttributes.Morphology.Should().Be(change.Morphology); modifyRoadSegmentAttributes.Status.Should().Be(change.Status); + modifyRoadSegmentAttributes.LeftSideStreetNameId.Should().Be(change.LeftSideStreetNameId); + modifyRoadSegmentAttributes.RightSideStreetNameId.Should().Be(change.RightSideStreetNameId); var addRoadSegmentToEuropeanRoad = Xunit.Assert.IsType(translatedChanges[1]); addRoadSegmentToEuropeanRoad.Number.Should().Be(change.EuropeanRoads!.Single()); diff --git a/test/RoadRegistry.Tests/BackOffice/Scenarios/RoadNetworkTestBase.cs b/test/RoadRegistry.Tests/BackOffice/Scenarios/RoadNetworkTestBase.cs index 8df0dc577..648800aa6 100644 --- a/test/RoadRegistry.Tests/BackOffice/Scenarios/RoadNetworkTestBase.cs +++ b/test/RoadRegistry.Tests/BackOffice/Scenarios/RoadNetworkTestBase.cs @@ -1,17 +1,23 @@ namespace RoadRegistry.Tests.BackOffice.Scenarios; +using AutoFixture; + public class RoadNetworkTestBase : RoadRegistryTestBase { - protected readonly RoadNetworkTestData TestData = new(); + protected readonly RoadNetworkTestData TestData; public RoadNetworkTestBase(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { + TestData = new RoadNetworkTestData(CustomizeTestData); TestData.CopyCustomizationsTo(ObjectProvider); } + protected virtual void CustomizeTestData(Fixture fixture) + { } + public static IEnumerable NonAdjacentLaneAttributesCases => RoadNetworkTestData.NonAdjacentLaneAttributesCases; public static IEnumerable NonAdjacentSurfaceAttributesCases => RoadNetworkTestData.NonAdjacentSurfaceAttributesCases; public static IEnumerable NonAdjacentWidthAttributesCases => RoadNetworkTestData.NonAdjacentWidthAttributesCases; public static IEnumerable SelfOverlapsCases => RoadNetworkTestData.SelfOverlapsCases; -} \ No newline at end of file +} From 8ae1c39ce0597ae90213b4c8e2f688c391e75a61 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Wed, 5 Feb 2025 11:43:11 +0100 Subject: [PATCH 07/13] add lambda failure scenarios --- ...egmentAttributesSqsLambdaRequestHandler.cs | 45 ++-- .../Core/ProblemCodes/RoadSegment.cs | 4 + ...adSegmentStreetNameNotProposedOrCurrent.cs | 18 +- .../Core/StreetNameNotFound.cs | 15 +- .../DutchTranslations/ProblemTranslator.cs | 20 +- .../Framework/BackOfficeLambdaTest.cs | 2 + .../WhenLinkingStreetName.cs | 195 ++++++++++++++++++ 7 files changed, 271 insertions(+), 28 deletions(-) create mode 100644 test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenLinkingStreetName.cs diff --git a/src/RoadRegistry.BackOffice.Handlers.Sqs.Lambda/Handlers/ChangeRoadSegmentAttributesSqsLambdaRequestHandler.cs b/src/RoadRegistry.BackOffice.Handlers.Sqs.Lambda/Handlers/ChangeRoadSegmentAttributesSqsLambdaRequestHandler.cs index 030cbc5fd..789df08bd 100644 --- a/src/RoadRegistry.BackOffice.Handlers.Sqs.Lambda/Handlers/ChangeRoadSegmentAttributesSqsLambdaRequestHandler.cs +++ b/src/RoadRegistry.BackOffice.Handlers.Sqs.Lambda/Handlers/ChangeRoadSegmentAttributesSqsLambdaRequestHandler.cs @@ -151,15 +151,7 @@ await _changeRoadNetworkDispatcher.DispatchAsync(request, "Attributen wijzigen", } } - if (change.LeftSideStreetNameId is not null) - { - problems = await ValidateStreetName(change.Id, change.LeftSideStreetNameId.Value, problems, cancellationToken); - } - - if (change.RightSideStreetNameId is not null) - { - problems = await ValidateStreetName(change.Id, change.RightSideStreetNameId.Value, problems, cancellationToken); - } + problems = await ValidateStreetNames(change, problems, cancellationToken); changes = changes.AppendChange(new ModifyRoadSegmentAttributes(RecordNumber.Initial, roadSegment.Id, roadSegment.AttributeHash.GeometryDrawMethod) { @@ -369,24 +361,41 @@ private TranslatedChanges AppendNumberedRoadChanges(TranslatedChanges changes, R return (organizationId, problems); } - private async Task ValidateStreetName( - RoadSegmentId roadSegmentId, - StreetNameLocalId streetNameId, + private async Task ValidateStreetNames( + ChangeRoadSegmentAttributeRequest change, Problems problems, CancellationToken cancellationToken) { try { - var streetName = await _streetNameClient.GetAsync(streetNameId, cancellationToken); - if (streetName is null) + string[] activeStreetNameStatus = [StreetNameStatus.Current, StreetNameStatus.Proposed]; + + if (change.LeftSideStreetNameId is not null) { - return problems.Add(new StreetNameNotFound(roadSegmentId)); + var streetName = await _streetNameClient.GetAsync(change.LeftSideStreetNameId.Value, cancellationToken); + if (streetName is null) + { + return problems.Add(new LeftStreetNameNotFound(change.Id)); + } + + if (activeStreetNameStatus.All(status => !string.Equals(streetName.Status, status, StringComparison.InvariantCultureIgnoreCase))) + { + return problems.Add(new RoadSegmentLeftStreetNameNotProposedOrCurrent(change.Id)); + } } - string[] activeStreetNameStatus = [StreetNameStatus.Current, StreetNameStatus.Proposed]; - if (activeStreetNameStatus.All(status => !string.Equals(streetName.Status, status, StringComparison.InvariantCultureIgnoreCase))) + if (change.RightSideStreetNameId is not null) { - return problems.Add(new RoadSegmentStreetNameNotProposedOrCurrent(roadSegmentId)); + var streetName = await _streetNameClient.GetAsync(change.RightSideStreetNameId.Value, cancellationToken); + if (streetName is null) + { + return problems.Add(new RightStreetNameNotFound(change.Id)); + } + + if (activeStreetNameStatus.All(status => !string.Equals(streetName.Status, status, StringComparison.InvariantCultureIgnoreCase))) + { + return problems.Add(new RoadSegmentRightStreetNameNotProposedOrCurrent(change.Id)); + } } } catch (StreetNameRegistryUnexpectedStatusCodeException ex) diff --git a/src/RoadRegistry.BackOffice/Core/ProblemCodes/RoadSegment.cs b/src/RoadRegistry.BackOffice/Core/ProblemCodes/RoadSegment.cs index 139c31728..387ac7ea7 100644 --- a/src/RoadRegistry.BackOffice/Core/ProblemCodes/RoadSegment.cs +++ b/src/RoadRegistry.BackOffice/Core/ProblemCodes/RoadSegment.cs @@ -185,6 +185,8 @@ public static class Left public static readonly ProblemCode NotLinked = new("RoadSegmentStreetNameLeftNotLinked"); public static readonly ProblemCode NotUnlinked = new("RoadSegmentStreetNameLeftNotUnlinked"); public static readonly ProblemCode NotValid = new("RoadSegmentStreetNameLeftNotValid"); + public static readonly ProblemCode NotProposedOrCurrent = new("RoadSegmentStreetNameLeftNotProposedOrCurrent"); + public static readonly ProblemCode NotFound = new("RoadSegmentStreetNameLeftNotFound"); } public static class Right @@ -192,6 +194,8 @@ public static class Right public static readonly ProblemCode NotLinked = new("RoadSegmentStreetNameRightNotLinked"); public static readonly ProblemCode NotUnlinked = new("RoadSegmentStreetNameRightNotUnlinked"); public static readonly ProblemCode NotValid = new("RoadSegmentStreetNameRightNotValid"); + public static readonly ProblemCode NotProposedOrCurrent = new("RoadSegmentStreetNameRightNotProposedOrCurrent"); + public static readonly ProblemCode NotFound = new("RoadSegmentStreetNameRightNotFound"); } } diff --git a/src/RoadRegistry.BackOffice/Core/RoadSegmentStreetNameNotProposedOrCurrent.cs b/src/RoadRegistry.BackOffice/Core/RoadSegmentStreetNameNotProposedOrCurrent.cs index 2e125b339..29b6be8f0 100644 --- a/src/RoadRegistry.BackOffice/Core/RoadSegmentStreetNameNotProposedOrCurrent.cs +++ b/src/RoadRegistry.BackOffice/Core/RoadSegmentStreetNameNotProposedOrCurrent.cs @@ -8,8 +8,22 @@ public RoadSegmentStreetNameNotProposedOrCurrent() : base(ProblemCode.RoadSegment.StreetName.NotProposedOrCurrent) { } - public RoadSegmentStreetNameNotProposedOrCurrent(RoadSegmentId roadSegmentId) - : base(ProblemCode.RoadSegment.StreetName.NotProposedOrCurrent, new ProblemParameter("SegmentId", roadSegmentId.ToString())) +} + +public class RoadSegmentLeftStreetNameNotProposedOrCurrent : Error +{ + public RoadSegmentLeftStreetNameNotProposedOrCurrent(RoadSegmentId roadSegmentId) + : base(ProblemCode.RoadSegment.StreetName.Left.NotProposedOrCurrent, new ProblemParameter("SegmentId", roadSegmentId.ToString())) + { + } +} + +public class RoadSegmentRightStreetNameNotProposedOrCurrent : Error +{ + public RoadSegmentRightStreetNameNotProposedOrCurrent(RoadSegmentId roadSegmentId) + : base(ProblemCode.RoadSegment.StreetName.Right.NotProposedOrCurrent, new ProblemParameter("SegmentId", roadSegmentId.ToString())) { } } + + diff --git a/src/RoadRegistry.BackOffice/Core/StreetNameNotFound.cs b/src/RoadRegistry.BackOffice/Core/StreetNameNotFound.cs index 9486cd01a..1025675a1 100644 --- a/src/RoadRegistry.BackOffice/Core/StreetNameNotFound.cs +++ b/src/RoadRegistry.BackOffice/Core/StreetNameNotFound.cs @@ -8,9 +8,20 @@ public StreetNameNotFound() : base(ProblemCode.StreetName.NotFound) { } +} - public StreetNameNotFound(RoadSegmentId roadSegmentId) - : base(ProblemCode.StreetName.NotFound, new ProblemParameter("SegmentId", roadSegmentId.ToString())) +public class LeftStreetNameNotFound : Error +{ + public LeftStreetNameNotFound(RoadSegmentId roadSegmentId) + : base(ProblemCode.RoadSegment.StreetName.Left.NotFound, new ProblemParameter("SegmentId", roadSegmentId.ToString())) + { + } +} + +public class RightStreetNameNotFound : Error +{ + public RightStreetNameNotFound(RoadSegmentId roadSegmentId) + : base(ProblemCode.RoadSegment.StreetName.Right.NotFound, new ProblemParameter("SegmentId", roadSegmentId.ToString())) { } } diff --git a/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs b/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs index 0de6444d0..9c57d4e27 100644 --- a/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs +++ b/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs @@ -230,17 +230,27 @@ public static class ProblemTranslator $"Wegsegment status is foutief. '{problem.Parameters[0].Value}' is geen geldige waarde.") }, {ProblemCode.RoadSegment.Status.IsRequired, problem => new(problem.Severity, "WegsegmentStatusVerplicht", "Wegsegment status is verplicht.") }, - {ProblemCode.RoadSegment.StreetName.NotProposedOrCurrent, problem => new(problem.Severity, "WegsegmentStraatnaamNietVoorgesteldOfInGebruik", problem.HasParameter("SegmentId") - ? $"De straatnaam voor wegsegment met id {problem.GetParameterValue("Identifier")} moet status 'voorgesteld' of 'in gebruik' hebben." - : "Deze actie is enkel toegelaten voor straatnamen met status 'voorgesteld' of 'in gebruik'.") }, + {ProblemCode.RoadSegment.StreetName.NotProposedOrCurrent, problem => new(problem.Severity, "WegsegmentStraatnaamNietVoorgesteldOfInGebruik", + "Deze actie is enkel toegelaten voor straatnamen met status 'voorgesteld' of 'in gebruik'.") }, + {ProblemCode.RoadSegment.StreetName.Left.NotLinked, problem => new(problem.Severity, "LinkerstraatnaamNietGekoppeld", $"Het wegsegment met id {problem.Parameters[0].Value} is niet gekoppeld aan de linkerstraatnaam '{problem.Parameters[1].Value}'") }, {ProblemCode.RoadSegment.StreetName.Left.NotUnlinked, problem => new(problem.Severity, "LinkerstraatnaamNietOntkoppeld", $"Het wegsegment met id {problem.Parameters[0].Value} heeft reeds een linkerstraatnaam. Gelieve deze eerst te ontkoppelen.") }, + {ProblemCode.RoadSegment.StreetName.Left.NotProposedOrCurrent, problem => new(problem.Severity, "LinkerstraatnaamNietVoorgesteldOfInGebruik", + $"De linkerstraatnaam voor wegsegment met id {problem.GetParameterValue("SegmentId")} moet status 'voorgesteld' of 'in gebruik' hebben.") }, + {ProblemCode.RoadSegment.StreetName.Left.NotFound, problem => new(problem.Severity, "LinkerstraatnaamNietGekend", + $"De linkerstraatnaam voor het wegsegment met id {problem.GetParameterValue("SegmentId")} is niet gekend in het Straatnamenregister.")}, + {ProblemCode.RoadSegment.StreetName.Right.NotLinked, problem => new(problem.Severity, "RechterstraatnaamNietGekoppeld", $"Het wegsegment met id {problem.Parameters[0].Value} is niet gekoppeld aan de rechterstraatnaam '{problem.Parameters[1].Value}'") }, {ProblemCode.RoadSegment.StreetName.Right.NotUnlinked, problem => new(problem.Severity, "RechterstraatnaamNietOntkoppeld", $"Het wegsegment met id {problem.Parameters[0].Value} heeft reeds een rechterstraatnaam. Gelieve deze eerst te ontkoppelen.") }, + {ProblemCode.RoadSegment.StreetName.Right.NotProposedOrCurrent, problem => new(problem.Severity, "RechterstraatnaamNietVoorgesteldOfInGebruik", + $"De rechterstraatnaam voor wegsegment met id {problem.GetParameterValue("SegmentId")} moet status 'voorgesteld' of 'in gebruik' hebben.") }, + {ProblemCode.RoadSegment.StreetName.Right.NotFound, problem => new(problem.Severity, "RechterstraatnaamNietGekend", + $"De rechterstraatnaam voor het wegsegment met id {problem.GetParameterValue("SegmentId")} is niet gekend in het Straatnamenregister.")}, + {ProblemCode.RoadSegment.Surface.FromPositionNotEqualToZero, problem => new(problem.Severity, problem.Reason, $"De van positie ({problem.Parameters[1].Value}) van het eerste wegverharding attribuut met id {problem.Parameters[0].Value} is niet 0.0.") }, {ProblemCode.RoadSegment.Surface.HasLengthOfZero, problem => new(problem.Severity, problem.Reason, @@ -293,9 +303,7 @@ public static class ProblemTranslator {ProblemCode.ShapeFile.InvalidPolygonShellOrientation, problem => new(problem.Severity, problem.Reason, "De orientatie van de polygoon moet in wijzerzin zijn.")}, - {ProblemCode.StreetName.NotFound, problem => new(problem.Severity, "StraatnaamNietGekend", problem.HasParameter("SegmentId") - ? $"De straatnaam voor het wegsegment met id {problem.GetParameterValue("SegmentId")} is niet gekend in het Straatnamenregister." - : "De straatnaam is niet gekend in het Straatnamenregister.")}, + {ProblemCode.StreetName.NotFound, problem => new(problem.Severity, "StraatnaamNietGekend", "De straatnaam is niet gekend in het Straatnamenregister.")}, {ProblemCode.StreetName.RegistryUnexpectedError, problem => new(problem.Severity, "StraatnamenregisterOnverwachteFout", $"Het Straatnamenregister gaf een onverwachte fout {problem.GetParameterValue("StatusCode")}.")}, diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs index c4805d2d2..411b3d2ef 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs @@ -476,10 +476,12 @@ protected void VerifyThatTicketHasError(Mock ticketing, string code, new TicketError(message, code), CancellationToken.None)); } + protected void VerifyThatTicketHasErrorList(string code, string message) { VerifyThatTicketHasErrorList(TicketingMock, code, message); } + protected void VerifyThatTicketHasErrorList(Mock ticketing, string code, string message) { ticketing.Verify(x => diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenLinkingStreetName.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenLinkingStreetName.cs new file mode 100644 index 000000000..8efce5a43 --- /dev/null +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangeAttributes/WhenLinkingStreetName.cs @@ -0,0 +1,195 @@ +namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangeAttributes; + +using Abstractions.RoadSegments; +using Core; +using Messages; +using NodaTime.Text; +using RoadRegistry.Tests.BackOffice.Extracts; +using AcceptedChange = Messages.AcceptedChange; + +public class WhenLinkingStreetName : WhenChangeAttributesTestBase +{ + [Fact] + public async Task WhenLeftStreetNameHasNotActiveStatus_ThenFailure() + { + // Arrange + var request = new ChangeRoadSegmentAttributesRequest() + .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => + { + change.LeftSideStreetNameId = new StreetNameLocalId(WellKnownStreetNameIds.Retired); + }); + + await Given(Organizations.ToStreamName(new OrganizationId(OrganizationDbaseRecord.ORG.Value)), new ImportedOrganization + { + Code = OrganizationDbaseRecord.ORG.Value, + Name = OrganizationDbaseRecord.ORG.Value, + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted + { + RequestId = TestData.RequestId, + Reason = TestData.ReasonForChange, + Operator = TestData.ChangedByOperator, + OrganizationId = TestData.ChangedByOrganization, + Organization = TestData.ChangedByOrganizationName, + Changes = + [ + new AcceptedChange + { + RoadSegmentAdded = TestData.Segment1Added + } + ], + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); + await EditorContext.SaveChangesAsync(); + + // Act + await HandleRequest(request); + + // Assert + VerifyThatTicketHasErrorList( + "LinkerstraatnaamNietVoorgesteldOfInGebruik", + $"De linkerstraatnaam voor wegsegment met id {request.ChangeRequests.Single().Id} moet status 'voorgesteld' of 'in gebruik' hebben."); + } + + [Fact] + public async Task WhenLeftStreetNameNotFound_ThenFailure() + { + // Arrange + var request = new ChangeRoadSegmentAttributesRequest() + .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => + { + change.LeftSideStreetNameId = new StreetNameLocalId(int.MaxValue); + }); + + await Given(Organizations.ToStreamName(new OrganizationId(OrganizationDbaseRecord.ORG.Value)), new ImportedOrganization + { + Code = OrganizationDbaseRecord.ORG.Value, + Name = OrganizationDbaseRecord.ORG.Value, + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted + { + RequestId = TestData.RequestId, + Reason = TestData.ReasonForChange, + Operator = TestData.ChangedByOperator, + OrganizationId = TestData.ChangedByOrganization, + Organization = TestData.ChangedByOrganizationName, + Changes = + [ + new AcceptedChange + { + RoadSegmentAdded = TestData.Segment1Added + } + ], + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); + await EditorContext.SaveChangesAsync(); + + // Act + await HandleRequest(request); + + // Assert + VerifyThatTicketHasErrorList( + "LinkerstraatnaamNietGekend", + $"De linkerstraatnaam voor het wegsegment met id {request.ChangeRequests.Single().Id} is niet gekend in het Straatnamenregister."); + } + + [Fact] + public async Task WhenRightStreetNameHasNotActiveStatus_ThenFailure() + { + // Arrange + var request = new ChangeRoadSegmentAttributesRequest() + .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => + { + change.RightSideStreetNameId = new StreetNameLocalId(WellKnownStreetNameIds.Retired); + }); + + await Given(Organizations.ToStreamName(new OrganizationId(OrganizationDbaseRecord.ORG.Value)), new ImportedOrganization + { + Code = OrganizationDbaseRecord.ORG.Value, + Name = OrganizationDbaseRecord.ORG.Value, + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted + { + RequestId = TestData.RequestId, + Reason = TestData.ReasonForChange, + Operator = TestData.ChangedByOperator, + OrganizationId = TestData.ChangedByOrganization, + Organization = TestData.ChangedByOrganizationName, + Changes = + [ + new AcceptedChange + { + RoadSegmentAdded = TestData.Segment1Added + } + ], + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); + await EditorContext.SaveChangesAsync(); + + // Act + await HandleRequest(request); + + // Assert + VerifyThatTicketHasErrorList( + "RechterstraatnaamNietVoorgesteldOfInGebruik", + $"De rechterstraatnaam voor wegsegment met id {request.ChangeRequests.Single().Id} moet status 'voorgesteld' of 'in gebruik' hebben."); + } + + [Fact] + public async Task WhenRightStreetNameNotFound_ThenFailure() + { + // Arrange + var request = new ChangeRoadSegmentAttributesRequest() + .Add(new RoadSegmentId(TestData.Segment1Added.Id), change => + { + change.RightSideStreetNameId = new StreetNameLocalId(int.MaxValue); + }); + + await Given(Organizations.ToStreamName(new OrganizationId(OrganizationDbaseRecord.ORG.Value)), new ImportedOrganization + { + Code = OrganizationDbaseRecord.ORG.Value, + Name = OrganizationDbaseRecord.ORG.Value, + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + await Given(RoadNetworks.Stream, new RoadNetworkChangesAccepted + { + RequestId = TestData.RequestId, + Reason = TestData.ReasonForChange, + Operator = TestData.ChangedByOperator, + OrganizationId = TestData.ChangedByOrganization, + Organization = TestData.ChangedByOrganizationName, + Changes = + [ + new AcceptedChange + { + RoadSegmentAdded = TestData.Segment1Added + } + ], + When = InstantPattern.ExtendedIso.Format(Clock.GetCurrentInstant()) + }); + + await EditorContext.RoadSegments.AddAsync(TestData.Segment1Added.ToRoadSegmentRecord(TestData.ChangedByOrganization, Clock)); + await EditorContext.SaveChangesAsync(); + + // Act + await HandleRequest(request); + + // Assert + VerifyThatTicketHasErrorList( + "RechterstraatnaamNietGekend", + $"De rechterstraatnaam voor het wegsegment met id {request.ChangeRequests.Single().Id} is niet gekend in het Straatnamenregister."); + } +} From 8a85919613e0d02acad4163433c4027331509af3 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Wed, 5 Feb 2025 11:59:43 +0100 Subject: [PATCH 08/13] refactor WhenChangingOutlineGeometry --- .../Framework/BackOfficeLambdaTest.cs | 13 --- .../{Framework => }/MessageHandlerTests.cs | 5 +- .../GivenOrganizationExists.cs | 93 +++++++++---------- .../GivenOrganizationExists.cs | 2 - .../{Framework => }/SqsLambdaHandlerTests.cs | 3 +- .../Scenarios/RoadNetworkTestBase.cs | 9 +- 6 files changed, 52 insertions(+), 73 deletions(-) rename test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/{Framework => }/MessageHandlerTests.cs (97%) rename test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/{Framework => }/SqsLambdaHandlerTests.cs (98%) diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs index 411b3d2ef..6849248fc 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/BackOfficeLambdaTest.cs @@ -417,19 +417,6 @@ protected async Task AddOutlinedRoadSegment(RoadSegmentId roadSegmentId) await GivenEvents(RoadNetworkStreamNameProvider.ForOutlinedRoadSegment(roadSegmentId), roadNetworkChangesAccepted); } - protected async Task ThrowIfLastCommandIsRoadNetworkChangesRejected() - { - var rejectCommand = await Store.GetLastMessageIfTypeIs(); - if (rejectCommand != null) - { - var problems = rejectCommand.Changes.SelectMany(change => change.Problems).ToArray(); - if (problems.Any()) - { - throw new Exception(string.Join(Environment.NewLine, problems.Select(x => x.ToString()))); - } - } - } - protected async Task VerifyThatTicketHasCompleted(RoadSegmentId roadSegmentId) { var roadNetwork = await RoadRegistryContext.RoadNetworks.ForOutlinedRoadSegment(roadSegmentId, CancellationToken.None); diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/MessageHandlerTests.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/MessageHandlerTests.cs similarity index 97% rename from test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/MessageHandlerTests.cs rename to test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/MessageHandlerTests.cs index b692b7f71..58fb206bf 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/MessageHandlerTests.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/MessageHandlerTests.cs @@ -1,4 +1,4 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.Framework; +namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests; using Abstractions; using Autofac; @@ -20,6 +20,7 @@ public MessageHandlerTests(ITestOutputHelper testOutputHelper) { } + // todo-rik why is this method not called? private async Task WhenProcessing_SqsRequest_Then_SqsLambdaRequest_IsSent() where TSqsRequest : SqsRequest, IHasBackOfficeRequest where TSqsLambdaRequest : SqsLambdaRequest, IHasBackOfficeRequest @@ -107,4 +108,4 @@ await sut.HandleMessage( internal class TestSqsRequest : SqsRequest { -} \ No newline at end of file +} diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangingOutlineGeometry/GivenOrganizationExists.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangingOutlineGeometry/GivenOrganizationExists.cs index d3d717554..06d13cf66 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangingOutlineGeometry/GivenOrganizationExists.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenChangingOutlineGeometry/GivenOrganizationExists.cs @@ -1,38 +1,32 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.RoadSegments.WhenChangingOutlineGeometry; using Abstractions.RoadSegmentsOutline; -using Autofac; using AutoFixture; -using BackOffice.Framework; +using BackOffice.Uploads; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using Be.Vlaanderen.Basisregisters.Shaperon.Geometries; -using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Infrastructure; -using Core; -using FeatureToggles; +using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Requests; using FluentAssertions; using Framework; using Handlers; using Hosts; -using Messages; using Microsoft.Extensions.Logging.Abstractions; +using Moq; using NetTopologySuite.Geometries; using NetTopologySuite.Geometries.Implementation; using Requests; using RoadRegistry.Tests.BackOffice; +using RoadRegistry.Tests.Framework; using Sqs.RoadSegments; using GeometryTranslator = GeometryTranslator; using LineString = NetTopologySuite.Geometries.LineString; +using ModifyRoadSegmentGeometry = BackOffice.Uploads.ModifyRoadSegmentGeometry; -public class GivenOrganizationExists: BackOfficeLambdaTest +public class GivenOrganizationExists : BackOfficeLambdaTest { - public ICustomRetryPolicy CustomRetryPolicy { get; } - - public GivenOrganizationExists( - ICustomRetryPolicy customRetryPolicy) + public GivenOrganizationExists() { - CustomRetryPolicy = customRetryPolicy; - ObjectProvider.CustomizeRoadSegmentOutlineGeometryDrawMethod(); } @@ -40,7 +34,7 @@ public GivenOrganizationExists( [InlineData(2)] [InlineData(10)] [InlineData(99999.99)] - public async Task WhenValidRequest_ThenChangeRoadNetwork(double length) + public async Task WhenValidRequest_ThenSucceeded(double length) { // Arrange await GivenOrganization(); @@ -48,7 +42,6 @@ public async Task WhenValidRequest_ThenChangeRoadNetwork(double length) var roadSegmentId = new RoadSegmentId(TestData.Segment1Added.Id); await AddOutlinedRoadSegment(roadSegmentId); - // Act var lineString = new LineString( new CoordinateArraySequence([new CoordinateM(0, 0, 0), new CoordinateM(length, 0, length)]), GeometryConfiguration.GeometryFactory); @@ -57,16 +50,17 @@ public async Task WhenValidRequest_ThenChangeRoadNetwork(double length) roadSegmentId, GeometryTranslator.Translate(lineString.ToMultiLineString()) ); - await HandleRequest(request); - // Assert - await ThrowIfLastCommandIsRoadNetworkChangesRejected(); + // Act + var translatedChanges = await HandleRequest(request); + // Assert await VerifyThatTicketHasCompleted(roadSegmentId); - var command = await Store.GetLastMessage(); - command.Changes.Length.Should().Be(1); - command.Changes.Single().RoadSegmentGeometryModified.Id.Should().Be(roadSegmentId); + translatedChanges.Should().HaveCount(1); + + var modifyRoadSegmentGeometry = Xunit.Assert.IsType(translatedChanges[0]); + modifyRoadSegmentGeometry.Id.Should().Be(roadSegmentId); } [Fact] @@ -78,7 +72,6 @@ public async Task WhenGeometryIsTooLong_ThenTicketError() var roadSegmentId = new RoadSegmentId(TestData.Segment1Added.Id); await AddOutlinedRoadSegment(roadSegmentId); - // Act var tooLongLineString = new LineString( new CoordinateArraySequence([new CoordinateM(0, 0, 0), new CoordinateM(100000, 0, 100000)]), GeometryConfiguration.GeometryFactory); @@ -87,10 +80,14 @@ public async Task WhenGeometryIsTooLong_ThenTicketError() roadSegmentId, GeometryTranslator.Translate(tooLongLineString.ToMultiLineString()) ); + + // Act await HandleRequest(request); // Assert - VerifyThatTicketHasErrorList("MiddellijnGeometrieTeLang", "De opgegeven geometrie van wegsegment met id 1 zijn lengte is groter of gelijk dan 100000 meter."); + VerifyThatTicketHasErrorList( + "MiddellijnGeometrieTeLang", + "De opgegeven geometrie van wegsegment met id 1 zijn lengte is groter of gelijk dan 100000 meter."); } [Fact] @@ -102,7 +99,6 @@ public async Task WhenGeometryIsTooShort_ThenTicketError() var roadSegmentId = new RoadSegmentId(TestData.Segment1Added.Id); await AddOutlinedRoadSegment(roadSegmentId); - // Act var tooLongLineString = new LineString( new CoordinateArraySequence([new CoordinateM(0, 0, 0), new CoordinateM(1.99, 0, 1.99)]), GeometryConfiguration.GeometryFactory); @@ -111,13 +107,17 @@ public async Task WhenGeometryIsTooShort_ThenTicketError() roadSegmentId, GeometryTranslator.Translate(tooLongLineString.ToMultiLineString()) ); + + // Act await HandleRequest(request); // Assert - VerifyThatTicketHasErrorList("MiddellijnGeometrieKorterDanMinimum", "De opgegeven geometrie van wegsegment met id 1 heeft niet de minimale lengte van 2 meter."); + VerifyThatTicketHasErrorList( + "MiddellijnGeometrieKorterDanMinimum", + "De opgegeven geometrie van wegsegment met id 1 heeft niet de minimale lengte van 2 meter."); } - private async Task HandleRequest(ChangeRoadSegmentOutlineGeometryRequest request) + private async Task> HandleRequest(ChangeRoadSegmentOutlineGeometryRequest request) { var sqsRequest = new ChangeRoadSegmentOutlineGeometrySqsRequest { @@ -129,35 +129,32 @@ private async Task HandleRequest(ChangeRoadSegmentOutlineGeometryRequest request var sqsLambdaRequest = new ChangeRoadSegmentOutlineGeometrySqsLambdaRequest(Guid.NewGuid().ToString(), sqsRequest); + var translatedChanges = TranslatedChanges.Empty; + var changeRoadNetworkDispatcherMock = new Mock(); + changeRoadNetworkDispatcherMock + .Setup(x => x.DispatchAsync( + It.IsAny(), + It.IsAny(), + It.IsAny>>(), + It.IsAny())) + .Callback( + (SqsLambdaRequest _, string _, Func> builder, CancellationToken _) => + { + translatedChanges = builder(translatedChanges).GetAwaiter().GetResult(); + }); + var handler = new ChangeRoadSegmentOutlineGeometrySqsLambdaRequestHandler( SqsLambdaHandlerOptions, - CustomRetryPolicy, + new FakeRetryPolicy(), TicketingMock.Object, - ScopedContainer.Resolve(), + Mock.Of(), RoadRegistryContext, - ScopedContainer.Resolve(), + changeRoadNetworkDispatcherMock.Object, new NullLogger() ); + await handler.Handle(sqsLambdaRequest, CancellationToken.None); - } - protected override void ConfigureContainer(ContainerBuilder containerBuilder) - { - base.ConfigureContainer(containerBuilder); - - containerBuilder - .Register(_ => Dispatch.Using(Resolve.WhenEqualToMessage( - [ - new RoadNetworkCommandModule( - Store, - ScopedContainer, - new FakeRoadNetworkSnapshotReader(), - Clock, - new UseOvoCodeInChangeRoadNetworkFeatureToggle(true), - new FakeExtractUploadFailedEmailClient(), - LoggerFactory - ) - ]), ApplicationMetadata)) - .SingleInstance(); + return translatedChanges.ToList(); } } diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenCreatingOutline/GivenOrganizationExists.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenCreatingOutline/GivenOrganizationExists.cs index 8c548bc59..1e15d2e54 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenCreatingOutline/GivenOrganizationExists.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/RoadSegments/WhenCreatingOutline/GivenOrganizationExists.cs @@ -55,8 +55,6 @@ public async Task WhenValidRequest_ThenChangeRoadNetwork() await HandleRequest(request); // Assert - await ThrowIfLastCommandIsRoadNetworkChangesRejected(); - var roadSegmentId = new RoadSegmentId(1); await VerifyThatTicketHasCompleted(roadSegmentId); diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/SqsLambdaHandlerTests.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/SqsLambdaHandlerTests.cs similarity index 98% rename from test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/SqsLambdaHandlerTests.cs rename to test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/SqsLambdaHandlerTests.cs index 45ce59569..1bc4e7678 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/Framework/SqsLambdaHandlerTests.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/SqsLambdaHandlerTests.cs @@ -1,4 +1,4 @@ -namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.Framework; +namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests; using Abstractions.Exceptions; using Abstractions.RoadSegments; @@ -9,6 +9,7 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests.Framework; using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Infrastructure; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using Core; +using Framework; using Hosts; using Infrastructure; using Microsoft.Extensions.Logging; diff --git a/test/RoadRegistry.Tests/BackOffice/Scenarios/RoadNetworkTestBase.cs b/test/RoadRegistry.Tests/BackOffice/Scenarios/RoadNetworkTestBase.cs index 648800aa6..2323713e8 100644 --- a/test/RoadRegistry.Tests/BackOffice/Scenarios/RoadNetworkTestBase.cs +++ b/test/RoadRegistry.Tests/BackOffice/Scenarios/RoadNetworkTestBase.cs @@ -1,21 +1,16 @@ namespace RoadRegistry.Tests.BackOffice.Scenarios; -using AutoFixture; - public class RoadNetworkTestBase : RoadRegistryTestBase { protected readonly RoadNetworkTestData TestData; - public RoadNetworkTestBase(ITestOutputHelper testOutputHelper) + protected RoadNetworkTestBase(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { - TestData = new RoadNetworkTestData(CustomizeTestData); + TestData = new RoadNetworkTestData(); TestData.CopyCustomizationsTo(ObjectProvider); } - protected virtual void CustomizeTestData(Fixture fixture) - { } - public static IEnumerable NonAdjacentLaneAttributesCases => RoadNetworkTestData.NonAdjacentLaneAttributesCases; public static IEnumerable NonAdjacentSurfaceAttributesCases => RoadNetworkTestData.NonAdjacentSurfaceAttributesCases; public static IEnumerable NonAdjacentWidthAttributesCases => RoadNetworkTestData.NonAdjacentWidthAttributesCases; From 8cbe726f810f4f4de99a59d6e9ed1331c86c6283 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Thu, 6 Feb 2025 13:17:29 +0100 Subject: [PATCH 09/13] only allow not applicable + fix tests --- .../ChangeAttributeParameters.cs | 4 +-- .../ChangeAttributeParametersValidator.cs | 4 +-- .../ChangeRoadSegmentAttributesParameters.cs | 2 +- .../Extensions/RuleBuilderExtensions.cs | 7 ++-- .../DutchTranslations/ProblemTranslator.cs | 4 +++ .../ChangeAttributesTestBase.cs | 12 +++---- .../BackOffice/ProblemTranslatorTests.cs | 32 ++++++++++++++++++- 7 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParameters.cs b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParameters.cs index 4bb7922f4..1abeccc24 100644 --- a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParameters.cs +++ b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParameters.cs @@ -75,14 +75,14 @@ public record ChangeAttributeParameters public ChangeAttributeNumberedRoad[] GenummerdeWegen { get; set; } /// - /// De unieke en persistente identificator van de straatnaam aan de linkerzijde van het wegsegment of "niet gekend" of "niet van toepassing". + /// De unieke en persistente identificator van de straatnaam aan de linkerzijde van het wegsegment of "niet van toepassing". /// [DataMember(Name = "LinkerstraatnaamId", Order = 10)] [JsonProperty("linkerstraatnaamId")] public string? LinkerstraatnaamId { get; set; } /// - /// De unieke en persistente identificator van de straatnaam aan de rechterzijde van het wegsegment of "niet gekend" of "niet van toepassing". + /// De unieke en persistente identificator van de straatnaam aan de rechterzijde van het wegsegment of "niet van toepassing". /// [DataMember(Name = "RechterstraatnaamId", Order = 11)] [JsonProperty("rechterstraatnaamId")] diff --git a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParametersValidator.cs b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParametersValidator.cs index d0020fdac..fa3c1e652 100644 --- a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParametersValidator.cs +++ b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeAttributeParametersValidator.cs @@ -135,7 +135,7 @@ public ChangeAttributeParametersValidator(EditorContext editorContext, IOrganiza { RuleFor(x => x.LinkerstraatnaamId) .Cascade(CascadeMode.Stop) - .MustBeValidStreetNameId(allowSystemValues: true) + .MustBeValidStreetNameId(allowNotApplicable: true) .WithProblemCode(ProblemCode.RoadSegment.StreetName.Left.NotValid); }); @@ -143,7 +143,7 @@ public ChangeAttributeParametersValidator(EditorContext editorContext, IOrganiza { RuleFor(x => x.RechterstraatnaamId) .Cascade(CascadeMode.Stop) - .MustBeValidStreetNameId(allowSystemValues: true) + .MustBeValidStreetNameId(allowNotApplicable: true) .WithProblemCode(ProblemCode.RoadSegment.StreetName.Right.NotValid); }); } diff --git a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeRoadSegmentAttributesParameters.cs b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeRoadSegmentAttributesParameters.cs index 3c1635ba0..3e134b7d5 100644 --- a/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeRoadSegmentAttributesParameters.cs +++ b/src/RoadRegistry.BackOffice.Api/RoadSegments/ChangeAttributes/ChangeRoadSegmentAttributesParameters.cs @@ -52,7 +52,7 @@ public ChangeRoadSegmentAttributesParameters GetExamples() } ], LinkerstraatnaamId = "https://data.vlaanderen.be/id/straatnaam/1", - RechterstraatnaamId = StreetNameLocalId.NotApplicable.ToDutchString() // todo-rik valideren met Erik + RechterstraatnaamId = StreetNameLocalId.NotApplicable.ToDutchString() } }; } diff --git a/src/RoadRegistry.BackOffice.Handlers/Extensions/RuleBuilderExtensions.cs b/src/RoadRegistry.BackOffice.Handlers/Extensions/RuleBuilderExtensions.cs index e7c1c9551..da888f465 100644 --- a/src/RoadRegistry.BackOffice.Handlers/Extensions/RuleBuilderExtensions.cs +++ b/src/RoadRegistry.BackOffice.Handlers/Extensions/RuleBuilderExtensions.cs @@ -6,7 +6,8 @@ public static class RuleBuilderExtensions { private const string StreetNameIdPrefix = "https://data.vlaanderen.be/id/straatnaam/"; - public static IRuleBuilderOptions MustBeValidStreetNameId(this IRuleBuilder ruleBuilder, bool allowSystemValues = false) + public static IRuleBuilderOptions MustBeValidStreetNameId(this IRuleBuilder ruleBuilder + , bool allowNotApplicable = false) { return ruleBuilder.Must(value => { @@ -15,7 +16,9 @@ public static IRuleBuilderOptions MustBeValidStreetNameId(this IRu return true; } - if (allowSystemValues && StreetNameLocalId.TryParseUsingDutchName(value, out _)) + if (allowNotApplicable + && StreetNameLocalId.TryParseUsingDutchName(value, out var streetNameLocalId) + && streetNameLocalId == StreetNameLocalId.NotApplicable) { return true; } diff --git a/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs b/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs index 9c57d4e27..221f1189b 100644 --- a/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs +++ b/src/RoadRegistry.BackOffice/DutchTranslations/ProblemTranslator.cs @@ -241,6 +241,8 @@ public static class ProblemTranslator $"De linkerstraatnaam voor wegsegment met id {problem.GetParameterValue("SegmentId")} moet status 'voorgesteld' of 'in gebruik' hebben.") }, {ProblemCode.RoadSegment.StreetName.Left.NotFound, problem => new(problem.Severity, "LinkerstraatnaamNietGekend", $"De linkerstraatnaam voor het wegsegment met id {problem.GetParameterValue("SegmentId")} is niet gekend in het Straatnamenregister.")}, + {ProblemCode.RoadSegment.StreetName.Left.NotValid, problem => new(problem.Severity, "LinkerstraatnaamNietCorrect", + $"De linkstraatnaam '{problem.Parameters[0].Value}' is geen geldige waarde.") }, {ProblemCode.RoadSegment.StreetName.Right.NotLinked, problem => new(problem.Severity, "RechterstraatnaamNietGekoppeld", $"Het wegsegment met id {problem.Parameters[0].Value} is niet gekoppeld aan de rechterstraatnaam '{problem.Parameters[1].Value}'") }, @@ -250,6 +252,8 @@ public static class ProblemTranslator $"De rechterstraatnaam voor wegsegment met id {problem.GetParameterValue("SegmentId")} moet status 'voorgesteld' of 'in gebruik' hebben.") }, {ProblemCode.RoadSegment.StreetName.Right.NotFound, problem => new(problem.Severity, "RechterstraatnaamNietGekend", $"De rechterstraatnaam voor het wegsegment met id {problem.GetParameterValue("SegmentId")} is niet gekend in het Straatnamenregister.")}, + {ProblemCode.RoadSegment.StreetName.Right.NotValid, problem => new(problem.Severity, "LinkerstraatnaamNietCorrect", + $"De linkstraatnaam '{problem.Parameters[0].Value}' is geen geldige waarde.") }, {ProblemCode.RoadSegment.Surface.FromPositionNotEqualToZero, problem => new(problem.Severity, problem.Reason, $"De van positie ({problem.Parameters[1].Value}) van het eerste wegverharding attribuut met id {problem.Parameters[0].Value} is niet 0.0.") }, diff --git a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/ChangeAttributesTestBase.cs b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/ChangeAttributesTestBase.cs index 0e19140e7..873d95f2a 100644 --- a/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/ChangeAttributesTestBase.cs +++ b/test/RoadRegistry.BackOffice.Api.Tests/RoadSegments/WhenChangeAttributes/ChangeAttributesTestBase.cs @@ -30,18 +30,18 @@ public abstract class ChangeAttributesTestBase protected ChangeAttributesTestBase() { + TestData = new RoadNetworkTestData(x => + { + x.CustomizeRoadSegmentOutlineMorphology(); + x.CustomizeRoadSegmentOutlineStatus(); + }); + _mediator = new Mock(); _mediator .Setup(x => x.Send(It.IsAny(), It.IsAny())) .ReturnsAsync(Fixture.Create()); _editorContext = new FakeEditorContextFactory().CreateDbContext(); OrganizationCache = new FakeOrganizationCache(); - - TestData = new RoadNetworkTestData(x => - { - x.CustomizeRoadSegmentOutlineMorphology(); - x.CustomizeRoadSegmentOutlineStatus(); - }); } protected async Task ItShouldHaveExpectedError( diff --git a/test/RoadRegistry.Tests/BackOffice/ProblemTranslatorTests.cs b/test/RoadRegistry.Tests/BackOffice/ProblemTranslatorTests.cs index 3759b220d..e5b1cab73 100644 --- a/test/RoadRegistry.Tests/BackOffice/ProblemTranslatorTests.cs +++ b/test/RoadRegistry.Tests/BackOffice/ProblemTranslatorTests.cs @@ -92,6 +92,36 @@ public void EnsureAllProblemCodeHaveADutchTranslation() new ProblemParameter("Identifier", "1") ] }, + { + ProblemCode.RoadSegment.StreetName.Left.NotProposedOrCurrent, [ + new ProblemParameter("SegmentId", "1") + ] + }, + { + ProblemCode.RoadSegment.StreetName.Left.NotFound, [ + new ProblemParameter("SegmentId", "1") + ] + }, + { + ProblemCode.RoadSegment.StreetName.Left.NotValid, [ + new ProblemParameter("SegmentId", "1") + ] + }, + { + ProblemCode.RoadSegment.StreetName.Right.NotProposedOrCurrent, [ + new ProblemParameter("SegmentId", "1") + ] + }, + { + ProblemCode.RoadSegment.StreetName.Right.NotFound, [ + new ProblemParameter("SegmentId", "1") + ] + }, + { + ProblemCode.RoadSegment.StreetName.Right.NotValid, [ + new ProblemParameter("SegmentId", "1") + ] + }, }; var allValues = ProblemCode.GetValues(); @@ -134,7 +164,7 @@ private void LoadAllProblemCodes() var problemCodeType = typeof(ProblemCode); var subClassTypes = problemCodeType.Assembly .GetTypes() - .Where(x => x.IsNested && x.FullName.StartsWith($"{problemCodeType}+")) + .Where(x => x.IsNested && x.FullName!.StartsWith($"{problemCodeType}+")) .ToArray(); foreach (var subClassType in subClassTypes) From e1d12fe8a4100f2cca604b63327e7204819f91d4 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Thu, 6 Feb 2025 14:19:36 +0100 Subject: [PATCH 10/13] translation --- .../Uploads/ModifyRoadSegmentAttributes.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/RoadRegistry.BackOffice/Uploads/ModifyRoadSegmentAttributes.cs b/src/RoadRegistry.BackOffice/Uploads/ModifyRoadSegmentAttributes.cs index 47caa272c..7b4306fd5 100644 --- a/src/RoadRegistry.BackOffice/Uploads/ModifyRoadSegmentAttributes.cs +++ b/src/RoadRegistry.BackOffice/Uploads/ModifyRoadSegmentAttributes.cs @@ -45,6 +45,10 @@ public void TranslateTo(RequestedChange message) Status = Status, Category = Category, AccessRestriction = AccessRestriction, + LeftSide = LeftSideStreetNameId is not null + ? new RoadSegmentSideAttributes { StreetNameId = LeftSideStreetNameId } : null, + RightSide = RightSideStreetNameId is not null + ? new RoadSegmentSideAttributes { StreetNameId = RightSideStreetNameId } : null, Lanes = Lanes? .Select(item => new RequestedRoadSegmentLaneAttribute { From 920b1e5e7642a19c0d61b4f657641b7cf57f1600 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Thu, 6 Feb 2025 14:26:09 +0100 Subject: [PATCH 11/13] =?UTF-8?q?=C3=83cleanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessageHandlerTests.cs | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/MessageHandlerTests.cs b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/MessageHandlerTests.cs index 58fb206bf..23ae556a4 100644 --- a/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/MessageHandlerTests.cs +++ b/test/RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests/MessageHandlerTests.cs @@ -1,11 +1,9 @@ namespace RoadRegistry.BackOffice.Handlers.Sqs.Lambda.Tests; -using Abstractions; using Autofac; using AutoFixture; using BackOffice.Uploads; using Be.Vlaanderen.Basisregisters.Aws.Lambda; -using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Requests; using Be.Vlaanderen.Basisregisters.Sqs.Requests; using FluentAssertions; using MediatR; @@ -20,41 +18,6 @@ public MessageHandlerTests(ITestOutputHelper testOutputHelper) { } - // todo-rik why is this method not called? - private async Task WhenProcessing_SqsRequest_Then_SqsLambdaRequest_IsSent() - where TSqsRequest : SqsRequest, IHasBackOfficeRequest - where TSqsLambdaRequest : SqsLambdaRequest, IHasBackOfficeRequest - { - // Arrange - var mediator = new Mock(); - var containerBuilder = new ContainerBuilder(); - containerBuilder.Register(_ => mediator.Object); - var container = containerBuilder.Build(); - var blobClient = new SqsMessagesBlobClient(Client, new SqsJsonMessageSerializer(new FakeSqsOptions())); - - var messageData = ObjectProvider.Create(); - var messageMetadata = new MessageMetadata { MessageGroupId = ObjectProvider.Create() }; - - var sut = new MessageHandler(container, blobClient); - - // Act - await sut.HandleMessage( - messageData, - messageMetadata, - CancellationToken.None); - - // Assert - mediator - .Verify(x => x.Send(It.Is(request => - request.TicketId == messageData.TicketId && - request.MessageGroupId == messageMetadata.MessageGroupId && - Equals(request.Request, messageData.Request) && - request.IfMatchHeaderValue == messageData.IfMatchHeaderValue && - request.Provenance == messageData.ProvenanceData.ToProvenance() && - request.Metadata == messageData.Metadata - ), CancellationToken.None), Times.Once); - } - [Fact] public async Task WhenProcessingSqsRequestWithoutCorrespondingSqsLambdaRequest_ThenThrowsNotImplementedException() { From 0bf4011510a63b7028e5a3105cf370582455f4a9 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Thu, 6 Feb 2025 14:43:38 +0100 Subject: [PATCH 12/13] log --- .../Uploads/TranslatedChanges.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/RoadRegistry.BackOffice/Uploads/TranslatedChanges.cs b/src/RoadRegistry.BackOffice/Uploads/TranslatedChanges.cs index f5eb95f31..bce86cccd 100644 --- a/src/RoadRegistry.BackOffice/Uploads/TranslatedChanges.cs +++ b/src/RoadRegistry.BackOffice/Uploads/TranslatedChanges.cs @@ -11,6 +11,7 @@ namespace RoadRegistry.BackOffice.Uploads; using Core; using Exceptions; using Messages; +using Microsoft.Extensions.Logging; public class TranslatedChanges : IReadOnlyCollection { @@ -254,7 +255,13 @@ public TranslatedChanges WithReason(Reason value) return new TranslatedChanges(value, Operator, Organization, _changes, _provisionalChanges); } - public async Task ToChangeRoadNetworkCommand(ExtractRequestId extractRequestId, ChangeRequestId requestId, DownloadId downloadId, Guid? ticketId, CancellationToken cancellationToken) + public async Task ToChangeRoadNetworkCommand( + ILogger logger, + ExtractRequestId extractRequestId, + ChangeRequestId requestId, + DownloadId downloadId, + Guid? ticketId, + CancellationToken cancellationToken) { var requestedChanges = new List(); @@ -286,7 +293,11 @@ public async Task ToChangeRoadNetworkCommand(ExtractRequestId .Aggregate( ZipArchiveProblems.None, (current, error) => current.Add(new FileError(string.Empty, error.ErrorMessage))); - throw new ZipArchiveValidationException(zipArchiveProblems); + var exception = new ZipArchiveValidationException(zipArchiveProblems); + + logger.LogError(exception, "BUG: ChangeRoadNetwork validation failed"); + + throw exception; } return changeRoadNetwork; From 892640c28dd5574ba04af7aa67a244b7e78903ad Mon Sep 17 00:00:00 2001 From: jvandaal Date: Thu, 6 Feb 2025 14:48:00 +0100 Subject: [PATCH 13/13] fix --- .../Extracts/RoadNetworkExtractEventModule.cs | 4 +++- .../Uploads/RoadNetworkChangesArchiveEventModule.cs | 4 +++- .../BackOffice/Uploads/TranslatedChangesTests.cs | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/RoadRegistry.BackOffice.Handlers/Extracts/RoadNetworkExtractEventModule.cs b/src/RoadRegistry.BackOffice.Handlers/Extracts/RoadNetworkExtractEventModule.cs index a6b25e518..d1e095490 100644 --- a/src/RoadRegistry.BackOffice.Handlers/Extracts/RoadNetworkExtractEventModule.cs +++ b/src/RoadRegistry.BackOffice.Handlers/Extracts/RoadNetworkExtractEventModule.cs @@ -76,7 +76,9 @@ public RoadNetworkExtractEventModule( using var archive = new ZipArchive(archiveBlobStream, ZipArchiveMode.Read, false); var translatedChanges = await featureCompareTranslator.TranslateAsync(archive, ct); - var changeRoadNetwork = await translatedChanges.ToChangeRoadNetworkCommand(extractRequestId, changeRequestId, downloadId, message.Body.TicketId, ct); + var changeRoadNetwork = await translatedChanges.ToChangeRoadNetworkCommand( + logger, + extractRequestId, changeRequestId, downloadId, message.Body.TicketId, ct); var command = new Command(changeRoadNetwork) .WithMessageId(message.MessageId); diff --git a/src/RoadRegistry.BackOffice.Handlers/Uploads/RoadNetworkChangesArchiveEventModule.cs b/src/RoadRegistry.BackOffice.Handlers/Uploads/RoadNetworkChangesArchiveEventModule.cs index 6d4710d1e..eb4edaf33 100644 --- a/src/RoadRegistry.BackOffice.Handlers/Uploads/RoadNetworkChangesArchiveEventModule.cs +++ b/src/RoadRegistry.BackOffice.Handlers/Uploads/RoadNetworkChangesArchiveEventModule.cs @@ -64,7 +64,9 @@ public RoadNetworkChangesArchiveEventModule( var transactionZoneFeatures = transactionZoneFeatureReader.Read(archive, FeatureType.Change, ExtractFileName.Transactiezones, readerContext).Item1; var downloadId = transactionZoneFeatures.Single().Attributes.DownloadId; - var changeRoadNetwork = await translatedChanges.ToChangeRoadNetworkCommand(extractRequestId, requestId, downloadId, message.Body.TicketId, ct); + var changeRoadNetwork = await translatedChanges.ToChangeRoadNetworkCommand( + logger, + extractRequestId, requestId, downloadId, message.Body.TicketId, ct); var command = new Command(changeRoadNetwork) .WithMessageId(message.MessageId); diff --git a/test/RoadRegistry.Tests/BackOffice/Uploads/TranslatedChangesTests.cs b/test/RoadRegistry.Tests/BackOffice/Uploads/TranslatedChangesTests.cs index d25a0e785..1bd8f7441 100644 --- a/test/RoadRegistry.Tests/BackOffice/Uploads/TranslatedChangesTests.cs +++ b/test/RoadRegistry.Tests/BackOffice/Uploads/TranslatedChangesTests.cs @@ -2,6 +2,7 @@ using AutoFixture; using FluentAssertions; +using Microsoft.Extensions.Logging.Abstractions; using RoadRegistry.BackOffice; using RoadRegistry.BackOffice.Exceptions; using RoadRegistry.BackOffice.Uploads; @@ -16,6 +17,7 @@ public async Task WhenInvalidTranslatedChanges_ThenThrowZipArchiveValidationExce var translatedChanges = TranslatedChanges.Empty; var sut = () => translatedChanges.ToChangeRoadNetworkCommand( + NullLogger.Instance, fixture.Create(), fixture.Create(), fixture.Create(),