From cc311f0b257df385dc42f62a35204e5936078e7b Mon Sep 17 00:00:00 2001 From: "Zickermann, Jan" <jan.zickermann@dataport.de> Date: Mon, 29 Jan 2024 17:40:03 +0100 Subject: [PATCH] OZG-4814 OZG-4840 Apply comments of review --- pom.xml | 2 - ...ConfigurationParameterRestRepository.java} | 14 ++-- .../ConfigurationParameters.java} | 10 +-- .../ParamsConstants.java} | 17 ++--- .../java/de/ozgcloud/admin/ApiRootITCase.java | 74 ++++++++++++------- .../admin/dummy/DummyServiceITCase.java | 64 ---------------- .../admin/dummy/DummyServiceTest.java | 70 ------------------ .../ConfigurationParameterRestITCase.java} | 56 +++++++------- ...org.mockito.junit.jupiter.MockitoExtension | 1 + src/test/resources/junit-platform.properties | 1 + 10 files changed, 93 insertions(+), 216 deletions(-) rename src/main/java/de/ozgcloud/admin/{dummy/DummyRepository.java => params/ConfigurationParameterRestRepository.java} (76%) rename src/main/java/de/ozgcloud/admin/{dummy/Dummy.java => params/ConfigurationParameters.java} (88%) rename src/main/java/de/ozgcloud/admin/{dummy/DummyService.java => params/ParamsConstants.java} (72%) delete mode 100644 src/test/java/de/ozgcloud/admin/dummy/DummyServiceITCase.java delete mode 100644 src/test/java/de/ozgcloud/admin/dummy/DummyServiceTest.java rename src/test/java/de/ozgcloud/admin/{dummy/DummyRepositoryITCase.java => params/ConfigurationParameterRestITCase.java} (57%) create mode 100644 src/test/resources/META-INF/spring/org.mockito.junit.jupiter.MockitoExtension create mode 100644 src/test/resources/junit-platform.properties diff --git a/pom.xml b/pom.xml index 3af917d6..53231196 100644 --- a/pom.xml +++ b/pom.xml @@ -63,13 +63,11 @@ <dependency> <groupId>org.testcontainers</groupId> <artifactId>mongodb</artifactId> - <version>1.19.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testcontainers</groupId> <artifactId>junit-jupiter</artifactId> - <version>1.19.3</version> <scope>test</scope> </dependency> </dependencies> diff --git a/src/main/java/de/ozgcloud/admin/dummy/DummyRepository.java b/src/main/java/de/ozgcloud/admin/params/ConfigurationParameterRestRepository.java similarity index 76% rename from src/main/java/de/ozgcloud/admin/dummy/DummyRepository.java rename to src/main/java/de/ozgcloud/admin/params/ConfigurationParameterRestRepository.java index 9e271534..4e973cdd 100644 --- a/src/main/java/de/ozgcloud/admin/dummy/DummyRepository.java +++ b/src/main/java/de/ozgcloud/admin/params/ConfigurationParameterRestRepository.java @@ -19,15 +19,15 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.admin.dummy; - -import java.util.Optional; +package de.ozgcloud.admin.params; import org.springframework.data.mongodb.repository.MongoRepository; -import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RepositoryRestResource; -@RepositoryRestResource(collectionResourceRel = "dummies", path = "dummy") -public interface DummyRepository extends MongoRepository<Dummy, String> { - Optional<Dummy> findFirstByDummyName(@Param("name") String name); +@RepositoryRestResource( + collectionResourceRel = ParamsConstants.REL, + path = ParamsConstants.PATH +) +public interface ConfigurationParameterRestRepository extends MongoRepository<ConfigurationParameters, String> { + } diff --git a/src/main/java/de/ozgcloud/admin/dummy/Dummy.java b/src/main/java/de/ozgcloud/admin/params/ConfigurationParameters.java similarity index 88% rename from src/main/java/de/ozgcloud/admin/dummy/Dummy.java rename to src/main/java/de/ozgcloud/admin/params/ConfigurationParameters.java index 532aa234..90e6f707 100644 --- a/src/main/java/de/ozgcloud/admin/dummy/Dummy.java +++ b/src/main/java/de/ozgcloud/admin/params/ConfigurationParameters.java @@ -19,14 +19,14 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.admin.dummy; +package de.ozgcloud.admin.params; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; -@Document(collection = "dummyy") -public record Dummy( - @Id String dummyName, - Number dummyNumber +@Document +public record ConfigurationParameters( + @Id + String id ) { } diff --git a/src/main/java/de/ozgcloud/admin/dummy/DummyService.java b/src/main/java/de/ozgcloud/admin/params/ParamsConstants.java similarity index 72% rename from src/main/java/de/ozgcloud/admin/dummy/DummyService.java rename to src/main/java/de/ozgcloud/admin/params/ParamsConstants.java index f1f3c84f..73d57ddc 100644 --- a/src/main/java/de/ozgcloud/admin/dummy/DummyService.java +++ b/src/main/java/de/ozgcloud/admin/params/ParamsConstants.java @@ -19,19 +19,14 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.admin.dummy; +package de.ozgcloud.admin.params; -import org.springframework.stereotype.Service; +class ParamsConstants { -import lombok.AllArgsConstructor; - -@Service -@AllArgsConstructor -public class DummyService { + private ParamsConstants() { + } - private final DummyRepository repository; + static final String REL = "params"; - public Number dummyNumberOrZero(String name) { - return repository.findFirstByDummyName(name).map(Dummy::dummyNumber).orElse(0); - } + static final String PATH = "param"; } diff --git a/src/test/java/de/ozgcloud/admin/ApiRootITCase.java b/src/test/java/de/ozgcloud/admin/ApiRootITCase.java index 5dfe66fd..52965bd4 100644 --- a/src/test/java/de/ozgcloud/admin/ApiRootITCase.java +++ b/src/test/java/de/ozgcloud/admin/ApiRootITCase.java @@ -21,48 +21,70 @@ */ package de.ozgcloud.admin; -import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -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.boot.autoconfigure.data.rest.RepositoryRestProperties; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; +import org.springframework.test.web.servlet.ResultActions; import de.ozgcloud.common.test.ITCase; import lombok.SneakyThrows; -/** - * Test that the spring-boot-starter-data-rest dependency is being used and spring.data.rest.basePath == /api - */ @ITCase +@AutoConfigureMockMvc class ApiRootITCase { + @Autowired + RepositoryRestProperties restProperties; + + @Autowired private MockMvc mockMvc; - @BeforeEach - void setup(WebApplicationContext context) { - mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); - } + @Nested + class TestRootEndpoint { - @Test - @SneakyThrows - void shouldHaveRESTApiRootEndpoint() { - mockMvc.perform(get("/api")) - .andExpect(status().isOk()) - .andExpect(content().contentType("application/hal+json")) - .andExpect(jsonPath("$._links.profile.href", endsWith("/api/profile"))); - } + @Test + void shouldBetSetToApi() { + assertEquals("/api", restProperties.getBasePath()); + } + + @Test + @SneakyThrows + void shouldHaveStatusOk() { + var result = doPerform(); + + result.andExpect(status().isOk()); + } + + @Test + @SneakyThrows + void shouldHaveHALApplicationType() { + var result = doPerform(); + + result.andExpect(content().contentType("application/hal+json")); + } + + @Test + @SneakyThrows + void shouldHaveStandardProfileLink() { + var result = doPerform(); + + result.andExpect( + jsonPath("$._links.profile.href") + .value("http://localhost" + restProperties.getBasePath() + "/profile") + ); + } - @Test - @SneakyThrows - void shouldHaveRESTApiProfileEndpoint() { - mockMvc.perform(get("/api/profile")) - .andExpect(status().isOk()) - .andExpect(content().contentType("application/hal+json")) - .andExpect(jsonPath("$._links.self.href", endsWith("/api/profile"))); + @SneakyThrows + private ResultActions doPerform() { + return mockMvc.perform(get(restProperties.getBasePath())); + } } } \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/admin/dummy/DummyServiceITCase.java b/src/test/java/de/ozgcloud/admin/dummy/DummyServiceITCase.java deleted file mode 100644 index 76a6a386..00000000 --- a/src/test/java/de/ozgcloud/admin/dummy/DummyServiceITCase.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch das Ministerium für Energiewende, Klimaschutz, Umwelt und Natur - * Zentrales IT-Management - * - * 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.admin.dummy; - -import static org.assertj.core.api.Assertions.*; - -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.data.mongodb.core.MongoOperations; - -import de.ozgcloud.common.test.DataITCase; - -@DataITCase -class DummyServiceITCase { - - @Autowired - private DummyService service; - - @Autowired - private MongoOperations mongoOperations; - - @Nested - class TestDummyNumber { - - @BeforeEach - void init() { - mongoOperations.dropCollection(Dummy.class); - mongoOperations.save(new Dummy("first", 1)); - mongoOperations.save(new Dummy("first2", 2)); - } - - @Test - void shouldFindDummyNumber() { - assertThat(service.dummyNumberOrZero("first")).isEqualTo(1); - } - - @Test - void shouldFindNoDummyNumber() { - assertThat(service.dummyNumberOrZero("unknown").intValue()).isZero(); - } - } - -} \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/admin/dummy/DummyServiceTest.java b/src/test/java/de/ozgcloud/admin/dummy/DummyServiceTest.java deleted file mode 100644 index 570c5062..00000000 --- a/src/test/java/de/ozgcloud/admin/dummy/DummyServiceTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch das Ministerium für Energiewende, Klimaschutz, Umwelt und Natur - * Zentrales IT-Management - * - * 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.admin.dummy; - -import static org.assertj.core.api.AssertionsForClassTypes.*; -import static org.mockito.Mockito.*; - -import java.util.Optional; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; - -@ExtendWith(MockitoExtension.class) -class DummyServiceTest { - - @Spy - @InjectMocks - private DummyService service; - - @Mock - private DummyRepository repository; - - @Nested - class TestDummyFunc { - @Test - void shouldHandleSome() { - var dummy = createDummy(); - when(repository.findFirstByDummyName(dummy.dummyName())).thenReturn(Optional.of(dummy)); - - assertThat(service.dummyNumberOrZero(dummy.dummyName())).isEqualTo(dummy.dummyNumber()); - } - - @Test - void shouldHandleNone() { - var dummy = createDummy(); - when(repository.findFirstByDummyName(dummy.dummyName())).thenReturn(Optional.empty()); - - assertThat(service.dummyNumberOrZero(dummy.dummyName()).intValue()).isZero(); - } - } - - private Dummy createDummy() { - return new Dummy("test", 1); - } - -} \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/admin/dummy/DummyRepositoryITCase.java b/src/test/java/de/ozgcloud/admin/params/ConfigurationParameterRestITCase.java similarity index 57% rename from src/test/java/de/ozgcloud/admin/dummy/DummyRepositoryITCase.java rename to src/test/java/de/ozgcloud/admin/params/ConfigurationParameterRestITCase.java index f09e1428..f019721f 100644 --- a/src/test/java/de/ozgcloud/admin/dummy/DummyRepositoryITCase.java +++ b/src/test/java/de/ozgcloud/admin/params/ConfigurationParameterRestITCase.java @@ -19,9 +19,8 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.admin.dummy; +package de.ozgcloud.admin.params; -import static org.hamcrest.Matchers.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -29,65 +28,60 @@ 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.boot.autoconfigure.data.rest.RepositoryRestProperties; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.http.HttpStatus; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; +import org.springframework.test.web.servlet.ResultActions; import de.ozgcloud.common.test.DataITCase; import lombok.SneakyThrows; @DataITCase -class DummyRepositoryITCase { +@AutoConfigureMockMvc +class ConfigurationParameterRestITCase { + @Autowired private MockMvc mockMvc; @Autowired private MongoOperations mongoOperations; - @BeforeEach - void setup(WebApplicationContext context) { - mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); - } + @Autowired + RepositoryRestProperties restProperties; @Nested - class TestDummyNumber { + class TestRestRepo { @BeforeEach void init() { - mongoOperations.dropCollection(Dummy.class); - mongoOperations.save(new Dummy("first", 1)); - mongoOperations.save(new Dummy("first2", 2)); + mongoOperations.dropCollection(ConfigurationParameters.class); + mongoOperations.save(new ConfigurationParameters("first")); + mongoOperations.save(new ConfigurationParameters("first2")); } @Test @SneakyThrows - void shouldFindFirstDummy() { - mockMvc.perform(get("/api/dummy/search/findFirstByDummyName").param("name", "first")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.dummyNumber", equalTo(1))); - } + void shouldFindExistingParam() { + var result = doPerform("first"); - @Test - @SneakyThrows - void shouldNotFindUnknown() { - mockMvc.perform(get("/api/dummy/search/findFirstByDummyName").param("name", "unknown")) - .andExpect(status().is(404)); + result.andExpect(status().isOk()); } @Test @SneakyThrows - void shouldFindDummyNumber() { - mockMvc.perform(get("/api/dummy/first")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.dummyNumber", equalTo(1))); + void shouldNotFindUnknownParam() { + var result = doPerform("unknown"); + + result.andExpect(status().is(HttpStatus.NOT_FOUND.value())); } - @Test @SneakyThrows - void shouldGiveNotFoundStatus() { - mockMvc.perform(get("/api/dummy/unknown")) - .andExpect(status().is(404)); + private ResultActions doPerform(String id) { + return mockMvc.perform( + get(String.join("/", restProperties.getBasePath(), ParamsConstants.PATH, id)) + ); } } diff --git a/src/test/resources/META-INF/spring/org.mockito.junit.jupiter.MockitoExtension b/src/test/resources/META-INF/spring/org.mockito.junit.jupiter.MockitoExtension new file mode 100644 index 00000000..79b126e6 --- /dev/null +++ b/src/test/resources/META-INF/spring/org.mockito.junit.jupiter.MockitoExtension @@ -0,0 +1 @@ +org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/src/test/resources/junit-platform.properties b/src/test/resources/junit-platform.properties new file mode 100644 index 00000000..b059a65d --- /dev/null +++ b/src/test/resources/junit-platform.properties @@ -0,0 +1 @@ +junit.jupiter.extensions.autodetection.enabled=true \ No newline at end of file -- GitLab