Skip to content
Snippets Groups Projects
Commit dadcc4fb authored by OZGCloud's avatar OZGCloud
Browse files

Merge pull request 'OZG-5841-vorgang-export-feature-toggle-ausbauen' (#658)...

Merge pull request 'OZG-5841-vorgang-export-feature-toggle-ausbauen' (#658) from OZG-5841-vorgang-export-feature-toggle-ausbauen into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/alfa/pulls/658


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents 63aeed07 268eee3b
Branches
Tags
No related merge requests found
Showing
with 337 additions and 201 deletions
...@@ -9,7 +9,6 @@ server: ...@@ -9,7 +9,6 @@ server:
ozgcloud: ozgcloud:
feature: feature:
vorgang-export: true
reply-always-allowed: true reply-always-allowed: true
bescheid-wizard: true bescheid-wizard: true
production: false production: false
......
...@@ -8,7 +8,6 @@ keycloak: ...@@ -8,7 +8,6 @@ keycloak:
ozgcloud: ozgcloud:
feature: feature:
vorgang-export: true
createBescheid: true createBescheid: true
reply-always-allowed: true reply-always-allowed: true
bescheid-wizard: true bescheid-wizard: true
......
...@@ -17,7 +17,6 @@ grpc: ...@@ -17,7 +17,6 @@ grpc:
ozgcloud: ozgcloud:
feature: feature:
vorgang-export: true
reply-always-allowed: true reply-always-allowed: true
bescheid-wizard: true bescheid-wizard: true
production: false production: false
...@@ -28,10 +27,6 @@ ozgcloud: ...@@ -28,10 +27,6 @@ ozgcloud:
url: http://localhost:9092 url: http://localhost:9092
profile-template: /api/userProfiles/%s profile-template: /api/userProfiles/%s
search-template: /api/userProfiles/?searchBy={searchBy} search-template: /api/userProfiles/?searchBy={searchBy}
xdomea:
behoerdenschluessel: "behoerdenschluesselWirdÜberHelmGesetzt"
behoerdenschluesselUri: "behoerdenschluesselUriWirdÜberHelmGesetzt"
behoerdenschluesselVersion: "behoerdenschluesselVersionWirdÜberHelmGesetzt"
keycloak: keycloak:
auth-server-url: http://localhost:8088 auth-server-url: http://localhost:8088
......
...@@ -92,3 +92,7 @@ ozgcloud: ...@@ -92,3 +92,7 @@ ozgcloud:
user-manager: user-manager:
profile-template: /api/userProfiles/%s profile-template: /api/userProfiles/%s
search-template: /api/userProfiles/?searchBy={searchBy} search-template: /api/userProfiles/?searchBy={searchBy}
xdomea:
behoerdenschluessel:
behoerdenschluessel-uri:
behoerdenschluessel-version:
...@@ -12,11 +12,6 @@ import lombok.Setter; ...@@ -12,11 +12,6 @@ import lombok.Setter;
@ConfigurationProperties(prefix = "ozgcloud.feature") @ConfigurationProperties(prefix = "ozgcloud.feature")
public class FeatureToggleProperties { public class FeatureToggleProperties {
/**
* Enable vorgang export(xdomea) feature.
*/
private boolean vorgangExport = false;
/** /**
* Enable/Disable bescheid creation feature. * Enable/Disable bescheid creation feature.
*/ */
......
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);
}
}
...@@ -3,12 +3,12 @@ package de.ozgcloud.alfa.export; ...@@ -3,12 +3,12 @@ package de.ozgcloud.alfa.export;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import jakarta.xml.bind.Marshaller;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller; import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.validation.Validator;
import jakarta.xml.bind.Marshaller;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor @RequiredArgsConstructor
...@@ -21,6 +21,11 @@ class ExportConfiguration { ...@@ -21,6 +21,11 @@ class ExportConfiguration {
private final XdomeaNamespacePrefixMapper prefixMapper; private final XdomeaNamespacePrefixMapper prefixMapper;
@Bean
static Validator configurationPropertiesValidator() {
return new XdomeaPropertiesValidator();
}
@Bean @Bean
Jaxb2Marshaller marshaller() { Jaxb2Marshaller marshaller() {
var marshaller = new Jaxb2Marshaller(); var marshaller = new Jaxb2Marshaller();
......
...@@ -10,7 +10,6 @@ import org.springframework.hateoas.LinkRelation; ...@@ -10,7 +10,6 @@ import org.springframework.hateoas.LinkRelation;
import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.hateoas.server.RepresentationModelProcessor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import de.ozgcloud.alfa.common.FeatureToggleProperties;
import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.ModelBuilder;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
...@@ -20,13 +19,10 @@ import lombok.RequiredArgsConstructor; ...@@ -20,13 +19,10 @@ import lombok.RequiredArgsConstructor;
@Component @Component
class ExportVorgangProcessor implements RepresentationModelProcessor<EntityModel<VorgangWithEingang>> { 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; private static final Predicate<VorgangWithEingang> IS_VORGANG_ABGESCHLOSSEN = vorgang -> vorgang.getStatus() == VorgangStatus.ABGESCHLOSSEN;
static final LinkRelation REL_EXPORT = LinkRelation.of("export"); static final LinkRelation REL_EXPORT = LinkRelation.of("export");
private final FeatureToggleProperties featureToggleProperties;
@Override @Override
public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) { public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) {
var vorgang = model.getContent(); var vorgang = model.getContent();
...@@ -36,12 +32,8 @@ class ExportVorgangProcessor implements RepresentationModelProcessor<EntityModel ...@@ -36,12 +32,8 @@ class ExportVorgangProcessor implements RepresentationModelProcessor<EntityModel
} }
return ModelBuilder.fromModel(model) 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)) .addLink(linkTo(methodOn(ExportVorgangController.class).exportToXdomea(vorgang.getId())).withRel(REL_EXPORT))
.buildModel(); .buildModel();
} }
private boolean isExportEnabled() {
return featureToggleProperties.isVorgangExport();
}
} }
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;
}
package de.ozgcloud.alfa.export; 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;
} }
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);
}
}
}
...@@ -15,6 +15,7 @@ import de.xoev.xdomea.NachrichtentypCodeType; ...@@ -15,6 +15,7 @@ import de.xoev.xdomea.NachrichtentypCodeType;
import de.xoev.xdomea.NkAbgabeType; import de.xoev.xdomea.NkAbgabeType;
import de.xoev.xdomea.OrganisationseinheitType; import de.xoev.xdomea.OrganisationseinheitType;
import de.xoev.xdomea.SystemType; import de.xoev.xdomea.SystemType;
import io.micrometer.common.util.StringUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor @RequiredArgsConstructor
...@@ -26,7 +27,7 @@ class KopfCreator { ...@@ -26,7 +27,7 @@ class KopfCreator {
static final String NACHRICHTENTYP_ABGABE_ABGABE_TYPE_CODE = "0401"; static final String NACHRICHTENTYP_ABGABE_ABGABE_TYPE_CODE = "0401";
static final String PRODUKT_NAME = "OZG-Cloud"; static final String PRODUKT_NAME = "OZG-Cloud";
private final XdomeaProperties xDomeaProperties; private final XdomeaProperties xdomeaProperties;
public NkAbgabeType createKopf(VorgangWithEingang vorgang) { public NkAbgabeType createKopf(VorgangWithEingang vorgang) {
var nkAbgabeType = new NkAbgabeType(); var nkAbgabeType = new NkAbgabeType();
...@@ -57,7 +58,9 @@ class KopfCreator { ...@@ -57,7 +58,9 @@ class KopfCreator {
KontaktType createKontaktType() { KontaktType createKontaktType() {
var kontakt = new KontaktType(); var kontakt = new KontaktType();
if (StringUtils.isNotBlank(xdomeaProperties.getBehoerdenschluessel())) {
kontakt.setBehoerdenkennung(createBehoerdenkennung()); kontakt.setBehoerdenkennung(createBehoerdenkennung());
}
return kontakt; return kontakt;
} }
...@@ -75,9 +78,9 @@ class KopfCreator { ...@@ -75,9 +78,9 @@ class KopfCreator {
Code createBehoerdenschluessel() { Code createBehoerdenschluessel() {
var behoerdenschluessel = new Code(); var behoerdenschluessel = new Code();
behoerdenschluessel.setCode(xDomeaProperties.getBehoerdenschluessel()); behoerdenschluessel.setCode(xdomeaProperties.getBehoerdenschluessel());
behoerdenschluessel.setListURI(xDomeaProperties.getBehoerdenschluesselUri()); behoerdenschluessel.setListURI(xdomeaProperties.getBehoerdenschluesselUri());
behoerdenschluessel.setListVersionID(xDomeaProperties.getBehoerdenschluesselVersion()); behoerdenschluessel.setListVersionID(xdomeaProperties.getBehoerdenschluesselVersion());
return behoerdenschluessel; return behoerdenschluessel;
} }
......
...@@ -2,7 +2,6 @@ package de.ozgcloud.alfa.export; ...@@ -2,7 +2,6 @@ package de.ozgcloud.alfa.export;
import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*; import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
...@@ -11,11 +10,9 @@ import org.junit.jupiter.api.Test; ...@@ -11,11 +10,9 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.EnumSource;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.Link; import org.springframework.hateoas.Link;
import de.ozgcloud.alfa.common.FeatureToggleProperties;
import de.ozgcloud.alfa.common.UserProfileUrlProvider; import de.ozgcloud.alfa.common.UserProfileUrlProvider;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
...@@ -27,9 +24,6 @@ class ExportVorgangProcessorTest { ...@@ -27,9 +24,6 @@ class ExportVorgangProcessorTest {
@InjectMocks @InjectMocks
private ExportVorgangProcessor processor; private ExportVorgangProcessor processor;
@Mock
private FeatureToggleProperties featureToggleProperties;
private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider(); private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
@Nested @Nested
...@@ -45,8 +39,7 @@ class ExportVorgangProcessorTest { ...@@ -45,8 +39,7 @@ class ExportVorgangProcessorTest {
} }
@Test @Test
void shouldAddLinkWhenExportIsEnabledAndVorgangIsAbgeschlossen() { void shouldAddLinkWhenVorgangIsAbgeschlossen() {
when(featureToggleProperties.isVorgangExport()).thenReturn(true);
var vorgang = vorgangInStatus(VorgangStatus.ABGESCHLOSSEN); var vorgang = vorgangInStatus(VorgangStatus.ABGESCHLOSSEN);
var model = processor.process(EntityModel.of(vorgang)); var model = processor.process(EntityModel.of(vorgang));
...@@ -58,7 +51,6 @@ class ExportVorgangProcessorTest { ...@@ -58,7 +51,6 @@ class ExportVorgangProcessorTest {
@ParameterizedTest @ParameterizedTest
@EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "ABGESCHLOSSEN") @EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "ABGESCHLOSSEN")
void shouldNotAddLinkWhenVorgangIsNotAbgeschlossen(VorgangStatus status) { void shouldNotAddLinkWhenVorgangIsNotAbgeschlossen(VorgangStatus status) {
when(featureToggleProperties.isVorgangExport()).thenReturn(true);
var vorgang = vorgangInStatus(status); var vorgang = vorgangInStatus(status);
var model = processor.process(EntityModel.of(vorgang)); var model = processor.process(EntityModel.of(vorgang));
...@@ -66,16 +58,6 @@ class ExportVorgangProcessorTest { ...@@ -66,16 +58,6 @@ class ExportVorgangProcessorTest {
assertThat(model.getLink(ExportVorgangProcessor.REL_EXPORT)).isEmpty(); 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) { private VorgangWithEingang vorgangInStatus(VorgangStatus status) {
return VorgangWithEingangTestFactory.createBuilder().status(status).build(); return VorgangWithEingangTestFactory.createBuilder().status(status).build();
} }
......
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");
}
}
}
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);
}
}
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);
}
}
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);
}
}
}
package de.ozgcloud.alfa.vorgang; package de.ozgcloud.alfa.vorgang;
import static de.ozgcloud.alfa.export.XdomeaPropertiesTestFactory.*;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
...@@ -13,6 +14,8 @@ import org.junit.jupiter.api.AfterEach; ...@@ -13,6 +14,8 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; 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.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockedStatic; import org.mockito.MockedStatic;
...@@ -38,9 +41,7 @@ class KopfCreatorTest { ...@@ -38,9 +41,7 @@ class KopfCreatorTest {
private KopfCreator creator; private KopfCreator creator;
@Mock @Mock
private XdomeaProperties xDomeaProperties; private XdomeaProperties xdomeaProperties;
@Mock
private DateConverter dateConverter;
@Nested @Nested
class TestCreateKopf { class TestCreateKopf {
...@@ -170,9 +171,6 @@ class KopfCreatorTest { ...@@ -170,9 +171,6 @@ class KopfCreatorTest {
@Nested @Nested
class TestCreateAbsender { class TestCreateAbsender {
@Mock
private BehoerdenkennungType behoerdenkennungType;
@Test @Test
void shouldCallCreateKontaktType() { void shouldCallCreateKontaktType() {
creator.createAbsender(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); creator.createAbsender(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID);
...@@ -194,15 +192,54 @@ class KopfCreatorTest { ...@@ -194,15 +192,54 @@ class KopfCreatorTest {
@Nested @Nested
class TestCreateKontaktType { class TestCreateKontaktType {
@Test @Nested
void shouldSetBehoerdenkennungType() { class OnBehoerdenschluesselNotSet {
var expectedValue = new BehoerdenkennungType();
@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();
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(); doReturn(expectedValue).when(creator).createBehoerdenkennung();
}
var kontaktType = creator.createAbsender(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); @Test
void shouldCreateBehoerdenkennung() {
creator.createKontaktType();
assertThat(kontaktType.getBehoerdenkennung()).isEqualTo(expectedValue); verify(creator).createBehoerdenkennung();
}
@Test
void shouldSetBehoerdenkennung() {
var kontaktType = creator.createKontaktType();
assertThat(kontaktType.getBehoerdenkennung()).isEqualTo(expectedValue);
}
} }
} }
...@@ -220,11 +257,22 @@ class KopfCreatorTest { ...@@ -220,11 +257,22 @@ class KopfCreatorTest {
@Nested @Nested
class TestCreateBehoerdenkennung { class TestCreateBehoerdenkennung {
@Test private final Code expectedBehoerdenschluessel = new Code();
void shouldSetBehoerdenschluessel() {
var expectedBehoerdenschluessel = new Code(); @BeforeEach
void init() {
doReturn(expectedBehoerdenschluessel).when(creator).createBehoerdenschluessel(); doReturn(expectedBehoerdenschluessel).when(creator).createBehoerdenschluessel();
}
@Test
void shouldcreateBehoerdenschluessel() {
creator.createBehoerdenkennung();
verify(creator).createBehoerdenschluessel();
}
@Test
void shouldSetBehoerdenschluessel() {
var behoerdenkennungType = creator.createBehoerdenkennung(); var behoerdenkennungType = creator.createBehoerdenkennung();
assertThat(behoerdenkennungType.getBehoerdenschluessel()).isEqualTo(expectedBehoerdenschluessel); assertThat(behoerdenkennungType.getBehoerdenschluessel()).isEqualTo(expectedBehoerdenschluessel);
...@@ -234,34 +282,32 @@ class KopfCreatorTest { ...@@ -234,34 +282,32 @@ class KopfCreatorTest {
@Nested @Nested
class TestCreateBehoerdenschlussel { class TestCreateBehoerdenschlussel {
@BeforeEach
void init() {
when(xdomeaProperties.getBehoerdenschluessel()).thenReturn(BEHOERDENSCHLUESSEL);
when(xdomeaProperties.getBehoerdenschluesselUri()).thenReturn(BEHOERDENSCHLUESSEL_URI);
when(xdomeaProperties.getBehoerdenschluesselVersion()).thenReturn(BEHOERDENSCHLUESSEL_VERSION);
}
@Test @Test
void shouldSetCode() { void shouldSetCode() {
var expectedBehoerdenschluessel = LoremIpsum.getInstance().getWords(1);
when(xDomeaProperties.getBehoerdenschluessel()).thenReturn(expectedBehoerdenschluessel);
var behoerdenschlussel = creator.createBehoerdenschluessel(); var behoerdenschlussel = creator.createBehoerdenschluessel();
assertThat(behoerdenschlussel.getCode()).isEqualTo(expectedBehoerdenschluessel); assertThat(behoerdenschlussel.getCode()).isEqualTo(BEHOERDENSCHLUESSEL);
} }
@Test @Test
void shouldSetListURI() { void shouldSetListURI() {
var expectedBehoerdenschluesselUri = LoremIpsum.getInstance().getUrl();
when(xDomeaProperties.getBehoerdenschluesselUri()).thenReturn(expectedBehoerdenschluesselUri);
var behoerdenschlussel = creator.createBehoerdenschluessel(); var behoerdenschlussel = creator.createBehoerdenschluessel();
assertThat(behoerdenschlussel.getListURI()).isEqualTo(expectedBehoerdenschluesselUri); assertThat(behoerdenschlussel.getListURI()).isEqualTo(BEHOERDENSCHLUESSEL_URI);
} }
@Test @Test
void shouldSetListVersionID() { void shouldSetListVersionID() {
var expectedBehoerdenschluesselVersion = LoremIpsum.getInstance().getWords(1);
when(xDomeaProperties.getBehoerdenschluesselVersion()).thenReturn(expectedBehoerdenschluesselVersion);
var behoerdenschlussel = creator.createBehoerdenschluessel(); var behoerdenschlussel = creator.createBehoerdenschluessel();
assertThat(behoerdenschlussel.getListVersionID()).isEqualTo(expectedBehoerdenschluesselVersion); assertThat(behoerdenschlussel.getListVersionID()).isEqualTo(BEHOERDENSCHLUESSEL_VERSION);
} }
} }
......
ozgcloud: ozgcloud:
feature:
vorgang-export: true
xdomea: xdomea:
behoerdenschluessel: ABC behoerdenschluessel: ABC
behoerdenschluesselUri: http://meine.behoer.de behoerdenschluesselUri: http://meine.behoer.de
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment