From c0128446ca323661314c9d58982d7822b998c234 Mon Sep 17 00:00:00 2001 From: Jan Lesage Date: Wed, 30 Oct 2024 14:18:03 +0100 Subject: [PATCH 1/2] feat: or-2515 wijzig lidmaatschap request validation --- .../VoegLidmaatschapToeRequestExamples.cs} | 2 +- .../VoegLidmaatschapToeRequest.cs | 2 +- .../VoegLidmaatschapToeRequestValidator.cs | 2 +- .../VoegLidmaatschapToeController.cs} | 24 ++--- .../WijzigLidmaatschapRequestExamples.cs | 17 ++++ .../WijzigLidmaatschapRequest.cs | 37 ++++++++ .../WijzigLidmaatschapRequestValidator.cs | 22 +++++ .../WijzigLidmaatschapController.cs | 88 ++++++++++++++++++ .../CommandHandling/Given_A_Lidmaatschap.cs | 2 +- .../To_VoegLidmaatschapToeCommandTests.cs | 4 +- .../RequestValidating/A_Invalid_Request.cs | 4 +- .../RequestValidating/A_Valid_Request.cs | 4 +- .../RequestValidating/A_Invalid_Request.cs | 85 +++++++++++++++++ .../RequestValidating/A_Valid_Request.cs | 91 +++++++++++++++++++ .../AdminApiAutoFixtureCustomizations.cs | 21 ++++- .../VoegLidmaatschapToeRequestFactory.cs | 2 +- .../VoegLidmaatschapToeContext.cs | 2 +- 17 files changed, 384 insertions(+), 25 deletions(-) rename src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/{Examples/VoegLocatieToeRequestExamples.cs => VoegLidmaatschapToe/Examples/VoegLidmaatschapToeRequestExamples.cs} (94%) rename src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/{ => VoegLidmaatschapToe}/RequestModels/VoegLidmaatschapToeRequest.cs (97%) rename src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/{ => VoegLidmaatschapToe}/RequestModels/VoegLidmaatschapToeRequestValidator.cs (95%) rename src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/{VoegLocatieToeController.cs => VoegLidmaatschapToe/VoegLidmaatschapToeController.cs} (82%) create mode 100644 src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/Examples/WijzigLidmaatschapRequestExamples.cs create mode 100644 src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/RequestModels/WijzigLidmaatschapRequest.cs create mode 100644 src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/RequestModels/WijzigLidmaatschapRequestValidator.cs create mode 100644 src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/WijzigLidmaatschapController.cs rename test/AssociationRegistry.Test.Admin.Api/Commands/{FeitelijkeVereniging => VerenigingOfAnyKind}/When_Adding_Lidmaatschap/CommandHandling/Given_A_Lidmaatschap.cs (92%) rename test/AssociationRegistry.Test.Admin.Api/Commands/{FeitelijkeVereniging => VerenigingOfAnyKind}/When_Adding_Lidmaatschap/RequestMapping/To_VoegLidmaatschapToeCommandTests.cs (82%) rename test/AssociationRegistry.Test.Admin.Api/Commands/{FeitelijkeVereniging => VerenigingOfAnyKind}/When_Adding_Lidmaatschap/RequestValidating/A_Invalid_Request.cs (93%) rename test/AssociationRegistry.Test.Admin.Api/Commands/{FeitelijkeVereniging => VerenigingOfAnyKind}/When_Adding_Lidmaatschap/RequestValidating/A_Valid_Request.cs (92%) create mode 100644 test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Wijzig_Lidmaatschap/RequestValidating/A_Invalid_Request.cs create mode 100644 test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Wijzig_Lidmaatschap/RequestValidating/A_Valid_Request.cs diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/Examples/VoegLocatieToeRequestExamples.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/Examples/VoegLidmaatschapToeRequestExamples.cs similarity index 94% rename from src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/Examples/VoegLocatieToeRequestExamples.cs rename to src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/Examples/VoegLidmaatschapToeRequestExamples.cs index a8147ecaf..412fb2d8b 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/Examples/VoegLocatieToeRequestExamples.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/Examples/VoegLidmaatschapToeRequestExamples.cs @@ -1,4 +1,4 @@ -namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.Examples; +namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe.Examples; using RequestModels; using Swashbuckle.AspNetCore.Filters; diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/RequestModels/VoegLidmaatschapToeRequest.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/RequestModels/VoegLidmaatschapToeRequest.cs similarity index 97% rename from src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/RequestModels/VoegLidmaatschapToeRequest.cs rename to src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/RequestModels/VoegLidmaatschapToeRequest.cs index 4605ed16f..2c5f7fb19 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/RequestModels/VoegLidmaatschapToeRequest.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/RequestModels/VoegLidmaatschapToeRequest.cs @@ -1,4 +1,4 @@ -namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.RequestModels; +namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe.RequestModels; using Acties.VoegLidmaatschapToe; using System.Runtime.Serialization; diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/RequestModels/VoegLidmaatschapToeRequestValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/RequestModels/VoegLidmaatschapToeRequestValidator.cs similarity index 95% rename from src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/RequestModels/VoegLidmaatschapToeRequestValidator.cs rename to src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/RequestModels/VoegLidmaatschapToeRequestValidator.cs index 2ed81bcfa..98af64243 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/RequestModels/VoegLidmaatschapToeRequestValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/RequestModels/VoegLidmaatschapToeRequestValidator.cs @@ -1,4 +1,4 @@ -namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.RequestModels; +namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe.RequestModels; using FluentValidation; using Infrastructure.Validation; diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLocatieToeController.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/VoegLidmaatschapToeController.cs similarity index 82% rename from src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLocatieToeController.cs rename to src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/VoegLidmaatschapToeController.cs index d3d12b69f..dbbc4052d 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLocatieToeController.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/VoegLidmaatschapToe/VoegLidmaatschapToeController.cs @@ -1,4 +1,4 @@ -namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap; +namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe; using Acties.VoegLidmaatschapToe; using Asp.Versioning; @@ -37,22 +37,23 @@ public VoegLidmaatschapToeController(IMessageBus messageBus, AppSettings appSett } /// - /// Voeg een Lidmaatschap toe. + /// Voeg een lidmaatschap toe. /// /// - /// Na het uitvoeren van deze actie wordt een sequentie teruggegeven via de `VR-Sequence` header. - /// Deze waarde kan gebruikt worden in andere endpoints om op te volgen of de aanpassing - /// al is doorgestroomd naar deze endpoints. + /// Na het uitvoeren van deze actie wordt een sequentie teruggegeven via de `VR-Sequence` header. + /// Deze waarde kan gebruikt worden in andere endpoints om op te volgen of de aanpassing + /// al is doorgestroomd naar deze endpoints. /// - /// De VCode van de vereniging - /// De toe te voegen Lidmaatschap + /// De VCode van de vereniging. + /// Het toe te voegen lidmaatschap. + /// De validator voor het toevoegen van een lidmaatschap. /// /// If-Match header met ETag van de laatst gekende versie van de vereniging. /// Het lidmaatschap werd toegevoegd. /// Er was een probleem met de doorgestuurde waarden. /// De gevraagde vereniging heeft niet de verwachte sequentiewaarde. /// Er is een interne fout opgetreden. - [HttpPost("{vCode}/Lidmaatschappen")] + [HttpPost("{vCode}/lidmaatschappen")] [ConsumesJson] [ProducesJson] [SwaggerRequestExample(typeof(VoegLidmaatschapToeRequest), typeof(VoegLidmaatschapToeRequestExamples))] @@ -64,7 +65,7 @@ public VoegLidmaatschapToeController(IMessageBus messageBus, AppSettings appSett [SwaggerResponseHeader(StatusCodes.Status202Accepted, name: "ETag", type: "string", description: "De versie van de geregistreerde vereniging.")] [SwaggerResponseHeader(StatusCodes.Status202Accepted, name: "Location", type: "string", - description: "De Lidmaatschap van de toegevoegde Lidmaatschap.")] + description: "De locatie van het toegevoegde lidmaatschap.")] [ProducesResponseType(StatusCodes.Status202Accepted)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status412PreconditionFailed)] @@ -73,12 +74,11 @@ public VoegLidmaatschapToeController(IMessageBus messageBus, AppSettings appSett public async Task Post( [FromRoute] string vCode, [FromBody] VoegLidmaatschapToeRequest request, - //[FromServices] IValidator validator, + [FromServices] IValidator validator, [FromServices] ICommandMetadataProvider metadataProvider, [FromHeader(Name = "If-Match")] string? ifMatch = null) { - // TODO: validate - //await validator.NullValidateAndThrowAsync(request); + await validator.NullValidateAndThrowAsync(request); var metaData = metadataProvider.GetMetadata(IfMatchParser.ParseIfMatch(ifMatch)); var envelope = new CommandEnvelope(request.ToCommand(vCode), metaData); diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/Examples/WijzigLidmaatschapRequestExamples.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/Examples/WijzigLidmaatschapRequestExamples.cs new file mode 100644 index 000000000..2d1291817 --- /dev/null +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/Examples/WijzigLidmaatschapRequestExamples.cs @@ -0,0 +1,17 @@ +namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.WijzigLidmaatschap.Examples; + +using RequestModels; +using Swashbuckle.AspNetCore.Filters; + +public class WijzigLidmaatschapRequestExamples : IExamplesProvider +{ + public WijzigLidmaatschapRequest GetExamples() + => new() + { + LidmaatschapId = 1, + Beschrijving = "De beschrijving van het lidmaatschap.", + Van = new DateOnly(2024, 10, 12), + Tot = new DateOnly(2024, 10, 10), + Identificatie = "0012", + }; +} diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/RequestModels/WijzigLidmaatschapRequest.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/RequestModels/WijzigLidmaatschapRequest.cs new file mode 100644 index 000000000..fe4a430ca --- /dev/null +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/RequestModels/WijzigLidmaatschapRequest.cs @@ -0,0 +1,37 @@ +namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.WijzigLidmaatschap.RequestModels; + +using System.Runtime.Serialization; + +[DataContract] +public class WijzigLidmaatschapRequest +{ + /// + /// De unieke identificator van het lidmaatschap + /// + [DataMember] + public int LidmaatschapId { get; set; } + + /// + /// De datum waarop de relatie actief wordt + /// + [DataMember] + public DateOnly? Van { get; set; } + + /// + /// De datum waarop de relatie niet meer actief wordt + /// + [DataMember] + public DateOnly? Tot { get; set; } + + /// + /// De externe identificatie voor het lidmaatschap + /// + [DataMember] + public string Identificatie { get; set; } + + /// + /// De externe beschrijving van het lidmaatschap + /// + [DataMember] + public string Beschrijving { get; set; } +} diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/RequestModels/WijzigLidmaatschapRequestValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/RequestModels/WijzigLidmaatschapRequestValidator.cs new file mode 100644 index 000000000..69e4df447 --- /dev/null +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/RequestModels/WijzigLidmaatschapRequestValidator.cs @@ -0,0 +1,22 @@ +namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.WijzigLidmaatschap.RequestModels; + +using FluentValidation; +using Infrastructure.Validation; + +public class WijzigLidmaatschapRequestValidator : AbstractValidator +{ + public WijzigLidmaatschapRequestValidator() + { + RuleFor(r => r.LidmaatschapId) + .GreaterThan(0) + .WithMessage(ValidationMessages.VeldIsVerplicht); + + RuleFor(r => r.Tot) + .GreaterThanOrEqualTo(x => x.Van) + .When(x => x.Van.HasValue) + .WithMessage(ValidationMessages.DatumTotMoetLaterZijnDanDatumVan); + + RuleFor(r => r.Identificatie).MustNotContainHtml(); + RuleFor(r => r.Beschrijving).MustNotContainHtml(); + } +} diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/WijzigLidmaatschapController.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/WijzigLidmaatschapController.cs new file mode 100644 index 000000000..5f9bee842 --- /dev/null +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/WijzigLidmaatschapController.cs @@ -0,0 +1,88 @@ +namespace AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.WijzigLidmaatschap; + +using Asp.Versioning; +using Be.Vlaanderen.Basisregisters.Api; +using Be.Vlaanderen.Basisregisters.Api.Exceptions; +using Examples; +using FluentValidation; +using Hosts.Configuration.ConfigurationBindings; +using Infrastructure; +using Infrastructure.Extensions; +using Infrastructure.Middleware; +using Infrastructure.Swagger.Annotations; +using Infrastructure.Swagger.Examples; +using Microsoft.AspNetCore.Mvc; +using RequestModels; +using Swashbuckle.AspNetCore.Filters; +using Wolverine; +using ProblemDetails = Be.Vlaanderen.Basisregisters.BasicApiProblem.ProblemDetails; +using ValidationProblemDetails = Be.Vlaanderen.Basisregisters.BasicApiProblem.ValidationProblemDetails; + +[ApiVersion("1.0")] +[AdvertiseApiVersions("1.0")] +[ApiRoute("verenigingen")] +[SwaggerGroup.DecentraalBeheer] +public class WijzigLidmaatschapController : ApiController +{ + private readonly IMessageBus _messageBus; + private readonly AppSettings _appSettings; + + public WijzigLidmaatschapController(IMessageBus messageBus, AppSettings appSettings) + { + _messageBus = messageBus; + _appSettings = appSettings; + } + + /// + /// Wijzig een lidmaatschap. + /// + /// + /// Na het uitvoeren van deze actie wordt een sequentie teruggegeven via de `VR-Sequence` header. + /// Deze waarde kan gebruikt worden in andere endpoints om op te volgen of de aanpassing + /// al is doorgestroomd naar deze endpoints. + /// + /// De VCode van de vereniging. + /// Het te wijzigen lidmaatschap. + /// De validator voor het wijzigen van het lidmaatschap. + /// + /// If-Match header met ETag van de laatst gekende versie van de vereniging. + /// Het lidmaatschap werd gewijzigd. + /// Er was een probleem met de doorgestuurde waarden. + /// De gevraagde vereniging heeft niet de verwachte sequentiewaarde. + /// Er is een interne fout opgetreden. + [HttpPatch("{vCode}/lidmaatschappen")] + [ConsumesJson] + [ProducesJson] + [SwaggerRequestExample(typeof(WijzigLidmaatschapRequest), typeof(WijzigLidmaatschapRequestExamples))] + [SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(InternalServerErrorResponseExamples))] + [SwaggerResponseExample(StatusCodes.Status400BadRequest, typeof(ProblemAndValidationProblemDetailsExamples))] + [SwaggerResponseExample(StatusCodes.Status412PreconditionFailed, typeof(PreconditionFailedProblemDetailsExamples))] + [SwaggerResponseHeader(StatusCodes.Status202Accepted, WellknownHeaderNames.Sequence, type: "string", + description: "Het sequence nummer van deze request.")] + [SwaggerResponseHeader(StatusCodes.Status202Accepted, name: "ETag", type: "string", + description: "De versie van de geregistreerde vereniging.")] + [SwaggerResponseHeader(StatusCodes.Status202Accepted, name: "Location", type: "string", + description: "De locatie van het gewijzigde lidmaatschap.")] + [ProducesResponseType(StatusCodes.Status202Accepted)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status412PreconditionFailed)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] + [ProducesResponseType(StatusCodes.Status202Accepted)] + public async Task Post( + [FromRoute] string vCode, + [FromBody] WijzigLidmaatschapRequest request, + [FromServices] IValidator validator, + [FromServices] ICommandMetadataProvider metadataProvider, + [FromHeader(Name = "If-Match")] string? ifMatch = null) + { + await validator.NullValidateAndThrowAsync(request); + + var metaData = metadataProvider.GetMetadata(IfMatchParser.ParseIfMatch(ifMatch)); + // var envelope = new CommandEnvelope(request.ToCommand(vCode), metaData); + // var commandResult = await _messageBus.InvokeAsync(envelope); + + // return this.AcceptedEntityCommand(_appSettings, WellKnownHeaderEntityNames.Lidmaatschappen, commandResult); + + return new EmptyResult(); + } +} diff --git a/test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/CommandHandling/Given_A_Lidmaatschap.cs b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/CommandHandling/Given_A_Lidmaatschap.cs similarity index 92% rename from test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/CommandHandling/Given_A_Lidmaatschap.cs rename to test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/CommandHandling/Given_A_Lidmaatschap.cs index c48ed0ff9..a8e7737ef 100644 --- a/test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/CommandHandling/Given_A_Lidmaatschap.cs +++ b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/CommandHandling/Given_A_Lidmaatschap.cs @@ -1,4 +1,4 @@ -namespace AssociationRegistry.Test.Admin.Api.Commands.FeitelijkeVereniging.When_Adding_Lidmaatschap.CommandHandling; +namespace AssociationRegistry.Test.Admin.Api.Commands.VerenigingOfAnyKind.When_Adding_Lidmaatschap.CommandHandling; using Acties.VoegLidmaatschapToe; using AssociationRegistry.Framework; diff --git a/test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/RequestMapping/To_VoegLidmaatschapToeCommandTests.cs b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/RequestMapping/To_VoegLidmaatschapToeCommandTests.cs similarity index 82% rename from test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/RequestMapping/To_VoegLidmaatschapToeCommandTests.cs rename to test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/RequestMapping/To_VoegLidmaatschapToeCommandTests.cs index e0281d55e..2a049bc11 100644 --- a/test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/RequestMapping/To_VoegLidmaatschapToeCommandTests.cs +++ b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/RequestMapping/To_VoegLidmaatschapToeCommandTests.cs @@ -1,6 +1,6 @@ -namespace AssociationRegistry.Test.Admin.Api.Commands.FeitelijkeVereniging.When_Adding_Lidmaatschap.RequestMapping; +namespace AssociationRegistry.Test.Admin.Api.Commands.VerenigingOfAnyKind.When_Adding_Lidmaatschap.RequestMapping; -using AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.RequestModels; +using AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe.RequestModels; using AutoFixture; using Common.AutoFixture; using FluentAssertions; diff --git a/test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/RequestValidating/A_Invalid_Request.cs b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/RequestValidating/A_Invalid_Request.cs similarity index 93% rename from test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/RequestValidating/A_Invalid_Request.cs rename to test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/RequestValidating/A_Invalid_Request.cs index 975c74894..2cc4caa73 100644 --- a/test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/RequestValidating/A_Invalid_Request.cs +++ b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/RequestValidating/A_Invalid_Request.cs @@ -1,7 +1,7 @@ -namespace AssociationRegistry.Test.Admin.Api.Commands.FeitelijkeVereniging.When_Adding_Lidmaatschap.RequestValidating; +namespace AssociationRegistry.Test.Admin.Api.Commands.VerenigingOfAnyKind.When_Adding_Lidmaatschap.RequestValidating; using AssociationRegistry.Admin.Api; -using AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.RequestModels; +using AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe.RequestModels; using AutoFixture; using Common.AutoFixture; using FluentValidation.TestHelper; diff --git a/test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/RequestValidating/A_Valid_Request.cs b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/RequestValidating/A_Valid_Request.cs similarity index 92% rename from test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/RequestValidating/A_Valid_Request.cs rename to test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/RequestValidating/A_Valid_Request.cs index 808c8ef72..906998eff 100644 --- a/test/AssociationRegistry.Test.Admin.Api/Commands/FeitelijkeVereniging/When_Adding_Lidmaatschap/RequestValidating/A_Valid_Request.cs +++ b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Adding_Lidmaatschap/RequestValidating/A_Valid_Request.cs @@ -1,6 +1,6 @@ -namespace AssociationRegistry.Test.Admin.Api.Commands.FeitelijkeVereniging.When_Adding_Lidmaatschap.RequestValidating; +namespace AssociationRegistry.Test.Admin.Api.Commands.VerenigingOfAnyKind.When_Adding_Lidmaatschap.RequestValidating; -using AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.RequestModels; +using AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe.RequestModels; using AutoFixture; using Common.AutoFixture; using FluentValidation.TestHelper; diff --git a/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Wijzig_Lidmaatschap/RequestValidating/A_Invalid_Request.cs b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Wijzig_Lidmaatschap/RequestValidating/A_Invalid_Request.cs new file mode 100644 index 000000000..5e9bb3ea5 --- /dev/null +++ b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Wijzig_Lidmaatschap/RequestValidating/A_Invalid_Request.cs @@ -0,0 +1,85 @@ +namespace AssociationRegistry.Test.Admin.Api.Commands.VerenigingOfAnyKind.When_Wijzig_Lidmaatschap.RequestValidating; + +using AssociationRegistry.Admin.Api; +using AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe.RequestModels; +using AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.WijzigLidmaatschap.RequestModels; +using AssociationRegistry.Resources; +using AssociationRegistry.Test.Common.AutoFixture; +using AutoFixture; +using FluentValidation.TestHelper; +using Microsoft.AspNetCore.Http; +using Xunit; +using Xunit.Categories; +using ValidatorTest = Framework.ValidatorTest; + +[UnitTest] +public class A_Invalid_Request : ValidatorTest +{ + private readonly Fixture _fixture; + private readonly WijzigLidmaatschapRequestValidator _validator; + + public A_Invalid_Request() + { + _fixture = new Fixture().CustomizeAdminApi(); + _validator = new WijzigLidmaatschapRequestValidator(); + } + + [Fact] + public void Has_validation_errors_for_lidmaatschapId_when_zero() + { + var request = _fixture.Create(); + request.LidmaatschapId = 0; + + var result = _validator.TestValidate(request); + + result.ShouldHaveValidationErrorFor(x => x.LidmaatschapId) + .WithErrorMessage(ValidationMessages.VeldIsVerplicht); + } + + [Fact] + public void Has_validation_errors_when_tot_after_van() + { + var request = _fixture.Create(); + request.Van = DateOnly.FromDateTime(DateTime.Now); + request.Tot = DateOnly.FromDateTime(DateTime.Now.AddDays(-1)); + + var result = _validator.TestValidate(request); + result.ShouldHaveValidationErrorFor(x => x.Tot) + .WithErrorMessage(ValidationMessages.DatumTotMoetLaterZijnDanDatumVan); + } + + [Fact] + public void Has_no_validation_errors_when_tot_not_after_van() + { + var request = _fixture.Create(); + request.Van = DateOnly.FromDateTime(DateTime.Now); + request.Tot = DateOnly.FromDateTime(DateTime.Now.AddDays(1)); + + var result = _validator.TestValidate(request); + result.ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Has_validation_errors_when_html_detected_in_identificatie() + { + var request = _fixture.Create(); + request.Identificatie = "

