diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java index d857ac77a073b629badf46eb4462265f2d8aba2e..d1f3b17742b04f08c6f30d4dac6ef11159425724 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java @@ -39,6 +39,7 @@ import org.springframework.hateoas.mediatype.hal.HalModelBuilder; import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; +import de.ozgcloud.alfa.common.LinkedResourceProcessor; import de.ozgcloud.alfa.common.binaryfile.BinaryFileController; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.postfach.PostfachMail.Direction; @@ -78,6 +79,7 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac private final UserManagerUrlProvider userManagerUrlProvider; private final VorgangController vorgangController; + private final LinkedResourceProcessor<PostfachMail> linkedResourceProcessor; public RepresentationModel<EntityModel<PostfachSettings>> toCollectionModel(Stream<PostfachMail> postfachMails, VorgangWithEingang vorgang, PostfachSettings postfachSettings) { @@ -95,7 +97,7 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac return HalModelBuilder .halModelOf(postfachSettings) .link(linkTo(methodOn(PostfachMailController.class).getAll(vorgang.getId())).withSelfRel()) - .embed(postfachMails.map(this::toModel)) + .embed(postfachMails.map(this::toModel).map(linkedResourceProcessor::process)) .build(); } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java index 800829cb556d58a3bc55d030f3b9369d95e7c3ac..205bd81da8557af9393258a1c0c62c560c9d1544 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java @@ -37,6 +37,7 @@ import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.stereotype.Component; import org.springframework.web.util.UriComponentsBuilder; +import de.ozgcloud.alfa.common.LinkedResourceProcessor; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserId; @@ -57,6 +58,7 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent private final CurrentUserService userService; private final VorgangService vorgangService; + private final LinkedResourceProcessor<Vorgang> linkedResourceProcessor; public RepresentationModel<EntityModel<EnhancedVorgang>> toCollectionModel(Stream<VorgangHeader> entities, VorgaengeHeaderResponse response, FindVorgaengeHeaderRequestCriteria requestCriteria, Statistic statistic) { @@ -71,7 +73,7 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent RepresentationModel<EntityModel<EnhancedVorgang>> initModel(Stream<VorgangHeader> entities, Statistic statistic) { return HalModelBuilder.halModelOf(EnhancedVorgang.builder().statistic(statistic).build()) .link(linkTo(VorgangController.class).withSelfRel()) - .embed(entities.map(this::toModel).toList()) + .embed(entities.map(this::toModel).map(linkedResourceProcessor::process)) .build(); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java index 5c8e2874053681408887e2b97e6157456e3c714c..091797403adabd9734b63866c28185033da4e0b7 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java @@ -48,6 +48,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import de.ozgcloud.alfa.common.LinkedResourceProcessor; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.postfach.PostfachMail.Direction; @@ -69,6 +70,8 @@ class PostfachMailModelAssemblerTest { private UserManagerUrlProvider userManagerUrlProvider; @Mock private VorgangController vorgangController; + @Mock + private LinkedResourceProcessor<PostfachMail> linkedResourceProcessor; @Nested class TestToModel { @@ -352,6 +355,14 @@ class PostfachMailModelAssemblerTest { private final Stream<PostfachMail> mails = Stream.of(postfachMail); private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); private final PostfachSettings postfachSettings = PostfachSettingsTestFactory.create(); + private final EntityModel<PostfachMail> entityModel = EntityModel.of(postfachMail); + private final EntityModel<PostfachMail> processedEntityModel = EntityModel.of(postfachMail, Link.of("dummy")); + + @BeforeEach + void mock() { + doReturn(entityModel).when(modelAssembler).toModel(any()); + when(linkedResourceProcessor.process(entityModel)).thenReturn(processedEntityModel); + } @Test void shouldHavePostfachAsContent() { @@ -376,15 +387,21 @@ class PostfachMailModelAssemblerTest { verify(modelAssembler).toModel(postfachMail); } + @Test + void shouldCallLinkedResourceProcessor() { + callModelAssembler(); + + verify(linkedResourceProcessor).process(entityModel); + } + @Test @SneakyThrows void shouldContainPostfachMails() { var objectMapper = new ObjectMapper().registerModules(new JavaTimeModule(), new Jdk8Module()); - doReturn(EntityModel.of(postfachMail)).when(modelAssembler).toModel(postfachMail); var model = callModelAssembler(); - assertThat(objectMapper.writeValueAsString(model)).contains(objectMapper.writeValueAsString(EntityModel.of(postfachMail))); + assertThat(objectMapper.writeValueAsString(model)).contains(objectMapper.writeValueAsString(processedEntityModel)); } private RepresentationModel<EntityModel<PostfachSettings>> callModelAssembler() { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java index 7b9dee67de61a225007517ea68d14440c69b6f6c..7daaae7e4675eaad6587961a5f42994787c3191d 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java @@ -24,6 +24,7 @@ package de.ozgcloud.alfa.vorgang; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Collections; @@ -32,6 +33,7 @@ import java.util.Optional; import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -42,10 +44,17 @@ import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.Link; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +import de.ozgcloud.alfa.common.LinkedResourceProcessor; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.common.user.UserRole; +import de.ozgcloud.alfa.statistic.Statistic; import de.ozgcloud.alfa.statistic.StatisticTestFactory; +import lombok.SneakyThrows; class VorgangModelAssemblerTest { @@ -56,6 +65,8 @@ class VorgangModelAssemblerTest { private CurrentUserService userService; @Mock private VorgangService vorgangService; + @Mock + private LinkedResourceProcessor<Vorgang> linkedResourceProcessor; private static final int PAGE_SIZE = 100; @@ -172,6 +183,54 @@ class VorgangModelAssemblerTest { } } + @Nested + class TestInitModel { + + private static final Link DUMMY_LINK = Link.of("dummy"); + private final VorgangHeader vorgangHeader = VorgangHeaderTestFactory.create(); + private final Stream<VorgangHeader> entities = Stream.of(vorgangHeader); + private final Statistic statistic = StatisticTestFactory.create(); + private final EntityModel<Vorgang> entityModel = EntityModel.of(vorgangHeader); + private final EntityModel<Vorgang> processedEntityModel = EntityModel.of(vorgangHeader, DUMMY_LINK); + + @BeforeEach + void mock() { + doReturn(entityModel).when(modelAssembler).toModel(any()); + when(linkedResourceProcessor.process(any())).thenReturn(processedEntityModel); + } + + @Test + void shouldHaveSelfLink() { + var model = modelAssembler.initModel(entities, statistic); + + assertThat(model.getLink(IanaLinkRelations.SELF_VALUE)).get().extracting(Link::getHref).isEqualTo(VorgangController.PATH); + } + + @Test + void shouldCallToModel() { + modelAssembler.initModel(entities, statistic); + + verify(modelAssembler).toModel(vorgangHeader); + } + + @Test + void shouldCallLinkedResourceProcessor() { + modelAssembler.initModel(entities, statistic); + + verify(linkedResourceProcessor).process(entityModel); + } + + @Test + @SneakyThrows + void shouldContainProcessedEntity() { + var mapper = new ObjectMapper().registerModules(new JavaTimeModule(), new Jdk8Module()); + + var model = mapper.writeValueAsString(modelAssembler.initModel(entities, statistic)); + + assertThat(model).contains(mapper.writeValueAsString(processedEntityModel)); + } + } + @DisplayName("Build page link") @Nested class TestBuildPageLink {