diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java index ed0f0ee2936cd65ee0e34587616ae67c2af65183..59520565f0a309e9b1a67367fa777fd2f7b36bf4 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializer.java @@ -29,6 +29,7 @@ import java.util.Collection; import org.apache.commons.lang3.reflect.ConstructorUtils; import org.springframework.hateoas.Link; +import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; @@ -36,29 +37,37 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; -@NoArgsConstructor +@Component +@RequiredArgsConstructor public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> implements ContextualSerializer { + private final UserManagerUrlProvider userManagerUrlProvider; + private LinkedUserProfileResource annotation; - private LinkedUserProfileResourceSerializer(LinkedUserProfileResource annotation) { - this.annotation = annotation; + private static LinkedUserProfileResourceSerializer createContectualSerializer(UserManagerUrlProvider userManagerUrlProvider, LinkedUserProfileResource annotation) { + var serializer = new LinkedUserProfileResourceSerializer(userManagerUrlProvider); + serializer.annotation = annotation; + return serializer; } @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) { - return new LinkedUserProfileResourceSerializer(property.getAnnotation(LinkedUserProfileResource.class)); + return LinkedUserProfileResourceSerializer.createContectualSerializer(userManagerUrlProvider, property.getAnnotation(LinkedUserProfileResource.class)); } String buildLink(Object id) { - if (UserProfileUrlProvider.isConfigured()) { - return Link.of(UserProfileUrlProvider.getUrl(getExtractor().extractId(id))).getHref(); - } else { - return id.toString(); - } + return userManagerUrlProvider.isConfiguredForUserProfile() ? + Link.of(buildUserProfileUri(id.toString())).getHref() : + String.valueOf(id); + } + + private String buildUserProfileUri(String id) { + return String.format(userManagerUrlProvider.getUserProfileTemplate(), getExtractor().extractId(id)); } IdExtractor<Object> getExtractor() { diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..2879f2297de17fb3a0bbf327c2285b29f52805ee --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerITCase.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.alfa.common; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; +import de.ozgcloud.alfa.common.user.UserProfileTestFactory; +import de.ozgcloud.common.test.ITCase; + +@ITCase +class LinkedUserProfileResourceSerializerITCase { + + @MockitoBean + private UserManagerUrlProvider userManagerUrlProvider; + + @Autowired + private ObjectMapper objectMapper; + + @Nested + class TestSerialization { + + private final LinkedUserProfileResourceTestObject testObj = new LinkedUserProfileResourceTestObject(UserProfileTestFactory.ID); + + @Nested + class OnIsUrlConfigured { + + private static final String HTTP_LOCALHOST = "http://localhost/"; + private static final String API_TEMPLATE = "api/profile/%s"; + private static final String API_PATH = "api/profile/"; + + @BeforeEach + void init() { + when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(true); + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(HTTP_LOCALHOST + API_TEMPLATE); + } + + @Test + void shouldSerializeToUrl() throws JsonProcessingException { + var serialized = objectMapper.writeValueAsString(testObj); + + assertThat(serialized).isEqualTo("{\"id\":\"" + HTTP_LOCALHOST + API_PATH + UserProfileTestFactory.ID.toString() + "\"}"); + } + } + + @Nested + class OnUrlIsNotConfigured { + + @Test + void shouldSerializeToId() throws JsonProcessingException { + var serialized = objectMapper.writeValueAsString(testObj); + + assertThat(serialized).isEqualTo("{\"id\":\"" + UserProfileTestFactory.ID.toString() + "\"}"); + } + } + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java index 6a7ebb175d136027b76138fa4d0c6aea6544108c..05aefe6e1c4ed6ff64875d4efbd5416ecb46e187 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/LinkedUserProfileResourceSerializerTest.java @@ -1,71 +1,96 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ package de.ozgcloud.alfa.common; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import org.junit.jupiter.api.DisplayName; +import java.util.UUID; + +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; import org.mockito.Mock; -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import org.mockito.Spy; +import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; class LinkedUserProfileResourceSerializerTest { - @DisplayName("Test the json serilization of linked user profile resource annotations") - @Nested - class TestSerialization { - private static final String HTTP_LOCALHOST = "http://localhost/"; - private static final String API_TEMPLATE = "api/profile/%s"; - private static final String API_PATH = "api/profile/"; - private UserProfileUrlProvider provider = new UserProfileUrlProvider(); + @Spy + @InjectMocks + private LinkedUserProfileResourceSerializer serializer; + @Mock + private UserManagerUrlProvider userManagerUrlProvider; - @Mock - private ApplicationContext context; - @Mock - private Environment env; + private static final String USER_PROFILE_URL_TEMPLATE = "DummyUserProfileUrlTemplate/%s"; + + @Nested + class TestBuildLink { @Test - void shouldSerialize() throws JsonProcessingException { - when(env.getProperty(UserProfileUrlProvider.URL_ROOT_KEY)).thenReturn(HTTP_LOCALHOST); - when(env.getProperty(UserProfileUrlProvider.USER_PROFILES_TEMPLATE_KEY)).thenReturn(API_TEMPLATE); - when(context.getEnvironment()).thenReturn(env); - provider.setApplicationContext(context); + void shouldCheckIfUrlIsConfigured() { + buildLink(); + + verify(userManagerUrlProvider).isConfiguredForUserProfile(); + } + + @Nested + class OnUrlIsConfigured { + + private static final String EXTRACTED_ID = UUID.randomUUID().toString(); + + @Mock + private IdExtractor<Object> extractor; - var testObj = new LinkedUserProfileResourceTestObject(UserProfileTestFactory.ID); + @BeforeEach + void init() { + when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(true); + when(userManagerUrlProvider.getUserProfileTemplate()).thenReturn(USER_PROFILE_URL_TEMPLATE); + doReturn(extractor).when(serializer).getExtractor(); + when(extractor.extractId(any())).thenReturn(EXTRACTED_ID); + } - String serialized = new ObjectMapper().writeValueAsString(testObj); + @Test + void shouldCallProvider() { + buildLink(); - assertThat(serialized).isEqualTo("{\"id\":\"" + HTTP_LOCALHOST + API_PATH + UserProfileTestFactory.ID.toString() + "\"}"); + verify(userManagerUrlProvider).getUserProfileTemplate(); + } + + @Test + void shouldExtractId() { + buildLink(); + + verify(extractor).extractId(UserProfileTestFactory.ID.toString()); + } + + @Test + void shouldReturnLink() { + var link = buildLink(); + + assertThat(link).isEqualTo("DummyUserProfileUrlTemplate/" + EXTRACTED_ID); + } + } + + @Nested + class OnUriIsNotConfigured { + + @BeforeEach + void init() { + when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(false); + } + + @Test + void shouldReturnStringValueOfId() { + var link = buildLink(); + + assertThat(link).isEqualTo(UserProfileTestFactory.ID.toString()); + } } + private String buildLink() { + return serializer.buildLink(UserProfileTestFactory.ID); + } } }