Something something

"; + + var result = _validator.TestValidate(request); + result.ShouldHaveValidationErrorFor(r => r.Identificatie) + .WithErrorCode(StatusCodes.Status400BadRequest.ToString()) + .WithErrorMessage(ExceptionMessages.UnsupportedContent); + } + + [Fact] + public void Has_validation_errors_when_html_detected_in_beschrijving() + { + var request = _fixture.Create(); + request.Beschrijving = "

Something something

"; + + var result = _validator.TestValidate(request); + result.ShouldHaveValidationErrorFor(r => r.Beschrijving) + .WithErrorCode(StatusCodes.Status400BadRequest.ToString()) + .WithErrorMessage(ExceptionMessages.UnsupportedContent); + } +} diff --git a/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Wijzig_Lidmaatschap/RequestValidating/A_Valid_Request.cs b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Wijzig_Lidmaatschap/RequestValidating/A_Valid_Request.cs new file mode 100644 index 000000000..5b9f637e6 --- /dev/null +++ b/test/AssociationRegistry.Test.Admin.Api/Commands/VerenigingOfAnyKind/When_Wijzig_Lidmaatschap/RequestValidating/A_Valid_Request.cs @@ -0,0 +1,91 @@ +namespace AssociationRegistry.Test.Admin.Api.Commands.VerenigingOfAnyKind.When_Wijzig_Lidmaatschap.RequestValidating; + +using AssociationRegistry.Admin.Api.Verenigingen.Lidmaatschap.WijzigLidmaatschap.RequestModels; +using AutoFixture; +using Common.AutoFixture; +using FluentValidation.TestHelper; +using Xunit; +using Xunit.Categories; +using ValidatorTest = Framework.ValidatorTest; + +[UnitTest] +public class A_Valid_Request : ValidatorTest +{ + private readonly Fixture _fixture; + private readonly WijzigLidmaatschapRequestValidator _validator; + + public A_Valid_Request() + { + _fixture = new Fixture().CustomizeAdminApi(); + _validator = new WijzigLidmaatschapRequestValidator(); + } + + [Fact] + public void Has_no_validation_errors() + { + var request = _fixture.Create(); + var result = _validator.TestValidate(request); + + result.ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Has_no_validation_errors_when_van_null() + { + var request = _fixture.Create(); + request.Van = null; + + var result = _validator.TestValidate(request); + result.ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Has_no_validation_errors_when_tot_null() + { + var request = _fixture.Create(); + request.Tot = null; + + var result = _validator.TestValidate(request); + result.ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Has_no_validation_errors_when_identificatie_null() + { + var request = _fixture.Create(); + request.Identificatie = null; + + var result = _validator.TestValidate(request); + result.ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Has_no_validation_errors_when_identificatie_empty() + { + var request = _fixture.Create(); + request.Identificatie = ""; + + var result = _validator.TestValidate(request); + result.ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Has_no_validation_errors_when_beschrijving_null() + { + var request = _fixture.Create(); + request.Beschrijving = null; + + var result = _validator.TestValidate(request); + result.ShouldNotHaveAnyValidationErrors(); + } + + [Fact] + public void Has_no_validation_errors_when_beschrijving_empty() + { + var request = _fixture.Create(); + request.Beschrijving = ""; + + var result = _validator.TestValidate(request); + result.ShouldNotHaveAnyValidationErrors(); + } +} diff --git a/test/AssociationRegistry.Test.Common/AutoFixture/AdminApiAutoFixtureCustomizations.cs b/test/AssociationRegistry.Test.Common/AutoFixture/AdminApiAutoFixtureCustomizations.cs index b8ffdf398..8c842cc06 100644 --- a/test/AssociationRegistry.Test.Common/AutoFixture/AdminApiAutoFixtureCustomizations.cs +++ b/test/AssociationRegistry.Test.Common/AutoFixture/AdminApiAutoFixtureCustomizations.cs @@ -3,7 +3,8 @@ namespace AssociationRegistry.Test.Common.AutoFixture; using Admin.Api.Verenigingen.Common; using Admin.Api.Verenigingen.Contactgegevens.FeitelijkeVereniging.VoegContactGegevenToe.RequestsModels; using Admin.Api.Verenigingen.Detail.ResponseModels; -using Admin.Api.Verenigingen.Lidmaatschap.RequestModels; +using Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe.RequestModels; +using Admin.Api.Verenigingen.Lidmaatschap.WijzigLidmaatschap.RequestModels; using Admin.Api.Verenigingen.Locaties.FeitelijkeVereniging.WijzigLocatie.RequestModels; using Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging.RequetsModels; using Admin.Api.Verenigingen.Registreer.MetRechtspersoonlijkheid.RequestModels; @@ -42,6 +43,7 @@ public static Fixture CustomizeAdminApi(this Fixture fixture) fixture.CustomizeWijzigLocatieRequest(); fixture.CustomizeVoegLidmaatschapToeRequest(); + fixture.CustomizeWijzigLidmaatschapRequest(); fixture.CustomizeTestEvent(typeof(TestEvent<>)); @@ -258,4 +260,21 @@ private static void CustomizeVoegLidmaatschapToeRequest(this IFixture fixture) Beschrijving = fixture.Create(), }).OmitAutoProperties()); } + + private static void CustomizeWijzigLidmaatschapRequest(this IFixture fixture) + { + var date = fixture.Create(); + + fixture.Customize( + composer => composer.FromFactory( + () => new WijzigLidmaatschapRequest + { + LidmaatschapId = fixture.Create(), + Van = date, + Tot = date.AddDays(new Random().Next(1, 99)), + Identificatie = fixture.Create(), + Beschrijving = fixture.Create(), + }).OmitAutoProperties()); + } + } diff --git a/test/AssociationRegistry.Test.E2E/Scenarios/Requests/FeitelijkeVereniging/VoegLidmaatschapToeRequestFactory.cs b/test/AssociationRegistry.Test.E2E/Scenarios/Requests/FeitelijkeVereniging/VoegLidmaatschapToeRequestFactory.cs index c6b57cb23..d6d9a4557 100644 --- a/test/AssociationRegistry.Test.E2E/Scenarios/Requests/FeitelijkeVereniging/VoegLidmaatschapToeRequestFactory.cs +++ b/test/AssociationRegistry.Test.E2E/Scenarios/Requests/FeitelijkeVereniging/VoegLidmaatschapToeRequestFactory.cs @@ -1,6 +1,6 @@ namespace AssociationRegistry.Test.E2E.Scenarios.Requests.FeitelijkeVereniging; -using Admin.Api.Verenigingen.Lidmaatschap.RequestModels; +using Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe.RequestModels; using Alba; using AutoFixture; using Common.AutoFixture; diff --git a/test/AssociationRegistry.Test.E2E/When_Voeg_Lidmaatschap_Toe/VoegLidmaatschapToeContext.cs b/test/AssociationRegistry.Test.E2E/When_Voeg_Lidmaatschap_Toe/VoegLidmaatschapToeContext.cs index 1e0d1c034..f4ea711f9 100644 --- a/test/AssociationRegistry.Test.E2E/When_Voeg_Lidmaatschap_Toe/VoegLidmaatschapToeContext.cs +++ b/test/AssociationRegistry.Test.E2E/When_Voeg_Lidmaatschap_Toe/VoegLidmaatschapToeContext.cs @@ -1,6 +1,6 @@ namespace AssociationRegistry.Test.E2E.When_Voeg_Lidmaatschap_Toe; -using Admin.Api.Verenigingen.Lidmaatschap.RequestModels; +using Admin.Api.Verenigingen.Lidmaatschap.VoegLidmaatschapToe.RequestModels; using Framework.ApiSetup; using Framework.TestClasses; using Marten.Events; From 43a080e940e062870804142d87f94cf4e547d858 Mon Sep 17 00:00:00 2001 From: Jan Lesage Date: Wed, 30 Oct 2024 14:21:23 +0100 Subject: [PATCH 2/2] fix: or-2515 temporary hide endpoint for wijzig lidmaatschap --- .../WijzigLidmaatschap/WijzigLidmaatschapController.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/WijzigLidmaatschapController.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/WijzigLidmaatschapController.cs index 5f9bee842..ebb7242d1 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/WijzigLidmaatschapController.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Lidmaatschap/WijzigLidmaatschap/WijzigLidmaatschapController.cs @@ -22,6 +22,9 @@ [AdvertiseApiVersions("1.0")] [ApiRoute("verenigingen")] [SwaggerGroup.DecentraalBeheer] + +// TODO Remove visibility marker before actual deployment +[ApiExplorerSettings(IgnoreApi = true)] public class WijzigLidmaatschapController : ApiController { private readonly IMessageBus _messageBus;