Skip to content
Snippets Groups Projects
Commit 76b61cb0 authored by Felix Reichenbach's avatar Felix Reichenbach
Browse files

OZG-3936 fix HalModel building

parent eac0f4df
Branches
Tags
1 merge request!16Ozg 3936 refactor user profile url provider
...@@ -39,6 +39,7 @@ import org.springframework.hateoas.mediatype.hal.HalModelBuilder; ...@@ -39,6 +39,7 @@ import org.springframework.hateoas.mediatype.hal.HalModelBuilder;
import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.hateoas.server.RepresentationModelAssembler;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import de.ozgcloud.alfa.common.LinkedResourceProcessor;
import de.ozgcloud.alfa.common.binaryfile.BinaryFileController; import de.ozgcloud.alfa.common.binaryfile.BinaryFileController;
import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
import de.ozgcloud.alfa.postfach.PostfachMail.Direction; import de.ozgcloud.alfa.postfach.PostfachMail.Direction;
...@@ -78,6 +79,7 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac ...@@ -78,6 +79,7 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac
private final UserManagerUrlProvider userManagerUrlProvider; private final UserManagerUrlProvider userManagerUrlProvider;
private final VorgangController vorgangController; private final VorgangController vorgangController;
private final LinkedResourceProcessor<PostfachMail> linkedResourceProcessor;
public RepresentationModel<EntityModel<PostfachSettings>> toCollectionModel(Stream<PostfachMail> postfachMails, VorgangWithEingang vorgang, public RepresentationModel<EntityModel<PostfachSettings>> toCollectionModel(Stream<PostfachMail> postfachMails, VorgangWithEingang vorgang,
PostfachSettings postfachSettings) { PostfachSettings postfachSettings) {
...@@ -95,7 +97,7 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac ...@@ -95,7 +97,7 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac
return HalModelBuilder return HalModelBuilder
.halModelOf(postfachSettings) .halModelOf(postfachSettings)
.link(linkTo(methodOn(PostfachMailController.class).getAll(vorgang.getId())).withSelfRel()) .link(linkTo(methodOn(PostfachMailController.class).getAll(vorgang.getId())).withSelfRel())
.embed(postfachMails.map(this::toModel)) .embed(postfachMails.map(this::toModel).map(linkedResourceProcessor::process))
.build(); .build();
} }
......
...@@ -37,6 +37,7 @@ import org.springframework.hateoas.server.RepresentationModelAssembler; ...@@ -37,6 +37,7 @@ import org.springframework.hateoas.server.RepresentationModelAssembler;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.util.UriComponentsBuilder; 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.command.CommandController.CommandByRelationController;
import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserId;
...@@ -57,6 +58,7 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent ...@@ -57,6 +58,7 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent
private final CurrentUserService userService; private final CurrentUserService userService;
private final VorgangService vorgangService; private final VorgangService vorgangService;
private final LinkedResourceProcessor<Vorgang> linkedResourceProcessor;
public RepresentationModel<EntityModel<EnhancedVorgang>> toCollectionModel(Stream<VorgangHeader> entities, VorgaengeHeaderResponse response, public RepresentationModel<EntityModel<EnhancedVorgang>> toCollectionModel(Stream<VorgangHeader> entities, VorgaengeHeaderResponse response,
FindVorgaengeHeaderRequestCriteria requestCriteria, Statistic statistic) { FindVorgaengeHeaderRequestCriteria requestCriteria, Statistic statistic) {
...@@ -71,7 +73,7 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent ...@@ -71,7 +73,7 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent
RepresentationModel<EntityModel<EnhancedVorgang>> initModel(Stream<VorgangHeader> entities, Statistic statistic) { RepresentationModel<EntityModel<EnhancedVorgang>> initModel(Stream<VorgangHeader> entities, Statistic statistic) {
return HalModelBuilder.halModelOf(EnhancedVorgang.builder().statistic(statistic).build()) return HalModelBuilder.halModelOf(EnhancedVorgang.builder().statistic(statistic).build())
.link(linkTo(VorgangController.class).withSelfRel()) .link(linkTo(VorgangController.class).withSelfRel())
.embed(entities.map(this::toModel).toList()) .embed(entities.map(this::toModel).map(linkedResourceProcessor::process))
.build(); .build();
} }
......
...@@ -48,6 +48,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -48,6 +48,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; 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.UserId;
import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
import de.ozgcloud.alfa.postfach.PostfachMail.Direction; import de.ozgcloud.alfa.postfach.PostfachMail.Direction;
...@@ -69,6 +70,8 @@ class PostfachMailModelAssemblerTest { ...@@ -69,6 +70,8 @@ class PostfachMailModelAssemblerTest {
private UserManagerUrlProvider userManagerUrlProvider; private UserManagerUrlProvider userManagerUrlProvider;
@Mock @Mock
private VorgangController vorgangController; private VorgangController vorgangController;
@Mock
private LinkedResourceProcessor<PostfachMail> linkedResourceProcessor;
@Nested @Nested
class TestToModel { class TestToModel {
...@@ -352,6 +355,14 @@ class PostfachMailModelAssemblerTest { ...@@ -352,6 +355,14 @@ class PostfachMailModelAssemblerTest {
private final Stream<PostfachMail> mails = Stream.of(postfachMail); private final Stream<PostfachMail> mails = Stream.of(postfachMail);
private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
private final PostfachSettings postfachSettings = PostfachSettingsTestFactory.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 @Test
void shouldHavePostfachAsContent() { void shouldHavePostfachAsContent() {
...@@ -376,15 +387,21 @@ class PostfachMailModelAssemblerTest { ...@@ -376,15 +387,21 @@ class PostfachMailModelAssemblerTest {
verify(modelAssembler).toModel(postfachMail); verify(modelAssembler).toModel(postfachMail);
} }
@Test
void shouldCallLinkedResourceProcessor() {
callModelAssembler();
verify(linkedResourceProcessor).process(entityModel);
}
@Test @Test
@SneakyThrows @SneakyThrows
void shouldContainPostfachMails() { void shouldContainPostfachMails() {
var objectMapper = new ObjectMapper().registerModules(new JavaTimeModule(), new Jdk8Module()); var objectMapper = new ObjectMapper().registerModules(new JavaTimeModule(), new Jdk8Module());
doReturn(EntityModel.of(postfachMail)).when(modelAssembler).toModel(postfachMail);
var model = callModelAssembler(); 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() { private RepresentationModel<EntityModel<PostfachSettings>> callModelAssembler() {
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
package de.ozgcloud.alfa.vorgang; package de.ozgcloud.alfa.vorgang;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import java.util.Collections; import java.util.Collections;
...@@ -32,6 +33,7 @@ import java.util.Optional; ...@@ -32,6 +33,7 @@ import java.util.Optional;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
...@@ -42,10 +44,17 @@ import org.springframework.hateoas.EntityModel; ...@@ -42,10 +44,17 @@ import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.IanaLinkRelations; import org.springframework.hateoas.IanaLinkRelations;
import org.springframework.hateoas.Link; 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.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
import de.ozgcloud.alfa.common.user.UserRole; import de.ozgcloud.alfa.common.user.UserRole;
import de.ozgcloud.alfa.statistic.Statistic;
import de.ozgcloud.alfa.statistic.StatisticTestFactory; import de.ozgcloud.alfa.statistic.StatisticTestFactory;
import lombok.SneakyThrows;
class VorgangModelAssemblerTest { class VorgangModelAssemblerTest {
...@@ -56,6 +65,8 @@ class VorgangModelAssemblerTest { ...@@ -56,6 +65,8 @@ class VorgangModelAssemblerTest {
private CurrentUserService userService; private CurrentUserService userService;
@Mock @Mock
private VorgangService vorgangService; private VorgangService vorgangService;
@Mock
private LinkedResourceProcessor<Vorgang> linkedResourceProcessor;
private static final int PAGE_SIZE = 100; private static final int PAGE_SIZE = 100;
...@@ -172,6 +183,54 @@ class VorgangModelAssemblerTest { ...@@ -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") @DisplayName("Build page link")
@Nested @Nested
class TestBuildPageLink { class TestBuildPageLink {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment