diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/information/InfoManagerProperties.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InfoManagerProperties.java index 1cd0f36ff7c553b0a52ea3f3020cedb2b5617a9a..18c39e699d56e7db2d7d8fbe9b7f1fc8c1eb4210 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/information/InfoManagerProperties.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InfoManagerProperties.java @@ -21,14 +21,19 @@ package de.ozgcloud.info.information; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.ConfigurationPropertiesScan; import org.springframework.context.annotation.Configuration; import lombok.Getter; +import lombok.Setter; @Getter +@Setter @Configuration @ConfigurationProperties(prefix = InfoManagerProperties.PREFIX) +@ConfigurationPropertiesScan public class InfoManagerProperties { static final String PREFIX = "ozgcloud.infomanager"; - private final String postfachIdKeyName = "postkorbhandle"; + public static final String POSTKORBHANDLE = "postkorbhandle"; + private String postfachIdKeyName = POSTKORBHANDLE; } diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java index 4bae8077690e8f41248ec23576e321846cdeb574..dea916356a1f30a8238f84fcadb1ff69760b294d 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java @@ -57,18 +57,16 @@ public class NachrichtGrpcService extends NachrichtServiceGrpc.NachrichtServiceI private void saveNachricht(GrpcNewNachrichtRequest request) { var nachricht = nachrichtenMapper.fromGrpcNachricht(request.getNachricht()); - if (isValid(nachricht)) { - nachrichtService.save(nachricht); - } + checkForValidity(nachricht); + + nachrichtService.save(nachricht); } - private boolean isValid(NachrichtEvent nachrichtEvent) { + private void checkForValidity(NachrichtEvent nachrichtEvent) { Set<ConstraintViolation<NachrichtEvent>> violations = validator.validate(nachrichtEvent); if (!violations.isEmpty()) { throw new ConstraintViolationException(violations); } - - return true; } @Override diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtMapper.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtMapper.java index 9c818ed736440b54d1abf8ea015c18b761c87497..d4797e5cf3039dbb8917f7d619af740d163bfec6 100644 --- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtMapper.java +++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtMapper.java @@ -32,8 +32,9 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor class NachrichtMapper { static final String LOCAL_PROFILE = "local"; - private static final String NACHRICHTEN_LIST_URL_REGEX = "^[A-Za-z\\d-]+(\\.[A-Za-z\\d-]+){0,512}:\\d{1,5}$"; - static final String NACHRICHTEN_LIST_URL_FORMAT = "dns:///%s"; + private static final String NACHRICHTEN_LIST_URL_REGEX = "^(dns:///)?[A-Za-z\\d-]+(\\.[A-Za-z\\d-]+){0,512}:\\d{1,5}$"; + static final String DNS_PREFIX = "dns:///"; + static final String NACHRICHTEN_LIST_URL_FORMAT = DNS_PREFIX + "%s"; private final Environment environment; @@ -54,6 +55,6 @@ class NachrichtMapper { throw new InvalidNachrichtenListUrlException(nachrichtenListUrl); } - return String.format(NACHRICHTEN_LIST_URL_FORMAT, nachrichtenListUrl); + return nachrichtenListUrl.startsWith(DNS_PREFIX) ? nachrichtenListUrl : NACHRICHTEN_LIST_URL_FORMAT.formatted(nachrichtenListUrl); } } diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java index bece6d4ca6823e7e9fc882c82e6451ee81e13f00..5ccbd9a68e1b9dcece9f6c9e55e74d08f9d8b1e3 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java @@ -22,6 +22,7 @@ */ package de.ozgcloud.info; +import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Spy; @@ -29,4 +30,9 @@ class InfoManagerApplicationTest { @Spy @InjectMocks private InfoManagerApplication application; + + @Test + void shouldLoadContext() { //NOSONAR + // empty + } } \ No newline at end of file diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java b/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java index e263d684a09aa7448b811b99e27b239214052c86..2e8e4632e2ca7298c6c8773f27732ae92fdedd47 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java @@ -34,6 +34,7 @@ public class NachrichtEventTestFactory { public static final String POSTKORB_HANDLE = UserTestFactory.POSTKORB_HANDLE; public static final String EMPTY_POSTFACH_HANDLE = "73228744-a28a-4485-845b-d8cc02422760"; public static final String URL = "localhost:6789"; + public static final String URL_WITH_DNS = "dns:///" + URL; public static NachrichtEvent createNachrichtEvent() { return createNachrichtEventBuilder().build(); @@ -47,7 +48,11 @@ public class NachrichtEventTestFactory { } public static GrpcNewNachrichtRequest createNewNachrichtRequest() { - return GrpcNewNachrichtRequest.newBuilder().setNachricht(createGrpcNachricht()).build(); + return createNewNachrichtRequestBuilder().setNachricht(createGrpcNachricht()).build(); + } + + public static GrpcNewNachrichtRequest.Builder createNewNachrichtRequestBuilder() { + return GrpcNewNachrichtRequest.newBuilder().setNachricht(createGrpcNachricht()); } public static GrpcFinishedNachrichtRequest createFinishNachrichtRequest() { diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/information/InfoManagerPropertiesITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InfoManagerPropertiesITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..04e51e55fecae5e6e266b3aabc2364b69d7580ac --- /dev/null +++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InfoManagerPropertiesITCase.java @@ -0,0 +1,54 @@ +package de.ozgcloud.info.information; + +import static de.ozgcloud.info.information.InfoManagerProperties.*; +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +import de.ozgcloud.common.test.ITCase; + +@SpringBootTest(classes = { InfoManagerProperties.class }) +@ITCase +class InfoManagerPropertiesITCase { + @TestPropertySource(properties = { + InfoManagerProperties.PREFIX + ".postfachIdKeyName" + "=" + TestLoadingConfiguration.OTHER_POSTFACH_KEY, + }) + @Nested + class TestLoadingConfiguration { + static final String OTHER_POSTFACH_KEY = "otherPostfachKey"; + + @Autowired + private InfoManagerProperties infoManagerProperties; + + @Test + void shouldHaveProperties() { + assertThat(infoManagerProperties).isNotNull(); + } + + @Test + void testPostfachHandleKey() { + assertThat(infoManagerProperties.getPostfachIdKeyName()).isEqualTo(OTHER_POSTFACH_KEY); + } + } + + @Nested + class TestLoadingDefaultConfiguration { + + @Autowired + private InfoManagerProperties infoManagerProperties; + + @Test + void shouldHaveProperties() { + assertThat(infoManagerProperties).isNotNull(); + } + + @Test + void testPostfachHandleKey() { + assertThat(infoManagerProperties.getPostfachIdKeyName()).isEqualTo(POSTKORBHANDLE); + } + } +} \ No newline at end of file diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java index 223e74bba19796799218cdf4ea40c69a1c5a3a17..5c31a181c4312cabd72a6ea6984df1908fa7b790 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.*; import java.util.Set; +import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.Validator; @@ -129,6 +130,33 @@ class NachrichtenGrpcServiceTest { } } + @Nested + class TestSaveInvalidNewNachrichtEvent { + @Mock + private StreamObserver<GrpcNewNachrichtReply> newNachrichtStreamObserver; + private final GrpcNachricht invalidNachricht = NachrichtEventTestFactory.createGrpcNachrichtBuilder().setNachrichtenListUrl("invalid") + .build(); + private final GrpcNewNachrichtRequest invalidNachrichtRequest = NachrichtEventTestFactory.createNewNachrichtRequestBuilder() + .setNachricht(invalidNachricht).build(); + + @BeforeEach + @SuppressWarnings("unchecked") + void init() { + when(nachrichtenMapper.fromGrpcNachricht(any())).thenReturn( + NachrichtEventTestFactory.createNachrichtEventBuilder().id(null).nachrichtenListUrl("invalid").build()); + var constraintViolation = mock(ConstraintViolation.class); + + when(validator.validate(any(NachrichtEvent.class))).thenReturn(Set.of(constraintViolation)); + } + + @Test + void shouldNotCreateNachrichtBecauseInvalidNachrichtenListUrl() { + nachrichtenGrpcService.saveNewNachricht(invalidNachrichtRequest, newNachrichtStreamObserver); + + verify(nachrichtenService, never()).save(any()); + } + } + @Nested class TestFinishNachrichtEvent { @Mock diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java index 958b0233da5868c6224ee81741fa915e463fa388..0d9be84c0c221ff1304ca00a0150598379a74c61 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java @@ -25,6 +25,7 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -93,32 +94,39 @@ class NachrichtenMapperTest { assertThat(result).isEqualTo(NachrichtEventTestFactory.URL); } - @Test - void shouldHaveValidFormat() { - var grpcNachricht = NachrichtEventTestFactory.createGrpcNachricht(); - var expectedNachrichtenListUrl = String.format(NACHRICHTEN_LIST_URL_FORMAT, NachrichtEventTestFactory.URL); - var result = nachrichtenMapper.getNachrichtenListUrl(grpcNachricht); - - assertThat(result).isEqualTo(expectedNachrichtenListUrl); - } - - @Test - void shouldHaveValidSubdomainFormat() { - var url = "test.example.com:20"; + @DisplayName("should have valid format when") + @ParameterizedTest(name = "url: {0}") + @ValueSource(strings = { NachrichtEventTestFactory.URL, NachrichtEventTestFactory.URL_WITH_DNS, "test.example.com:20" }) + void shouldHaveValidFormat(String url) { var grpcNachricht = NachrichtEventTestFactory.createGrpcNachrichtBuilder().setNachrichtenListUrl(url).build(); - var expectedNachrichtenListUrl = String.format(NACHRICHTEN_LIST_URL_FORMAT, url); - var result = nachrichtenMapper.getNachrichtenListUrl(grpcNachricht); - assertThat(result).isEqualTo(expectedNachrichtenListUrl); + assertThatNoException().isThrownBy(() -> nachrichtenMapper.getNachrichtenListUrl(grpcNachricht)); } @ParameterizedTest - @ValueSource(strings = { "invalidUrl", "%test%:2345", "localhost:234567" }) + @ValueSource(strings = { "invalidUrl", "%test%:2345", "localhost:234567", "dns://host:9090" }) void shouldHaveInvalidFormat(String url) { var grpcNachricht = NachrichtEventTestFactory.createGrpcNachrichtBuilder().setNachrichtenListUrl(url).build(); assertThatExceptionOfType(InvalidNachrichtenListUrlException.class).isThrownBy( () -> nachrichtenMapper.getNachrichtenListUrl(grpcNachricht)); } + + @Test + void shouldAddDnsPrefix() { + var result = nachrichtenMapper.getNachrichtenListUrl(NachrichtEventTestFactory.createGrpcNachricht()); + + assertThat(result).isEqualTo(NachrichtEventTestFactory.URL_WITH_DNS); + } + + @Test + void shouldNotAddDnsPrefix() { + var grpcNachricht = NachrichtEventTestFactory.createGrpcNachrichtBuilder().setNachrichtenListUrl(NachrichtEventTestFactory.URL_WITH_DNS) + .build(); + + var result = nachrichtenMapper.getNachrichtenListUrl(grpcNachricht); + + assertThat(result).isEqualTo(NachrichtEventTestFactory.URL_WITH_DNS); + } } } \ No newline at end of file diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java index 38d8a14bf966ac47d9b055a74008a84c99d54eec..d93e6e6b1ad52c59277b98ca69742b7893d7bef5 100644 --- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java +++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java @@ -94,6 +94,10 @@ class NachrichtenServiceTest { class TestFinishNachrichtEvent { @Test void shouldCallDelete() { + when( + repository.findByPostfachIdAndNachrichtenListUrl(NachrichtEventTestFactory.POSTKORB_HANDLE, NachrichtEventTestFactory.URL)).thenReturn( + Optional.of(NachrichtEventTestFactory.createNachrichtEvent())); + service.finish(NachrichtEventTestFactory.createNachrichtEvent()); verify(repository, atMostOnce()).findByPostfachIdAndNachrichtenListUrl(NachrichtEventTestFactory.POSTKORB_HANDLE,