Skip to content
Snippets Groups Projects
Commit 83450009 authored by Krzysztof Witukiewicz's avatar Krzysztof Witukiewicz
Browse files

OZG-3936 OZG-7793 Remove UserManagerUrlProvider from serializer

parent 2a403a57
No related branches found
No related tags found
1 merge request!16Ozg 3936 refactor user profile url provider
...@@ -29,6 +29,7 @@ import java.util.Collection; ...@@ -29,6 +29,7 @@ import java.util.Collection;
import org.apache.commons.lang3.reflect.ConstructorUtils; import org.apache.commons.lang3.reflect.ConstructorUtils;
import org.springframework.hateoas.Link; import org.springframework.hateoas.Link;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.BeanProperty;
...@@ -36,29 +37,37 @@ import com.fasterxml.jackson.databind.JsonSerializer; ...@@ -36,29 +37,37 @@ import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer; import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.common.errorhandling.TechnicalException;
import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor;
@NoArgsConstructor @Component
@RequiredArgsConstructor
public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> implements ContextualSerializer { public class LinkedUserProfileResourceSerializer extends JsonSerializer<Object> implements ContextualSerializer {
private final UserManagerUrlProvider userManagerUrlProvider;
private LinkedUserProfileResource annotation; private LinkedUserProfileResource annotation;
private LinkedUserProfileResourceSerializer(LinkedUserProfileResource annotation) { private static LinkedUserProfileResourceSerializer createContectualSerializer(UserManagerUrlProvider userManagerUrlProvider, LinkedUserProfileResource annotation) {
this.annotation = annotation; var serializer = new LinkedUserProfileResourceSerializer(userManagerUrlProvider);
serializer.annotation = annotation;
return serializer;
} }
@Override @Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) { 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) { String buildLink(Object id) {
if (UserProfileUrlProvider.isConfigured()) { return userManagerUrlProvider.isConfiguredForUserProfile() ?
return Link.of(UserProfileUrlProvider.getUrl(getExtractor().extractId(id))).getHref(); Link.of(buildUserProfileUri(id.toString())).getHref() :
} else { String.valueOf(id);
return id.toString();
} }
private String buildUserProfileUri(String id) {
return String.format(userManagerUrlProvider.getUserProfileTemplate(), getExtractor().extractId(id));
} }
IdExtractor<Object> getExtractor() { IdExtractor<Object> getExtractor() {
......
/*
* 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() + "\"}");
}
}
}
}
/*
* 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; package de.ozgcloud.alfa.common;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*; 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.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.springframework.context.ApplicationContext; import org.mockito.Spy;
import org.springframework.core.env.Environment;
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.alfa.common.user.UserProfileTestFactory;
class LinkedUserProfileResourceSerializerTest { class LinkedUserProfileResourceSerializerTest {
@DisplayName("Test the json serilization of linked user profile resource annotations")
@Spy
@InjectMocks
private LinkedUserProfileResourceSerializer serializer;
@Mock
private UserManagerUrlProvider userManagerUrlProvider;
private static final String USER_PROFILE_URL_TEMPLATE = "DummyUserProfileUrlTemplate/%s";
@Nested @Nested
class TestSerialization { class TestBuildLink {
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(); @Test
void shouldCheckIfUrlIsConfigured() {
buildLink();
verify(userManagerUrlProvider).isConfiguredForUserProfile();
}
@Nested
class OnUrlIsConfigured {
private static final String EXTRACTED_ID = UUID.randomUUID().toString();
@Mock @Mock
private ApplicationContext context; private IdExtractor<Object> extractor;
@Mock
private Environment env; @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);
}
@Test
void shouldCallProvider() {
buildLink();
verify(userManagerUrlProvider).getUserProfileTemplate();
}
@Test
void shouldExtractId() {
buildLink();
verify(extractor).extractId(UserProfileTestFactory.ID.toString());
}
@Test @Test
void shouldSerialize() throws JsonProcessingException { void shouldReturnLink() {
when(env.getProperty(UserProfileUrlProvider.URL_ROOT_KEY)).thenReturn(HTTP_LOCALHOST); var link = buildLink();
when(env.getProperty(UserProfileUrlProvider.USER_PROFILES_TEMPLATE_KEY)).thenReturn(API_TEMPLATE);
when(context.getEnvironment()).thenReturn(env); assertThat(link).isEqualTo("DummyUserProfileUrlTemplate/" + EXTRACTED_ID);
provider.setApplicationContext(context); }
}
@Nested
class OnUriIsNotConfigured {
var testObj = new LinkedUserProfileResourceTestObject(UserProfileTestFactory.ID); @BeforeEach
void init() {
when(userManagerUrlProvider.isConfiguredForUserProfile()).thenReturn(false);
}
String serialized = new ObjectMapper().writeValueAsString(testObj); @Test
void shouldReturnStringValueOfId() {
var link = buildLink();
assertThat(serialized).isEqualTo("{\"id\":\"" + HTTP_LOCALHOST + API_PATH + UserProfileTestFactory.ID.toString() + "\"}"); assertThat(link).isEqualTo(UserProfileTestFactory.ID.toString());
}
} }
private String buildLink() {
return serializer.buildLink(UserProfileTestFactory.ID);
}
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment