diff --git a/src/main/java/de/ozgcloud/admin/common/FeatureToggleProperties.java b/src/main/java/de/ozgcloud/admin/common/FeatureToggleProperties.java index 1589df746c931b2735e9af15ab55d0bafda1eb99..71cdb9eec76431a104e4913e530401e73d415f6c 100644 --- a/src/main/java/de/ozgcloud/admin/common/FeatureToggleProperties.java +++ b/src/main/java/de/ozgcloud/admin/common/FeatureToggleProperties.java @@ -32,9 +32,11 @@ import lombok.Setter; @Setter @Getter @Configuration -@ConfigurationProperties(prefix = "ozgcloud.feature") +@ConfigurationProperties(prefix = FeatureToggleProperties.FEATURE_TOGGLE_PREFIX) public class FeatureToggleProperties { + public static final String FEATURE_TOGGLE_PREFIX = "ozgcloud.feature"; + private boolean postfach; private boolean benutzerRollen; private boolean organisationsEinheiten; diff --git a/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitProperties.java b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..2a38bb399af4b7aca615d4e4ed592bf78c7c8a75 --- /dev/null +++ b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitProperties.java @@ -0,0 +1,24 @@ +package de.ozgcloud.admin.organisationseinheit; + +import jakarta.validation.constraints.NotBlank; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import de.ozgcloud.admin.common.FeatureToggleProperties; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@Configuration +@ConfigurationProperties(prefix = OrganisationsEinheitProperties.ORGANISATIONS_EINHEIT_PROPERTIES_PREFIX) +@ConditionalOnProperty(prefix = FeatureToggleProperties.FEATURE_TOGGLE_PREFIX, name = "organisationsEinheiten", havingValue = "true") +class OrganisationsEinheitProperties { + + static final String ORGANISATIONS_EINHEIT_PROPERTIES_PREFIX = "ozgcloud.organisationsEinheit"; + + @NotBlank + private String zufiSucheUri; +} diff --git a/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessor.java b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessor.java index 1cb98fd649ac08564bb8f9da24e5419c0e930016..9d76ca2b50044c3607da07698278d38397a9dcaa 100644 --- a/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessor.java +++ b/src/main/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessor.java @@ -25,7 +25,10 @@ package de.ozgcloud.admin.organisationseinheit; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; +import java.util.List; + import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.Link; import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; @@ -38,12 +41,22 @@ import lombok.RequiredArgsConstructor; class OrganisationsEinheitRootProcessor implements RepresentationModelProcessor<EntityModel<Root>> { static final String REL_ORGANISATIONS_EINHEITEN = "organisationsEinheiten"; + static final String REL_SEARCH_ORGANISATIONS_EINHEIT = "searchOrganisationsEinheit"; private final FeatureToggleProperties featureToggleProperties; + private final OrganisationsEinheitProperties organisationsEinheitProperties; @Override public EntityModel<Root> process(EntityModel<Root> model) { - return model.addIf(featureToggleProperties.isOrganisationsEinheiten(), - () -> linkTo(methodOn(OrganisationsEinheitController.class).getAll()).withRel(REL_ORGANISATIONS_EINHEITEN)); + return model.addAllIf(featureToggleProperties.isOrganisationsEinheiten(), + () -> List.of(buildGetAllOrganisationsEinheitenLink(), buildSearchOrganisationsEinheitLink())); + } + + private Link buildGetAllOrganisationsEinheitenLink() { + return linkTo(methodOn(OrganisationsEinheitController.class).getAll()).withRel(REL_ORGANISATIONS_EINHEITEN); + } + + private Link buildSearchOrganisationsEinheitLink() { + return Link.of(organisationsEinheitProperties.getZufiSucheUri(), REL_SEARCH_ORGANISATIONS_EINHEIT); } } diff --git a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessorTest.java b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessorTest.java index f147d68e37d851e374f7376a2e84c34374c1f271..1d3bfcc90dd770964b2801057228df3d6bb262a2 100644 --- a/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessorTest.java +++ b/src/test/java/de/ozgcloud/admin/organisationseinheit/OrganisationsEinheitRootProcessorTest.java @@ -33,6 +33,8 @@ import org.mockito.Mock; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; +import com.thedeanda.lorem.LoremIpsum; + import de.ozgcloud.admin.RootTestFactory; import de.ozgcloud.admin.common.FeatureToggleProperties; @@ -42,10 +44,14 @@ class OrganisationsEinheitRootProcessorTest { private OrganisationsEinheitRootProcessor organisationsEinheitRootProcessor; @Mock private FeatureToggleProperties featureToggleProperties; + @Mock + private OrganisationsEinheitProperties organisationsEinheitProperties; @Nested class TestProcess { + private final String zufiSucheUri = LoremIpsum.getInstance().getUrl() + "?searchBy={searchBy}"; + @Nested class OrganisationsEinheitenLinkRelation { @@ -78,14 +84,71 @@ class OrganisationsEinheitRootProcessorTest { .extracting(Link::getHref) .isEqualTo(OrganisationsEinheitController.PATH); } + } + + @Nested + class SearchOrganisationsEinheitenLink { + + @Test + void shouldExistsIfFeatureEnabled() { + givenFeatureIsEnabled(); + + var model = organisationsEinheitRootProcessor.process(EntityModel.of(RootTestFactory.create())); - private void givenFeatureIsEnabled() { - when(featureToggleProperties.isOrganisationsEinheiten()).thenReturn(true); + assertThat(model.getLink(OrganisationsEinheitRootProcessor.REL_SEARCH_ORGANISATIONS_EINHEIT)).isNotEmpty(); } - private void givenFeatureIsDisabled() { - when(featureToggleProperties.isOrganisationsEinheiten()).thenReturn(false); + @Test + void shouldNotExistIfFeatureDisabled() { + givenFeatureIsDisabled(); + + var model = organisationsEinheitRootProcessor.process(EntityModel.of(RootTestFactory.create())); + + assertThat(model.getLink(OrganisationsEinheitRootProcessor.REL_SEARCH_ORGANISATIONS_EINHEIT)).isEmpty(); } + + @Test + void shouldGetZufiSucheUri() { + givenFeatureIsEnabled(); + + organisationsEinheitRootProcessor.process(EntityModel.of(RootTestFactory.create())); + + verify(organisationsEinheitProperties).getZufiSucheUri(); + + } + + @Test + void shouldHaveHref() { + givenFeatureIsEnabled(); + + var model = organisationsEinheitRootProcessor.process(EntityModel.of(RootTestFactory.create())); + + assertThat(model.getLink(OrganisationsEinheitRootProcessor.REL_SEARCH_ORGANISATIONS_EINHEIT)) + .get() + .extracting(Link::getHref) + .isEqualTo(zufiSucheUri); + } + + @Test + void shouldBeTemplated() { + givenFeatureIsEnabled(); + + var model = organisationsEinheitRootProcessor.process(EntityModel.of(RootTestFactory.create())); + + assertThat(model.getLink(OrganisationsEinheitRootProcessor.REL_SEARCH_ORGANISATIONS_EINHEIT)) + .get() + .extracting(Link::isTemplated) + .isEqualTo(true); + } + } + + private void givenFeatureIsEnabled() { + when(featureToggleProperties.isOrganisationsEinheiten()).thenReturn(true); + when(organisationsEinheitProperties.getZufiSucheUri()).thenReturn(zufiSucheUri); + } + + private void givenFeatureIsDisabled() { + when(featureToggleProperties.isOrganisationsEinheiten()).thenReturn(false); } }