diff --git a/alfa-server/src/main/resources/application-dev.yml b/alfa-server/src/main/resources/application-dev.yml index 942555d4746e7ec791959ee5b1e41b6995d8f3a6..70ae53c6c499ef254dd591b6ef9a668022e741e9 100644 --- a/alfa-server/src/main/resources/application-dev.yml +++ b/alfa-server/src/main/resources/application-dev.yml @@ -9,7 +9,6 @@ server: ozgcloud: feature: - vorgang-export: true reply-always-allowed: true bescheid-wizard: true production: false diff --git a/alfa-server/src/main/resources/application-e2e.yml b/alfa-server/src/main/resources/application-e2e.yml index f5e0b466e36f33f9b60e43fde82de864247fe092..d91ee9e7f3874a0799b8c92bcdb28dab13dcb9ad 100644 --- a/alfa-server/src/main/resources/application-e2e.yml +++ b/alfa-server/src/main/resources/application-e2e.yml @@ -8,7 +8,6 @@ keycloak: ozgcloud: feature: - vorgang-export: true createBescheid: true reply-always-allowed: true bescheid-wizard: true diff --git a/alfa-server/src/main/resources/application-local.yml b/alfa-server/src/main/resources/application-local.yml index a0ed2b50fa6eb31acfb21af7156aa2c0590a7cc9..55480e664c9e5159bc787f902bd7c1d8e77eda1a 100644 --- a/alfa-server/src/main/resources/application-local.yml +++ b/alfa-server/src/main/resources/application-local.yml @@ -17,7 +17,6 @@ grpc: ozgcloud: feature: - vorgang-export: true reply-always-allowed: true bescheid-wizard: true production: false @@ -28,10 +27,6 @@ ozgcloud: url: http://localhost:9092 profile-template: /api/userProfiles/%s search-template: /api/userProfiles/?searchBy={searchBy} - xdomea: - behoerdenschluessel: "behoerdenschluesselWirdÜberHelmGesetzt" - behoerdenschluesselUri: "behoerdenschluesselUriWirdÜberHelmGesetzt" - behoerdenschluesselVersion: "behoerdenschluesselVersionWirdÜberHelmGesetzt" keycloak: auth-server-url: http://localhost:8088 diff --git a/alfa-server/src/main/resources/application.yml b/alfa-server/src/main/resources/application.yml index 8e17178fea49083f2e1a5035d0b27d50c6670e50..ac930de36a83c9b7d962e72dca5ef29eae2fdd57 100644 --- a/alfa-server/src/main/resources/application.yml +++ b/alfa-server/src/main/resources/application.yml @@ -91,4 +91,8 @@ ozgcloud: - image/jpeg user-manager: profile-template: /api/userProfiles/%s - search-template: /api/userProfiles/?searchBy={searchBy} \ No newline at end of file + search-template: /api/userProfiles/?searchBy={searchBy} + xdomea: + behoerdenschluessel: + behoerdenschluessel-uri: + behoerdenschluessel-version: diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java index 4ed36c554b2ec08ee7691c284a18bff95967332f..2e8d93a5e51a15f05418aac4952d926c64717300 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java @@ -12,11 +12,6 @@ import lombok.Setter; @ConfigurationProperties(prefix = "ozgcloud.feature") public class FeatureToggleProperties { - /** - * Enable vorgang export(xdomea) feature. - */ - private boolean vorgangExport = false; - /** * Enable/Disable bescheid creation feature. */ diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DefaultXdomeaProperties.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DefaultXdomeaProperties.java deleted file mode 100644 index 32861d97bc2c68ae07e572d05b8316b526aaec90..0000000000000000000000000000000000000000 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DefaultXdomeaProperties.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.ozgcloud.alfa.export; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ConditionalOnProperty(value = "ozgcloud.feature.vorgang-export", havingValue = "false", matchIfMissing = true) -public class DefaultXdomeaProperties implements XdomeaProperties { - - private static final String EXCEPTION_MESSAGE = "The feature vorgang-export must be active to access this property."; - - @Override - public String getBehoerdenschluessel() { - throw new UnsupportedOperationException(EXCEPTION_MESSAGE); - } - - @Override - public String getBehoerdenschluesselUri() { - throw new UnsupportedOperationException(EXCEPTION_MESSAGE); - } - - @Override - public String getBehoerdenschluesselVersion() { - throw new UnsupportedOperationException(EXCEPTION_MESSAGE); - } -} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportConfiguration.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportConfiguration.java index 8840c0ac344b8d8d84fde3d7d48a96ec76794267..1ad1ea37461edf34756e2f478e3b56cc74e2bd88 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportConfiguration.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportConfiguration.java @@ -3,12 +3,12 @@ package de.ozgcloud.alfa.export; import java.util.HashMap; import java.util.Map; -import jakarta.xml.bind.Marshaller; - import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.oxm.jaxb.Jaxb2Marshaller; +import org.springframework.validation.Validator; +import jakarta.xml.bind.Marshaller; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @@ -21,6 +21,11 @@ class ExportConfiguration { private final XdomeaNamespacePrefixMapper prefixMapper; + @Bean + static Validator configurationPropertiesValidator() { + return new XdomeaPropertiesValidator(); + } + @Bean Jaxb2Marshaller marshaller() { var marshaller = new Jaxb2Marshaller(); diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java index cd93a4d4c15df7e7f57bcc02668076f4c2efdd15..b7621e342cb52f19593b07ee03384b25285feb6e 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java @@ -10,7 +10,6 @@ import org.springframework.hateoas.LinkRelation; import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -20,13 +19,10 @@ import lombok.RequiredArgsConstructor; @Component class ExportVorgangProcessor implements RepresentationModelProcessor<EntityModel<VorgangWithEingang>> { - private final Predicate<VorgangWithEingang> isExportEnabled = vorgang -> isExportEnabled(); private static final Predicate<VorgangWithEingang> IS_VORGANG_ABGESCHLOSSEN = vorgang -> vorgang.getStatus() == VorgangStatus.ABGESCHLOSSEN; static final LinkRelation REL_EXPORT = LinkRelation.of("export"); - private final FeatureToggleProperties featureToggleProperties; - @Override public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) { var vorgang = model.getContent(); @@ -36,12 +32,8 @@ class ExportVorgangProcessor implements RepresentationModelProcessor<EntityModel } return ModelBuilder.fromModel(model) - .ifMatch(isExportEnabled.and(IS_VORGANG_ABGESCHLOSSEN)) + .ifMatch(IS_VORGANG_ABGESCHLOSSEN) .addLink(linkTo(methodOn(ExportVorgangController.class).exportToXdomea(vorgang.getId())).withRel(REL_EXPORT)) .buildModel(); } - - private boolean isExportEnabled() { - return featureToggleProperties.isVorgangExport(); - } } diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExternalXdomeaProperties.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExternalXdomeaProperties.java deleted file mode 100644 index 924bc8c28890c805e728af255a10a80b0c2cc575..0000000000000000000000000000000000000000 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExternalXdomeaProperties.java +++ /dev/null @@ -1,24 +0,0 @@ -package de.ozgcloud.alfa.export; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -import jakarta.validation.constraints.NotNull; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Configuration -@ConfigurationProperties("ozgcloud.xdomea") -@ConditionalOnProperty(value = "ozgcloud.feature.vorgang-export", havingValue = "true") -public class ExternalXdomeaProperties implements XdomeaProperties { - - @NotNull - private String behoerdenschluessel; - @NotNull - private String behoerdenschluesselUri; - @NotNull - private String behoerdenschluesselVersion; -} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaProperties.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaProperties.java index bedb3877aeafe1401e8ca5a8e82727e2da1e963a..2d2157c690d1b1c354875b477ec6163752cc1234 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaProperties.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaProperties.java @@ -1,10 +1,26 @@ package de.ozgcloud.alfa.export; -public interface XdomeaProperties { +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.validation.annotation.Validated; - String getBehoerdenschluessel(); +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; - String getBehoerdenschluesselUri(); +@Configuration +@ConfigurationProperties("ozgcloud.xdomea") +@Validated +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class XdomeaProperties { - String getBehoerdenschluesselVersion(); + private String behoerdenschluessel; + private String behoerdenschluesselUri; + private String behoerdenschluesselVersion; } diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaPropertiesValidator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaPropertiesValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..8cc320ecb6346fbc79bd42a2826b08bec38aaff3 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaPropertiesValidator.java @@ -0,0 +1,44 @@ +package de.ozgcloud.alfa.export; + +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; + +import de.ozgcloud.common.errorhandling.TechnicalException; + +public class XdomeaPropertiesValidator implements Validator { + + @Override + public boolean supports(Class<?> clazz) { + return XdomeaProperties.class.isAssignableFrom(clazz); + } + + @Override + public void validate(Object target, Errors errors) { + var properties = (XdomeaProperties) target; + validateBehoerdenschluesselProperties(errors, properties); + } + + private void validateBehoerdenschluesselProperties(Errors errors, XdomeaProperties properties) { + if (StringUtils.isNotBlank(properties.getBehoerdenschluessel())) { + validateNotBlank("behoerdenschluesselUri", properties, errors); + validateNotBlank("behoerdenschluesselVersion", properties, errors); + } + } + + private void validateNotBlank(String propertyName, XdomeaProperties properties, Errors errors) { + getPropertyValue(propertyName, properties); + if (StringUtils.isBlank(getPropertyValue(propertyName, properties))) { + errors.rejectValue(propertyName, String.format("ozgcloud.xdomea.%s.empty", propertyName), String.format("%s must be set", propertyName)); + } + } + + private static String getPropertyValue(String fieldName, XdomeaProperties properties) { + try { + return BeanUtils.getSimpleProperty(properties, fieldName); + } catch (Exception e) { + throw new TechnicalException("Property does not exist", e); + } + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/KopfCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/KopfCreator.java index f23b06bdff34f335838f388ca0da9e389af0eedc..5305519177c60d83ac4de118977b4fbd4c549fa2 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/KopfCreator.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/KopfCreator.java @@ -15,6 +15,7 @@ import de.xoev.xdomea.NachrichtentypCodeType; import de.xoev.xdomea.NkAbgabeType; import de.xoev.xdomea.OrganisationseinheitType; import de.xoev.xdomea.SystemType; +import io.micrometer.common.util.StringUtils; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @@ -26,7 +27,7 @@ class KopfCreator { static final String NACHRICHTENTYP_ABGABE_ABGABE_TYPE_CODE = "0401"; static final String PRODUKT_NAME = "OZG-Cloud"; - private final XdomeaProperties xDomeaProperties; + private final XdomeaProperties xdomeaProperties; public NkAbgabeType createKopf(VorgangWithEingang vorgang) { var nkAbgabeType = new NkAbgabeType(); @@ -57,7 +58,9 @@ class KopfCreator { KontaktType createKontaktType() { var kontakt = new KontaktType(); - kontakt.setBehoerdenkennung(createBehoerdenkennung()); + if (StringUtils.isNotBlank(xdomeaProperties.getBehoerdenschluessel())) { + kontakt.setBehoerdenkennung(createBehoerdenkennung()); + } return kontakt; } @@ -75,9 +78,9 @@ class KopfCreator { Code createBehoerdenschluessel() { var behoerdenschluessel = new Code(); - behoerdenschluessel.setCode(xDomeaProperties.getBehoerdenschluessel()); - behoerdenschluessel.setListURI(xDomeaProperties.getBehoerdenschluesselUri()); - behoerdenschluessel.setListVersionID(xDomeaProperties.getBehoerdenschluesselVersion()); + behoerdenschluessel.setCode(xdomeaProperties.getBehoerdenschluessel()); + behoerdenschluessel.setListURI(xdomeaProperties.getBehoerdenschluesselUri()); + behoerdenschluessel.setListVersionID(xdomeaProperties.getBehoerdenschluesselVersion()); return behoerdenschluessel; } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java index 27ed62377f845026eb3265b2a23f0694188c2579..1443f94482daadc8ab02a10a9ebeaa17a3045457 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java @@ -2,7 +2,6 @@ package de.ozgcloud.alfa.export; import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -11,11 +10,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.InjectMocks; -import org.mockito.Mock; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; -import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; @@ -27,9 +24,6 @@ class ExportVorgangProcessorTest { @InjectMocks private ExportVorgangProcessor processor; - @Mock - private FeatureToggleProperties featureToggleProperties; - private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); @Nested @@ -45,8 +39,7 @@ class ExportVorgangProcessorTest { } @Test - void shouldAddLinkWhenExportIsEnabledAndVorgangIsAbgeschlossen() { - when(featureToggleProperties.isVorgangExport()).thenReturn(true); + void shouldAddLinkWhenVorgangIsAbgeschlossen() { var vorgang = vorgangInStatus(VorgangStatus.ABGESCHLOSSEN); var model = processor.process(EntityModel.of(vorgang)); @@ -58,7 +51,6 @@ class ExportVorgangProcessorTest { @ParameterizedTest @EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "ABGESCHLOSSEN") void shouldNotAddLinkWhenVorgangIsNotAbgeschlossen(VorgangStatus status) { - when(featureToggleProperties.isVorgangExport()).thenReturn(true); var vorgang = vorgangInStatus(status); var model = processor.process(EntityModel.of(vorgang)); @@ -66,16 +58,6 @@ class ExportVorgangProcessorTest { assertThat(model.getLink(ExportVorgangProcessor.REL_EXPORT)).isEmpty(); } - @Test - void shouldNotAddLinkWhenExportIsDisabled() { - when(featureToggleProperties.isVorgangExport()).thenReturn(false); - var vorgang = vorgangInStatus(VorgangStatus.ABGESCHLOSSEN); - - var model = processor.process(EntityModel.of(vorgang)); - - assertThat(model.getLink(ExportVorgangProcessor.REL_EXPORT)).isEmpty(); - } - private VorgangWithEingang vorgangInStatus(VorgangStatus status) { return VorgangWithEingangTestFactory.createBuilder().status(status).build(); } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesTest.java deleted file mode 100644 index e44fadad0ec3d14b3d261b45fe5b8dc30cbb7669..0000000000000000000000000000000000000000 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.ozgcloud.alfa.export; - -import static org.assertj.core.api.AssertionsForClassTypes.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; - -public class XdomeaPropertiesTest { - - @Nested - @SpringBootTest(properties = {"ozgcloud.feature.vorgang-export=false"}) - class OnMissingVorgangExportFeature { - - @Autowired - XdomeaProperties xdomeaProperties; - - @Test - void shouldPropertiesBeOfTypeDefault(){ - assertThat(xdomeaProperties).isInstanceOf(DefaultXdomeaProperties.class); - } - - @Test - void shouldBehoerdenschluesselThrowException(){ - assertThatThrownBy(() -> xdomeaProperties.getBehoerdenschluessel()).isInstanceOf(UnsupportedOperationException.class); - } - - @Test - void shouldBehoerdenschluesselUriThrowException(){ - assertThatThrownBy(() -> xdomeaProperties.getBehoerdenschluesselUri()).isInstanceOf(UnsupportedOperationException.class); - } - - @Test - void shouldBehoerdenschluesselVersionThrowException(){ - assertThatThrownBy(() -> xdomeaProperties.getBehoerdenschluesselVersion()).isInstanceOf(UnsupportedOperationException.class); - } - } - - @Nested - @SpringBootTest - @ActiveProfiles({"itcase"}) - class OnActiveVorgangExportFeature { - - @Autowired - XdomeaProperties xdomeaProperties; - - @Test - void shouldPropertiesBeOfTypeConfig(){ - assertThat(xdomeaProperties).isInstanceOf(ExternalXdomeaProperties.class); - } - - @Test - void shouldBehoerdenschluesselBeSet(){ - assertThat(xdomeaProperties.getBehoerdenschluessel()).isEqualTo("ABC"); - } - - @Test - void shouldBehoerdenschluesselUriBeSet(){ - assertThat(xdomeaProperties.getBehoerdenschluesselUri()).isEqualTo("http://meine.behoer.de"); - } - - @Test - void shouldBehoerdenschluesselVersionBeSet(){ - assertThat(xdomeaProperties.getBehoerdenschluesselVersion()).isEqualTo("1.0.15b"); - } - } -} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..78d786011aeedec05d51b6407305c2fb3769a626 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesTestFactory.java @@ -0,0 +1,23 @@ +package de.ozgcloud.alfa.export; + +import com.thedeanda.lorem.LoremIpsum; + +import de.ozgcloud.alfa.export.XdomeaProperties.XdomeaPropertiesBuilder; + +public class XdomeaPropertiesTestFactory { + + public static final String BEHOERDENSCHLUESSEL = LoremIpsum.getInstance().getWords(1); + public static final String BEHOERDENSCHLUESSEL_URI = LoremIpsum.getInstance().getUrl(); + public static final String BEHOERDENSCHLUESSEL_VERSION = LoremIpsum.getInstance().getWords(1); + + public static XdomeaProperties create() { + return createBuilder().build(); + } + + public static XdomeaPropertiesBuilder createBuilder() { + return new XdomeaPropertiesBuilder() + .behoerdenschluessel(BEHOERDENSCHLUESSEL) + .behoerdenschluesselUri(BEHOERDENSCHLUESSEL_URI) + .behoerdenschluesselVersion(BEHOERDENSCHLUESSEL_VERSION); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesValidatorITCase.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesValidatorITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..451d2c7c49059af03d5e26034ad45f7bc6929998 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesValidatorITCase.java @@ -0,0 +1,17 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Test; +import org.springframework.context.ApplicationContext; + +import de.ozgcloud.common.test.ITCase; + +@ITCase +class XdomeaPropertiesValidatorITCase { + + @Test + void shouldExistInApplicationContext(ApplicationContext context) { + assertThat(context.getBean("configurationPropertiesValidator")).isNotNull().isInstanceOf(XdomeaPropertiesValidator.class); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesValidatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesValidatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..cd6cf19672ab8118254ded34a4b2444d921f8f55 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaPropertiesValidatorTest.java @@ -0,0 +1,138 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.mockito.Spy; +import org.springframework.validation.Errors; + +class XdomeaPropertiesValidatorTest { + + @Spy + private XdomeaPropertiesValidator validator; + + @Nested + class TestSupports { + + @Test + void shouldSupportXdomeaProperties() { + var supports = validator.supports(XdomeaProperties.class); + + assertThat(supports).isTrue(); + } + } + + @Nested + class TestValidate { + + @Test + void shouldBeValidIfAllBehoerdenschluesselPropertiesAreSet() { + var properties = XdomeaPropertiesTestFactory.create(); + + var errors = validate(properties); + + assertThat(errors.hasErrors()).isFalse(); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldBeValidIfBehoerdenschluesselIsNotSet(String behoerdenschluessel) { + var properties = XdomeaPropertiesTestFactory.createBuilder().behoerdenschluessel(behoerdenschluessel).build(); + + var errors = validate(properties); + + assertThat(errors.hasErrors()).isFalse(); + } + + @Nested + class OnUriNotSet { + + private static final String PROPERTY_NAME = "behoerdenschluesselUri"; + public static final String PROPERTY_PATH = "ozgcloud.xdomea." + PROPERTY_NAME; + public static final String ERROR_CODE = PROPERTY_PATH + ".empty"; + + @ParameterizedTest + @NullAndEmptySource + void shouldHaveFieldErrors(String uri) { + var properties = withBehoerdenschluesselUri(uri); + + var errors = validate(properties); + + assertThat(errors.hasFieldErrors(PROPERTY_NAME)).isTrue(); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldHaveMeaningfulErrorMessage(String uri) { + var properties = withBehoerdenschluesselUri(uri); + + var errors = validate(properties); + + assertThat(errors.getFieldError(PROPERTY_NAME).getDefaultMessage()).contains(PROPERTY_NAME); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldHaveErrorCode(String uri) { + var properties = withBehoerdenschluesselUri(uri); + + var errors = validate(properties); + + assertThat(errors.getFieldError(PROPERTY_NAME).getCode()).isEqualTo(ERROR_CODE); + } + + private XdomeaProperties withBehoerdenschluesselUri(String uri) { + return XdomeaPropertiesTestFactory.createBuilder().behoerdenschluesselUri(uri).build(); + } + } + + @Nested + class OnVersionNotSet { + + public static final String PROPERTY_NAME = "behoerdenschluesselVersion"; + public static final String PROPERTY_PATH = "ozgcloud.xdomea." + PROPERTY_NAME; + public static final String ERROR_CODE = PROPERTY_PATH + ".empty"; + + @ParameterizedTest + @NullAndEmptySource + void shouldHaveFieldErrors(String version) { + var properties = withBehoerdenschluesselVersion(version); + + var errors = validate(properties); + + assertThat(errors.hasFieldErrors(PROPERTY_NAME)).isTrue(); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldHaveMeaningfulErrorMessage(String version) { + var properties = withBehoerdenschluesselVersion(version); + + var errors = validate(properties); + + assertThat(errors.getFieldError(PROPERTY_NAME).getDefaultMessage()).contains(PROPERTY_NAME); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldHaveErrorCode(String version) { + var properties = withBehoerdenschluesselVersion(version); + + var errors = validate(properties); + + assertThat(errors.getFieldError(PROPERTY_NAME).getCode()).isEqualTo(ERROR_CODE); + } + + private XdomeaProperties withBehoerdenschluesselVersion(String version) { + return XdomeaPropertiesTestFactory.createBuilder().behoerdenschluesselVersion(version).build(); + } + } + + private Errors validate(XdomeaProperties properties) { + return validator.validateObject(properties); + } + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/KopfCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/KopfCreatorTest.java index 0c72b5ad9ff5d21840af73074a8f244c3899b0ab..ad2a07d492a41a25956fe6032f940df5b82c0f9e 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/KopfCreatorTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/KopfCreatorTest.java @@ -1,5 +1,6 @@ package de.ozgcloud.alfa.vorgang; +import static de.ozgcloud.alfa.export.XdomeaPropertiesTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -13,6 +14,8 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockedStatic; @@ -38,9 +41,7 @@ class KopfCreatorTest { private KopfCreator creator; @Mock - private XdomeaProperties xDomeaProperties; - @Mock - private DateConverter dateConverter; + private XdomeaProperties xdomeaProperties; @Nested class TestCreateKopf { @@ -170,9 +171,6 @@ class KopfCreatorTest { @Nested class TestCreateAbsender { - @Mock - private BehoerdenkennungType behoerdenkennungType; - @Test void shouldCallCreateKontaktType() { creator.createAbsender(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); @@ -194,15 +192,54 @@ class KopfCreatorTest { @Nested class TestCreateKontaktType { - @Test - void shouldSetBehoerdenkennungType() { - var expectedValue = new BehoerdenkennungType(); - doReturn(expectedValue).when(creator).createBehoerdenkennung(); + @Nested + class OnBehoerdenschluesselNotSet { + + @ParameterizedTest + @NullAndEmptySource + void shouldNotCreateBehoerdenkennung(String behoerdenschluessel) { + when(xdomeaProperties.getBehoerdenschluessel()).thenReturn(behoerdenschluessel); + + creator.createKontaktType(); + + verify(creator, never()).createBehoerdenkennung(); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldNotSetBehoerdenkennung(String behoerdenschluessel) { + when(xdomeaProperties.getBehoerdenschluessel()).thenReturn(behoerdenschluessel); + + var kontaktType = creator.createKontaktType(); - var kontaktType = creator.createAbsender(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); + assertThat(kontaktType.getBehoerdenkennung()).isNull(); + } + } + + @Nested + class OnBehoerdenschluesselSet { + + private static final BehoerdenkennungType expectedValue = new BehoerdenkennungType(); + + @BeforeEach + void init() { + when(xdomeaProperties.getBehoerdenschluessel()).thenReturn(BEHOERDENSCHLUESSEL); + doReturn(expectedValue).when(creator).createBehoerdenkennung(); + } + + @Test + void shouldCreateBehoerdenkennung() { + creator.createKontaktType(); + + verify(creator).createBehoerdenkennung(); + } - assertThat(kontaktType.getBehoerdenkennung()).isEqualTo(expectedValue); + @Test + void shouldSetBehoerdenkennung() { + var kontaktType = creator.createKontaktType(); + assertThat(kontaktType.getBehoerdenkennung()).isEqualTo(expectedValue); + } } } @@ -220,11 +257,22 @@ class KopfCreatorTest { @Nested class TestCreateBehoerdenkennung { - @Test - void shouldSetBehoerdenschluessel() { - var expectedBehoerdenschluessel = new Code(); + private final Code expectedBehoerdenschluessel = new Code(); + + @BeforeEach + void init() { doReturn(expectedBehoerdenschluessel).when(creator).createBehoerdenschluessel(); + } + + @Test + void shouldcreateBehoerdenschluessel() { + creator.createBehoerdenkennung(); + + verify(creator).createBehoerdenschluessel(); + } + @Test + void shouldSetBehoerdenschluessel() { var behoerdenkennungType = creator.createBehoerdenkennung(); assertThat(behoerdenkennungType.getBehoerdenschluessel()).isEqualTo(expectedBehoerdenschluessel); @@ -234,34 +282,32 @@ class KopfCreatorTest { @Nested class TestCreateBehoerdenschlussel { + @BeforeEach + void init() { + when(xdomeaProperties.getBehoerdenschluessel()).thenReturn(BEHOERDENSCHLUESSEL); + when(xdomeaProperties.getBehoerdenschluesselUri()).thenReturn(BEHOERDENSCHLUESSEL_URI); + when(xdomeaProperties.getBehoerdenschluesselVersion()).thenReturn(BEHOERDENSCHLUESSEL_VERSION); + } + @Test void shouldSetCode() { - var expectedBehoerdenschluessel = LoremIpsum.getInstance().getWords(1); - when(xDomeaProperties.getBehoerdenschluessel()).thenReturn(expectedBehoerdenschluessel); - var behoerdenschlussel = creator.createBehoerdenschluessel(); - assertThat(behoerdenschlussel.getCode()).isEqualTo(expectedBehoerdenschluessel); + assertThat(behoerdenschlussel.getCode()).isEqualTo(BEHOERDENSCHLUESSEL); } @Test void shouldSetListURI() { - var expectedBehoerdenschluesselUri = LoremIpsum.getInstance().getUrl(); - when(xDomeaProperties.getBehoerdenschluesselUri()).thenReturn(expectedBehoerdenschluesselUri); - var behoerdenschlussel = creator.createBehoerdenschluessel(); - assertThat(behoerdenschlussel.getListURI()).isEqualTo(expectedBehoerdenschluesselUri); + assertThat(behoerdenschlussel.getListURI()).isEqualTo(BEHOERDENSCHLUESSEL_URI); } @Test void shouldSetListVersionID() { - var expectedBehoerdenschluesselVersion = LoremIpsum.getInstance().getWords(1); - when(xDomeaProperties.getBehoerdenschluesselVersion()).thenReturn(expectedBehoerdenschluesselVersion); - var behoerdenschlussel = creator.createBehoerdenschluessel(); - assertThat(behoerdenschlussel.getListVersionID()).isEqualTo(expectedBehoerdenschluesselVersion); + assertThat(behoerdenschlussel.getListVersionID()).isEqualTo(BEHOERDENSCHLUESSEL_VERSION); } } diff --git a/alfa-xdomea/src/test/resources/application-itcase.yaml b/alfa-xdomea/src/test/resources/application-itcase.yaml index 8637dea80e839d9c9b817da9756bf1e394ac958d..c6f85b1e94d61d1ee6c5992b97cbac70b7260e24 100644 --- a/alfa-xdomea/src/test/resources/application-itcase.yaml +++ b/alfa-xdomea/src/test/resources/application-itcase.yaml @@ -1,6 +1,4 @@ ozgcloud: - feature: - vorgang-export: true xdomea: behoerdenschluessel: ABC behoerdenschluesselUri: http://meine.behoer.de