From a2a8e531d90cac21e92b11f9bf1f9a69dec49013 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Wed, 11 Sep 2024 09:31:36 +0200 Subject: [PATCH] OZG-6636 add validation for missing postfachAddress in serviceKonto --- .../vorgang/servicekonto/ServiceKonto.java | 6 +++++ .../de/ozgcloud/vorgang/vorgang/Eingang.java | 3 +++ .../vorgang/vorgang/EingangHeader.java | 3 +++ .../vorgang/vorgang/VorgangService.java | 6 ++++- .../vorgang/VorgangGrpcServiceITCase.java | 24 +++---------------- .../vorgang/vorgang/VorgangServiceITCase.java | 18 ++++++++++++++ 6 files changed, 38 insertions(+), 22 deletions(-) diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java index c65e33018..1b932d19d 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java @@ -3,13 +3,17 @@ package de.ozgcloud.vorgang.servicekonto; import java.util.List; import java.util.Set; +import jakarta.validation.constraints.NotEmpty; + import org.apache.commons.lang3.StringUtils; +import org.springframework.validation.annotation.Validated; import lombok.Builder; import lombok.Getter; import lombok.Singular; import lombok.extern.log4j.Log4j2; +@Validated @Getter @Builder @Log4j2 @@ -21,6 +25,8 @@ public class ServiceKonto { private String type; private String trustLevel; + + @NotEmpty @Singular private List<PostfachAddress> postfachAddresses; diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java index d8c1ab65d..5b3c144fb 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java @@ -26,11 +26,14 @@ package de.ozgcloud.vorgang.vorgang; import java.util.List; import java.util.Map; +import org.springframework.validation.annotation.Validated; + import lombok.Builder; import lombok.Getter; import lombok.Singular; import lombok.ToString; +@Validated @ToString(onlyExplicitlyIncluded = true) @Getter @Builder(toBuilder = true) diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java index d092cc381..e85204977 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java @@ -25,11 +25,14 @@ package de.ozgcloud.vorgang.vorgang; import java.time.ZonedDateTime; +import org.springframework.validation.annotation.Validated; + import de.ozgcloud.vorgang.servicekonto.ServiceKonto; import lombok.Builder; import lombok.Getter; import lombok.ToString; +@Validated @ToString @Getter @Builder diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java index 3b69aa9e5..51e2ba9ba 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java @@ -30,6 +30,8 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.stream.Stream; +import jakarta.validation.Valid; + import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -37,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.access.AccessDeniedException; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; import de.ozgcloud.command.Command; import de.ozgcloud.command.VorgangCreatedEvent; @@ -47,6 +50,7 @@ import de.ozgcloud.vorgang.common.errorhandling.NotFoundException; import de.ozgcloud.vorgang.servicekonto.ServiceKonto; import lombok.NonNull; +@Validated @Service public class VorgangService { @@ -72,7 +76,7 @@ public class VorgangService { @Autowired private VorgangStubMapper stubMapper; - public Vorgang startCreation(Eingang eingang) { + public Vorgang startCreation(@Valid Eingang eingang) { var mappedEingang = kopControlDataMapper.moveLabelsToControlData(eingang); return repository.save(buildVorgang(mappedEingang, true)); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java index bf5cbf6aa..c29844752 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java @@ -27,14 +27,11 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -import java.time.LocalDate; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Optional; -import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -42,29 +39,14 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.annotation.DirtiesContext; -import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.vorgang.callcontext.CallContextUserTestFactory; -import de.ozgcloud.vorgang.callcontext.CurrentUserService; -import de.ozgcloud.vorgang.clientattribute.ClientAttribute; -import de.ozgcloud.vorgang.clientattribute.ClientAttributeTestFactory; -import de.ozgcloud.vorgang.clientattribute.ClientAttributesMap; -import de.ozgcloud.vorgang.clientattribute.ClientAttributesMapTestFactory; -import de.ozgcloud.vorgang.common.GrpcQueryOperator; -import de.ozgcloud.vorgang.common.db.CriteriaUtil; import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory; import de.ozgcloud.vorgang.common.grpc.GrpcFormFieldTestFactory; import de.ozgcloud.vorgang.common.grpc.GrpcSubFormTestFactory; -import de.ozgcloud.vorgang.common.operator.OperatorBuilder; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; import io.grpc.stub.StreamObserver; -import net.devh.boot.grpc.client.inject.GrpcClient; @ITCase class VorgangGrpcServiceITCase { @@ -117,7 +99,7 @@ class VorgangGrpcServiceITCase { void shouldKeepFieldsOrder() { var grpcFormData = GrpcFormData.newBuilder().addAllField(formFields).build(); - Map<String, Object> formData = startCreation(grpcFormData); + var formData = startCreation(grpcFormData); assertThat(removeControlData(formData)).containsExactly( entry(NAME_FIELD_1, FIELD_1), @@ -131,7 +113,7 @@ class VorgangGrpcServiceITCase { .addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_2)) .addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_3)).build(); - Map<String, Object> formData = startCreation(grpcFormData); + var formData = startCreation(grpcFormData); verifySubFormOrder(formData, TITLE_SUBFORM_1, TITLE_SUBFORM_2, TITLE_SUBFORM_3); } @@ -140,7 +122,7 @@ class VorgangGrpcServiceITCase { @Test void shouldKeepFieldsOrderInSubForm() { var grpcFormData = GrpcFormDataTestFactory.createBuilder().addForm( - GrpcSubFormTestFactory.createBuilder().clearField().clearSubForm().setTitle(TITLE_SUBFORM_1).addAllField(formFields)) + GrpcSubFormTestFactory.createBuilder().clearField().clearSubForm().setTitle(TITLE_SUBFORM_1).addAllField(formFields)) .build(); var formData = (Map<String, Object>) startCreation(grpcFormData).get(TITLE_SUBFORM_1); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java index 443303a1c..5835a656a 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java @@ -29,6 +29,8 @@ import static org.mockito.Mockito.*; import java.util.List; +import jakarta.validation.ConstraintViolationException; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -40,6 +42,7 @@ import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.notification.antragsteller.AntragstellerNotificationEventListener; import de.ozgcloud.notification.user.UserNotificationEventListener; import de.ozgcloud.vorgang.command.CommandService; +import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory; @DataITCase @WithMockUser @@ -80,5 +83,20 @@ class VorgangServiceITCase { verify(antragstellerNotificationEventListener, timeout(60000)).onVorgangCreated(any()); verify(userNotificationEventListener, timeout(60000)).onVorgangCreated(any()); } + + @DisplayName("validation") + @Nested + class TestValidation { + + @DisplayName("should be invalid on missing postfachAddress in serviceKonto") + @Test + void shouldBeInvalidOnMissingPostfachAddress() { + var eingang = EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder() + .serviceKonto(ServiceKontoTestFactory.createBuilder().clearPostfachAddresses().build()).build()) + .build(); + + assertThatThrownBy(() -> vorgangService.startCreation(eingang)).isInstanceOf(ConstraintViolationException.class); + } + } } } \ No newline at end of file -- GitLab