Skip to content
Snippets Groups Projects
Commit cc311f0b authored by Jan Zickermann's avatar Jan Zickermann
Browse files

OZG-4814 OZG-4840 Apply comments of review

parent 55e30bca
Branches
Tags
No related merge requests found
Showing with 93 additions and 216 deletions
...@@ -63,13 +63,11 @@ ...@@ -63,13 +63,11 @@
<dependency> <dependency>
<groupId>org.testcontainers</groupId> <groupId>org.testcontainers</groupId>
<artifactId>mongodb</artifactId> <artifactId>mongodb</artifactId>
<version>1.19.3</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.testcontainers</groupId> <groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId> <artifactId>junit-jupiter</artifactId>
<version>1.19.3</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
......
...@@ -19,15 +19,15 @@ ...@@ -19,15 +19,15 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.admin.dummy; package de.ozgcloud.admin.params;
import java.util.Optional;
import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource; import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource(collectionResourceRel = "dummies", path = "dummy") @RepositoryRestResource(
public interface DummyRepository extends MongoRepository<Dummy, String> { collectionResourceRel = ParamsConstants.REL,
Optional<Dummy> findFirstByDummyName(@Param("name") String name); path = ParamsConstants.PATH
)
public interface ConfigurationParameterRestRepository extends MongoRepository<ConfigurationParameters, String> {
} }
...@@ -19,14 +19,14 @@ ...@@ -19,14 +19,14 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * 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.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "dummyy") @Document
public record Dummy( public record ConfigurationParameters(
@Id String dummyName, @Id
Number dummyNumber String id
) { ) {
} }
...@@ -19,19 +19,14 @@ ...@@ -19,19 +19,14 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * 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; private ParamsConstants() {
}
@Service
@AllArgsConstructor
public class DummyService {
private final DummyRepository repository; static final String REL = "params";
public Number dummyNumberOrZero(String name) { static final String PATH = "param";
return repository.findFirstByDummyName(name).map(Dummy::dummyNumber).orElse(0);
}
} }
...@@ -21,48 +21,70 @@ ...@@ -21,48 +21,70 @@
*/ */
package de.ozgcloud.admin; 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.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; 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.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.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.test.web.servlet.ResultActions;
import org.springframework.web.context.WebApplicationContext;
import de.ozgcloud.common.test.ITCase; import de.ozgcloud.common.test.ITCase;
import lombok.SneakyThrows; import lombok.SneakyThrows;
/**
* Test that the spring-boot-starter-data-rest dependency is being used and spring.data.rest.basePath == /api
*/
@ITCase @ITCase
@AutoConfigureMockMvc
class ApiRootITCase { class ApiRootITCase {
@Autowired
RepositoryRestProperties restProperties;
@Autowired
private MockMvc mockMvc; private MockMvc mockMvc;
@BeforeEach @Nested
void setup(WebApplicationContext context) { class TestRootEndpoint {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
@Test
void shouldBetSetToApi() {
assertEquals("/api", restProperties.getBasePath());
} }
@Test @Test
@SneakyThrows @SneakyThrows
void shouldHaveRESTApiRootEndpoint() { void shouldHaveStatusOk() {
mockMvc.perform(get("/api")) var result = doPerform();
.andExpect(status().isOk())
.andExpect(content().contentType("application/hal+json")) result.andExpect(status().isOk());
.andExpect(jsonPath("$._links.profile.href", endsWith("/api/profile")));
} }
@Test @Test
@SneakyThrows @SneakyThrows
void shouldHaveRESTApiProfileEndpoint() { void shouldHaveHALApplicationType() {
mockMvc.perform(get("/api/profile")) var result = doPerform();
.andExpect(status().isOk())
.andExpect(content().contentType("application/hal+json")) result.andExpect(content().contentType("application/hal+json"));
.andExpect(jsonPath("$._links.self.href", endsWith("/api/profile"))); }
@Test
@SneakyThrows
void shouldHaveStandardProfileLink() {
var result = doPerform();
result.andExpect(
jsonPath("$._links.profile.href")
.value("http://localhost" + restProperties.getBasePath() + "/profile")
);
}
@SneakyThrows
private ResultActions doPerform() {
return mockMvc.perform(get(restProperties.getBasePath()));
}
} }
} }
\ No newline at end of file
/*
* 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
/*
* 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
...@@ -19,9 +19,8 @@ ...@@ -19,9 +19,8 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * 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.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
...@@ -29,65 +28,60 @@ import org.junit.jupiter.api.BeforeEach; ...@@ -29,65 +28,60 @@ 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.springframework.beans.factory.annotation.Autowired; 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.data.mongodb.core.MongoOperations;
import org.springframework.http.HttpStatus;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.test.web.servlet.ResultActions;
import org.springframework.web.context.WebApplicationContext;
import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.common.test.DataITCase;
import lombok.SneakyThrows; import lombok.SneakyThrows;
@DataITCase @DataITCase
class DummyRepositoryITCase { @AutoConfigureMockMvc
class ConfigurationParameterRestITCase {
@Autowired
private MockMvc mockMvc; private MockMvc mockMvc;
@Autowired @Autowired
private MongoOperations mongoOperations; private MongoOperations mongoOperations;
@BeforeEach @Autowired
void setup(WebApplicationContext context) { RepositoryRestProperties restProperties;
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Nested @Nested
class TestDummyNumber { class TestRestRepo {
@BeforeEach @BeforeEach
void init() { void init() {
mongoOperations.dropCollection(Dummy.class); mongoOperations.dropCollection(ConfigurationParameters.class);
mongoOperations.save(new Dummy("first", 1)); mongoOperations.save(new ConfigurationParameters("first"));
mongoOperations.save(new Dummy("first2", 2)); mongoOperations.save(new ConfigurationParameters("first2"));
} }
@Test @Test
@SneakyThrows @SneakyThrows
void shouldFindFirstDummy() { void shouldFindExistingParam() {
mockMvc.perform(get("/api/dummy/search/findFirstByDummyName").param("name", "first")) var result = doPerform("first");
.andExpect(status().isOk())
.andExpect(jsonPath("$.dummyNumber", equalTo(1)));
}
@Test result.andExpect(status().isOk());
@SneakyThrows
void shouldNotFindUnknown() {
mockMvc.perform(get("/api/dummy/search/findFirstByDummyName").param("name", "unknown"))
.andExpect(status().is(404));
} }
@Test @Test
@SneakyThrows @SneakyThrows
void shouldFindDummyNumber() { void shouldNotFindUnknownParam() {
mockMvc.perform(get("/api/dummy/first")) var result = doPerform("unknown");
.andExpect(status().isOk())
.andExpect(jsonPath("$.dummyNumber", equalTo(1))); result.andExpect(status().is(HttpStatus.NOT_FOUND.value()));
} }
@Test
@SneakyThrows @SneakyThrows
void shouldGiveNotFoundStatus() { private ResultActions doPerform(String id) {
mockMvc.perform(get("/api/dummy/unknown")) return mockMvc.perform(
.andExpect(status().is(404)); get(String.join("/", restProperties.getBasePath(), ParamsConstants.PATH, id))
);
} }
} }
......
org.mockito.junit.jupiter.MockitoExtension
\ No newline at end of file
junit.jupiter.extensions.autodetection.enabled=true
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment