diff --git a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/ExceptionConstants.java b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/ExceptionConstants.java index cb532dd8..6a7e9241 100644 --- a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/ExceptionConstants.java +++ b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/ExceptionConstants.java @@ -9,7 +9,17 @@ public class ExceptionConstants { private static final String CODE_SUCHKRITERIEN_UNVOLLSTAENDIG = "901"; private static final String MSG_SUCHKRITERIEN_UNVOLLSTAENDIG = "Fehler beim Laden: Suchkriterien unvollständig."; + private static final String CODE_PARAMS_UNVOLLSTAENDIG = "902"; + private static final String MSG_PARAMS_UNVOLLSTAENDIG = "Fehler beim Speichern: Parameter unvollständig."; + + private static final String CODE_UNSAVEABLE = "903"; + private static final String MSG_UNSAVEABLE = "Fehler beim speichern: Daten konnten nicht gespeichert werden."; + public static ExceptionDataWrapper SUCHKRITERIEN_UNVOLLSTAENDIG = new ExceptionDataWrapper(CODE_SUCHKRITERIEN_UNVOLLSTAENDIG, MSG_SUCHKRITERIEN_UNVOLLSTAENDIG); + public static ExceptionDataWrapper PARAMS_UNVOLLSTAENDIG = new ExceptionDataWrapper(CODE_PARAMS_UNVOLLSTAENDIG, MSG_PARAMS_UNVOLLSTAENDIG); + + public static ExceptionDataWrapper UNSAVEABLE = new ExceptionDataWrapper(CODE_UNSAVEABLE, MSG_UNSAVEABLE); + } diff --git a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/ExceptionFactory.java b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/ExceptionFactory.java index c43666b2..0466b9ca 100644 --- a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/ExceptionFactory.java +++ b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/ExceptionFactory.java @@ -1,6 +1,9 @@ package de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception; import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.TechnischeWlsException; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.WlsException; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.builder.states.CodeIsSet; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ServiceIDFormatter; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -12,7 +15,16 @@ public class ExceptionFactory { private final ServiceIDFormatter serviceIDFormatter; public FachlicheWlsException createFachlicheWlsException(final ExceptionDataWrapper exceptionDataWrapper) { - return FachlicheWlsException.withCode(exceptionDataWrapper.code()).inService(serviceIDFormatter.getId()) - .buildWithMessage(exceptionDataWrapper.message()); + return finalizeWlsException(FachlicheWlsException.withCode(exceptionDataWrapper.code()), exceptionDataWrapper.message()); + } + + public TechnischeWlsException createTechnischeWlsException(final ExceptionDataWrapper exceptionDataWrapper) { + return finalizeWlsException(TechnischeWlsException.withCode(exceptionDataWrapper.code()), exceptionDataWrapper.message()); + } + + private T finalizeWlsException(final CodeIsSet initializedExceptionBuilder, final String message) { + return initializedExceptionBuilder + .inService(serviceIDFormatter.getId()) + .buildWithMessage(message); } } diff --git a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/GlobalExceptionHandler.java b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/GlobalExceptionHandler.java new file mode 100644 index 00000000..4cd93857 --- /dev/null +++ b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/exception/GlobalExceptionHandler.java @@ -0,0 +1,33 @@ +package de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception; + +import de.muenchen.oss.wahllokalsystem.wls.common.exception.errorhandler.AbstractExceptionHandler; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.rest.model.DTOMapper; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.rest.model.WlsExceptionDTO; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ServiceIDFormatter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +@Slf4j +public class GlobalExceptionHandler extends AbstractExceptionHandler { + + private final ServiceIDFormatter serviceIDFormatter; + + public GlobalExceptionHandler(final ServiceIDFormatter serviceIDFormatter, final DTOMapper dtoMapper) { + super(dtoMapper); + this.serviceIDFormatter = serviceIDFormatter; + } + + @ExceptionHandler + public ResponseEntity handleThrowables(final Throwable throwable) { + log.info("handling throwable", throwable); + return createResponse(getWahlExceptionDTO(throwable)); + } + + @Override + protected String getService() { + return serviceIDFormatter.getId(); + } +} diff --git a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungController.java b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungController.java index df52425f..5e65bb5a 100644 --- a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungController.java +++ b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungController.java @@ -5,10 +5,14 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.val; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; @RestController @@ -19,6 +23,7 @@ public class UrnenwahlvorbereitungController { private final UrnenwahlvorbereitungService service; private final UrnenwahlvorbereitungDTOMapper urnenwahlvorbereitungDTOMapper; + private final UrnenwahlvorbereitungService urnenwahlvorbereitungService; @Operation(description = "Laden der Wahlvorbereitungsdaten des Urnenwahllokals {wahlbezirkID}") @GetMapping("{wahlbezirkID}") @@ -28,6 +33,15 @@ public ResponseEntity getUrnenwahlVorbereitung(@PathVa return withBodyOrNoContent(urnenwahlvorbereitungModel.map(urnenwahlvorbereitungDTOMapper::toDTO)); } + @Operation(description = "Aktualisiert die Wahlvorbereitungsdaten des Urnenwahllokals {wahlbezirkID}") + @PostMapping("{wahlbezirkID}") + @ResponseStatus(HttpStatus.CREATED) + public void postUrnenwahlvorbereitung(@PathVariable("wahlbezirkID") final String wahlbezirkID, + @RequestBody final UrnenwahlvorbereitungWriteDTO urnenwahlvorbereitungDTO) { + val vorbereitungToSet = urnenwahlvorbereitungDTOMapper.toModel(wahlbezirkID, urnenwahlvorbereitungDTO); + urnenwahlvorbereitungService.setUrnenwahlvorbereitung(vorbereitungToSet); + } + private ResponseEntity withBodyOrNoContent(final Optional body) { return body.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.noContent().build()); } diff --git a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungDTOMapper.java b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungDTOMapper.java index a2c52b1d..4af4abcc 100644 --- a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungDTOMapper.java +++ b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungDTOMapper.java @@ -8,4 +8,6 @@ public interface UrnenwahlvorbereitungDTOMapper { UrnenwahlvorbereitungDTO toDTO(UrnenwahlvorbereitungModel model); + + UrnenwahlvorbereitungModel toModel(String wahlbezirkID, UrnenwahlvorbereitungWriteDTO dto); } diff --git a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungWriteDTO.java b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungWriteDTO.java new file mode 100644 index 00000000..b64d236a --- /dev/null +++ b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungWriteDTO.java @@ -0,0 +1,25 @@ +package de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.rest.urnenwahlvorbereitung; + +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.rest.common.WahlurneDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import lombok.Builder; + +@Builder +public record UrnenwahlvorbereitungWriteDTO(@Schema(requiredMode = Schema.RequiredMode.REQUIRED) long anzahlWahlkabinen, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) long anzahlWahltische, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) long anzahlNebenraeume, + @NotNull @Size(min = 1) List urnenAnzahl) { + + public UrnenwahlvorbereitungWriteDTO(final long anzahlWahlkabinen, final long anzahlWahltische, final long anzahlNebenraeume, + final List urnenAnzahl) { + this.anzahlWahlkabinen = anzahlWahlkabinen; + this.anzahlWahltische = anzahlWahltische; + this.anzahlNebenraeume = anzahlNebenraeume; + this.urnenAnzahl = Objects.requireNonNullElseGet(urnenAnzahl, ArrayList::new); + } +} diff --git a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungModelMapper.java b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungModelMapper.java index 902453c1..c5c95d97 100644 --- a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungModelMapper.java +++ b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungModelMapper.java @@ -8,4 +8,6 @@ public interface UrnenwahlvorbereitungModelMapper { UrnenwahlvorbereitungModel toModel(UrnenwahlVorbereitung entity); + + UrnenwahlVorbereitung toEntity(UrnenwahlvorbereitungModel model); } diff --git a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungService.java b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungService.java index a5ff923e..62b6ee15 100644 --- a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungService.java +++ b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungService.java @@ -1,6 +1,8 @@ package de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.service.urnenwahlvorbereitung; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.domain.UrnenwahlVorbereitungRepository; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception.ExceptionFactory; import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -19,6 +21,7 @@ public class UrnenwahlvorbereitungService { private final UrnenwahlvorbereitungModelMapper urnenwahlvorbereitungModelMapper; private final UrnenwahlvorbereitungValidator urnenwahlvorbereitungValidator; + private final ExceptionFactory exceptionFactory; @PreAuthorize( "hasAuthority('Wahlvorbereitung_BUSINESSACTION_GetUrnenwahlVorbereitung')" @@ -35,4 +38,22 @@ public Optional getUrnenwahlvorbereitung(@P("wahlbez return dataFromRepo.map(urnenwahlvorbereitungModelMapper::toModel); } + + @PreAuthorize( + "hasAuthority('Wahlvorbereitung_BUSINESSACTION_PostUrnenwahlVorbereitung')" + + "and @bezirkIdPermisionEvaluator.tokenUserBezirkIdMatches(#vorbereitungToSet.wahlbezirkID, authentication)" + ) + public void setUrnenwahlvorbereitung(@P("vorbereitungToSet") final UrnenwahlvorbereitungModel vorbereitungToSet) { + log.debug("#postUrnenwahlVorbereitung"); + log.debug("in: urnenwahlVorbereitung > {}", vorbereitungToSet); + + urnenwahlvorbereitungValidator.validModelToSetOrThrow(vorbereitungToSet); + + try { + urnenwahlVorbereitungRepository.save(urnenwahlvorbereitungModelMapper.toEntity(vorbereitungToSet)); + } catch (final Exception onSaveException) { + log.error("Fehler beim speichern: ", onSaveException); + throw exceptionFactory.createTechnischeWlsException(ExceptionConstants.UNSAVEABLE); + } + } } diff --git a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungValidator.java b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungValidator.java index 94120257..191d5832 100644 --- a/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungValidator.java +++ b/wls-wahlvorbereitung-service/src/main/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungValidator.java @@ -3,6 +3,7 @@ import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception.ExceptionFactory; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @Component @@ -16,4 +17,11 @@ public void validWahlbezirkIDOrThrow(final String wahlbezirkID) { throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.SUCHKRITERIEN_UNVOLLSTAENDIG); } } + + public void validModelToSetOrThrow(final UrnenwahlvorbereitungModel modelToValidate) { + if (modelToValidate == null || StringUtils.isEmpty(modelToValidate.wahlbezirkID()) || modelToValidate.urnenAnzahl() + .isEmpty()) { //urnenanzahl cannot be null because of the records constructor + throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.PARAMS_UNVOLLSTAENDIG); + } + } } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/configuration/SecurityConfigurationTest.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/configuration/SecurityConfigurationTest.java index 0f47fc34..2af3d83a 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/configuration/SecurityConfigurationTest.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/configuration/SecurityConfigurationTest.java @@ -1,5 +1,6 @@ package de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.configuration; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -14,6 +15,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; @@ -62,5 +64,23 @@ void accessGetUrnenwahlvorbereitungAuthorizedThenNoContent() throws Exception { mockMvc.perform(request).andExpect(status().isNoContent()); } + + @Test + @WithAnonymousUser + void accessPostUrnenwahlvorbereitungUnauthorizedThenUnauthorized() throws Exception { + val request = MockMvcRequestBuilders.post("/businessActions/urnenwahlVorbereitung/wahlbezirkID").with(csrf()) + .contentType(MediaType.APPLICATION_JSON).content("{}"); + + mockMvc.perform(request).andExpect(status().isUnauthorized()); + } + + @Test + @WithMockUser + void accessPostUrnenwahlvorbereitungAuthorizedThenIsCreated() throws Exception { + val request = MockMvcRequestBuilders.post("/businessActions/urnenwahlVorbereitung/wahlbezirkID").with(csrf()) + .contentType(MediaType.APPLICATION_JSON).content("{}"); + + mockMvc.perform(request).andExpect(status().isCreated()); + } } } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungControllerIntegrationTest.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungControllerIntegrationTest.java index 3293980a..42dcf877 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungControllerIntegrationTest.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungControllerIntegrationTest.java @@ -1,19 +1,29 @@ package de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.rest.urnenwahlvorbereitung; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.fasterxml.jackson.databind.ObjectMapper; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.MicroServiceApplication; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.TestConstants; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.domain.UrnenwahlVorbereitung; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.domain.UrnenwahlVorbereitungRepository; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.domain.Wahlurne; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.service.urnenwahlvorbereitung.UrnenwahlvorbereitungModelMapper; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.utils.Authorities; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.utils.SecurityUtils; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.utils.testdaten.UrnenwahlVorbereitungTestdatenfactory; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.rest.model.WlsExceptionCategory; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.rest.model.WlsExceptionDTO; import de.muenchen.oss.wahllokalsystem.wls.common.security.Profiles; +import java.nio.charset.StandardCharsets; +import java.util.Collections; import java.util.List; import lombok.val; +import org.apache.commons.lang3.StringUtils; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Nested; @@ -21,9 +31,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.RequestBuilder; @SpringBootTest(classes = MicroServiceApplication.class, webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc @@ -46,7 +58,7 @@ public class UrnenwahlvorbereitungControllerIntegrationTest { UrnenwahlVorbereitungRepository urnenwahlVorbereitungRepository; @AfterEach - void tearDown() throws Exception { + void tearDown() { SecurityUtils.runAs(Authorities.REPOSITORY_DELETE_URNENWAHLVORBEREITUNG); urnenwahlVorbereitungRepository.deleteAll(); } @@ -93,4 +105,88 @@ void noDataFound() throws Exception { Assertions.assertThat(response.getResponse().getContentAsString()).isEmpty(); } } + + @Nested + class PostUrnenwahlvorbereitung { + + @Test + @WithMockUser(authorities = { Authorities.SERVICE_POST_URNENWAHLVORBEREITUNG, Authorities.REPOSITORY_WRITE_URNENWAHLVORBEREITUNG }) + void newDataIsSaved() throws Exception { + val wahlbezirkID = "wahlbezirkID"; + val requestBody = UrnenwahlVorbereitungTestdatenfactory.initValidDTO("wahlID").build(); + val request = buildPostRequest(wahlbezirkID, requestBody); + + mockMvc.perform(request).andExpect(status().isCreated()); + + val vorbereitungFromRepo = urnenwahlVorbereitungRepository.findById(wahlbezirkID).get(); + + val expectedVorbereitung = urnenwahlvorbereitungModelMapper.toEntity(urnenwahlvorbereitungDTOMapper.toModel(wahlbezirkID, requestBody)); + + Assertions.assertThat(vorbereitungFromRepo).usingRecursiveComparison().isEqualTo(expectedVorbereitung); + } + + @Test + @WithMockUser(authorities = { Authorities.SERVICE_POST_URNENWAHLVORBEREITUNG, Authorities.REPOSITORY_WRITE_URNENWAHLVORBEREITUNG }) + void existingDataIsOverwritten() throws Exception { + val wahlbezirkID = "wahlbezirkID"; + + val requestBody = UrnenwahlVorbereitungTestdatenfactory.initValidDTO("wahlID").build(); + val request = buildPostRequest(wahlbezirkID, requestBody); + + val firstNewWahlurne = requestBody.urnenAnzahl().get(0); + val oldUrnen = List.of(new Wahlurne(firstNewWahlurne.wahlID() + "Old", firstNewWahlurne.anzahl() + 2, firstNewWahlurne.urneVersiegelt())); + val entityToWriteOver = new UrnenwahlVorbereitung(wahlbezirkID, oldUrnen, requestBody.anzahlWahlkabinen(), requestBody.anzahlWahltische(), + requestBody.anzahlNebenraeume()); + urnenwahlVorbereitungRepository.save(entityToWriteOver); + + mockMvc.perform(request).andExpect(status().isCreated()); + + val vorbereitungFromRepo = urnenwahlVorbereitungRepository.findById(wahlbezirkID).get(); + + val expectedVorbereitung = urnenwahlvorbereitungModelMapper.toEntity(urnenwahlvorbereitungDTOMapper.toModel(wahlbezirkID, requestBody)); + + Assertions.assertThat(vorbereitungFromRepo).usingRecursiveComparison().isEqualTo(expectedVorbereitung); + } + + @Test + @WithMockUser(authorities = { Authorities.SERVICE_POST_URNENWAHLVORBEREITUNG, Authorities.REPOSITORY_WRITE_URNENWAHLVORBEREITUNG }) + void gotWlsExceptionWhenDataIsInvalid() throws Exception { + val wahlbezirkID = "wahlbezirkID"; + + val requestBody = UrnenwahlVorbereitungTestdatenfactory.initValidDTO("wahlID").urnenAnzahl(Collections.emptyList()).build(); + val request = buildPostRequest(wahlbezirkID, requestBody); + + val response = mockMvc.perform(request).andExpect(status().isBadRequest()).andReturn(); + val exceptionBodyFromRepsonse = objectMapper.readValue(response.getResponse().getContentAsString(StandardCharsets.UTF_8), WlsExceptionDTO.class); + + Assertions.assertThat(urnenwahlVorbereitungRepository.findById(wahlbezirkID)).isEmpty(); + + val expectedExceptionDTO = new WlsExceptionDTO(WlsExceptionCategory.F, ExceptionConstants.PARAMS_UNVOLLSTAENDIG.code(), "WLS-WAHLVORBEREITUNG", + ExceptionConstants.PARAMS_UNVOLLSTAENDIG.message()); + Assertions.assertThat(exceptionBodyFromRepsonse).usingRecursiveComparison().isEqualTo(expectedExceptionDTO); + } + + @Test + @WithMockUser(authorities = { Authorities.SERVICE_POST_URNENWAHLVORBEREITUNG, Authorities.REPOSITORY_WRITE_URNENWAHLVORBEREITUNG }) + void gotWlsExceptionWhenNotSaveableCauseOfToLongData() throws Exception { + val wahlbezirkID = StringUtils.leftPad(" ", 255) + "wahlbezirkID"; + + val requestBody = UrnenwahlVorbereitungTestdatenfactory.initValidDTO("wahlID").build(); + val request = buildPostRequest(wahlbezirkID, requestBody); + + val response = mockMvc.perform(request).andExpect(status().isInternalServerError()).andReturn(); + val exceptionBodyFromRepsonse = objectMapper.readValue(response.getResponse().getContentAsString(StandardCharsets.UTF_8), WlsExceptionDTO.class); + + Assertions.assertThat(urnenwahlVorbereitungRepository.findById(wahlbezirkID)).isEmpty(); + + val expectedExceptionDTO = new WlsExceptionDTO(WlsExceptionCategory.T, ExceptionConstants.UNSAVEABLE.code(), "WLS-WAHLVORBEREITUNG", + ExceptionConstants.UNSAVEABLE.message()); + Assertions.assertThat(exceptionBodyFromRepsonse).usingRecursiveComparison().isEqualTo(expectedExceptionDTO); + } + + private RequestBuilder buildPostRequest(final String wahlbezirkID, final UrnenwahlvorbereitungWriteDTO requestBody) throws Exception { + return post("/businessActions/urnenwahlVorbereitung/" + wahlbezirkID).with(csrf()).contentType(MediaType.APPLICATION_JSON).content( + objectMapper.writeValueAsString(requestBody)); + } + } } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungControllerTest.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungControllerTest.java index 55fdb071..9aa6c01c 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungControllerTest.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungControllerTest.java @@ -1,5 +1,7 @@ package de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.rest.urnenwahlvorbereitung; +import static org.mockito.ArgumentMatchers.eq; + import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.service.urnenwahlvorbereitung.UrnenwahlvorbereitungModel; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.service.urnenwahlvorbereitung.UrnenwahlvorbereitungService; import java.util.Collections; @@ -59,4 +61,21 @@ void gotNoDataFromService() { } } + @Nested + class PostUrnenwahlvorbereitung { + + @Test + void requestIsMappedAndSendToService() { + val wahlbezirkID = "wahlbezirkID"; + val requestBody = new UrnenwahlvorbereitungWriteDTO(0, 0, 0, Collections.emptyList()); + + val mockedMappedRequest = new UrnenwahlvorbereitungModel(wahlbezirkID, 0, 0, 0, Collections.emptyList()); + + Mockito.when(urnenwahlvorbereitungDTOMapper.toModel(eq(wahlbezirkID), eq(requestBody))).thenReturn(mockedMappedRequest); + + Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.postUrnenwahlvorbereitung(wahlbezirkID, requestBody)); + Mockito.verify(service).setUrnenwahlvorbereitung(mockedMappedRequest); + } + } + } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungDTOMapperTest.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungDTOMapperTest.java index 04b52cfa..6c8a83f2 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungDTOMapperTest.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungDTOMapperTest.java @@ -41,4 +41,25 @@ void isMapped() { } } + @Nested + class ToModel { + + @Test + void isMapped() { + val anzahlKabinen = 12; + val anzahlWahltische = 21; + val anzahlNebenraeume = 4; + val urnen = List.of(new WahlurneDTO("wahlID1", 2, true), new WahlurneDTO("wahlID2", 4, false)); + val dtoToMap = new UrnenwahlvorbereitungWriteDTO(anzahlKabinen, anzahlWahltische, anzahlNebenraeume, urnen); + val wahlbezirkIDToMap = "wahlbezirkID"; + + val result = unitUnderTest.toModel(wahlbezirkIDToMap, dtoToMap); + + val expectedResult = new UrnenwahlvorbereitungModel(wahlbezirkIDToMap, anzahlKabinen, anzahlWahltische, anzahlNebenraeume, + List.of(new WahlurneModel("wahlID1", 2, true), new WahlurneModel("wahlID2", 4, false))); + + Assertions.assertThat(result).isEqualTo(expectedResult); + } + } + } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungWriteDTOTest.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungWriteDTOTest.java new file mode 100644 index 00000000..cc33fc8a --- /dev/null +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/rest/urnenwahlvorbereitung/UrnenwahlvorbereitungWriteDTOTest.java @@ -0,0 +1,21 @@ +package de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.rest.urnenwahlvorbereitung; + +import lombok.val; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class UrnenwahlvorbereitungWriteDTOTest { + + @Nested + class ConstructionTests { + + @Test + void listOfWahlurneIsNotNullOnNullParameter() { + val result = new UrnenwahlvorbereitungWriteDTO(0, 0, 0, null); + + Assertions.assertThat(result.urnenAnzahl()).isNotNull(); + } + } + +} diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungModelMapperTest.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungModelMapperTest.java index 9c177161..228a62fc 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungModelMapperTest.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungModelMapperTest.java @@ -39,4 +39,25 @@ void isMapped() { } } + @Nested + class ToEntity { + + @Test + void isMapped() { + val wahlbezirkID = "wahlbezirkID"; + val anzahlKabinen = 21; + val anzahlNebenraeume = 3; + val anzahlTische = 7; + val urnen = List.of(new WahlurneModel("wahlID1", 3, true), new WahlurneModel("wahlID5", 17, false)); + val modelToMap = new UrnenwahlvorbereitungModel(wahlbezirkID, anzahlKabinen, anzahlTische, anzahlNebenraeume, urnen); + + val result = unitUnderTest.toEntity(modelToMap); + + val expectedUrnen = List.of(new Wahlurne("wahlID1", 3, true), new Wahlurne("wahlID5", 17, false)); + val expectedResult = new UrnenwahlVorbereitung(wahlbezirkID, expectedUrnen, anzahlKabinen, anzahlTische, anzahlNebenraeume); + + Assertions.assertThat(result).isEqualTo(expectedResult); + } + } + } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungSecurityTest.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungSecurityTest.java index 48e10d4c..1d3b1cb0 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungSecurityTest.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungSecurityTest.java @@ -2,9 +2,12 @@ import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.MicroServiceApplication; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.TestConstants; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.service.common.WahlurneModel; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.utils.Authorities; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.utils.SecurityUtils; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.TechnischeWlsException; import de.muenchen.oss.wahllokalsystem.wls.common.security.BezirkIDPermissionEvaluator; +import java.util.List; import java.util.stream.Stream; import lombok.val; import org.assertj.core.api.Assertions; @@ -80,4 +83,59 @@ private static Stream getMissingAuthoritiesVariations() { return SecurityUtils.buildArgumentsForMissingAuthoritiesVariations(Authorities.ALL_AUTHORITIES_GET_URNENWAHLVORBEREITUNG); } } + + @Nested + class SetUrnenwahlvorbereitung { + + @Test + void accessGranted() { + SecurityUtils.runAs(Authorities.ALL_AUTHORITIES_POST_URNENWAHLVORBEITUNG); + + val wahlbezirkID = "wahlbezirkID"; + val modelToSet = new UrnenwahlvorbereitungModel(wahlbezirkID, 0, 0, 0, List.of(new WahlurneModel("wahlID", 1, true))); + + Mockito.when(bezirkIDPermissionEvaluator.tokenUserBezirkIdMatches(Mockito.eq(wahlbezirkID), Mockito.any())).thenReturn(true); + + Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.setUrnenwahlvorbereitung(modelToSet)); + } + + @Test + void bezirkIDPermissionEvaluatorFailed() { + SecurityUtils.runAs(Authorities.ALL_AUTHORITIES_POST_URNENWAHLVORBEITUNG); + + val wahlbezirkID = "wahlbezirkID"; + val modelToSet = new UrnenwahlvorbereitungModel(wahlbezirkID, 0, 0, 0, List.of(new WahlurneModel("wahlID", 1, true))); + + Mockito.when(bezirkIDPermissionEvaluator.tokenUserBezirkIdMatches(Mockito.eq(wahlbezirkID), Mockito.any())).thenReturn(false); + + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.setUrnenwahlvorbereitung(modelToSet)) + .isExactlyInstanceOf(AccessDeniedException.class); + } + + @Test + void accessDeniedOnServiceAuthorityMissing() { + SecurityUtils.runAs(Authorities.REPOSITORY_WRITE_URNENWAHLVORBEREITUNG); + + val wahlbezirkID = "wahlbezirkID"; + val modelToSet = new UrnenwahlvorbereitungModel(wahlbezirkID, 0, 0, 0, List.of(new WahlurneModel("wahlID", 1, true))); + + Mockito.when(bezirkIDPermissionEvaluator.tokenUserBezirkIdMatches(Mockito.eq(wahlbezirkID), Mockito.any())).thenReturn(true); + + Assertions.assertThatThrownBy(() -> unitUnderTest.setUrnenwahlvorbereitung(modelToSet)) + .isExactlyInstanceOf(AccessDeniedException.class); + } + + @Test + void wlsExceptionOnRepoWriteAuthorityMissing() { + SecurityUtils.runAs(Authorities.SERVICE_POST_URNENWAHLVORBEREITUNG); + + val wahlbezirkID = "wahlbezirkID"; + val modelToSet = new UrnenwahlvorbereitungModel(wahlbezirkID, 0, 0, 0, List.of(new WahlurneModel("wahlID", 1, true))); + + Mockito.when(bezirkIDPermissionEvaluator.tokenUserBezirkIdMatches(Mockito.eq(wahlbezirkID), Mockito.any())).thenReturn(true); + + Assertions.assertThatThrownBy(() -> unitUnderTest.setUrnenwahlvorbereitung(modelToSet)) + .isExactlyInstanceOf(TechnischeWlsException.class); + } + } } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungServiceTest.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungServiceTest.java index c8011f8f..88a3b35b 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungServiceTest.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungServiceTest.java @@ -5,6 +5,9 @@ import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.domain.UrnenwahlVorbereitung; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.domain.UrnenwahlVorbereitungRepository; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception.ExceptionFactory; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.TechnischeWlsException; import java.util.Optional; import lombok.val; import org.assertj.core.api.Assertions; @@ -28,6 +31,9 @@ class UrnenwahlvorbereitungServiceTest { @Mock UrnenwahlvorbereitungValidator urnenwahlvorbereitungValidator; + @Mock + ExceptionFactory exceptionFactory; + @InjectMocks UrnenwahlvorbereitungService unitUnderTest; @@ -75,4 +81,50 @@ void exceptionFromValidator() { } } + @Nested + class SetUrnenwahlvorbereitung { + + @Test + void isSaved() { + val modelToSave = UrnenwahlvorbereitungModel.builder().build(); + + val mockedModelAsEntity = new UrnenwahlVorbereitung(); + Mockito.when(urnenwahlvorbereitungModelMapper.toEntity(modelToSave)).thenReturn(mockedModelAsEntity); + + Mockito.doNothing().when(urnenwahlvorbereitungValidator).validModelToSetOrThrow(modelToSave); + + unitUnderTest.setUrnenwahlvorbereitung(modelToSave); + + Mockito.verify(urnenwahlVorbereitungRepository).save(mockedModelAsEntity); + } + + @Test + void exceptionFromValidationGotThrown() { + val modelToSave = UrnenwahlvorbereitungModel.builder().build(); + + val mockedValidationException = new RuntimeException("validation failed"); + + Mockito.doThrow(mockedValidationException).when(urnenwahlvorbereitungValidator).validModelToSetOrThrow(modelToSave); + + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.setUrnenwahlvorbereitung(modelToSave)).isSameAs(mockedValidationException); + } + + @Test + void exceptionFromSavingIsMapped() { + val modelToSave = UrnenwahlvorbereitungModel.builder().build(); + + val mockedModelAsEntity = new UrnenwahlVorbereitung(); + val mockedSaveException = new RuntimeException("fail on save"); + val mockedFactoryException = TechnischeWlsException.withCode("code").buildWithMessage("message"); + + Mockito.when(urnenwahlvorbereitungModelMapper.toEntity(modelToSave)).thenReturn(mockedModelAsEntity); + Mockito.doThrow(mockedSaveException).when(urnenwahlVorbereitungRepository).save(mockedModelAsEntity); + Mockito.doNothing().when(urnenwahlvorbereitungValidator).validModelToSetOrThrow(modelToSave); + Mockito.when(exceptionFactory.createTechnischeWlsException(ExceptionConstants.UNSAVEABLE)).thenReturn(mockedFactoryException); + + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.setUrnenwahlvorbereitung(modelToSave)).usingRecursiveComparison() + .isSameAs(mockedFactoryException); + } + } + } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungValidatorTest.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungValidatorTest.java index 536b1d2e..80b1e109 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungValidatorTest.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/service/urnenwahlvorbereitung/UrnenwahlvorbereitungValidatorTest.java @@ -2,7 +2,10 @@ import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.exception.ExceptionFactory; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.service.common.WahlurneModel; import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; +import java.util.Collections; +import java.util.List; import lombok.val; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Nested; @@ -49,4 +52,67 @@ void exceptionWhenWahlbezirkIDIsEmpty() { } } + @Nested + class ValidModelToSetOrThrow { + + @Test + void noExceptionOnValidModel() { + val validModel = initValid().build(); + + Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.validModelToSetOrThrow(validModel)); + } + + @Test + void exceptionWhenModelIsNull() { + val mockedFactoryException = FachlicheWlsException.withCode("000").buildWithMessage("error"); + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.PARAMS_UNVOLLSTAENDIG)).thenReturn(mockedFactoryException); + + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validModelToSetOrThrow(null)).isSameAs(mockedFactoryException); + } + + @Test + void exceptionWhenWahlbezirkIDIsNull() { + val invalidModel = initValid().wahlbezirkID(null).build(); + + val mockedFactoryException = FachlicheWlsException.withCode("000").buildWithMessage("error"); + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.PARAMS_UNVOLLSTAENDIG)).thenReturn(mockedFactoryException); + + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validModelToSetOrThrow(invalidModel)).isSameAs(mockedFactoryException); + } + + @Test + void exceptionWhenWahlbezirkIDIsEmpty() { + val invalidModel = initValid().wahlbezirkID("").build(); + + val mockedFactoryException = FachlicheWlsException.withCode("000").buildWithMessage("error"); + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.PARAMS_UNVOLLSTAENDIG)).thenReturn(mockedFactoryException); + + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validModelToSetOrThrow(invalidModel)).isSameAs(mockedFactoryException); + } + + @Test + void exceptionWhenUrnenAnzahlIsNull() { + val invalidModel = initValid().urnenAnzahl(null).build(); + + val mockedFactoryException = FachlicheWlsException.withCode("000").buildWithMessage("error"); + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.PARAMS_UNVOLLSTAENDIG)).thenReturn(mockedFactoryException); + + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validModelToSetOrThrow(invalidModel)).isSameAs(mockedFactoryException); + } + + @Test + void exceptionWhenUrnenAnzahlIsEmpty() { + val invalidModel = initValid().urnenAnzahl(Collections.emptyList()).build(); + + val mockedFactoryException = FachlicheWlsException.withCode("000").buildWithMessage("error"); + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.PARAMS_UNVOLLSTAENDIG)).thenReturn(mockedFactoryException); + + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validModelToSetOrThrow(invalidModel)).isSameAs(mockedFactoryException); + } + + private UrnenwahlvorbereitungModel.UrnenwahlvorbereitungModelBuilder initValid() { + return UrnenwahlvorbereitungModel.builder().wahlbezirkID("wahlbezirkID").urnenAnzahl(List.of(new WahlurneModel("wahlID", 1, true))); + } + } + } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/Authorities.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/Authorities.java index 121e9d81..e726eb7d 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/Authorities.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/Authorities.java @@ -7,6 +7,7 @@ public class Authorities { public static final String SERVICE_GET_URNENWAHLVORBEREITUNG = "Wahlvorbereitung_BUSINESSACTION_GetUrnenwahlVorbereitung"; + public static final String SERVICE_POST_URNENWAHLVORBEREITUNG = "Wahlvorbereitung_BUSINESSACTION_PostUrnenwahlVorbereitung"; public static final String REPOSITORY_DELETE_URNENWAHLVORBEREITUNG = "Wahlvorbereitung_DELETE_UrnenwahlVorbereitung"; public static final String REPOSITORY_WRITE_URNENWAHLVORBEREITUNG = "Wahlvorbereitung_WRITE_UrnenwahlVorbereitung"; @@ -14,4 +15,9 @@ public class Authorities { public static final String[] ALL_AUTHORITIES_GET_URNENWAHLVORBEREITUNG = { SERVICE_GET_URNENWAHLVORBEREITUNG }; + + public static final String[] ALL_AUTHORITIES_POST_URNENWAHLVORBEITUNG = { + SERVICE_POST_URNENWAHLVORBEREITUNG, + REPOSITORY_WRITE_URNENWAHLVORBEREITUNG + }; } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/testdaten/UrnenwahlVorbereitungTestdatenfactory.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/testdaten/UrnenwahlVorbereitungTestdatenfactory.java index de9b8744..b024620e 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/testdaten/UrnenwahlVorbereitungTestdatenfactory.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/testdaten/UrnenwahlVorbereitungTestdatenfactory.java @@ -1,6 +1,7 @@ package de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.utils.testdaten; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.domain.UrnenwahlVorbereitung; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.rest.urnenwahlvorbereitung.UrnenwahlvorbereitungWriteDTO; import java.util.List; public class UrnenwahlVorbereitungTestdatenfactory { @@ -9,4 +10,9 @@ public static UrnenwahlVorbereitung.UrnenwahlVorbereitungBuilder initValid(final return UrnenwahlVorbereitung.builder().wahlbezirkID(wahlbezirkID).urnenAnzahl(List.of(WahlurneTestdatenfactory.initValid(wahlID).build())) .anzahlWahlkabinen(10).anzahlWahltische(12).anzahlNebenraeume(0); } + + public static UrnenwahlvorbereitungWriteDTO.UrnenwahlvorbereitungWriteDTOBuilder initValidDTO(final String wahlID) { + return UrnenwahlvorbereitungWriteDTO.builder().anzahlWahlkabinen(10).anzahlWahltische(12).anzahlNebenraeume(0) + .urnenAnzahl(List.of(WahlurneTestdatenfactory.initValidDTO(wahlID).build())); + } } diff --git a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/testdaten/WahlurneTestdatenfactory.java b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/testdaten/WahlurneTestdatenfactory.java index 35a6caac..65f8dc2b 100644 --- a/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/testdaten/WahlurneTestdatenfactory.java +++ b/wls-wahlvorbereitung-service/src/test/java/de/muenchen/oss/wahllokalsystem/wahlvorbereitungservice/utils/testdaten/WahlurneTestdatenfactory.java @@ -1,10 +1,15 @@ package de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.utils.testdaten; import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.domain.Wahlurne; +import de.muenchen.oss.wahllokalsystem.wahlvorbereitungservice.rest.common.WahlurneDTO; public class WahlurneTestdatenfactory { public static Wahlurne.WahlurneBuilder initValid(final String wahlID) { return Wahlurne.builder().wahlID(wahlID).anzahl(1).urneVersiegelt(true); } + + public static WahlurneDTO.WahlurneDTOBuilder initValidDTO(final String wahlID) { + return WahlurneDTO.builder().wahlID(wahlID); + } } diff --git a/wls-wahlvorbereitung-service/src/test/resources/urnenwahlvorbereitung.http b/wls-wahlvorbereitung-service/src/test/resources/urnenwahlvorbereitung.http index 44995e55..ea431fe0 100644 --- a/wls-wahlvorbereitung-service/src/test/resources/urnenwahlvorbereitung.http +++ b/wls-wahlvorbereitung-service/src/test/resources/urnenwahlvorbereitung.http @@ -18,4 +18,27 @@ Authorization: {{ token_type }} {{ auth_token }} ### GET wbzID-1 GET http://localhost:39150/businessActions/urnenwahlVorbereitung/wbzID-1 -Authorization: {{ token_type }} {{ auth_token }} \ No newline at end of file +Authorization: {{ token_type }} {{ auth_token }} + +### POST wbzID-1 +POST http://localhost:39150/businessActions/urnenwahlVorbereitung/wbzID-1 +Authorization: {{ token_type }} {{ auth_token }} +Content-Type: application/json + +{ + "anzahlNebenraeume": 10, + "anzahlWahlkabinen": 12, + "anzahlWahltische": 21, + "urnenAnzahl": [ + { + "anzahl": 1, + "urneVersiegelt": true, + "wahlID": "wahlID1" + }, + { + "wahlID": "wahlID2", + "urneVersiegelt": false, + "anzahl": 13 + } + ] +} \ No newline at end of file