diff --git a/pom.xml b/pom.xml index 3af917d6d067ae136e18166ce3bcbd96119c4a4f..5323119656c8ab5f8aad55459a8137327a1c53a0 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 9e271534d2a2f6d99c36671ead01c681583c441f..4e973cdd39f612b0d2e285cc5e3aa9bcbc6179e6 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 532aa234f3861ad1db661a3b617d5fc3bce02601..90e6f707e767fea7fa9b8ffc3f66aa71871840ae 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 f1f3c84f8625810245f46654334365e1b5bc1629..73d57ddc3ae8cbd278c47aea564c02373c0a4848 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 5dfe66fd65dc347c072f4711bbbe09d3705b410b..52965bd43add12e290df9474269992899ff90b73 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 76a6a3869391e8a0febf89d8b4dad0eb0910f624..0000000000000000000000000000000000000000 --- 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 570c506255f8e77255a6819fbbeca339664d470b..0000000000000000000000000000000000000000 --- 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 f09e1428faadf4eba69ebab6d321b27e1f9d5871..f019721f2e7292f48ff2c81c38477456903b8221 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 0000000000000000000000000000000000000000..79b126e6cdb86bec1f4f08c205de8961bde1934a --- /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 0000000000000000000000000000000000000000..b059a65dc46792ea5494de02f888ab2ad08cd420 --- /dev/null +++ b/src/test/resources/junit-platform.properties @@ -0,0 +1 @@ +junit.jupiter.extensions.autodetection.enabled=true \ No newline at end of file