From 8fd9ccbfb2bc88eded494644dd2aa44bf40e8e49 Mon Sep 17 00:00:00 2001 From: Nic12345678 <162564162+Nic12345678@users.noreply.github.com> Date: Thu, 22 Aug 2024 14:50:35 +0200 Subject: [PATCH 01/67] Wahltermindaten Controller Service und Validator Implementierung --- .../WahltermindatenController.java | 51 ++++++++ .../WahltermindatenService.java | 118 ++++++++++++++++++ .../WahltermindatenValidator.java | 37 ++++++ 3 files changed, 206 insertions(+) create mode 100644 wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenController.java create mode 100644 wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java create mode 100644 wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenController.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenController.java new file mode 100644 index 000000000..a5efefdb6 --- /dev/null +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenController.java @@ -0,0 +1,51 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahltermindaten; + +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten.WahltermindatenService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/businessActions/") +@RequiredArgsConstructor +@Slf4j +public class WahltermindatenController { + + private final WahltermindatenService wahltermindatenService; + + @Operation( + description = "Triggert die Einrichtung der Wahltermindaten.", + responses = { + @ApiResponse( + responseCode = "200", description = "Die Wahltermindaten werden angelegt." + ) + } + ) + @PutMapping("wahltermindaten/{wahltagID}") + @ResponseStatus(HttpStatus.OK) + public void putWahltermindaten(@PathVariable("wahltagID") String wahltagID) { + wahltermindatenService.putWahltermindaten(wahltagID); + } + + @Operation( + description = "Löscht die Wahltermindaten eines bestimmten Wahltags.", + responses = { + @ApiResponse( + responseCode = "200", description = "Die Wahltermindaten werden gelöscht." + ) + } + ) + @DeleteMapping("wahltermindaten/{wahltagID}") + @ResponseStatus(HttpStatus.OK) + public void deleteWahltermindaten(@PathVariable("wahltagID") String wahltagID) { + wahltermindatenService.deleteWahltermindaten(wahltagID); + } +} diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java new file mode 100644 index 000000000..dc0e0020c --- /dev/null +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -0,0 +1,118 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; + +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlbezirkRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahltagRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.WahlRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.InitializeKopfdaten; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModelMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.WahldatenClient; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModelMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkeClient; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModelMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModelMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltageService; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.http.HttpMethod; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class WahltermindatenService { + + private final WahltermindatenValidator wahltermindatenValidator; + private final WahltageService wahltageService; + private final WahldatenClient wahldatenClient; + private final WahlbezirkeClient wahlbezirkeClient; + + private final WahltagModelMapper wahltagModelMapper; + private final WahlModelMapper wahlModelMapper; + private final WahlbezirkModelMapper wahlbezirkModelMapper; + private final KopfdatenModelMapper kopfdatenModelMapper; + + private final WahlRepository wahlRepository; + private final WahlbezirkRepository wahlbezirkRepository; + private final KopfdatenRepository kopfdatenRepository; + private final WahltagRepository wahltagRepository; + private final WahlvorschlaegeRepository wahlvorschlaegeRepository; + private final ReferendumvorlagenRepository referendumvorlagenRepository; + + private final ExceptionFactory exceptionFactory; + + @PreAuthorize("hasAuthority('Basisdaten_BUSINESSACTION_PutWahltermindaten')") + @Transactional + public void putWahltermindaten(final String wahltagID) { + log.info("#putWahltermindaten"); + wahltermindatenValidator.validWahltagIDParamOrThrow(wahltagID, HttpMethod.PUT); + val wahltagModel = wahltageService.getWahltage().stream() + .filter(w -> w.wahltagID().equals(wahltagID)) + .findAny().orElse(null); + wahltermindatenValidator.validateWahltagForSearchingWahltagID(wahltagModelMapper.toEntity(wahltagModel), HttpMethod.PUT); + assert wahltagModel != null; + val basisdatenModel = wahldatenClient.loadBasisdaten(wahltagModel.wahltag(), wahltagModel.nummer()); + if (null == basisdatenModel) { throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.GET_BASISDATEN_NO_DATA);} + val wahlModels = initWahlen(wahltagModel); + val wahlbezirkModels = initWahlbezirke(wahltagModel, wahlModels); + final InitializeKopfdaten kopfDataInitializer = new InitializeKopfdaten(exceptionFactory, kopfdatenRepository, kopfdatenModelMapper); + kopfDataInitializer.initKopfdaten(basisdatenModel); + + // ToDo in next Issue + // Async +// asyncRequests.getAsyncProgress().reset(wahltag.getWahltag(), wahltag.getNummer()); +// asyncRequests.initWahlvorschlaege(wahlen, wahlbezirke); +// asyncRequests.initReferendumvorlagen(wahlen, wahlbezirke); + + } + + @PreAuthorize("hasAuthority('Basisdaten_BUSINESSACTION_DeleteWahltermindaten')") + @Transactional + public void deleteWahltermindaten(final String wahltagID) { + log.info("#deleteWahltermindaten"); + wahltermindatenValidator.validWahltagIDParamOrThrow(wahltagID, HttpMethod.DELETE); + val wahltag = wahltagRepository.findById(wahltagID).orElse(null); + wahltermindatenValidator.validateWahltagForSearchingWahltagID(wahltag, HttpMethod.DELETE); + assert wahltag != null; + val basisstrukturdaten = wahldatenClient.loadBasisdaten(wahltag.getWahltag(), wahltag.getNummer()).basisstrukturdaten(); + val wahlIDs = basisstrukturdaten.stream().map(BasisstrukturdatenModel::wahlID).toList(); + + wahlbezirkRepository.deleteByWahltag(wahltag.getWahltag()); + wahlIDs.forEach((wahlID) -> { + kopfdatenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID); + wahlRepository.deleteById(wahlID); + //To Test if "orphanRemoval= true" aus dem Repository funktioniert, also ob auch jeder entsprechende Wahlvorschlag gelöscht wird + wahlvorschlaegeRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID); + //To Test if "orphanRemoval= true" aus dem Repository funktioniert + referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID); + }); + } + + private List initWahlen(WahltagModel wahltag) { + val wahlen = wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities( + wahldatenClient.loadBasisdaten(wahltag.wahltag(), wahltag.nummer()).wahlen().stream().toList() + ); + wahlRepository.saveAll(wahlen); + return wahlModelMapper.fromListOfWahlEntityToListOfWahlModel(wahlen); + } + + private List initWahlbezirke(WahltagModel wahltagModel, List wahlModels) { + val wahlbezirke = wahlbezirkModelMapper.fromListOfWahlbezirkModeltoListOfWahlbezirkEntities( + wahlbezirkeClient.loadWahlbezirke(wahltagModel.wahltag(), wahltagModel.nummer()).stream().toList() + ); + wahlbezirkRepository.saveAll(wahlbezirke); + return wahlbezirkModelMapper.fromListOfWahlbezirkEntityToListOfWahlbezirkModel(wahlbezirke); + } +} diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java new file mode 100644 index 000000000..da836aad2 --- /dev/null +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java @@ -0,0 +1,37 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; + +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahltag; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModel; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class WahltermindatenValidator { + + private final ExceptionFactory exceptionFactory; + + public void validWahltagIDParamOrThrow(final String wahltagID, HttpMethod httpMethod) { + if (wahltagID == null || StringUtils.isBlank(wahltagID) || StringUtils.isEmpty(wahltagID)) { + switch (httpMethod.toString()) { + case "PUT" -> throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG); + case "DELETE" -> throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_DELETEWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG); + } + } + } + + public void validateWahltagForSearchingWahltagID(final Wahltag wahltag, HttpMethod httpMethod) { + if (null == wahltag || null == wahltag.getWahltag()) { + switch (httpMethod.toString()) { + case "PUT" -> throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_NO_WAHLTAG); + case "DELETE" -> throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_DELETEWAHLTERMINDATEN_LOESCHEN_UNVOLLSTAENDIG); + } + } + } + +} From 38bfe3a38eab53b6163ee6fbbe1e1265bd253848 Mon Sep 17 00:00:00 2001 From: Nic12345678 <162564162+Nic12345678@users.noreply.github.com> Date: Thu, 22 Aug 2024 14:56:56 +0200 Subject: [PATCH 02/67] =?UTF-8?q?InitializeKopfdaten=20soll=20ins=20Repo?= =?UTF-8?q?=20speichern=20wegen=20der=20Effizienz,=20wie=20im=20alten=20Se?= =?UTF-8?q?rvice.=20Wenn=20es=20vllt=20bei=20getKopfdaten=20einere=20sch?= =?UTF-8?q?=C3=B6nere=20Separation=20of=20Concerns=20(Trennung=20der=20Zus?= =?UTF-8?q?t=C3=A4ndigkeiten)=20im=20Sinne=20dass=20InitializeKopfdaten=20?= =?UTF-8?q?sollte=20die=20Daten=20bereitstellen=20und=20die=20Speicherung?= =?UTF-8?q?=20ins=20Repo=20durch=20den=20Service=20erfolgen,=20erzielt=20w?= =?UTF-8?q?urde,=20wird=20bei=20initializeKopfdaten=20aus=20dem=20UseCase?= =?UTF-8?q?=20putWahltermindaten=20auf=20alle=20Wahlbezirke=20eines=20Wahl?= =?UTF-8?q?tages=20(im=20Unterschied=20zum=20Vorhin=20nur=20ein=20Bezirk)?= =?UTF-8?q?=20eingegangen.=20Es=20w=C3=A4re=20nicht=20performant,=20wenn?= =?UTF-8?q?=20man=20erst=20nach=20Erstellung=20einer=20Liste=20mit=20jedem?= =?UTF-8?q?=20Kopfdaten-Satz=20eine=20Antwort=20an=20den=20Service=20gelie?= =?UTF-8?q?fert=20worden=20w=C3=A4re=20und=20dieser=20dann=20diese=20Liste?= =?UTF-8?q?=20wieder=20h=C3=A4tte=20durchlaufen=20sollen=20um=20das=20zu?= =?UTF-8?q?=20tun=20was=20schon=20vorher=20schneller=20m=C3=B6glich=20war.?= =?UTF-8?q?=20Deshalb=20speichert=20der=20Initializer=20selbst=20ins=20Rep?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/kopfdaten/InitializeKopfdaten.java | 10 +++++++--- .../services/kopfdaten/KopfdatenService.java | 3 +-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java index 79400afb7..3a2f9d598 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java @@ -1,5 +1,6 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; @@ -12,8 +13,10 @@ public class InitializeKopfdaten { private final ExceptionFactory exceptionFactory; + private final KopfdatenRepository kopfdatenRepository; + private final KopfdatenModelMapper kopfdatenModelMapper; - protected void initKopfdaten(BasisdatenModel basisdatenModel) { + public void initKopfdaten(BasisdatenModel basisdatenModel) { basisdatenModel.basisstrukturdaten() .forEach(basisstrukturdaten -> { initKopfdata(basisstrukturdaten.wahlID(), basisstrukturdaten.wahlbezirkID(), basisdatenModel); @@ -50,8 +53,7 @@ private KopfdatenModel createKopfdaten(WahlModel wahl, WahlbezirkModel wahlbezir val bezirkUndWahlID = new BezirkUndWahlID(wahl.wahlID(), wahlbezirk.wahlbezirkID()); val gemeinde = "LHM"; - - return new KopfdatenModel( + val kopfdatenModel = new KopfdatenModel( bezirkUndWahlID, gemeinde, stimmzettelgebiet.stimmzettelgebietsart(), @@ -59,5 +61,7 @@ private KopfdatenModel createKopfdaten(WahlModel wahl, WahlbezirkModel wahlbezir stimmzettelgebiet.name(), wahl.name(), wahlbezirk.nummer()); + kopfdatenRepository.save(kopfdatenModelMapper.toEntity(kopfdatenModel)); + return kopfdatenModel; } } diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java index 4f54bc5d0..894acb2b9 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java @@ -36,11 +36,10 @@ public KopfdatenModel getKopfdaten(BezirkUndWahlID bezirkUndWahlID) { } else { log.error("#getKopfdaten: Für Wahlbezirk {} mit WahlID {} waren keine Kopfdaten in der Datenbank", bezirkUndWahlID.getWahlbezirkID(), bezirkUndWahlID.getWahlID()); - final InitializeKopfdaten kopfDataInitializer = new InitializeKopfdaten(exceptionFactory); + final InitializeKopfdaten kopfDataInitializer = new InitializeKopfdaten(exceptionFactory, kopfdatenRepository, kopfdatenModelMapper); KonfigurierterWahltagModel konfigurierterWahltagModel = konfigurierterWahltagClient.getKonfigurierterWahltag(); BasisdatenModel basisdatenModel = wahldatenClient.loadBasisdaten(konfigurierterWahltagModel.wahltag(), konfigurierterWahltagModel.nummer()); kopfdatenModel = kopfDataInitializer.initKopfdata(bezirkUndWahlID.getWahlID(), bezirkUndWahlID.getWahlbezirkID(), basisdatenModel); - kopfdatenRepository.save(kopfdatenModelMapper.toEntity(kopfdatenModel)); } return kopfdatenModel; } From ca982aae827be19546b7e11e94652df1e6ac3afc Mon Sep 17 00:00:00 2001 From: Nic12345678 <162564162+Nic12345678@users.noreply.github.com> Date: Thu, 22 Aug 2024 14:58:26 +0200 Subject: [PATCH 03/67] =?UTF-8?q?Erg=C3=A4nzung=20ExceptionConstants=20und?= =?UTF-8?q?=20notwendige=20Method=20im=20WahltagModelMapper=20toEntity=20h?= =?UTF-8?q?inzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/ExceptionConstants.java | 15 +++++++++++++++ .../services/wahltag/WahltagModelMapper.java | 2 ++ 2 files changed, 17 insertions(+) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java index 915e4c7b2..4afec9bbe 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java @@ -14,6 +14,7 @@ public class ExceptionConstants { private static final String CODE_UNSAVEABLE = "903"; private static final String MSG_UNSAVEABLE = "Fehler beim speichern: Daten konnten nicht gespeichert werden."; + private static final String CODE_NO_DATA_BASISDATEN = "401"; private static final String CODE_NO_DATA_WAHLBEZIRK = "402"; public static ExceptionDataWrapper SUCHKRITERIEN_UNVOLLSTAENDIG = new ExceptionDataWrapper(CODE_SUCHKRITERIEN_UNVOLLSTAENDIG, @@ -79,4 +80,18 @@ public class ExceptionConstants { "BasisdatenValidierung: Es gab Inkonsistenzen in den Bestandteilen der Basisdaten. Basisstrukturdaten, Wahlen, Wahlbezirke, Stimmzettelgebiete konnten nicht eindeutig einander zugeordnetwerden."); public static final ExceptionDataWrapper GETWAHLBEZIRKE_NO_DATA = new ExceptionDataWrapper(CODE_NO_DATA_WAHLBEZIRK, "Es wurden keine Wahlbezirke gefunden."); + + public static ExceptionDataWrapper CODE_PUTWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG = new ExceptionDataWrapper("319", + "putWahltermindaten: Suchkriterien unvollständig."); + public static ExceptionDataWrapper CODE_DELETEWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG = new ExceptionDataWrapper("306", + "deleteWahltermindaten: Suchkriterien unvollständig."); + public static ExceptionDataWrapper CODE_PUTWAHLTERMINDATEN_NO_WAHLTAG = new ExceptionDataWrapper("320", + "putWahltermindaten: Es wurde kein Wahltag zu dieser WahltagID gefunden. Bitte überprüfen sie Konfiguration im Remote-System nach der EAI."); + public static ExceptionDataWrapper CODE_DELETEWAHLTERMINDATEN_LOESCHEN_UNVOLLSTAENDIG = new ExceptionDataWrapper("307", + "deleteWahltermindaten: Die Wahltermindaten konnten aufgrund eines Fehlers nicht vollstaendig geloescht werden."); + + public static final ExceptionDataWrapper GET_BASISDATEN_NO_DATA = new ExceptionDataWrapper(CODE_NO_DATA_BASISDATEN, + "Es wurden keine Basisdaten gefunden."); + + } diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java index c7d148efd..fc4142fba 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java @@ -7,6 +7,8 @@ @Mapper public interface WahltagModelMapper { + Wahltag toEntity(WahltagModel wahltagModel); + List fromWahltagEntityToWahltagModelList(List entities); List fromWahltagModelToWahltagEntityList(List entities); From 23e9f2595e1800b4d755100e31251c1abd3abfef Mon Sep 17 00:00:00 2001 From: Nic12345678 <162564162+Nic12345678@users.noreply.github.com> Date: Thu, 22 Aug 2024 15:00:12 +0200 Subject: [PATCH 04/67] warnings style usw --- .../services/kopfdaten/InitializeKopfdaten.java | 4 +--- .../services/wahltermindaten/WahltermindatenValidator.java | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java index 3a2f9d598..e32ba93c8 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java @@ -18,9 +18,7 @@ public class InitializeKopfdaten { public void initKopfdaten(BasisdatenModel basisdatenModel) { basisdatenModel.basisstrukturdaten() - .forEach(basisstrukturdaten -> { - initKopfdata(basisstrukturdaten.wahlID(), basisstrukturdaten.wahlbezirkID(), basisdatenModel); - }); + .forEach(basisstrukturdaten -> initKopfdata(basisstrukturdaten.wahlID(), basisstrukturdaten.wahlbezirkID(), basisdatenModel)); } protected KopfdatenModel initKopfdata(String wahlID, String wahlbezirkID, BasisdatenModel basisdaten) { diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java index da836aad2..65e376804 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java @@ -2,9 +2,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahltag; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModel; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; -import java.util.Optional; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpMethod; From 9254b6fdd2f64ba01c42e1be6fcfa063e73befd2 Mon Sep 17 00:00:00 2001 From: Nic12345678 <162564162+Nic12345678@users.noreply.github.com> Date: Thu, 22 Aug 2024 15:02:08 +0200 Subject: [PATCH 05/67] =?UTF-8?q?Repos=20mit=20der=20deleteByBezirkUndWahl?= =?UTF-8?q?ID=5FwahlID=20erg=C3=A4nzt,=20denn=20beim=20deleteWahltermindat?= =?UTF-8?q?en,=20die=20L=C3=B6schung=20nach=20den=20wahlIDs=20der=20vorhan?= =?UTF-8?q?denen=20Wahlen=20eines=20Wahltages=20erfolgt,=20gel=C3=B6scht?= =?UTF-8?q?=20wird=20f=C3=BCr=20alle=20BezirkIDs=20dieser=20Wahlen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basisdatenservice/domain/WahlvorschlaegeRepository.java | 2 ++ .../referendumvorlagen/ReferendumvorlagenRepository.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepository.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepository.java index 05a26a16b..53ba61f12 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepository.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepository.java @@ -51,4 +51,6 @@ public interface WahlvorschlaegeRepository extends CrudRepository Date: Thu, 22 Aug 2024 19:38:50 +0200 Subject: [PATCH 06/67] =?UTF-8?q?Anpassungen=20und=20Tests=20infolge=20von?= =?UTF-8?q?=20deleteWahltermindaten=20bzw=20Delete=20Wahlvorschlaege=20im?= =?UTF-8?q?=20Service,=20Einf=C3=BChrung=20der=20notwendigen=20deleteAllBy?= =?UTF-8?q?BezirkUndWahlID=5FWahlID=20soll=20nur=20die=20betroffenen=20l?= =?UTF-8?q?=C3=B6schen=20nach=20wahlID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/Wahlvorschlaege.java | 3 +- .../domain/Wahlvorschlag.java | 3 +- .../wahlvorschlag/WahlvorschlaegeService.java | 8 +- .../domain/WahlvorschlaegeRepositoryTest.java | 157 ++++++++++++++++++ .../WahlvorschlaegeServiceTest.java | 4 - 5 files changed, 162 insertions(+), 13 deletions(-) create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/Wahlvorschlaege.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/Wahlvorschlaege.java index 8a6ab1f8d..5c986b7cb 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/Wahlvorschlaege.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/Wahlvorschlaege.java @@ -3,6 +3,7 @@ import static java.sql.Types.VARCHAR; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import jakarta.persistence.CascadeType; import jakarta.persistence.Embeddable; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; @@ -50,7 +51,7 @@ public class Wahlvorschlaege { @ToString.Include private String stimmzettelgebietID; - @OneToMany(mappedBy = "wahlvorschlaeage", orphanRemoval = true) + @OneToMany(mappedBy = "wahlvorschlaeage", orphanRemoval = true, cascade = CascadeType.ALL) @NotNull @Size(min = 1) private Set wahlvorschlaege = new LinkedHashSet<>(); diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/Wahlvorschlag.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/Wahlvorschlag.java index eda6a09ee..1c5c395b6 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/Wahlvorschlag.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/Wahlvorschlag.java @@ -2,6 +2,7 @@ import static java.sql.Types.VARCHAR; +import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; @@ -60,7 +61,7 @@ public class Wahlvorschlag { @ToString.Include private boolean erhaeltStimmen; - @OneToMany(mappedBy = "wahlvorschlag", orphanRemoval = true) + @OneToMany(mappedBy = "wahlvorschlag", orphanRemoval = true, cascade = CascadeType.ALL) @NotNull private Set kandidaten = new LinkedHashSet<>(); diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeService.java index 7726057c0..cd0ac4f63 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeService.java @@ -50,13 +50,7 @@ public WahlvorschlaegeModel getWahlvorschlaege(final BezirkUndWahlID bezirkUndWa protected Wahlvorschlaege persistWahlvorschlagModel(final WahlvorschlaegeModel wahlvorschlaegeModel) { val entityToCreate = wahlvorschlaegeModelMapper.toEntity(wahlvorschlaegeModel); - val createdEntity = wahlvorschlaegeRepository.save(entityToCreate); - entityToCreate.getWahlvorschlaege().forEach(wahlvorschlag -> { - wahlvorschlagRepository.save(wahlvorschlag); - kandidatRepository.saveAll(wahlvorschlag.getKandidaten()); - }); - - return createdEntity; + return wahlvorschlaegeRepository.save(entityToCreate); } } diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java new file mode 100644 index 000000000..778c30b13 --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java @@ -0,0 +1,157 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.domain; + +import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_NO_SECURITY_PROFILE; +import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_TEST_PROFILE; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.MicroServiceApplication; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest( + classes = { MicroServiceApplication.class }, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT +) +@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) +@Slf4j +class WahlvorschlaegeRepositoryTest { + + @Autowired + private WahlvorschlaegeRepository wahlvorschlaegeRepository; + + @Autowired + private WahlvorschlagRepository wahlvorschlagRepository; + + @Autowired + private KandidatRepository kandidatRepository; + + @AfterEach + void tearDown() { + kandidatRepository.deleteAll(); + wahlvorschlagRepository.deleteAll(); + wahlvorschlaegeRepository.deleteAll(); + } + + @Test + @Transactional + public void wahlvorschlaegeRepositorySave() { + val wahlID = "wahlID"; + val wahlbezirkID = "wahlbezirkID"; + val wahlvorschlaegeEntity = createWahlvorschlaegeEntity(wahlID, wahlbezirkID); + val bezirkUndWahlID = wahlvorschlaegeEntity.getBezirkUndWahlID(); + + wahlvorschlaegeRepository.save(wahlvorschlaegeEntity); + + Optional persistedWahlvorschlaege = wahlvorschlaegeRepository.findByBezirkUndWahlID(bezirkUndWahlID); + + Assertions.assertThat(wahlvorschlaegeEntity).isEqualTo(persistedWahlvorschlaege.get()); + } + + @Test + @Transactional + public void savingParentWahlvorschlaegeIsAutomaticallySavingWahlvorschlagChildsAndHerKandidatChilds() { + val wahlID = "wahlID"; + val wahlbezirkID = "wahlbezirkID"; + val wahlvorschlaegeEntity = createWahlvorschlaegeEntity(wahlID, wahlbezirkID); + + val expectedWahlvorschlagChilds = wahlvorschlaegeEntity.getWahlvorschlaege(); + + Set expectedAllKandidatChilds = new HashSet<>(); + for (Wahlvorschlag expectedWahlvorschlagChild : expectedWahlvorschlagChilds) { + expectedAllKandidatChilds.addAll(expectedWahlvorschlagChild.getKandidaten()); + } + + wahlvorschlaegeRepository.save(wahlvorschlaegeEntity); + + val foundWahlvorschlagChilds = wahlvorschlagRepository.findAll(); + val foundKandidatChildsOfAllWahlvorschlags = kandidatRepository.findAll(); + + Assertions.assertThat(foundWahlvorschlagChilds).containsExactlyInAnyOrderElementsOf(expectedWahlvorschlagChilds); + Assertions.assertThat(foundKandidatChildsOfAllWahlvorschlags).containsExactlyInAnyOrderElementsOf(expectedAllKandidatChilds); + } + + @Test + @Transactional + public void method_deleteAllByBezirkUndWahlID_WahlID_doesNotDeleteElementsWithOtherWahlIDButSameWahlbezirkID() { + Assertions.assertThat(wahlvorschlaegeRepository.findAll()).isEmpty(); + Assertions.assertThat(wahlvorschlagRepository.findAll()).isEmpty(); + Assertions.assertThat(kandidatRepository.findAll()).isEmpty(); + + val wahlID_1 = "wahlID_1"; + val wahlbezirkID = "wahlbezirkID"; + val wahlID_2 = "wahlID_2"; + + val wahlvorschlaegeEntity1 = createWahlvorschlaegeEntity(wahlID_1, wahlbezirkID); + val bezirkUndWahlID1 = wahlvorschlaegeEntity1.getBezirkUndWahlID(); + val wahlvorschlaegeEntity2 = createWahlvorschlaegeEntity(wahlID_2, wahlbezirkID); + val bezirkUndWahlID2 = wahlvorschlaegeEntity2.getBezirkUndWahlID(); + + wahlvorschlaegeRepository.save(wahlvorschlaegeEntity1); + wahlvorschlaegeRepository.save(wahlvorschlaegeEntity2); + + val expectedWahlvorschlagChilds1 = wahlvorschlaegeEntity1.getWahlvorschlaege(); + Set expectedAllKandidatChilds1 = new HashSet<>(); + for (Wahlvorschlag expectedWahlvorschlagChild : expectedWahlvorschlagChilds1) { + expectedAllKandidatChilds1.addAll(expectedWahlvorschlagChild.getKandidaten()); + } + + val foundWahlvorschlaege_OfWahlID1 = wahlvorschlaegeRepository.findByBezirkUndWahlID(bezirkUndWahlID1); + val foundWahlvorschlagChilds_Of_wahlID1 = foundWahlvorschlaege_OfWahlID1.get().getWahlvorschlaege(); + val foundKandidatChildsOfAllWahlvorschlags_Of_wahlID1 = foundWahlvorschlaege_OfWahlID1.get().getWahlvorschlaege().stream().flatMap( wvorschlag -> wvorschlag.getKandidaten().stream()); + + + Assertions.assertThat(foundWahlvorschlagChilds_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedWahlvorschlagChilds1); + Assertions.assertThat(foundKandidatChildsOfAllWahlvorschlags_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedAllKandidatChilds1); + + val expectedWahlvorschlagChilds2 = wahlvorschlaegeEntity2.getWahlvorschlaege(); + Set expectedAllKandidatChilds2 = new HashSet<>(); + for (Wahlvorschlag expectedWahlvorschlagChild : expectedWahlvorschlagChilds2) { + expectedAllKandidatChilds2.addAll(expectedWahlvorschlagChild.getKandidaten()); + } + + val foundWahlvorschlaege_OfWahlID2 = wahlvorschlaegeRepository.findByBezirkUndWahlID(bezirkUndWahlID2); + val foundWahlvorschlagChilds_Of_wahlID2 = foundWahlvorschlaege_OfWahlID2.get().getWahlvorschlaege(); + val foundKandidatChildsOfAllWahlvorschlags_Of_wahlID2 = foundWahlvorschlaege_OfWahlID2.get().getWahlvorschlaege().stream().flatMap( wvorschlag -> wvorschlag.getKandidaten().stream()).toList(); + + Assertions.assertThat(foundWahlvorschlagChilds_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedWahlvorschlagChilds2); + Assertions.assertThat(foundKandidatChildsOfAllWahlvorschlags_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedAllKandidatChilds2); + + wahlvorschlaegeRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID_1); + + val allRemainingWahlvorschlaege = wahlvorschlaegeRepository.findAll(); + val allRemainingWahlvorschlag = wahlvorschlagRepository.findAll(); + val allRemainingKandidat = kandidatRepository.findAll(); + + Assertions.assertThat(allRemainingWahlvorschlaege).containsExactlyInAnyOrderElementsOf(foundWahlvorschlaege_OfWahlID2.stream().toList()); + Assertions.assertThat(allRemainingWahlvorschlag).containsExactlyInAnyOrderElementsOf(foundWahlvorschlagChilds_Of_wahlID2); + Assertions.assertThat(allRemainingKandidat).containsExactlyInAnyOrderElementsOf(foundKandidatChildsOfAllWahlvorschlags_Of_wahlID2); + + } + + private Wahlvorschlaege createWahlvorschlaegeEntity(final String wahlID, final String wahlbezirkID) { + val entity = new Wahlvorschlaege(null, new BezirkUndWahlID(wahlID, wahlbezirkID), "stimmzettelgebietID", + null); + val wahlvorschlag1 = new Wahlvorschlag(null, "id1" + wahlID + wahlbezirkID, entity, 1L, "kurzname1", true, null); + val kandidat1 = new Kandidat(null, "kandidatID1" + wahlID + wahlbezirkID, wahlvorschlag1, "name1", 1L, true, 1L, true); + val kandidat2 = new Kandidat(null, "kandidatID2" + wahlID + wahlbezirkID, wahlvorschlag1, "name2", 2L, false, 2L, false); + wahlvorschlag1.setKandidaten(Set.of(kandidat1, kandidat2)); + + val wahlvorschlag2 = new Wahlvorschlag(null, "id2" + wahlID + wahlbezirkID, entity, 2L, "kurzname2", false, null); + val kandidat3 = new Kandidat(null, "kandidatID3" + wahlID + wahlbezirkID, wahlvorschlag2, "name3", 1L, true, 1L, true); + val kandidat4 = new Kandidat(null, "kandidatID4" + wahlID + wahlbezirkID, wahlvorschlag2, "name4", 2L, false, 2L, false); + wahlvorschlag2.setKandidaten(Set.of(kandidat3, kandidat4)); + + entity.setWahlvorschlaege(Set.of(wahlvorschlag1, wahlvorschlag2)); + + return entity; + } +} diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeServiceTest.java index d75e67f05..552ed6f03 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeServiceTest.java @@ -82,10 +82,6 @@ void missingDataIsLoadedAndStored() { Assertions.assertThat(result).isSameAs(mockedMappedSavedEntity); Mockito.verify(wahlvorschlaegeRepository).save(mockedMappedEntity); - Mockito.verify(wahlvorschlagRepository).save(mockedWahlvorschlagEntity1); - Mockito.verify(wahlvorschlagRepository).save(mockedWahlvorschlagEntity2); - Mockito.verify(kandidatRepository).saveAll(mockedWahlvorschlagEntity1.getKandidaten()); - Mockito.verify(kandidatRepository).saveAll(mockedWahlvorschlagEntity2.getKandidaten()); } @Test From 3518a8c0ecfb415ca41f7738ebdb14817c0b0a01 Mon Sep 17 00:00:00 2001 From: Nic12345678 <162564162+Nic12345678@users.noreply.github.com> Date: Thu, 22 Aug 2024 19:43:32 +0200 Subject: [PATCH 07/67] =?UTF-8?q?Tests=20nach=20=C3=84nderung=20hinzugef?= =?UTF-8?q?=C3=BCgt=20toEntity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/wahltag/WahltagModelMapperTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapperTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapperTest.java index af8fbab2a..f4bbf84af 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapperTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapperTest.java @@ -32,6 +32,16 @@ void fromWahltagEntityToWahltagModelList() { Assertions.assertThat(result).isEqualTo(expectedResult); } + @Test + void isMappingCorrectFromModelToEntity(){ + val modelToMap = createWahltagModelList().get(0); + + val result = unitUnderTest.toEntity(modelToMap); + + val expectedResult = createWahltagList().get(0); + Assertions.assertThat(result).isEqualTo(expectedResult); + } + private List createWahltagList() { val wahltag1 = new Wahltag("identifikatorWahltag1", LocalDate.now().minusMonths(2), "beschreibungWahltag1", "nummerWahltag1"); val wahltag2 = new Wahltag("identifikatorWahltag2", LocalDate.now().minusMonths(1), "beschreibungWahltag2", "nummerWahltag2"); From ba49a7060468bb4ec7309c3f3c50e6dbee7f36b4 Mon Sep 17 00:00:00 2001 From: Nic12345678 <162564162+Nic12345678@users.noreply.github.com> Date: Fri, 23 Aug 2024 14:47:25 +0200 Subject: [PATCH 08/67] =?UTF-8?q?Anpassungen=20und=20Tests=20infolge=20von?= =?UTF-8?q?=20deleteWahltermindaten=20bzw=20Delete=20Wahlvorschlaege=20im?= =?UTF-8?q?=20Service,=20Einf=C3=BChrung=20der=20notwendigen=20deleteAllBy?= =?UTF-8?q?BezirkUndWahlID=5FWahlID=20soll=20nur=20die=20betroffenen=20l?= =?UTF-8?q?=C3=B6schen=20nach=20wahlID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Referendumvorlagen.java | 3 +- .../ReferendumvorlagenService.java | 2 +- .../WahltermindatenService.java | 4 +- .../ReferendumvorlagenRepositoryTest.java | 149 +++++++ ...ltermindatenControllerIntegrationTest.java | 368 ++++++++++++++++++ 5 files changed, 522 insertions(+), 4 deletions(-) create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/referendumvorlagen/Referendumvorlagen.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/referendumvorlagen/Referendumvorlagen.java index c6d452eb1..8ba935e61 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/referendumvorlagen/Referendumvorlagen.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/referendumvorlagen/Referendumvorlagen.java @@ -3,6 +3,7 @@ import static java.sql.Types.VARCHAR; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import jakarta.persistence.CascadeType; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -45,7 +46,7 @@ public class Referendumvorlagen { @NotNull private String stimmzettelgebietID; - @OneToMany(mappedBy = "referendumvorlagen", orphanRemoval = true) + @OneToMany(mappedBy = "referendumvorlagen", orphanRemoval = true, cascade = CascadeType.ALL) @NotNull private Set referendumvorlagen = new HashSet<>(); diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/referendumvorlagen/ReferendumvorlagenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/referendumvorlagen/ReferendumvorlagenService.java index 8630f1f27..6c1cd8a5f 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/referendumvorlagen/ReferendumvorlagenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/referendumvorlagen/ReferendumvorlagenService.java @@ -57,7 +57,7 @@ private void saveReferendumvorlagen(final Referendumvorlagen referendumvorlagenT try { transactionTemplate.executeWithoutResult(transactionStatus -> { referendumvorlagenRepository.save(referendumvorlagenToSave); - referendumvorlageRepository.saveAll(referendumvorlagenToSave.getReferendumvorlagen()); + //referendumvorlageRepository.saveAll(referendumvorlagenToSave.getReferendumvorlagen()); }); } catch (final Exception e) { log.error("#getReferendumvorlagen: Fehler beim Cachen", e); diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index dc0e0020c..000b06233 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -93,9 +93,9 @@ public void deleteWahltermindaten(final String wahltagID) { wahlIDs.forEach((wahlID) -> { kopfdatenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID); wahlRepository.deleteById(wahlID); - //To Test if "orphanRemoval= true" aus dem Repository funktioniert, also ob auch jeder entsprechende Wahlvorschlag gelöscht wird + //ToDo: Test if "orphanRemoval= true" aus dem Repository funktioniert, also ob auch jeder entsprechende Wahlvorschlag gelöscht wird wahlvorschlaegeRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID); - //To Test if "orphanRemoval= true" aus dem Repository funktioniert + //ToDo: Test if "orphanRemoval= true" aus dem Repository funktioniert referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID); }); } diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java new file mode 100644 index 000000000..f8e56141a --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java @@ -0,0 +1,149 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.domain; + +import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_NO_SECURITY_PROFILE; +import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_TEST_PROFILE; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.MicroServiceApplication; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumoption; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlage; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlageRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest( + classes = { MicroServiceApplication.class }, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT +) +@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) +@Slf4j +class ReferendumvorlagenRepositoryTest { + + @Autowired + private ReferendumvorlagenRepository referendumvorlagenRepository; + + @Autowired + private ReferendumvorlageRepository referendumvorlageRepository; + + @AfterEach + void tearDown() { + referendumvorlageRepository.deleteAll(); + referendumvorlagenRepository.deleteAll(); + } + + @Test + @Transactional + public void referendumvorlagenRepositorySave() { + val wahlID = "wahlID"; + val wahlbezirkID = "wahlbezirkID"; + val referendumvorlagenEntity = createReferendumvorlagenEntity(wahlID, wahlbezirkID); + val bezirkUndWahlID = referendumvorlagenEntity.getBezirkUndWahlID(); + + referendumvorlagenRepository.save(referendumvorlagenEntity); + + Optional persistedReferendumvorlagen = referendumvorlagenRepository.findByBezirkUndWahlID(bezirkUndWahlID); + + Assertions.assertThat(referendumvorlagenEntity).isEqualTo(persistedReferendumvorlagen.get()); + } + + @Test + @Transactional + public void savingParentReferendumvorlagenIsAutomaticallySavingReferendumvorlageChilds() { + val wahlID = "wahlID"; + val wahlbezirkID = "wahlbezirkID"; + val referendumvorlagenEntity = createReferendumvorlagenEntity(wahlID, wahlbezirkID); + + val expectedReferendumvorlageChilds = referendumvorlagenEntity.getReferendumvorlagen(); + + Set expectedAllReferendumoptionChilds = new HashSet<>(); + for (Referendumvorlage expectedReferendumvorlageChild : expectedReferendumvorlageChilds) { + expectedAllReferendumoptionChilds.addAll(expectedReferendumvorlageChild.getReferendumoptionen()); + } + + referendumvorlagenRepository.save(referendumvorlagenEntity); + + val foundReferendumvorlageChilds = referendumvorlageRepository.findAll(); + val foundReferendumoptionChildsOfAllReferendumvorlages = foundReferendumvorlageChilds.stream().flatMap( rvorlage -> rvorlage.getReferendumoptionen().stream()).toList(); + + Assertions.assertThat(foundReferendumvorlageChilds).containsExactlyInAnyOrderElementsOf(expectedReferendumvorlageChilds); + Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages).containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds); + } + + @Test + @Transactional + public void method_deleteAllByBezirkUndWahlID_WahlID_doesNotDeleteElementsWithOtherWahlIDButSameWahlbezirkID() { + Assertions.assertThat(referendumvorlagenRepository.findAll()).isEmpty(); + Assertions.assertThat(referendumvorlageRepository.findAll()).isEmpty(); + + val wahlID_1 = "wahlID_1"; + val wahlbezirkID = "wahlbezirkID"; + val wahlID_2 = "wahlID_2"; + + val referendumvorlagenEntity1 = createReferendumvorlagenEntity(wahlID_1, wahlbezirkID); + val bezirkUndWahlID1 = referendumvorlagenEntity1.getBezirkUndWahlID(); + val referendumvorlagenEntity2 = createReferendumvorlagenEntity(wahlID_2, wahlbezirkID); + val bezirkUndWahlID2 = referendumvorlagenEntity2.getBezirkUndWahlID(); + + referendumvorlagenRepository.save(referendumvorlagenEntity1); + referendumvorlagenRepository.save(referendumvorlagenEntity2); + + val expectedReferendumvorlageChilds1 = referendumvorlagenEntity1.getReferendumvorlagen(); + Set expectedAllReferendumoptionChilds1 = new HashSet<>(); + for (Referendumvorlage expectedReferendumvorlageChild : expectedReferendumvorlageChilds1) { + expectedAllReferendumoptionChilds1.addAll(expectedReferendumvorlageChild.getReferendumoptionen()); + } + + val foundReferendumvorlagen_OfWahlID1 = referendumvorlagenRepository.findByBezirkUndWahlID(bezirkUndWahlID1); + val foundReferendumvorlageChilds_Of_wahlID1 = foundReferendumvorlagen_OfWahlID1.get().getReferendumvorlagen(); + val foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID1 = foundReferendumvorlagen_OfWahlID1.get().getReferendumvorlagen().stream().flatMap( rvorlage -> rvorlage.getReferendumoptionen().stream()); + + Assertions.assertThat(foundReferendumvorlageChilds_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedReferendumvorlageChilds1); + Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds1); + + val expectedReferendumvorlageChilds2 = referendumvorlagenEntity2.getReferendumvorlagen(); + Set expectedAllReferendumoptionChilds2 = new HashSet<>(); + for (Referendumvorlage expectedReferendumvorlageChild : expectedReferendumvorlageChilds2) { + expectedAllReferendumoptionChilds2.addAll(expectedReferendumvorlageChild.getReferendumoptionen()); + } + + val foundReferendumvorlagen_OfWahlID2 = referendumvorlagenRepository.findByBezirkUndWahlID(bezirkUndWahlID2); + val foundReferendumvorlageChilds_Of_wahlID2 = foundReferendumvorlagen_OfWahlID2.get().getReferendumvorlagen(); + val foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID2 = foundReferendumvorlagen_OfWahlID2.get().getReferendumvorlagen().stream().flatMap( rvorlage -> rvorlage.getReferendumoptionen().stream()).toList(); + + Assertions.assertThat(foundReferendumvorlageChilds_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedReferendumvorlageChilds2); + Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds2); + + referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID_1); + + val allRemainingReferendumvorlagen = referendumvorlagenRepository.findAll(); + val allRemainingReferendumvorlages = referendumvorlageRepository.findAll(); + val allRemainingReferendumoption = allRemainingReferendumvorlages.stream().flatMap(rvorlage -> rvorlage.getReferendumoptionen().stream()).toList(); + + Assertions.assertThat(allRemainingReferendumvorlagen).containsExactlyInAnyOrderElementsOf(foundReferendumvorlagen_OfWahlID2.stream().toList()); + Assertions.assertThat(allRemainingReferendumvorlages).containsExactlyInAnyOrderElementsOf(foundReferendumvorlageChilds_Of_wahlID2); + Assertions.assertThat(allRemainingReferendumoption).containsExactlyInAnyOrderElementsOf(foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID2); + } + + private Referendumvorlagen createReferendumvorlagenEntity(final String wahlID, final String wahlbezirkID) { + val stimmzettelgebietID = "stimmzettelgebietID"; + val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val entity = new Referendumvorlagen(null, bezirkUndWahlID, stimmzettelgebietID, null); + val referendumvorlage_1 = new Referendumvorlage(null, entity, "wahlvorschlagID1", 1L, "kurzname1", "frage1", + Set.of(new Referendumoption("option11" + wahlID + wahlbezirkID, "optionsName11", 1L), new Referendumoption("option12" + wahlID + wahlbezirkID, "optionsName12", 2L))); + val referendumvorlage_2 = new Referendumvorlage(null, entity, "wahlvorschlagID2", 2L, "kurzname2", "frage2", + Set.of(new Referendumoption("option21" + wahlID + wahlbezirkID, "optionsName21", 3L), new Referendumoption("option22" + wahlID + wahlbezirkID, "optionsName22", 4L))); + entity.setReferendumvorlagen(Set.of(referendumvorlage_1, referendumvorlage_2)); + return entity; + } +} diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java new file mode 100644 index 000000000..ab1a92176 --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -0,0 +1,368 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahltermindaten; + +import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_NO_SECURITY_PROFILE; +import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_TEST_PROFILE; +import static org.mockito.ArgumentMatchers.any; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.tomakehurst.wiremock.client.WireMock; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.MicroServiceApplication; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.clients.ReferendumvorlagenClientMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.KandidatRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlagRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlageRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.KandidatDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumoptionDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlageDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlvorschlagDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.referendumvorlagen.ReferendumvorlagenDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.referendumvorlagen.ReferendumvorlagenDTOMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenModelMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenReferenceModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenValidator; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.Authorities; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; +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.domain.BezirkUndWahlID; +import de.muenchen.oss.wahllokalsystem.wls.common.testing.SecurityUtils; +import jakarta.transaction.Transactional; +import java.util.Set; +import javax.annotation.Nullable; +import lombok.val; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +@SpringBootTest(classes = MicroServiceApplication.class) +@AutoConfigureMockMvc +@AutoConfigureWireMock +@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) +public class WahltermindatenControllerIntegrationTest { + + public static final String BUSINESS_ACTIONS_REFERENDUMVORLAGEN = "/businessActions/referendumvorlagen/"; + + @Value("${service.info.oid}") + String serviceOid; + + @Autowired + MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + WahlvorschlaegeRepository wahlvorschlaegeRepository; + @Autowired + WahlvorschlagRepository wahlvorschlagRepository; + @Autowired + KandidatRepository kandidatRepository; + + @Autowired + ReferendumvorlagenRepository referendumvorlagenRepository; + @Autowired + ReferendumvorlageRepository referendumvorlageRepository; + + @Autowired + ReferendumvorlagenClientMapper referendumvorlagenClientMapper; + + @Autowired + ReferendumvorlagenModelMapper referendumvorlagenModelMapper; + + @Autowired + ReferendumvorlagenDTOMapper referendumvorlagenDTOMapper; + + @SpyBean + ReferendumvorlagenValidator referendumvorlagenValidator; + + @AfterEach + void tearDown() { + SecurityUtils.runWith(Authorities.REPOSITORY_DELETE_REFERENDUMVORLAGEN, Authorities.REPOSITORY_DELETE_WAHLVORSCHLAEGE); + wahlvorschlaegeRepository.deleteAll(); + referendumvorlagenRepository.deleteAll(); + } + + @Nested + class DeleteWahltermindaten { + + @Test + @Transactional + void deletesReferendumvorlagenAndAllChildren_onlyForGivenWahlID() throws Exception { + val wahlID_1 = "wahlID_1"; + val wahlbezirkID = "wahlbezirkID"; + val wahlID_2 = "wahlID_2"; + + val eaiReferendumvorschlage1 = createClientReferendumvorlagenDTO("szgID1"); + defineStubForGetReferendumvorlage(eaiReferendumvorschlage1, wahlID_1, wahlbezirkID, HttpStatus.OK); + val eaiReferendumvorschlage2 = createClientReferendumvorlagenDTO("szgID2"); + defineStubForGetReferendumvorlage(eaiReferendumvorschlage2, wahlID_2, wahlbezirkID, HttpStatus.OK); + + val request_1 = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID_1 + "/" + wahlbezirkID); + mockMvc.perform(request_1).andExpect(status().isOk()); + val request_2 = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID_2 + "/" + wahlbezirkID); + mockMvc.perform(request_2).andExpect(status().isOk()); + + val referendumvorlagenEntity_1 = referendumvorlagenRepository.findByBezirkUndWahlID(new BezirkUndWahlID(wahlID_1, wahlbezirkID)).get(); + val savedSubEntities_1_inRepo = referendumvorlagenEntity_1.getReferendumvorlagen(); + Assertions.assertThat(savedSubEntities_1_inRepo.size()).isEqualTo(eaiReferendumvorschlage1.getReferendumvorlagen().size()); + + val referendumvorlagenEntity_2 = referendumvorlagenRepository.findByBezirkUndWahlID(new BezirkUndWahlID(wahlID_2, wahlbezirkID)).get(); + val savedSubEntities_2_inRepo = referendumvorlagenEntity_2.getReferendumvorlagen(); + Assertions.assertThat(savedSubEntities_2_inRepo.size()).isEqualTo(eaiReferendumvorschlage2.getReferendumvorlagen().size()); + + Assertions.assertThat(referendumvorlageRepository.findAll().size()).isEqualTo(savedSubEntities_2_inRepo.size() + savedSubEntities_2_inRepo.size()); + + referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID_1); + + val foundSubEntities_afterDelete_InRepo = referendumvorlageRepository.findAll(); + + Assertions.assertThat(foundSubEntities_afterDelete_InRepo).containsExactlyInAnyOrderElementsOf(savedSubEntities_2_inRepo); + } + +// @Test +// @Transactional +// void deletesWahlvorschlaegeAndAllChildren_onlyForGivenWahlID() throws Exception { +// val wahlID_1 = "wahlID_1"; +// val wahlbezirkID = "wahlbezirkID"; +// val wahlID_2 = "wahlID_2"; +// +// val eaiWahlvorschlaege_1 = createClientWahlvorschlaegeDTO("wahlID_1", "wahlbezirkID"); +// defineStubForGetReferendumvorlage(eaiReferendumvorschlage1, wahlID_1, wahlbezirkID, HttpStatus.OK); +// val eaiReferendumvorschlage2 = createClientReferendumvorlagenDTO("szgID2"); +// defineStubForGetReferendumvorlage(eaiReferendumvorschlage2, wahlID_2, wahlbezirkID, HttpStatus.OK); +// +// val request_1 = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID_1 + "/" + wahlbezirkID); +// mockMvc.perform(request_1).andExpect(status().isOk()); +// val request_2 = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID_2 + "/" + wahlbezirkID); +// mockMvc.perform(request_2).andExpect(status().isOk()); +// +// val referendumvorlagenEntity_1 = referendumvorlagenRepository.findByBezirkUndWahlID(new BezirkUndWahlID(wahlID_1, wahlbezirkID)).get(); +// val savedSubEntities_1_inRepo = referendumvorlagenEntity_1.getReferendumvorlagen(); +// Assertions.assertThat(savedSubEntities_1_inRepo.size()).isEqualTo(eaiReferendumvorschlage1.getReferendumvorlagen().size()); +// +// val referendumvorlagenEntity_2 = referendumvorlagenRepository.findByBezirkUndWahlID(new BezirkUndWahlID(wahlID_2, wahlbezirkID)).get(); +// val savedSubEntities_2_inRepo = referendumvorlagenEntity_2.getReferendumvorlagen(); +// Assertions.assertThat(savedSubEntities_2_inRepo.size()).isEqualTo(eaiReferendumvorschlage2.getReferendumvorlagen().size()); +// +// Assertions.assertThat(referendumvorlageRepository.findAll().size()).isEqualTo(savedSubEntities_2_inRepo.size() + savedSubEntities_2_inRepo.size()); +// +// referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID_1); +// +// val foundSubEntities_afterDelete_InRepo = referendumvorlageRepository.findAll(); +// +// Assertions.assertThat(foundSubEntities_afterDelete_InRepo).containsExactlyInAnyOrderElementsOf(savedSubEntities_2_inRepo); +// } + +// @Test +// void technischeWlsExceptionWhenNoDataFoundExternal() throws Exception { +// val wahlID = "wahlID"; +// val wahlbezirkID = "wahlbezirkID"; +// +// defineStubForGetReferendumvorlage(null, wahlID, wahlbezirkID, HttpStatus.OK); +// +// val request = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID + "/" + wahlbezirkID); +// +// val response = mockMvc.perform(request).andExpect(status().isNoContent()).andReturn(); +// +// Assertions.assertThat(response.getResponse().getContentAsByteArray()).isEmpty(); +// } +// +// @Test +// void technischeWlsExceptionWhenCommunicationFailed() throws Exception { +// val wahlID = "wahlID"; +// val wahlbezirkID = "wahlbezirkID"; +// +// val eaiReferendumvorschlage = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WlsExceptionDTO(); +// defineStubForGetReferendumvorlage(eaiReferendumvorschlage, wahlID, wahlbezirkID, HttpStatus.INSUFFICIENT_STORAGE); +// +// val request = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID + "/" + wahlbezirkID); +// +// val response = mockMvc.perform(request).andExpect(status().isInternalServerError()).andReturn(); +// val responseBodyAsDTO = objectMapper.readValue(response.getResponse().getContentAsByteArray(), WlsExceptionDTO.class); +// +// val expectedWlsExceptionDTO = new WlsExceptionDTO(WlsExceptionCategory.T, ExceptionConstants.FAILED_COMMUNICATION_WITH_EAI.code(), serviceOid, +// ExceptionConstants.FAILED_COMMUNICATION_WITH_EAI.message()); +// Assertions.assertThat(responseBodyAsDTO).isEqualTo(expectedWlsExceptionDTO); +// } +// +// @Test +// void fachlicheWlsExceptionWhenPathVariableIsInvalid() throws Exception { +// val wahlID = "wahlID"; +// val wahlbezirkID = "wahlbezirkID"; +// +// val mockedWlsExceptionCode = "123"; +// val mockedWlsExceptionMessage = "faked validation exception"; +// val mockedWlsExceptionService = "mockedServiceID"; +// val mockedValidationException = FachlicheWlsException.withCode(mockedWlsExceptionCode).inService(mockedWlsExceptionService) +// .buildWithMessage(mockedWlsExceptionMessage); +// Mockito.doThrow(mockedValidationException).when(referendumvorlagenValidator) +// .validReferumvorlageReferenceModelOrThrow(new ReferendumvorlagenReferenceModel(wahlID, wahlbezirkID)); +// +// val request = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID + "/" + wahlbezirkID); +// +// val response = mockMvc.perform(request).andExpect(status().isBadRequest()).andReturn(); +// val responseBodyAsDTO = objectMapper.readValue(response.getResponse().getContentAsByteArray(), WlsExceptionDTO.class); +// +// val expectedBodyDTO = new WlsExceptionDTO(WlsExceptionCategory.F, mockedWlsExceptionCode, mockedWlsExceptionService, mockedWlsExceptionMessage); +// Assertions.assertThat(responseBodyAsDTO).isEqualTo(expectedBodyDTO); +// } +// +// @Test +// void alleReferendumdataIsStoredTransactional() throws Exception { +// val wahlID = "wahlID"; +// val wahlbezirkID = "wahlbezirkID"; +// +// val eaiReferendumvorschlage = createClientReferendumvorlagenDTO(); +// defineStubForGetReferendumvorlage(eaiReferendumvorschlage, wahlID, wahlbezirkID, HttpStatus.OK); +// +// val mockedSaveAllException = new RuntimeException("save all failed"); +// Mockito.doThrow(mockedSaveAllException).when(referendumvorlageRepository).saveAll(any()); +// +// val request = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID + "/" + wahlbezirkID); +// +// val response = mockMvc.perform(request).andExpect(status().isOk()).andReturn(); +// val responseBodyAsDTO = objectMapper.readValue(response.getResponse().getContentAsByteArray(), ReferendumvorlagenDTO.class); +// +// val expectedBodyDTO = referendumvorlagenDTOMapper.toDTO(referendumvorlagenClientMapper.toModel(eaiReferendumvorschlage)); +// Assertions.assertThat(responseBodyAsDTO).isEqualTo(expectedBodyDTO); +// +// Assertions.assertThat(referendumvorlagenRepository.count()).isEqualTo(0); +// Assertions.assertThat(referendumvorlageRepository.count()).isEqualTo(0); +// } + + private de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlagenDTO createClientReferendumvorlagenDTO(final String stimmzettelgebietID) { + val dto = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlagenDTO(); + + dto.setStimmzettelgebietID(stimmzettelgebietID); + + val referendumOption1_1 = new ReferendumoptionDTO(); + referendumOption1_1.setId("optionID1_1" + stimmzettelgebietID); + referendumOption1_1.setName("optionName1_1"); + referendumOption1_1.setPosition(1L); + + val referendumOption1_2 = new ReferendumoptionDTO(); + referendumOption1_2.setId("optionID1_2" + stimmzettelgebietID); + referendumOption1_2.setName("optionName1_2"); + referendumOption1_2.setPosition(1L); + + val vorlage1 = new ReferendumvorlageDTO(); + vorlage1.setFrage("frage"); + vorlage1.setKurzname("kurzname_1"); + vorlage1.setOrdnungszahl(1L); + vorlage1.setWahlvorschlagID("wahlvorschlagID"); + vorlage1.setReferendumoptionen(Set.of(referendumOption1_1, referendumOption1_2)); + + val referendumOption2_1 = new ReferendumoptionDTO(); + referendumOption2_1.setId("optionID2_1" + stimmzettelgebietID); + referendumOption2_1.setName("optionName2_1"); + referendumOption2_1.setPosition(1L); + + val referendumOption2_2 = new ReferendumoptionDTO(); + referendumOption2_2.setId("optionID2_2" + stimmzettelgebietID); + referendumOption2_2.setName("optionName2_2"); + referendumOption2_2.setPosition(1L); + + val vorlage2 = new ReferendumvorlageDTO(); + vorlage2.setFrage("frage"); + vorlage2.setKurzname("kurzname_2"); + vorlage2.setOrdnungszahl(1L); + vorlage2.setWahlvorschlagID("wahlvorschlagID"); + vorlage2.setReferendumoptionen(Set.of(referendumOption2_1, referendumOption2_2)); + + dto.setReferendumvorlagen(Set.of(vorlage1, vorlage2)); + + return dto; + } + + private void defineStubForGetReferendumvorlage( + @Nullable final Object wiremockPayload, final String wahlID, + final String wahlbezirkID, + final HttpStatus httpStatus) throws Exception { + val wireMockResponse = WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus( + httpStatus.value()); + + if (wireMockResponse != null) { + wireMockResponse.withBody(objectMapper.writeValueAsBytes(wiremockPayload)); + } + + WireMock.stubFor(WireMock.get("/vorschlaege/referendum/" + wahlID + "/" + wahlbezirkID) + .willReturn(wireMockResponse)); + } + } + + private de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlvorschlaegeDTO createClientWahlvorschlaegeDTO(final String wahlID, + final String wahlbezirkID) { + val stimmzettelgebietID = "stimmzettelgebietID"; + + val clientWahlvorschlaegeDTO = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlvorschlaegeDTO(); + clientWahlvorschlaegeDTO.setStimmzettelgebietID(stimmzettelgebietID); + clientWahlvorschlaegeDTO.setWahlID(wahlID); + clientWahlvorschlaegeDTO.setWahlbezirkID(wahlbezirkID); + + val wahlvorschlag1 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlvorschlagDTO(); + wahlvorschlag1.setErhaeltStimmen(true); + wahlvorschlag1.setIdentifikator("identifikator1"); + wahlvorschlag1.setKurzname("kurzname1"); + wahlvorschlag1.setOrdnungszahl(1L); + + val kandidat11 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.KandidatDTO(); + kandidat11.setIdentifikator("kandidat11"); + kandidat11.setDirektkandidat(true); + kandidat11.setEinzelbewerber(true); + kandidat11.setName("name11"); + kandidat11.setListenposition(1L); + kandidat11.setTabellenSpalteInNiederschrift(1L); + + val kandidat12 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.KandidatDTO(); + kandidat12.setIdentifikator("kandidat12"); + kandidat12.setDirektkandidat(false); + kandidat12.setEinzelbewerber(false); + kandidat12.setName("name12"); + kandidat12.setListenposition(2L); + kandidat12.setTabellenSpalteInNiederschrift(2L); + wahlvorschlag1.setKandidaten(Set.of(kandidat11, kandidat12)); + + val wahlvorschlag2 = new WahlvorschlagDTO(); + wahlvorschlag2.setErhaeltStimmen(false); + wahlvorschlag2.setIdentifikator("identifikator2"); + wahlvorschlag2.setKurzname("kurzname2"); + wahlvorschlag2.setOrdnungszahl(2L); + + val kandidat21 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.KandidatDTO(); + kandidat21.setIdentifikator("kandidat21"); + kandidat21.setDirektkandidat(true); + kandidat21.setEinzelbewerber(true); + kandidat21.setName("name21"); + kandidat21.setListenposition(3L); + kandidat21.setTabellenSpalteInNiederschrift(3L); + + val kandidat22 = new KandidatDTO(); + kandidat22.setIdentifikator("kandidat22"); + kandidat22.setDirektkandidat(false); + kandidat22.setEinzelbewerber(false); + kandidat22.setName("name22"); + kandidat22.setListenposition(4L); + kandidat22.setTabellenSpalteInNiederschrift(4L); + wahlvorschlag2.setKandidaten(Set.of(kandidat21, kandidat22)); + + val wahlvorschlaege = Set.of(wahlvorschlag1, wahlvorschlag2); + clientWahlvorschlaegeDTO.setWahlvorschlaege(wahlvorschlaege); + + return clientWahlvorschlaegeDTO; + } +} From d7e33b2e5bd40703fb18089eb3bbf61e8b7e1eae Mon Sep 17 00:00:00 2001 From: Nic12345678 <162564162+Nic12345678@users.noreply.github.com> Date: Fri, 23 Aug 2024 16:40:43 +0200 Subject: [PATCH 09/67] =?UTF-8?q?Test=20deletByWahlbezirUndWahlID=5FWAHLid?= =?UTF-8?q?=20f=C3=BCr=20Referendumvorlagen,=20folgst=20Wahlvorschlaege?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ltermindatenControllerIntegrationTest.java | 110 ------------------ 1 file changed, 110 deletions(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index ab1a92176..901a7d090 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -134,116 +134,6 @@ void deletesReferendumvorlagenAndAllChildren_onlyForGivenWahlID() throws Excepti Assertions.assertThat(foundSubEntities_afterDelete_InRepo).containsExactlyInAnyOrderElementsOf(savedSubEntities_2_inRepo); } -// @Test -// @Transactional -// void deletesWahlvorschlaegeAndAllChildren_onlyForGivenWahlID() throws Exception { -// val wahlID_1 = "wahlID_1"; -// val wahlbezirkID = "wahlbezirkID"; -// val wahlID_2 = "wahlID_2"; -// -// val eaiWahlvorschlaege_1 = createClientWahlvorschlaegeDTO("wahlID_1", "wahlbezirkID"); -// defineStubForGetReferendumvorlage(eaiReferendumvorschlage1, wahlID_1, wahlbezirkID, HttpStatus.OK); -// val eaiReferendumvorschlage2 = createClientReferendumvorlagenDTO("szgID2"); -// defineStubForGetReferendumvorlage(eaiReferendumvorschlage2, wahlID_2, wahlbezirkID, HttpStatus.OK); -// -// val request_1 = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID_1 + "/" + wahlbezirkID); -// mockMvc.perform(request_1).andExpect(status().isOk()); -// val request_2 = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID_2 + "/" + wahlbezirkID); -// mockMvc.perform(request_2).andExpect(status().isOk()); -// -// val referendumvorlagenEntity_1 = referendumvorlagenRepository.findByBezirkUndWahlID(new BezirkUndWahlID(wahlID_1, wahlbezirkID)).get(); -// val savedSubEntities_1_inRepo = referendumvorlagenEntity_1.getReferendumvorlagen(); -// Assertions.assertThat(savedSubEntities_1_inRepo.size()).isEqualTo(eaiReferendumvorschlage1.getReferendumvorlagen().size()); -// -// val referendumvorlagenEntity_2 = referendumvorlagenRepository.findByBezirkUndWahlID(new BezirkUndWahlID(wahlID_2, wahlbezirkID)).get(); -// val savedSubEntities_2_inRepo = referendumvorlagenEntity_2.getReferendumvorlagen(); -// Assertions.assertThat(savedSubEntities_2_inRepo.size()).isEqualTo(eaiReferendumvorschlage2.getReferendumvorlagen().size()); -// -// Assertions.assertThat(referendumvorlageRepository.findAll().size()).isEqualTo(savedSubEntities_2_inRepo.size() + savedSubEntities_2_inRepo.size()); -// -// referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID_1); -// -// val foundSubEntities_afterDelete_InRepo = referendumvorlageRepository.findAll(); -// -// Assertions.assertThat(foundSubEntities_afterDelete_InRepo).containsExactlyInAnyOrderElementsOf(savedSubEntities_2_inRepo); -// } - -// @Test -// void technischeWlsExceptionWhenNoDataFoundExternal() throws Exception { -// val wahlID = "wahlID"; -// val wahlbezirkID = "wahlbezirkID"; -// -// defineStubForGetReferendumvorlage(null, wahlID, wahlbezirkID, HttpStatus.OK); -// -// val request = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID + "/" + wahlbezirkID); -// -// val response = mockMvc.perform(request).andExpect(status().isNoContent()).andReturn(); -// -// Assertions.assertThat(response.getResponse().getContentAsByteArray()).isEmpty(); -// } -// -// @Test -// void technischeWlsExceptionWhenCommunicationFailed() throws Exception { -// val wahlID = "wahlID"; -// val wahlbezirkID = "wahlbezirkID"; -// -// val eaiReferendumvorschlage = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WlsExceptionDTO(); -// defineStubForGetReferendumvorlage(eaiReferendumvorschlage, wahlID, wahlbezirkID, HttpStatus.INSUFFICIENT_STORAGE); -// -// val request = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID + "/" + wahlbezirkID); -// -// val response = mockMvc.perform(request).andExpect(status().isInternalServerError()).andReturn(); -// val responseBodyAsDTO = objectMapper.readValue(response.getResponse().getContentAsByteArray(), WlsExceptionDTO.class); -// -// val expectedWlsExceptionDTO = new WlsExceptionDTO(WlsExceptionCategory.T, ExceptionConstants.FAILED_COMMUNICATION_WITH_EAI.code(), serviceOid, -// ExceptionConstants.FAILED_COMMUNICATION_WITH_EAI.message()); -// Assertions.assertThat(responseBodyAsDTO).isEqualTo(expectedWlsExceptionDTO); -// } -// -// @Test -// void fachlicheWlsExceptionWhenPathVariableIsInvalid() throws Exception { -// val wahlID = "wahlID"; -// val wahlbezirkID = "wahlbezirkID"; -// -// val mockedWlsExceptionCode = "123"; -// val mockedWlsExceptionMessage = "faked validation exception"; -// val mockedWlsExceptionService = "mockedServiceID"; -// val mockedValidationException = FachlicheWlsException.withCode(mockedWlsExceptionCode).inService(mockedWlsExceptionService) -// .buildWithMessage(mockedWlsExceptionMessage); -// Mockito.doThrow(mockedValidationException).when(referendumvorlagenValidator) -// .validReferumvorlageReferenceModelOrThrow(new ReferendumvorlagenReferenceModel(wahlID, wahlbezirkID)); -// -// val request = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID + "/" + wahlbezirkID); -// -// val response = mockMvc.perform(request).andExpect(status().isBadRequest()).andReturn(); -// val responseBodyAsDTO = objectMapper.readValue(response.getResponse().getContentAsByteArray(), WlsExceptionDTO.class); -// -// val expectedBodyDTO = new WlsExceptionDTO(WlsExceptionCategory.F, mockedWlsExceptionCode, mockedWlsExceptionService, mockedWlsExceptionMessage); -// Assertions.assertThat(responseBodyAsDTO).isEqualTo(expectedBodyDTO); -// } -// -// @Test -// void alleReferendumdataIsStoredTransactional() throws Exception { -// val wahlID = "wahlID"; -// val wahlbezirkID = "wahlbezirkID"; -// -// val eaiReferendumvorschlage = createClientReferendumvorlagenDTO(); -// defineStubForGetReferendumvorlage(eaiReferendumvorschlage, wahlID, wahlbezirkID, HttpStatus.OK); -// -// val mockedSaveAllException = new RuntimeException("save all failed"); -// Mockito.doThrow(mockedSaveAllException).when(referendumvorlageRepository).saveAll(any()); -// -// val request = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID + "/" + wahlbezirkID); -// -// val response = mockMvc.perform(request).andExpect(status().isOk()).andReturn(); -// val responseBodyAsDTO = objectMapper.readValue(response.getResponse().getContentAsByteArray(), ReferendumvorlagenDTO.class); -// -// val expectedBodyDTO = referendumvorlagenDTOMapper.toDTO(referendumvorlagenClientMapper.toModel(eaiReferendumvorschlage)); -// Assertions.assertThat(responseBodyAsDTO).isEqualTo(expectedBodyDTO); -// -// Assertions.assertThat(referendumvorlagenRepository.count()).isEqualTo(0); -// Assertions.assertThat(referendumvorlageRepository.count()).isEqualTo(0); -// } private de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlagenDTO createClientReferendumvorlagenDTO(final String stimmzettelgebietID) { val dto = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlagenDTO(); From 5a0e2c4f07b1d68b70472f51dfcd38fbf7614af3 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Thu, 12 Sep 2024 09:27:31 +0200 Subject: [PATCH 10/67] method 'toEntity' added --- .../basisdatenservice/services/wahltag/WahltagModelMapper.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java index 90b5657bf..09ac5adab 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java @@ -7,6 +7,8 @@ @Mapper public interface WahltagModelMapper { + Wahltag toEntity(WahltagModel wahltagModel); + WahltagModel toModel(Wahltag wahltag); List fromWahltagEntityToWahltagModelList(List entities); From 635f631df481cc5b3feecd37d57e1b76c641a713 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Thu, 12 Sep 2024 09:50:15 +0200 Subject: [PATCH 11/67] 'assert' removed -> should not be used in production code and checks for null are already done in validator: some formatting --- .../WahltermindatenService.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index 000b06233..2952fff2e 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -59,22 +59,24 @@ public void putWahltermindaten(final String wahltagID) { log.info("#putWahltermindaten"); wahltermindatenValidator.validWahltagIDParamOrThrow(wahltagID, HttpMethod.PUT); val wahltagModel = wahltageService.getWahltage().stream() - .filter(w -> w.wahltagID().equals(wahltagID)) - .findAny().orElse(null); + .filter(w -> w.wahltagID().equals(wahltagID)) + .findAny().orElse(null); wahltermindatenValidator.validateWahltagForSearchingWahltagID(wahltagModelMapper.toEntity(wahltagModel), HttpMethod.PUT); - assert wahltagModel != null; + val basisdatenModel = wahldatenClient.loadBasisdaten(wahltagModel.wahltag(), wahltagModel.nummer()); - if (null == basisdatenModel) { throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.GET_BASISDATEN_NO_DATA);} + if (null == basisdatenModel) { + throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.GET_BASISDATEN_NO_DATA); + } val wahlModels = initWahlen(wahltagModel); val wahlbezirkModels = initWahlbezirke(wahltagModel, wahlModels); final InitializeKopfdaten kopfDataInitializer = new InitializeKopfdaten(exceptionFactory, kopfdatenRepository, kopfdatenModelMapper); kopfDataInitializer.initKopfdaten(basisdatenModel); - // ToDo in next Issue + // ToDo: add async classes, adapt EAI client, improve async handlöing? // Async -// asyncRequests.getAsyncProgress().reset(wahltag.getWahltag(), wahltag.getNummer()); -// asyncRequests.initWahlvorschlaege(wahlen, wahlbezirke); -// asyncRequests.initReferendumvorlagen(wahlen, wahlbezirke); + // asyncRequests.getAsyncProgress().reset(wahltag.getWahltag(), wahltag.getNummer()); + // asyncRequests.initWahlvorschlaege(wahlen, wahlbezirke); + // asyncRequests.initReferendumvorlagen(wahlen, wahlbezirke); } @@ -85,7 +87,7 @@ public void deleteWahltermindaten(final String wahltagID) { wahltermindatenValidator.validWahltagIDParamOrThrow(wahltagID, HttpMethod.DELETE); val wahltag = wahltagRepository.findById(wahltagID).orElse(null); wahltermindatenValidator.validateWahltagForSearchingWahltagID(wahltag, HttpMethod.DELETE); - assert wahltag != null; + val basisstrukturdaten = wahldatenClient.loadBasisdaten(wahltag.getWahltag(), wahltag.getNummer()).basisstrukturdaten(); val wahlIDs = basisstrukturdaten.stream().map(BasisstrukturdatenModel::wahlID).toList(); @@ -102,16 +104,14 @@ public void deleteWahltermindaten(final String wahltagID) { private List initWahlen(WahltagModel wahltag) { val wahlen = wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities( - wahldatenClient.loadBasisdaten(wahltag.wahltag(), wahltag.nummer()).wahlen().stream().toList() - ); + wahldatenClient.loadBasisdaten(wahltag.wahltag(), wahltag.nummer()).wahlen().stream().toList()); wahlRepository.saveAll(wahlen); return wahlModelMapper.fromListOfWahlEntityToListOfWahlModel(wahlen); } private List initWahlbezirke(WahltagModel wahltagModel, List wahlModels) { val wahlbezirke = wahlbezirkModelMapper.fromListOfWahlbezirkModeltoListOfWahlbezirkEntities( - wahlbezirkeClient.loadWahlbezirke(wahltagModel.wahltag(), wahltagModel.nummer()).stream().toList() - ); + wahlbezirkeClient.loadWahlbezirke(wahltagModel.wahltag(), wahltagModel.nummer()).stream().toList()); wahlbezirkRepository.saveAll(wahlbezirke); return wahlbezirkModelMapper.fromListOfWahlbezirkEntityToListOfWahlbezirkModel(wahlbezirke); } From c0419c1e1fdeca70ef4f6f09993ce095d22277a2 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Thu, 12 Sep 2024 14:40:13 +0200 Subject: [PATCH 12/67] =?UTF-8?q?Arbeitsstand=20der=20Async-Klassen=20f?= =?UTF-8?q?=C3=BCr=20=C3=9Cbergabe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wahltermindaten/AsyncProgress.java | 71 +++++++++++++++++++ .../wahltermindaten/AsyncRequests.java | 8 +++ 2 files changed, 79 insertions(+) create mode 100644 wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java create mode 100644 wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncRequests.java diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java new file mode 100644 index 000000000..24ab61f24 --- /dev/null +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java @@ -0,0 +1,71 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; + +import jakarta.persistence.Embeddable; +import java.time.LocalDate; +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Embeddable +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AsyncProgress { + + public static final Logger LOG = LoggerFactory.getLogger(AsyncProgress.class); + + private LocalDate forWahltag; + private String wahlNummer = ""; + private LocalDateTime lastStartTime; + private LocalDateTime lastFinishTime = LocalDateTime.now(); + private boolean wahlvorschlaegeLoadingActive = false; + private int wahlvorschlaegeTotal = 0; + private int wahlvorschlageFinished = 0; + private String wahlvorschlaegeNext = ""; + private boolean referendumLoadingActive = false; + private int referendumVorlagenTotal = 0; + private int referendumVorlagenFinished = 0; + private String referendumVorlagenNext = ""; + + public synchronized void incWahlvorschlaegeFinished() { + wahlvorschlageFinished++; + LOG.info("#incWahlvorschlaegeFinished: {}", wahlvorschlageFinished); + if (wahlvorschlageFinished >= getWahlvorschlaegeTotal()) { + this.setWahlvorschlaegeLoadingActive(false); + if (!this.isReferendumLoadingActive()) { + this.setLastFinishTime(LocalDateTime.now()); + } + } + } + + public synchronized void incReferendumVorlagenFinished() { + referendumVorlagenFinished++; + LOG.info("#incReferendumVorlagenFinished: {}", referendumVorlagenFinished); + if (getReferendumVorlagenFinished() >= getReferendumVorlagenTotal()) { + this.setReferendumLoadingActive(false); + if (!this.isWahlvorschlaegeLoadingActive()) { + this.setLastFinishTime(LocalDateTime.now()); + } + } + } + + public void reset(LocalDate forWahltag, String wahlNummer) { + this.forWahltag = forWahltag; + this.wahlNummer = wahlNummer; + lastStartTime = LocalDateTime.now(); + lastFinishTime = null; + wahlvorschlageFinished = 0; + wahlvorschlaegeTotal = 0; + wahlvorschlaegeLoadingActive = false; + referendumVorlagenFinished = 0; + referendumVorlagenTotal = 0; + referendumLoadingActive = false; + } + +} + diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncRequests.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncRequests.java new file mode 100644 index 000000000..f08b6d831 --- /dev/null +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncRequests.java @@ -0,0 +1,8 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; + +import org.springframework.stereotype.Service; + +@Service +public class AsyncRequests { + +} From 143ee92741de1ced7b21dc576e9d39fc2a1b925e Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 3 Oct 2024 10:04:41 +0200 Subject: [PATCH 13/67] improve implementation --- .../WahltermindatenService.java | 73 ++++++++++--------- .../WahltermindatenValidator.java | 20 ++--- 2 files changed, 45 insertions(+), 48 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index 2952fff2e..41813c344 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -1,7 +1,7 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlbezirk; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlbezirkRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahltagRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; @@ -9,22 +9,22 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.InitializeKopfdaten; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModelMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.WahldatenClient; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModelMapper; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkeClient; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModelMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModel; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModelMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltageService; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; +import java.util.Collection; import java.util.List; +import java.util.function.Supplier; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val; -import org.springframework.http.HttpMethod; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -32,24 +32,22 @@ @Service @RequiredArgsConstructor @Slf4j +//TODO create Issue for Phase 3: this Service is a fassade for other services: wahlen, wahlbezirke, ... public class WahltermindatenService { private final WahltermindatenValidator wahltermindatenValidator; private final WahltageService wahltageService; private final WahldatenClient wahldatenClient; - private final WahlbezirkeClient wahlbezirkeClient; - private final WahltagModelMapper wahltagModelMapper; private final WahlModelMapper wahlModelMapper; private final WahlbezirkModelMapper wahlbezirkModelMapper; - private final KopfdatenModelMapper kopfdatenModelMapper; private final WahlRepository wahlRepository; private final WahlbezirkRepository wahlbezirkRepository; private final KopfdatenRepository kopfdatenRepository; - private final WahltagRepository wahltagRepository; private final WahlvorschlaegeRepository wahlvorschlaegeRepository; private final ReferendumvorlagenRepository referendumvorlagenRepository; + private final InitializeKopfdaten kopfDataInitializer; private final ExceptionFactory exceptionFactory; @@ -57,19 +55,17 @@ public class WahltermindatenService { @Transactional public void putWahltermindaten(final String wahltagID) { log.info("#putWahltermindaten"); - wahltermindatenValidator.validWahltagIDParamOrThrow(wahltagID, HttpMethod.PUT); - val wahltagModel = wahltageService.getWahltage().stream() - .filter(w -> w.wahltagID().equals(wahltagID)) - .findAny().orElse(null); - wahltermindatenValidator.validateWahltagForSearchingWahltagID(wahltagModelMapper.toEntity(wahltagModel), HttpMethod.PUT); + wahltermindatenValidator.validateParameterToInitWahltermindaten(wahltagID); + val wahltagModel = getWahltagByIdOrThrow(wahltagID, + () -> exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_NO_WAHLTAG)); - val basisdatenModel = wahldatenClient.loadBasisdaten(wahltagModel.wahltag(), wahltagModel.nummer()); + val basisdatenModel = wahldatenClient.loadBasisdaten(new WahltagWithNummer(wahltagModel.wahltag(), wahltagModel.nummer())); if (null == basisdatenModel) { throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.GET_BASISDATEN_NO_DATA); } - val wahlModels = initWahlen(wahltagModel); - val wahlbezirkModels = initWahlbezirke(wahltagModel, wahlModels); - final InitializeKopfdaten kopfDataInitializer = new InitializeKopfdaten(exceptionFactory, kopfdatenRepository, kopfdatenModelMapper); + + persistWahlen(basisdatenModel.wahlen().stream().toList()); + persistWahlbezirke(basisdatenModel.wahlbezirke(), basisdatenModel.wahlen()); kopfDataInitializer.initKopfdaten(basisdatenModel); // ToDo: add async classes, adapt EAI client, improve async handlöing? @@ -84,35 +80,44 @@ public void putWahltermindaten(final String wahltagID) { @Transactional public void deleteWahltermindaten(final String wahltagID) { log.info("#deleteWahltermindaten"); - wahltermindatenValidator.validWahltagIDParamOrThrow(wahltagID, HttpMethod.DELETE); - val wahltag = wahltagRepository.findById(wahltagID).orElse(null); - wahltermindatenValidator.validateWahltagForSearchingWahltagID(wahltag, HttpMethod.DELETE); + wahltermindatenValidator.validateParameterToDeleteWahltermindaten(wahltagID); + val wahltag = getWahltagByIdOrThrow(wahltagID, + () -> exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_DELETEWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG)); - val basisstrukturdaten = wahldatenClient.loadBasisdaten(wahltag.getWahltag(), wahltag.getNummer()).basisstrukturdaten(); + val basisstrukturdaten = wahldatenClient.loadBasisdaten(new WahltagWithNummer(wahltag.wahltag(), wahltag.nummer())).basisstrukturdaten(); val wahlIDs = basisstrukturdaten.stream().map(BasisstrukturdatenModel::wahlID).toList(); - wahlbezirkRepository.deleteByWahltag(wahltag.getWahltag()); + wahlbezirkRepository.deleteByWahltag(wahltag.wahltag()); wahlIDs.forEach((wahlID) -> { kopfdatenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID); wahlRepository.deleteById(wahlID); - //ToDo: Test if "orphanRemoval= true" aus dem Repository funktioniert, also ob auch jeder entsprechende Wahlvorschlag gelöscht wird wahlvorschlaegeRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID); - //ToDo: Test if "orphanRemoval= true" aus dem Repository funktioniert referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID); }); } - private List initWahlen(WahltagModel wahltag) { - val wahlen = wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities( - wahldatenClient.loadBasisdaten(wahltag.wahltag(), wahltag.nummer()).wahlen().stream().toList()); - wahlRepository.saveAll(wahlen); - return wahlModelMapper.fromListOfWahlEntityToListOfWahlModel(wahlen); + private WahltagModel getWahltagByIdOrThrow(final String wahltagID, final Supplier wlsExceptionSupplier) { + val wahltagModel = wahltageService.getWahltage().stream() //TODO wie wäre es mit getOptionalById oder findById aus dem WahltageService? + .filter(w -> w.wahltagID().equals(wahltagID)) + .findAny(); + return wahltagModel.orElseThrow(wlsExceptionSupplier); + } + + private void persistWahlen(final List wahlModelIterable) { + val wahlenEntities = wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities(wahlModelIterable); + wahlRepository.saveAll(wahlenEntities); } - private List initWahlbezirke(WahltagModel wahltagModel, List wahlModels) { - val wahlbezirke = wahlbezirkModelMapper.fromListOfWahlbezirkModeltoListOfWahlbezirkEntities( - wahlbezirkeClient.loadWahlbezirke(wahltagModel.wahltag(), wahltagModel.nummer()).stream().toList()); + private void persistWahlbezirke(Collection wahlbezirkModelIterable, Collection wahlModels) { + val wahlbezirke = wahlbezirkModelMapper.fromListOfWahlbezirkModeltoListOfWahlbezirkEntities(wahlbezirkModelIterable); + wahlbezirke.forEach(wahlbezirkEntity -> linkFirstMatchingWahl(wahlbezirkEntity, wahlModels)); wahlbezirkRepository.saveAll(wahlbezirke); - return wahlbezirkModelMapper.fromListOfWahlbezirkEntityToListOfWahlbezirkModel(wahlbezirke); + } + + private void linkFirstMatchingWahl(final Wahlbezirk wahlbezirk, final Collection wahlen) { + val searchedWahl = wahlen.stream().filter(wahl -> wahlbezirk.getWahlnummer().equals(wahl.nummer())).findFirst().orElse(null); + if (null != searchedWahl) { + wahlbezirk.setWahlID(searchedWahl.wahlID()); + } } } diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java index 65e376804..3e4f66559 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidator.java @@ -1,11 +1,9 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahltag; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; -import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; @Component @@ -14,21 +12,15 @@ public class WahltermindatenValidator { private final ExceptionFactory exceptionFactory; - public void validWahltagIDParamOrThrow(final String wahltagID, HttpMethod httpMethod) { - if (wahltagID == null || StringUtils.isBlank(wahltagID) || StringUtils.isEmpty(wahltagID)) { - switch (httpMethod.toString()) { - case "PUT" -> throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG); - case "DELETE" -> throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_DELETEWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG); - } + public void validateParameterToInitWahltermindaten(final String wahltagID) { + if (StringUtils.isBlank(wahltagID)) { + throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG); } } - public void validateWahltagForSearchingWahltagID(final Wahltag wahltag, HttpMethod httpMethod) { - if (null == wahltag || null == wahltag.getWahltag()) { - switch (httpMethod.toString()) { - case "PUT" -> throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_NO_WAHLTAG); - case "DELETE" -> throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_DELETEWAHLTERMINDATEN_LOESCHEN_UNVOLLSTAENDIG); - } + public void validateParameterToDeleteWahltermindaten(final String wahltagID) { + if (StringUtils.isBlank(wahltagID)) { + throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_DELETEWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG); } } From cff6b72dac5b7c1e75f2a02c12ef2fc34d039600 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 3 Oct 2024 10:05:26 +0200 Subject: [PATCH 14/67] add example requests for wahltermindaten --- .../src/test/resources/http-client.env.json | 2 ++ .../src/test/resources/wahltermindaten.http | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 wls-basisdaten-service/src/test/resources/wahltermindaten.http diff --git a/wls-basisdaten-service/src/test/resources/http-client.env.json b/wls-basisdaten-service/src/test/resources/http-client.env.json index 5efb2e017..28b176a15 100644 --- a/wls-basisdaten-service/src/test/resources/http-client.env.json +++ b/wls-basisdaten-service/src/test/resources/http-client.env.json @@ -1,5 +1,7 @@ { "nonDocker": { + "token_type": "", + "auth_token": "", "WLS_BASISDATEN_SERVICE_URL": "http://localhost:39151", "SSO_URL": "http://kubernetes.docker.internal:8100" } diff --git a/wls-basisdaten-service/src/test/resources/wahltermindaten.http b/wls-basisdaten-service/src/test/resources/wahltermindaten.http new file mode 100644 index 000000000..c78765e0c --- /dev/null +++ b/wls-basisdaten-service/src/test/resources/wahltermindaten.http @@ -0,0 +1,26 @@ +### Get token wls_all +POST {{ SSO_URL }}/auth/realms/wls_realm/protocol/openid-connect/token +Content-Type: application/x-www-form-urlencoded + +password = test & +grant_type = password & +client_secret = top-secret & +client_id = wls & +username = wls_all + +> {% + client.global.set("auth_token", response.body.access_token); + client.global.set("token_type", response.body.token_type); +%} + +### get userinfo with auth_token +GET {{ SSO_URL }}/auth/realms/wls_realm/protocol/openid-connect/userinfo +Authorization: {{ token_type }} {{ auth_token }} + +### Put Wahltermindaten +PUT {{ WLS_BASISDATEN_SERVICE_URL }}/businessActions/wahltermindaten/wahltagID1 +Authorization: {{ token_type }} {{ auth_token }} + +### Delete Wahltermindaten +DELETE {{ WLS_BASISDATEN_SERVICE_URL }}/businessActions/wahltermindaten/wahltagID1 +Authorization: {{ token_type }} {{ auth_token }} \ No newline at end of file From 5c7dbd33e0388e4b9228e11932994898b5fca5cb Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 3 Oct 2024 11:38:46 +0200 Subject: [PATCH 15/67] implement async import of vorschlaege and vorlagen --- .../configuration/AsyncConfiguration.java | 39 +++++++ .../wahltermindaten/AsyncProgress.java | 4 +- .../AsyncWahltermindatenService.java | 102 ++++++++++++++++++ .../WahltermindatenService.java | 3 + .../src/main/resources/application.yml | 4 + 5 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java create mode 100644 wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java new file mode 100644 index 000000000..29d8c270c --- /dev/null +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java @@ -0,0 +1,39 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.configuration; + +import lombok.val; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.security.task.DelegatingSecurityContextAsyncTaskExecutor; + +@EnableAsync +@Configuration +public class AsyncConfiguration { + + @Value("${app.async.corePoolSize}") + public int corePoolSize; + + @Value("${app.async.maxPoolSize}") + public int maxPoolSize; + + @Value("${app.async.queueCapacity}") + public int queueCapacity; + + @Bean + public ThreadPoolTaskExecutor threadPoolTaskExecutor() { + val executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2); + executor.setMaxPoolSize(2); + executor.setQueueCapacity(500); + executor.setThreadNamePrefix("asyncTaskExecutor-"); + executor.initialize(); + return executor; + } + + @Bean + public DelegatingSecurityContextAsyncTaskExecutor taskExecutor(ThreadPoolTaskExecutor threadPoolTaskExecutor) { + return new DelegatingSecurityContextAsyncTaskExecutor(threadPoolTaskExecutor); + } +} diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java index 24ab61f24..e7fa5d6bf 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java @@ -1,6 +1,5 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; -import jakarta.persistence.Embeddable; import java.time.LocalDate; import java.time.LocalDateTime; import lombok.AllArgsConstructor; @@ -9,8 +8,9 @@ import lombok.NoArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; -@Embeddable +@Component @Data @NoArgsConstructor @AllArgsConstructor diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java new file mode 100644 index 000000000..cb2035d14 --- /dev/null +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java @@ -0,0 +1,102 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; + +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenClient; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenModelMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenReferenceModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlvorschlag.WahlvorschlaegeClient; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlvorschlag.WahlvorschlaegeModelMapper; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.time.LocalDate; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j +public class AsyncWahltermindatenService { + + private final AsyncProgress asyncProgress; + + private final WahlvorschlaegeClient wahlvorschlaegeClient; + private final ReferendumvorlagenClient referendumvorlagenClient; + + private final WahlvorschlaegeRepository wahlvorschlaegeRepository; + private final ReferendumvorlagenRepository referendumvorlagenRepository; + + private final WahlvorschlaegeModelMapper wahlvorschlaegeModelMapper; + private final ReferendumvorlagenModelMapper referendumvorlagenModelMapper; + + @Async + public void initVorlagenAndVorschlaege(final LocalDate wahltag, final String wahltagNummmer, final BasisdatenModel basisdaten) { + asyncProgress.reset(wahltag, wahltagNummmer); + initWahlvorschlaege(basisdaten); + initReferendumvorlagen(basisdaten); + } + + private void initWahlvorschlaege(final BasisdatenModel basisdaten) { + asyncProgress.setWahlvorschlaegeTotal(basisdaten.wahlen().size() * basisdaten.wahlbezirke().size()); + asyncProgress.setWahlvorschlaegeLoadingActive(true); + + basisdaten.wahlen().parallelStream() + .filter(wahl -> !Wahlart.VE.equals(wahl.wahlart()) && !Wahlart.BEB.equals(wahl.wahlart())) + .forEach(wahl -> basisdaten.wahlbezirke().parallelStream() + .forEach(wahlbezirk -> { + if (wahl.wahlID().equals(wahlbezirk.wahlID())) { + loadAndPersistWahlvorschlaege(wahl.wahlID(), wahlbezirk.wahlbezirkID(), wahlbezirk.nummer()); + } + }) + ); + } + + private void loadAndPersistWahlvorschlaege(String wahlID, String wahlbezirk, String nummer) { + try { + log.info("#initWahlvorschlag von Wahlbezirk {}", nummer); + asyncProgress.setWahlvorschlaegeNext(nummer); + val wahlvorschlaege = wahlvorschlaegeClient.getWahlvorschlaege(new BezirkUndWahlID(wahlID, wahlbezirk)); + val wahlvorschlaegeEntity = wahlvorschlaegeModelMapper.toEntity(wahlvorschlaege); + wahlvorschlaegeRepository.save(wahlvorschlaegeEntity); + } catch (final Exception e) { + log.info("#initReferendumvorlage: Fehler bei initReferendumvortage -> möglicherweise richtiges Verhalten; Fehler:", e); + } finally { + asyncProgress.incWahlvorschlaegeFinished(); + } + } + + private void initReferendumvorlagen(final BasisdatenModel basisdaten) { + if (basisdaten.wahlen().stream().anyMatch(wahl -> Wahlart.VE.equals(wahl.wahlart()) || Wahlart.BEB.equals(wahl.wahlart()))) { + asyncProgress.setReferendumVorlagenTotal(basisdaten.wahlen().size() * basisdaten.wahlbezirke().size()); + asyncProgress.setReferendumLoadingActive(true); + } + + basisdaten.wahlen().parallelStream() + .filter(wahl -> !Wahlart.VE.equals(wahl.wahlart()) && !Wahlart.BEB.equals(wahl.wahlart())) + .forEach(wahl -> basisdaten.wahlbezirke().parallelStream() + .forEach(wahlbezirk -> { + if (wahl.wahlID().equals(wahlbezirk.wahlID())) { + loadAndPersistReferendumvorlagen(wahl.wahlID(), wahlbezirk.wahlbezirkID(), wahlbezirk.nummer()); + } + }) + ); + } + + private void loadAndPersistReferendumvorlagen(String wahlID, String wahlbezirk, String nummer) { + try { + log.info("#initReferendumvorlage von Wahlbezirk {}", nummer); + asyncProgress.setReferendumVorlagenNext(nummer); + val referendumvorlagen = referendumvorlagenClient.getReferendumvorlagen(new ReferendumvorlagenReferenceModel(wahlID, wahlbezirk)); + val referendumvorlagenEntity = referendumvorlagenModelMapper.toEntity(referendumvorlagen, new BezirkUndWahlID(wahlID, wahlbezirk)); + referendumvorlagenRepository.save(referendumvorlagenEntity); + } catch (final Exception e) { + log.info("#initReferendumvorlage: Fehler bei initReferendumvorlage -> möglicherweise richtiges Verhalten; Fehler:", e); + } finally { + asyncProgress.incWahlvorschlaegeFinished(); + } + } +} diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index 41813c344..f260884a8 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -49,6 +49,8 @@ public class WahltermindatenService { private final ReferendumvorlagenRepository referendumvorlagenRepository; private final InitializeKopfdaten kopfDataInitializer; + private final AsyncWahltermindatenService asyncWahltermindatenService; + private final ExceptionFactory exceptionFactory; @PreAuthorize("hasAuthority('Basisdaten_BUSINESSACTION_PutWahltermindaten')") @@ -68,6 +70,7 @@ public void putWahltermindaten(final String wahltagID) { persistWahlbezirke(basisdatenModel.wahlbezirke(), basisdatenModel.wahlen()); kopfDataInitializer.initKopfdaten(basisdatenModel); + asyncWahltermindatenService.initVorlagenAndVorschlaege(wahltagModel.wahltag(), wahltagModel.nummer(), basisdatenModel); // ToDo: add async classes, adapt EAI client, improve async handlöing? // Async // asyncRequests.getAsyncProgress().reset(wahltag.getWahltag(), wahltag.getNummer()); diff --git a/wls-basisdaten-service/src/main/resources/application.yml b/wls-basisdaten-service/src/main/resources/application.yml index 01d33e9a9..799937156 100644 --- a/wls-basisdaten-service/src/main/resources/application.yml +++ b/wls-basisdaten-service/src/main/resources/application.yml @@ -64,6 +64,10 @@ info.application.name: @project.artifactId@ info.application.version: @project.version@ app: + async: + corePoolSize: 2 + maxPoolSize: 2 + queueCapacity: 500 clients: eai: basePath: http://localhost:39146 From 9137af0cadf792a4c7b16f1e4be26e4fe7fc33cb Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:25:52 +0200 Subject: [PATCH 16/67] fix filter for referendumvorlagen --- .../services/wahltermindaten/AsyncWahltermindatenService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java index cb2035d14..a1de297f7 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java @@ -76,7 +76,7 @@ private void initReferendumvorlagen(final BasisdatenModel basisdaten) { } basisdaten.wahlen().parallelStream() - .filter(wahl -> !Wahlart.VE.equals(wahl.wahlart()) && !Wahlart.BEB.equals(wahl.wahlart())) + .filter(wahl -> Wahlart.VE.equals(wahl.wahlart()) || Wahlart.BEB.equals(wahl.wahlart())) .forEach(wahl -> basisdaten.wahlbezirke().parallelStream() .forEach(wahlbezirk -> { if (wahl.wahlID().equals(wahlbezirk.wahlID())) { From 9a955437b110d191a955fe0ff04e4dfae9e4cc38 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:26:39 +0200 Subject: [PATCH 17/67] fix ids on referendumoptionen --- .../basisdatenservice/clients/DummyClientImpl.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java index f4a0528cc..b4bdd0769 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java @@ -50,8 +50,8 @@ public class DummyClientImpl public WahlvorschlaegeModel getWahlvorschlaege(BezirkUndWahlID bezirkUndWahlID) { return new WahlvorschlaegeModel(bezirkUndWahlID, "stimmzettelgebiedID", Set.of(new WahlvorschlagModel(UUID.randomUUID().toString(), 1L, "kurzname1", true, - Set.of(new KandidatModel(UUID.randomUUID().toString(), "kandidat11", 1L, true, 1L, true), - new KandidatModel(UUID.randomUUID().toString(), "kandidat21", 2L, false, 1L, false))), + Set.of(new KandidatModel(UUID.randomUUID().toString(), "kandidat11", 1L, true, 1L, true), + new KandidatModel(UUID.randomUUID().toString(), "kandidat21", 2L, false, 1L, false))), new WahlvorschlagModel(UUID.randomUUID().toString(), 2L, "kurzname2", true, Set.of(new KandidatModel(UUID.randomUUID().toString(), "kandidat21", 1L, true, 1L, true), new KandidatModel(UUID.randomUUID().toString(), "kandidat22", 2L, false, 1L, false))))); @@ -77,9 +77,11 @@ public List getWahlen(final WahltagWithNummer wahltagWithNummer) thro @Override public ReferendumvorlagenModel getReferendumvorlagen(ReferendumvorlagenReferenceModel referendumvorlagenReferenceModel) { return new ReferendumvorlagenModel("stimmzettelgebietID", Set.of(new ReferendumvorlageModel("wahlvorschlagID1", 1L, "kurzname1", "frage1", - Set.of(new ReferendumoptionModel("optionID11", "option11", 1L), new ReferendumoptionModel("optionID12", "option12", 2L))), + Set.of(new ReferendumoptionModel("optionID11" + UUID.randomUUID(), "option11", 1L), + new ReferendumoptionModel("optionID12" + UUID.randomUUID(), "option12", 2L))), new ReferendumvorlageModel("wahlvorschlagID2", 2L, "kurzname2", "frage2", - Set.of(new ReferendumoptionModel("optionID21", "option21", 1L), new ReferendumoptionModel("optionID22", "option22", 2L))))); + Set.of(new ReferendumoptionModel("optionID21" + UUID.randomUUID(), "option21", 1L), + new ReferendumoptionModel("optionID22" + UUID.randomUUID(), "option22", 2L))))); } @Override From 6dff8742d360a49e06df3e204cfdc25993c6e166 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 3 Oct 2024 14:15:41 +0200 Subject: [PATCH 18/67] add keycloak migration for wahltermindaten --- ...authorities-basisdaten-wahltermindaten.yml | 21 +++++++++++++++++++ .../keycloak/migration/keycloak-changelog.yml | 1 + 2 files changed, 22 insertions(+) create mode 100644 stack/keycloak/migration/add-authorities-basisdaten-wahltermindaten.yml diff --git a/stack/keycloak/migration/add-authorities-basisdaten-wahltermindaten.yml b/stack/keycloak/migration/add-authorities-basisdaten-wahltermindaten.yml new file mode 100644 index 000000000..880d04d95 --- /dev/null +++ b/stack/keycloak/migration/add-authorities-basisdaten-wahltermindaten.yml @@ -0,0 +1,21 @@ +id: add authorities basisdaten wahltermindaten +author: MrSebastian +realm: ${SSO_REALM} +changes: + - addRole: + name: Basisdaten_BUSINESSACTION_PutWahltermindaten + clientRole: true + clientId: ${SSO_CLIENT_ID} + - assignRoleToGroup: + group: allBasisdatenAuthorities + role: Basisdaten_BUSINESSACTION_PutWahltermindaten + clientId: ${SSO_CLIENT_ID} + + - addRole: + name: Basisdaten_BUSINESSACTION_DeleteWahltermindaten + clientRole: true + clientId: ${SSO_CLIENT_ID} + - assignRoleToGroup: + group: allBasisdatenAuthorities + role: Basisdaten_BUSINESSACTION_DeleteWahltermindaten + clientId: ${SSO_CLIENT_ID} \ No newline at end of file diff --git a/stack/keycloak/migration/keycloak-changelog.yml b/stack/keycloak/migration/keycloak-changelog.yml index 5c6ebe284..27ee19839 100644 --- a/stack/keycloak/migration/keycloak-changelog.yml +++ b/stack/keycloak/migration/keycloak-changelog.yml @@ -43,3 +43,4 @@ includes: - path: create-group-all-vorfaelleundvorkommnisse-authorities.yml - path: add-authorities-vorfaelleundvorkommnisse.yml - path: add-authorities-eai-ergebnismeldung.yml + - path: add-authorities-basisdaten-wahltermindaten.yml From e5b4b1c3900e93d8eb3ae6ea7bcae9835b77184d Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 3 Oct 2024 14:30:55 +0200 Subject: [PATCH 19/67] add authentication propagation to parallel streams --- .../wahltermindaten/AsyncWahltermindatenService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java index a1de297f7..fe5f7b934 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java @@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j; import lombok.val; import org.springframework.scheduling.annotation.Async; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @Service @@ -44,12 +45,16 @@ private void initWahlvorschlaege(final BasisdatenModel basisdaten) { asyncProgress.setWahlvorschlaegeTotal(basisdaten.wahlen().size() * basisdaten.wahlbezirke().size()); asyncProgress.setWahlvorschlaegeLoadingActive(true); + val currentAuthentication = SecurityContextHolder.getContext().getAuthentication(); + basisdaten.wahlen().parallelStream() .filter(wahl -> !Wahlart.VE.equals(wahl.wahlart()) && !Wahlart.BEB.equals(wahl.wahlart())) .forEach(wahl -> basisdaten.wahlbezirke().parallelStream() .forEach(wahlbezirk -> { if (wahl.wahlID().equals(wahlbezirk.wahlID())) { + SecurityContextHolder.getContext().setAuthentication(currentAuthentication); loadAndPersistWahlvorschlaege(wahl.wahlID(), wahlbezirk.wahlbezirkID(), wahlbezirk.nummer()); + SecurityContextHolder.getContext().setAuthentication(null); } }) ); @@ -75,12 +80,16 @@ private void initReferendumvorlagen(final BasisdatenModel basisdaten) { asyncProgress.setReferendumLoadingActive(true); } + val currentAuthentication = SecurityContextHolder.getContext().getAuthentication(); + basisdaten.wahlen().parallelStream() .filter(wahl -> Wahlart.VE.equals(wahl.wahlart()) || Wahlart.BEB.equals(wahl.wahlart())) .forEach(wahl -> basisdaten.wahlbezirke().parallelStream() .forEach(wahlbezirk -> { if (wahl.wahlID().equals(wahlbezirk.wahlID())) { + SecurityContextHolder.getContext().setAuthentication(currentAuthentication); loadAndPersistReferendumvorlagen(wahl.wahlID(), wahlbezirk.wahlbezirkID(), wahlbezirk.nummer()); + SecurityContextHolder.getContext().setAuthentication(null); } }) ); From b1cab00f01432ca693d3f375a869e2e48b59f170 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Mon, 7 Oct 2024 14:12:58 +0200 Subject: [PATCH 20/67] created WahltermindatenControllerTest --- .../WahltermindatenControllerTest.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerTest.java diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerTest.java new file mode 100644 index 000000000..07f51dc10 --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerTest.java @@ -0,0 +1,49 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahltermindaten; + +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten.WahltermindatenService; +import lombok.val; +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.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class WahltermindatenControllerTest { + + @Mock + WahltermindatenService wahltermindatenService; + + @InjectMocks + WahltermindatenController unitUnderTest; + + @Nested + class PutWahltermindaten { + + @Test + void should_callServiceWithWahltagID_when_givenWahltagID() { + val wahltagID = "wahltagID"; + + unitUnderTest.putWahltermindaten(wahltagID); + + Mockito.verify(wahltermindatenService).putWahltermindaten(wahltagID); + } + } + + @Nested + class DeleteWahltermindaten { + + @Test + void should_callServiceWahltagID_when_givenWahltagID() { + val wahltagID = "wahltagID"; + + unitUnderTest.deleteWahltermindaten(wahltagID); + + Mockito.verify(wahltermindatenService).deleteWahltermindaten(wahltagID); + } + + } + +} \ No newline at end of file From 0fe11eac1915855b785b67a4cdec8b81241f9e36 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:04:08 +0200 Subject: [PATCH 21/67] refactored test for deleteWahltermindaten on WahltermindatenControllerIntegrationTest --- ...ltermindatenControllerIntegrationTest.java | 413 +++++++++++------- 1 file changed, 258 insertions(+), 155 deletions(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index 901a7d090..0f378409f 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -4,37 +4,49 @@ import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_TEST_PROFILE; import static org.mockito.ArgumentMatchers.any; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.client.WireMock; import de.muenchen.oss.wahllokalsystem.basisdatenservice.MicroServiceApplication; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.clients.ReferendumvorlagenClientMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Kandidat; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.KandidatRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlbezirk; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlbezirkArt; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlbezirkRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahltag; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahltagRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlvorschlaege; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlvorschlag; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlagRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.Kopfdaten; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.Stimmzettelgebietsart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumoption; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlage; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlageRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.KandidatDTO; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumoptionDTO; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlageDTO; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlvorschlagDTO; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.referendumvorlagen.ReferendumvorlagenDTO; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.referendumvorlagen.ReferendumvorlagenDTOMapper; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenModelMapper; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenReferenceModel; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenValidator; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahl; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.WahlRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.BasisdatenDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.BasisstrukturdatenDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahltagDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.Authorities; -import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; -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.domain.BezirkUndWahlID; import de.muenchen.oss.wahllokalsystem.wls.common.testing.SecurityUtils; -import jakarta.transaction.Transactional; +import java.time.LocalDate; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; import java.util.Set; -import javax.annotation.Nullable; +import java.util.UUID; import lombok.val; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -66,193 +78,284 @@ public class WahltermindatenControllerIntegrationTest { @Autowired ObjectMapper objectMapper; - @Autowired + @SpyBean WahlvorschlaegeRepository wahlvorschlaegeRepository; @Autowired WahlvorschlagRepository wahlvorschlagRepository; @Autowired KandidatRepository kandidatRepository; - @Autowired + @SpyBean ReferendumvorlagenRepository referendumvorlagenRepository; @Autowired ReferendumvorlageRepository referendumvorlageRepository; - @Autowired - ReferendumvorlagenClientMapper referendumvorlagenClientMapper; - - @Autowired - ReferendumvorlagenModelMapper referendumvorlagenModelMapper; + @SpyBean + WahlRepository wahlRepository; + @SpyBean + WahlbezirkRepository wahlbezirkRepository; + @SpyBean + KopfdatenRepository kopfdatenRepository; @Autowired - ReferendumvorlagenDTOMapper referendumvorlagenDTOMapper; - - @SpyBean - ReferendumvorlagenValidator referendumvorlagenValidator; + private WahltagRepository wahltagRepository; @AfterEach void tearDown() { - SecurityUtils.runWith(Authorities.REPOSITORY_DELETE_REFERENDUMVORLAGEN, Authorities.REPOSITORY_DELETE_WAHLVORSCHLAEGE); + SecurityUtils.runWith(Authorities.REPOSITORY_DELETE_REFERENDUMVORLAGEN, Authorities.REPOSITORY_DELETE_WAHLVORSCHLAEGE, + Authorities.REPOSITORY_DELETE_WAHL, Authorities.REPOSITORY_DELETE_WAHLBEZIRK); wahlvorschlaegeRepository.deleteAll(); referendumvorlagenRepository.deleteAll(); + wahlbezirkRepository.deleteAll(); + wahlRepository.deleteAll(); + kopfdatenRepository.deleteAll(); } @Nested class DeleteWahltermindaten { + private String dateStringForDelete; + private LocalDate localDateForDelete; + private Wahltag wahltagForDelete; + private Wahl wahlToDelete1; + private Wahl wahlToDelete2; + private Collection wahlbezirkeToDelete; + private Collection kopfdatenToDelete; + private Collection wahlvorschlaegeToDelete; + private Collection referendumvorlagenToDelete; + + @BeforeEach + void setup() throws Exception { + //Data that should be deleted after call + dateStringForDelete = "2013-01-01"; + localDateForDelete = LocalDate.parse(dateStringForDelete); + wahltagForDelete = wahltagRepository.save(new Wahltag("wahltagForDelete", LocalDate.parse(dateStringForDelete), null, "12")); + + wahlToDelete1 = createWahlToDelete("wahlToDelete1", localDateForDelete); + wahlToDelete2 = createWahlToDelete("wahlToDelete2", localDateForDelete); + wahlbezirkeToDelete = createWahlbezirkeToDelete(localDateForDelete, wahlToDelete1.getWahlID(), wahlToDelete2.getWahlID()); + kopfdatenToDelete = createKopfdatenToDelete(wahlbezirkeToDelete); + wahlvorschlaegeToDelete = createWahlvorschlaegeToDelete(wahlbezirkeToDelete); + referendumvorlagenToDelete = createReferendumvorlagenToDelete(wahlbezirkeToDelete); + + setupWireMockForWahltagClient(wahltagForDelete, dateStringForDelete); + + setupWireMockForWahlClient(wahlToDelete1.getWahlID(), wahlToDelete2.getWahlID(), dateStringForDelete, wahltagForDelete); + } + @Test - @Transactional - void deletesReferendumvorlagenAndAllChildren_onlyForGivenWahlID() throws Exception { - val wahlID_1 = "wahlID_1"; - val wahlbezirkID = "wahlbezirkID"; - val wahlID_2 = "wahlID_2"; + void should_deleteWahlenAndWahlbezirkeOnWahlenOfWahltag_when_wahltagIDIsGiven() throws Exception { + //Data that should be kept after the call + val localDateForDataToKeep = LocalDate.parse("2024-10-07"); + val wahlToKeep = wahlRepository.save(new Wahl(UUID.randomUUID().toString(), "wahlToKeep", 1, 1, localDateForDataToKeep, Wahlart.BTW, null, "1")); + val wahlbezirkToKeep = wahlbezirkRepository.save( + new Wahlbezirk("wahlbezirkToKeep", localDateForDataToKeep, "1", WahlbezirkArt.UWB, "1", wahlToKeep.getWahlID())); + val wahlvorschlaegeToKeep = createWahlvorschlaege(wahlToKeep.getWahlID(), wahlbezirkToKeep.getWahlbezirkID(), "3"); + val referendumvorlagenToKeep = createReferendunvorlagen(wahlToKeep.getWahlID(), wahlbezirkToKeep.getWahlbezirkID(), "3"); + val kopfdatenToKeep = kopfdatenRepository.save( + new Kopfdaten(new BezirkUndWahlID(wahlToKeep.getWahlID(), wahlbezirkToKeep.getWahlbezirkID()), "LHM", Stimmzettelgebietsart.WK, "3", + "SHZ to keep", wahlToKeep.getName(), wahlbezirkToKeep.getNummer())); + + val request = MockMvcRequestBuilders.delete("/businessActions/wahltermindaten/" + wahltagForDelete.getWahltagID()); + mockMvc.perform(request).andExpect(status().isOk()); + + //verify data to keep are not deleted + Assertions.assertThat(wahlRepository.findById(wahlToKeep.getWahlID())).isPresent(); + Assertions.assertThat(wahlbezirkRepository.findById(wahlbezirkToKeep.getWahlbezirkID())).isPresent(); + Assertions.assertThat(wahlvorschlaegeRepository.findById(wahlvorschlaegeToKeep.getId())).isPresent(); + Assertions.assertThat(referendumvorlagenRepository.findById(referendumvorlagenToKeep.getId())).isPresent(); + Assertions.assertThat(kopfdatenRepository.findById(kopfdatenToKeep.getBezirkUndWahlID())).isPresent(); + + //verify no additional data exists + val expectedCountWahlvorschlaeg = wahlvorschlaegeToKeep.getWahlvorschlaege().size(); + val expectedCountKandidaten = (Long) wahlvorschlaegeToKeep.getWahlvorschlaege().stream() + .map(vorschlag -> vorschlag.getKandidaten().size()) + .mapToLong(Integer::longValue).sum(); + val expectedCountReferendumvorlage = referendumvorlagenToKeep.getReferendumvorlagen().size(); + Assertions.assertThat(wahlRepository.count()).isEqualTo(1); + Assertions.assertThat(wahlbezirkRepository.count()).isEqualTo(1); + Assertions.assertThat(wahlvorschlaegeRepository.count()).isEqualTo(1); + Assertions.assertThat(wahlvorschlagRepository.count()).isEqualTo(expectedCountWahlvorschlaeg); + Assertions.assertThat(kandidatRepository.count()).isEqualTo(expectedCountKandidaten); + Assertions.assertThat(referendumvorlagenRepository.count()).isEqualTo(1); + Assertions.assertThat(referendumvorlageRepository.count()).isEqualTo(expectedCountReferendumvorlage); + Assertions.assertThat(kopfdatenRepository.count()).isEqualTo(1); + } - val eaiReferendumvorschlage1 = createClientReferendumvorlagenDTO("szgID1"); - defineStubForGetReferendumvorlage(eaiReferendumvorschlage1, wahlID_1, wahlbezirkID, HttpStatus.OK); - val eaiReferendumvorschlage2 = createClientReferendumvorlagenDTO("szgID2"); - defineStubForGetReferendumvorlage(eaiReferendumvorschlage2, wahlID_2, wahlbezirkID, HttpStatus.OK); + @Test + void should_keepAllExistingData_when_deleteOfWahlbezirkeFailed() throws Exception { + Mockito.doThrow(new RuntimeException("test transactional")).when(wahlbezirkRepository).deleteByWahltag(any()); - val request_1 = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID_1 + "/" + wahlbezirkID); - mockMvc.perform(request_1).andExpect(status().isOk()); - val request_2 = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID_2 + "/" + wahlbezirkID); - mockMvc.perform(request_2).andExpect(status().isOk()); + val request = MockMvcRequestBuilders.delete("/businessActions/wahltermindaten/" + wahltagForDelete.getWahltagID()); + mockMvc.perform(request).andExpect(status().isInternalServerError()); - val referendumvorlagenEntity_1 = referendumvorlagenRepository.findByBezirkUndWahlID(new BezirkUndWahlID(wahlID_1, wahlbezirkID)).get(); - val savedSubEntities_1_inRepo = referendumvorlagenEntity_1.getReferendumvorlagen(); - Assertions.assertThat(savedSubEntities_1_inRepo.size()).isEqualTo(eaiReferendumvorschlage1.getReferendumvorlagen().size()); + verifyNoDataForDeletionIsDeleted(wahlvorschlaegeToDelete, referendumvorlagenToDelete, wahlbezirkeToDelete, kopfdatenToDelete); + } - val referendumvorlagenEntity_2 = referendumvorlagenRepository.findByBezirkUndWahlID(new BezirkUndWahlID(wahlID_2, wahlbezirkID)).get(); - val savedSubEntities_2_inRepo = referendumvorlagenEntity_2.getReferendumvorlagen(); - Assertions.assertThat(savedSubEntities_2_inRepo.size()).isEqualTo(eaiReferendumvorschlage2.getReferendumvorlagen().size()); + @Test + void should_keepAllExistingData_when_deleteOfKopfdatenFailed() throws Exception { + Mockito.doThrow(new RuntimeException("test transactional")).when(kopfdatenRepository).deleteAllByBezirkUndWahlID_WahlID(any()); - Assertions.assertThat(referendumvorlageRepository.findAll().size()).isEqualTo(savedSubEntities_2_inRepo.size() + savedSubEntities_2_inRepo.size()); + val request = MockMvcRequestBuilders.delete("/businessActions/wahltermindaten/" + wahltagForDelete.getWahltagID()); + mockMvc.perform(request).andExpect(status().isInternalServerError()); - referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID_1); + verifyNoDataForDeletionIsDeleted(wahlvorschlaegeToDelete, referendumvorlagenToDelete, wahlbezirkeToDelete, kopfdatenToDelete); + } - val foundSubEntities_afterDelete_InRepo = referendumvorlageRepository.findAll(); + @Test + void should_keepAllExistingData_when_deleteOfWahlenFailed() throws Exception { + Mockito.doThrow(new RuntimeException("test transactional")).when(wahlRepository).deleteById(any()); + + val request = MockMvcRequestBuilders.delete("/businessActions/wahltermindaten/" + wahltagForDelete.getWahltagID()); + mockMvc.perform(request).andExpect(status().isInternalServerError()); - Assertions.assertThat(foundSubEntities_afterDelete_InRepo).containsExactlyInAnyOrderElementsOf(savedSubEntities_2_inRepo); + verifyNoDataForDeletionIsDeleted(wahlvorschlaegeToDelete, referendumvorlagenToDelete, wahlbezirkeToDelete, kopfdatenToDelete); } + @Test + void should_keepAllExistingData_when_deleteOfWahlvorschlaegeFailed() throws Exception { + Mockito.doThrow(new RuntimeException("test transactional")).when(wahlvorschlaegeRepository).deleteAllByBezirkUndWahlID_WahlID(any()); - private de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlagenDTO createClientReferendumvorlagenDTO(final String stimmzettelgebietID) { - val dto = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlagenDTO(); + val request = MockMvcRequestBuilders.delete("/businessActions/wahltermindaten/" + wahltagForDelete.getWahltagID()); + mockMvc.perform(request).andExpect(status().isInternalServerError()); - dto.setStimmzettelgebietID(stimmzettelgebietID); + verifyNoDataForDeletionIsDeleted(wahlvorschlaegeToDelete, referendumvorlagenToDelete, wahlbezirkeToDelete, kopfdatenToDelete); + } - val referendumOption1_1 = new ReferendumoptionDTO(); - referendumOption1_1.setId("optionID1_1" + stimmzettelgebietID); - referendumOption1_1.setName("optionName1_1"); - referendumOption1_1.setPosition(1L); + @Test + void should_keepAllExistingData_when_deleteOfReferendumvorlagenFailed() throws Exception { + Mockito.doThrow(new RuntimeException("test transactional")).when(referendumvorlagenRepository).deleteAllByBezirkUndWahlID_WahlID(any()); - val referendumOption1_2 = new ReferendumoptionDTO(); - referendumOption1_2.setId("optionID1_2" + stimmzettelgebietID); - referendumOption1_2.setName("optionName1_2"); - referendumOption1_2.setPosition(1L); + val request = MockMvcRequestBuilders.delete("/businessActions/wahltermindaten/" + wahltagForDelete.getWahltagID()); + mockMvc.perform(request).andExpect(status().isInternalServerError()); - val vorlage1 = new ReferendumvorlageDTO(); - vorlage1.setFrage("frage"); - vorlage1.setKurzname("kurzname_1"); - vorlage1.setOrdnungszahl(1L); - vorlage1.setWahlvorschlagID("wahlvorschlagID"); - vorlage1.setReferendumoptionen(Set.of(referendumOption1_1, referendumOption1_2)); + verifyNoDataForDeletionIsDeleted(wahlvorschlaegeToDelete, referendumvorlagenToDelete, wahlbezirkeToDelete, kopfdatenToDelete); + } - val referendumOption2_1 = new ReferendumoptionDTO(); - referendumOption2_1.setId("optionID2_1" + stimmzettelgebietID); - referendumOption2_1.setName("optionName2_1"); - referendumOption2_1.setPosition(1L); + private void verifyNoDataForDeletionIsDeleted(Collection wahlvorschlaegeToDelete, + Collection referendumvorlagenToDelete, + Collection wahlbezirkeToDelete, Collection kopfdatenToDelete) { + val expectedCountWahlvorschlaeg = wahlvorschlaegeToDelete.stream().map(wahlvorschlaege -> wahlvorschlaege.getWahlvorschlaege().size()) + .mapToLong(Integer::longValue) + .sum(); + val expectedCountKandidaten = wahlvorschlaegeToDelete.stream() + .flatMap(wahlvorschlaege -> wahlvorschlaege.getWahlvorschlaege().stream()) + .mapToLong(wahlvorschlag -> wahlvorschlag.getKandidaten().size()) + .sum(); + val expectedCountReferendumvorlage = referendumvorlagenToDelete.stream() + .mapToLong(referendumvorlagen -> referendumvorlagen.getReferendumvorlagen().size()) + .sum(); + Assertions.assertThat(wahlRepository.count()).isEqualTo(2); + Assertions.assertThat(wahlbezirkRepository.count()).isEqualTo(wahlbezirkeToDelete.size()); + Assertions.assertThat(wahlvorschlaegeRepository.count()).isEqualTo(wahlvorschlaegeToDelete.size()); + Assertions.assertThat(wahlvorschlagRepository.count()).isEqualTo(expectedCountWahlvorschlaeg); + Assertions.assertThat(kandidatRepository.count()).isEqualTo(expectedCountKandidaten); + Assertions.assertThat(referendumvorlagenRepository.count()).isEqualTo(referendumvorlagenToDelete.size()); + Assertions.assertThat(referendumvorlageRepository.count()).isEqualTo(expectedCountReferendumvorlage); + Assertions.assertThat(kopfdatenRepository.count()).isEqualTo(kopfdatenToDelete.size()); + } - val referendumOption2_2 = new ReferendumoptionDTO(); - referendumOption2_2.setId("optionID2_2" + stimmzettelgebietID); - referendumOption2_2.setName("optionName2_2"); - referendumOption2_2.setPosition(1L); + private void setupWireMockForWahlClient(String wahlToDeleteID1, String wahlToDeleteID2, String dateStringForDelete, Wahltag wahltagForDelete) + throws JsonProcessingException { + val wahlclientResponse = new BasisdatenDTO().basisstrukturdaten( + Set.of(new BasisstrukturdatenDTO().wahlID(wahlToDeleteID1), new BasisstrukturdatenDTO().wahlID(wahlToDeleteID2))); + WireMock.stubFor(WireMock.get("/wahldaten/basisdaten?forDate=" + dateStringForDelete + "&withNummer=" + wahltagForDelete.getNummer()) + .willReturn(WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(wahlclientResponse)) + .withStatus(HttpStatus.OK.value())) + ); + } - val vorlage2 = new ReferendumvorlageDTO(); - vorlage2.setFrage("frage"); - vorlage2.setKurzname("kurzname_2"); - vorlage2.setOrdnungszahl(1L); - vorlage2.setWahlvorschlagID("wahlvorschlagID"); - vorlage2.setReferendumoptionen(Set.of(referendumOption2_1, referendumOption2_2)); + private void setupWireMockForWahltagClient(Wahltag wahltagForDelete, String dateStringForDelete) throws JsonProcessingException { + val wahltagClientResponse = Set.of(new WahltagDTO().identifikator(wahltagForDelete.getWahltagID()).tag(LocalDate.parse(dateStringForDelete)) + .nummer(wahltagForDelete.getNummer())); + WireMock.stubFor(WireMock.get("/wahldaten/wahltage?includingSince=2024-07-07") + .willReturn(WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(wahltagClientResponse)) + .withStatus(HttpStatus.OK.value())) + ); + } - dto.setReferendumvorlagen(Set.of(vorlage1, vorlage2)); + private Wahl createWahlToDelete(final String wahlID, final LocalDate wahltag) { + return wahlRepository.save(new Wahl(wahlID, wahlID, 1, 1, wahltag, Wahlart.BTW, null, "1")); + } - return dto; + private Collection createWahlbezirkeToDelete(final LocalDate wahltagDate, final String wahlToDeleteID1, final String wahlToDeleteID2) { + val wahlbezirk1ToDeleteWahl1 = wahlbezirkRepository.save( + new Wahlbezirk("wbz1_1", wahltagDate, "1", WahlbezirkArt.UWB, "1", wahlToDeleteID1)); + val wahlbezirk2ToDeleteWahl1 = wahlbezirkRepository.save( + new Wahlbezirk("wbz1_2", wahltagDate, "2", WahlbezirkArt.UWB, "1", wahlToDeleteID1)); + val wahlbezirk1ToDeleteWahl2 = wahlbezirkRepository.save( + new Wahlbezirk("wbz2_1", wahltagDate, "1", WahlbezirkArt.UWB, "2", wahlToDeleteID2)); + val wahlbezirk2ToDeleteWahl2 = wahlbezirkRepository.save( + new Wahlbezirk("wbz2_2", wahltagDate, "2", WahlbezirkArt.UWB, "2", wahlToDeleteID2)); + + return List.of(wahlbezirk1ToDeleteWahl1, wahlbezirk2ToDeleteWahl1, wahlbezirk1ToDeleteWahl2, wahlbezirk2ToDeleteWahl2); } - private void defineStubForGetReferendumvorlage( - @Nullable final Object wiremockPayload, final String wahlID, - final String wahlbezirkID, - final HttpStatus httpStatus) throws Exception { - val wireMockResponse = WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus( - httpStatus.value()); + private Collection createKopfdatenToDelete(final Collection wahlbezirke) { + return wahlbezirke.stream() + .map(wahlbezirk -> kopfdatenRepository.save( + new Kopfdaten(new BezirkUndWahlID(wahlbezirk.getWahlID(), wahlbezirk.getWahlbezirkID()), "LHM", Stimmzettelgebietsart.WK, "1", + "SGZ 1_1", wahlbezirk.getWahlID(), wahlbezirk.getWahlbezirkID()) + )) + .toList(); + } - if (wireMockResponse != null) { - wireMockResponse.withBody(objectMapper.writeValueAsBytes(wiremockPayload)); - } + private Collection createWahlvorschlaegeToDelete(final Collection wahlbezirke) { + return wahlbezirke.stream() + .map(wahlbezirk -> createWahlvorschlaege(wahlbezirk.getWahlID(), wahlbezirk.getWahlbezirkID(), wahlbezirk.getNummer())) + .toList(); + } - WireMock.stubFor(WireMock.get("/vorschlaege/referendum/" + wahlID + "/" + wahlbezirkID) - .willReturn(wireMockResponse)); + private Collection createReferendumvorlagenToDelete(final Collection wahlbezirke) { + return wahlbezirke.stream() + .map(wahlbezirk -> createReferendunvorlagen(wahlbezirk.getWahlID(), wahlbezirk.getWahlbezirkID(), wahlbezirk.getNummer())) + .toList(); + } + + private Wahlvorschlaege createWahlvorschlaege(final String wahlID, final String wahlbezirkID, final String stimmzettelgebietID) { + val wahlvorschlaege = new Wahlvorschlaege(UUID.randomUUID(), new BezirkUndWahlID(wahlID, wahlbezirkID), stimmzettelgebietID, new HashSet<>()); + + val wahlvorschlag1 = new Wahlvorschlag(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlaege, 1L, wahlID + wahlbezirkID, true, + new HashSet<>()); + wahlvorschlaege.addWahlvorschlag(wahlvorschlag1); + val kandidat1Vorschlag1 = new Kandidat(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlag1, "kandidat1", 1, false, 1L, false); + wahlvorschlag1.addKandidat(kandidat1Vorschlag1); + val kandidat2Vorschlag1 = new Kandidat(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlag1, "kandidat1", 1, false, 1L, false); + wahlvorschlag1.addKandidat(kandidat2Vorschlag1); + + val wahlvorschlag2 = new Wahlvorschlag(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlaege, 1L, wahlID + wahlbezirkID, true, + new HashSet<>()); + wahlvorschlaege.addWahlvorschlag(wahlvorschlag2); + val kandidat1Vorschlag2 = new Kandidat(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlag2, "kandidat1", 1, false, 1L, false); + wahlvorschlag2.addKandidat(kandidat1Vorschlag2); + val kandidat2Vorschlag2 = new Kandidat(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlag2, "kandidat1", 1, false, 1L, false); + wahlvorschlag2.addKandidat(kandidat2Vorschlag2); + + return wahlvorschlaegeRepository.save(wahlvorschlaege); } - } - private de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlvorschlaegeDTO createClientWahlvorschlaegeDTO(final String wahlID, - final String wahlbezirkID) { - val stimmzettelgebietID = "stimmzettelgebietID"; - - val clientWahlvorschlaegeDTO = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlvorschlaegeDTO(); - clientWahlvorschlaegeDTO.setStimmzettelgebietID(stimmzettelgebietID); - clientWahlvorschlaegeDTO.setWahlID(wahlID); - clientWahlvorschlaegeDTO.setWahlbezirkID(wahlbezirkID); - - val wahlvorschlag1 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlvorschlagDTO(); - wahlvorschlag1.setErhaeltStimmen(true); - wahlvorschlag1.setIdentifikator("identifikator1"); - wahlvorschlag1.setKurzname("kurzname1"); - wahlvorschlag1.setOrdnungszahl(1L); - - val kandidat11 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.KandidatDTO(); - kandidat11.setIdentifikator("kandidat11"); - kandidat11.setDirektkandidat(true); - kandidat11.setEinzelbewerber(true); - kandidat11.setName("name11"); - kandidat11.setListenposition(1L); - kandidat11.setTabellenSpalteInNiederschrift(1L); - - val kandidat12 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.KandidatDTO(); - kandidat12.setIdentifikator("kandidat12"); - kandidat12.setDirektkandidat(false); - kandidat12.setEinzelbewerber(false); - kandidat12.setName("name12"); - kandidat12.setListenposition(2L); - kandidat12.setTabellenSpalteInNiederschrift(2L); - wahlvorschlag1.setKandidaten(Set.of(kandidat11, kandidat12)); - - val wahlvorschlag2 = new WahlvorschlagDTO(); - wahlvorschlag2.setErhaeltStimmen(false); - wahlvorschlag2.setIdentifikator("identifikator2"); - wahlvorschlag2.setKurzname("kurzname2"); - wahlvorschlag2.setOrdnungszahl(2L); - - val kandidat21 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.KandidatDTO(); - kandidat21.setIdentifikator("kandidat21"); - kandidat21.setDirektkandidat(true); - kandidat21.setEinzelbewerber(true); - kandidat21.setName("name21"); - kandidat21.setListenposition(3L); - kandidat21.setTabellenSpalteInNiederschrift(3L); - - val kandidat22 = new KandidatDTO(); - kandidat22.setIdentifikator("kandidat22"); - kandidat22.setDirektkandidat(false); - kandidat22.setEinzelbewerber(false); - kandidat22.setName("name22"); - kandidat22.setListenposition(4L); - kandidat22.setTabellenSpalteInNiederschrift(4L); - wahlvorschlag2.setKandidaten(Set.of(kandidat21, kandidat22)); - - val wahlvorschlaege = Set.of(wahlvorschlag1, wahlvorschlag2); - clientWahlvorschlaegeDTO.setWahlvorschlaege(wahlvorschlaege); - - return clientWahlvorschlaegeDTO; + private Referendumvorlagen createReferendunvorlagen(final String wahlID, final String wahlbezirkID, final String stimmzettelgebietID) { + val referendumvorlagen = new Referendumvorlagen(UUID.randomUUID(), new BezirkUndWahlID(wahlID, wahlbezirkID), stimmzettelgebietID, new HashSet<>()); + + val referendumvorlage1 = new Referendumvorlage(UUID.randomUUID(), referendumvorlagen, "1", 1L, wahlID + wahlbezirkID, "Frage 1", new HashSet<>()); + referendumvorlagen.addReferendumvorlage(referendumvorlage1); + val referendumOption1Vorlage1 = new Referendumoption(UUID.randomUUID().toString(), "Option 1", 1L); + referendumvorlage1.getReferendumoptionen().add(referendumOption1Vorlage1); + val referendumOption2Vorlage1 = new Referendumoption(UUID.randomUUID().toString(), "Option 2", 1L); + referendumvorlage1.getReferendumoptionen().add(referendumOption2Vorlage1); + + val referendumvorlage2 = new Referendumvorlage(UUID.randomUUID(), referendumvorlagen, "1", 1L, wahlID + wahlbezirkID, "Frage 1", new HashSet<>()); + referendumvorlagen.addReferendumvorlage(referendumvorlage2); + val referendumOption1Vorlage2 = new Referendumoption(UUID.randomUUID().toString(), "Option 1", 1L); + referendumvorlage1.getReferendumoptionen().add(referendumOption1Vorlage2); + val referendumOption2Vorlage2 = new Referendumoption(UUID.randomUUID().toString(), "Option 2", 1L); + referendumvorlage1.getReferendumoptionen().add(referendumOption2Vorlage2); + + return referendumvorlagenRepository.save(referendumvorlagen); + } } } From e7baab4a9e9df0da1c663d80eacdb1e59ae8b1e9 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:06:56 +0200 Subject: [PATCH 22/67] remove unused code --- .../WahltermindatenControllerIntegrationTest.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index 0f378409f..1f0636f15 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -51,7 +51,6 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.SpyBean; @@ -67,11 +66,6 @@ @ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) public class WahltermindatenControllerIntegrationTest { - public static final String BUSINESS_ACTIONS_REFERENDUMVORLAGEN = "/businessActions/referendumvorlagen/"; - - @Value("${service.info.oid}") - String serviceOid; - @Autowired MockMvc mockMvc; From 91626be1252c8ceb178eed1e8dc6b9348a32fc2f Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:46:27 +0200 Subject: [PATCH 23/67] created test for PutWahltermindaten --- ...ltermindatenControllerIntegrationTest.java | 114 +++++++++++++++--- 1 file changed, 99 insertions(+), 15 deletions(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index 1f0636f15..6a24a0cde 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -33,6 +33,9 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahlart; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.BasisdatenDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.BasisstrukturdatenDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.StimmzettelgebietDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlbezirkDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahltagDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.Authorities; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; @@ -132,9 +135,9 @@ void setup() throws Exception { wahlvorschlaegeToDelete = createWahlvorschlaegeToDelete(wahlbezirkeToDelete); referendumvorlagenToDelete = createReferendumvorlagenToDelete(wahlbezirkeToDelete); - setupWireMockForWahltagClient(wahltagForDelete, dateStringForDelete); + setupWireMockForWahltagClient(wahltagForDelete); - setupWireMockForWahlClient(wahlToDelete1.getWahlID(), wahlToDelete2.getWahlID(), dateStringForDelete, wahltagForDelete); + setupWireMockForWahlClient(wahlToDelete1.getWahlID(), wahlToDelete2.getWahlID()); } @Test @@ -249,11 +252,11 @@ private void verifyNoDataForDeletionIsDeleted(Collection wahlvo Assertions.assertThat(kopfdatenRepository.count()).isEqualTo(kopfdatenToDelete.size()); } - private void setupWireMockForWahlClient(String wahlToDeleteID1, String wahlToDeleteID2, String dateStringForDelete, Wahltag wahltagForDelete) + private void setupWireMockForWahlClient(String wahlToDeleteID1, String wahlToDeleteID2) throws JsonProcessingException { val wahlclientResponse = new BasisdatenDTO().basisstrukturdaten( Set.of(new BasisstrukturdatenDTO().wahlID(wahlToDeleteID1), new BasisstrukturdatenDTO().wahlID(wahlToDeleteID2))); - WireMock.stubFor(WireMock.get("/wahldaten/basisdaten?forDate=" + dateStringForDelete + "&withNummer=" + wahltagForDelete.getNummer()) + WireMock.stubFor(WireMock.get(WireMock.urlPathMatching("/wahldaten/basisdaten")) .willReturn(WireMock.aResponse() .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(wahlclientResponse)) @@ -261,17 +264,6 @@ private void setupWireMockForWahlClient(String wahlToDeleteID1, String wahlToDel ); } - private void setupWireMockForWahltagClient(Wahltag wahltagForDelete, String dateStringForDelete) throws JsonProcessingException { - val wahltagClientResponse = Set.of(new WahltagDTO().identifikator(wahltagForDelete.getWahltagID()).tag(LocalDate.parse(dateStringForDelete)) - .nummer(wahltagForDelete.getNummer())); - WireMock.stubFor(WireMock.get("/wahldaten/wahltage?includingSince=2024-07-07") - .willReturn(WireMock.aResponse() - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(wahltagClientResponse)) - .withStatus(HttpStatus.OK.value())) - ); - } - private Wahl createWahlToDelete(final String wahlID, final LocalDate wahltag) { return wahlRepository.save(new Wahl(wahlID, wahlID, 1, 1, wahltag, Wahlart.BTW, null, "1")); } @@ -352,4 +344,96 @@ private Referendumvorlagen createReferendunvorlagen(final String wahlID, final S return referendumvorlagenRepository.save(referendumvorlagen); } } + + @Nested + class PutWahltermindaten { + + @Test + void should_persistImportedData_when_wahltagIDIsValidWahltag() throws Exception { + val localDateOfWahltag = LocalDate.parse("2024-08-26"); + val wahltagToGetWahltermindaten = new Wahltag("wahltagID", localDateOfWahltag, "", "1"); + + setupWireMockForWahltagClient(wahltagToGetWahltermindaten); + + val basisstrukturdatenToImport = new BasisdatenDTO() + .basisstrukturdaten( + Set.of( + new BasisstrukturdatenDTO().wahlID("wahlID1").wahltag(localDateOfWahltag).wahlbezirkID("wahlbezirkID1_1") + .stimmzettelgebietID("sgzID1"), + new BasisstrukturdatenDTO().wahlID("wahlID1").wahltag(localDateOfWahltag).wahlbezirkID("wahlbezirkID1_2") + .stimmzettelgebietID("sgzID1"), + new BasisstrukturdatenDTO().wahlID("wahlID1").wahltag(localDateOfWahltag).wahlbezirkID("wahlbezirkID1_3") + .stimmzettelgebietID("sgzID1"), + new BasisstrukturdatenDTO().wahlID("wahlID2").wahltag(localDateOfWahltag).wahlbezirkID("wahlbezirkID2_1") + .stimmzettelgebietID("sgzID2"), + new BasisstrukturdatenDTO().wahlID("wahlID2").wahltag(localDateOfWahltag).wahlbezirkID("wahlbezirkID2_2") + .stimmzettelgebietID("sgzID2") + ) + ) + .stimmzettelgebiete( + Set.of( + new StimmzettelgebietDTO().wahltag(localDateOfWahltag).name("sgz1").identifikator("sgzID1").nummer("1") + .stimmzettelgebietsart( + StimmzettelgebietDTO.StimmzettelgebietsartEnum.WK), + new StimmzettelgebietDTO().wahltag(localDateOfWahltag).name("sgz2").identifikator("sgzID2").nummer("2") + .stimmzettelgebietsart( + StimmzettelgebietDTO.StimmzettelgebietsartEnum.WK) + + ) + ) + .wahlen( + Set.of( + new WahlDTO().name("wahl 1").wahltag(localDateOfWahltag).identifikator("wahlID1").wahlart(WahlDTO.WahlartEnum.BTW) + .nummer("1"), + new WahlDTO().name("wahl 2").wahltag(localDateOfWahltag).identifikator("wahlID2").wahlart(WahlDTO.WahlartEnum.BTW) + .nummer("2") + ) + ) + .wahlbezirke( + Set.of( + new WahlbezirkDTO().wahltag(localDateOfWahltag).wahlID("wahlID1").identifikator("wahlbezirkID1_1").nummer("1_1") + .wahlnummer("1").wahlbezirkArt( + WahlbezirkDTO.WahlbezirkArtEnum.UWB), + new WahlbezirkDTO().wahltag(localDateOfWahltag).wahlID("wahlID1").identifikator("wahlbezirkID1_2").nummer("1_2") + .wahlnummer("1").wahlbezirkArt( + WahlbezirkDTO.WahlbezirkArtEnum.UWB), + new WahlbezirkDTO().wahltag(localDateOfWahltag).wahlID("wahlID1").identifikator("wahlbezirkID1_3").nummer("1_3") + .wahlnummer("1").wahlbezirkArt( + WahlbezirkDTO.WahlbezirkArtEnum.UWB), + new WahlbezirkDTO().wahltag(localDateOfWahltag).wahlID("wahlID2").identifikator("wahlbezirkID2_1").nummer("2_1") + .wahlnummer("2").wahlbezirkArt( + WahlbezirkDTO.WahlbezirkArtEnum.UWB), + new WahlbezirkDTO().wahltag(localDateOfWahltag).wahlID("wahlID2").identifikator("wahlbezirkID2_2").nummer("2_2") + .wahlnummer("2").wahlbezirkArt( + WahlbezirkDTO.WahlbezirkArtEnum.UWB) + ) + ); + + WireMock.stubFor(WireMock.get(WireMock.urlPathMatching("/wahldaten/basisdaten")) + .willReturn(WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(basisstrukturdatenToImport)) + .withStatus(HttpStatus.OK.value())) + ); + + val request = MockMvcRequestBuilders.put("/businessActions/wahltermindaten/" + wahltagToGetWahltermindaten.getWahltagID()); + mockMvc.perform(request).andExpect(status().isOk()); + + Assertions.assertThat(kopfdatenRepository.count()).isEqualTo(5); + Assertions.assertThat(wahlbezirkRepository.count()).isEqualTo(5); + Assertions.assertThat(wahlRepository.count()).isEqualTo(2); + + } + } + + private void setupWireMockForWahltagClient(Wahltag wahltag) throws JsonProcessingException { + val wahltagClientResponse = Set.of(new WahltagDTO().identifikator(wahltag.getWahltagID()).tag(wahltag.getWahltag()) + .nummer(wahltag.getNummer())); + WireMock.stubFor(WireMock.get(WireMock.urlPathMatching("/wahldaten/wahltage")) + .willReturn(WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(wahltagClientResponse)) + .withStatus(HttpStatus.OK.value())) + ); + } } From c4eab6134d1213ce88a7283bfedc9c0a4016dbf4 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:48:05 +0200 Subject: [PATCH 24/67] spotless:apply --- .../exception/ExceptionConstants.java | 1 - .../wahltermindaten/AsyncProgress.java | 1 - .../ReferendumvorlagenRepositoryTest.java | 21 ++++++++++----- .../domain/WahlvorschlaegeRepositoryTest.java | 7 ++--- ...ltermindatenControllerIntegrationTest.java | 27 ++++++------------- .../WahltermindatenControllerTest.java | 2 +- 6 files changed, 27 insertions(+), 32 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java index 98fb62db7..33fa19b92 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java @@ -90,5 +90,4 @@ public class ExceptionConstants { public static final ExceptionDataWrapper GET_BASISDATEN_NO_DATA = new ExceptionDataWrapper(CODE_NO_DATA_BASISDATEN, "Es wurden keine Basisdaten gefunden."); - } diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java index 24ab61f24..e8c48a229 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgress.java @@ -68,4 +68,3 @@ public void reset(LocalDate forWahltag, String wahlNummer) { } } - diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java index f8e56141a..a798259d7 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java @@ -74,7 +74,8 @@ public void savingParentReferendumvorlagenIsAutomaticallySavingReferendumvorlage referendumvorlagenRepository.save(referendumvorlagenEntity); val foundReferendumvorlageChilds = referendumvorlageRepository.findAll(); - val foundReferendumoptionChildsOfAllReferendumvorlages = foundReferendumvorlageChilds.stream().flatMap( rvorlage -> rvorlage.getReferendumoptionen().stream()).toList(); + val foundReferendumoptionChildsOfAllReferendumvorlages = foundReferendumvorlageChilds.stream() + .flatMap(rvorlage -> rvorlage.getReferendumoptionen().stream()).toList(); Assertions.assertThat(foundReferendumvorlageChilds).containsExactlyInAnyOrderElementsOf(expectedReferendumvorlageChilds); Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages).containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds); @@ -106,10 +107,12 @@ public void method_deleteAllByBezirkUndWahlID_WahlID_doesNotDeleteElementsWithOt val foundReferendumvorlagen_OfWahlID1 = referendumvorlagenRepository.findByBezirkUndWahlID(bezirkUndWahlID1); val foundReferendumvorlageChilds_Of_wahlID1 = foundReferendumvorlagen_OfWahlID1.get().getReferendumvorlagen(); - val foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID1 = foundReferendumvorlagen_OfWahlID1.get().getReferendumvorlagen().stream().flatMap( rvorlage -> rvorlage.getReferendumoptionen().stream()); + val foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID1 = foundReferendumvorlagen_OfWahlID1.get().getReferendumvorlagen().stream() + .flatMap(rvorlage -> rvorlage.getReferendumoptionen().stream()); Assertions.assertThat(foundReferendumvorlageChilds_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedReferendumvorlageChilds1); - Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds1); + Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID1) + .containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds1); val expectedReferendumvorlageChilds2 = referendumvorlagenEntity2.getReferendumvorlagen(); Set expectedAllReferendumoptionChilds2 = new HashSet<>(); @@ -119,10 +122,12 @@ public void method_deleteAllByBezirkUndWahlID_WahlID_doesNotDeleteElementsWithOt val foundReferendumvorlagen_OfWahlID2 = referendumvorlagenRepository.findByBezirkUndWahlID(bezirkUndWahlID2); val foundReferendumvorlageChilds_Of_wahlID2 = foundReferendumvorlagen_OfWahlID2.get().getReferendumvorlagen(); - val foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID2 = foundReferendumvorlagen_OfWahlID2.get().getReferendumvorlagen().stream().flatMap( rvorlage -> rvorlage.getReferendumoptionen().stream()).toList(); + val foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID2 = foundReferendumvorlagen_OfWahlID2.get().getReferendumvorlagen().stream() + .flatMap(rvorlage -> rvorlage.getReferendumoptionen().stream()).toList(); Assertions.assertThat(foundReferendumvorlageChilds_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedReferendumvorlageChilds2); - Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds2); + Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID2) + .containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds2); referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID_1); @@ -140,9 +145,11 @@ private Referendumvorlagen createReferendumvorlagenEntity(final String wahlID, f val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); val entity = new Referendumvorlagen(null, bezirkUndWahlID, stimmzettelgebietID, null); val referendumvorlage_1 = new Referendumvorlage(null, entity, "wahlvorschlagID1", 1L, "kurzname1", "frage1", - Set.of(new Referendumoption("option11" + wahlID + wahlbezirkID, "optionsName11", 1L), new Referendumoption("option12" + wahlID + wahlbezirkID, "optionsName12", 2L))); + Set.of(new Referendumoption("option11" + wahlID + wahlbezirkID, "optionsName11", 1L), + new Referendumoption("option12" + wahlID + wahlbezirkID, "optionsName12", 2L))); val referendumvorlage_2 = new Referendumvorlage(null, entity, "wahlvorschlagID2", 2L, "kurzname2", "frage2", - Set.of(new Referendumoption("option21" + wahlID + wahlbezirkID, "optionsName21", 3L), new Referendumoption("option22" + wahlID + wahlbezirkID, "optionsName22", 4L))); + Set.of(new Referendumoption("option21" + wahlID + wahlbezirkID, "optionsName21", 3L), + new Referendumoption("option22" + wahlID + wahlbezirkID, "optionsName22", 4L))); entity.setReferendumvorlagen(Set.of(referendumvorlage_1, referendumvorlage_2)); return entity; } diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java index 778c30b13..d5dde4250 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java @@ -106,8 +106,8 @@ public void method_deleteAllByBezirkUndWahlID_WahlID_doesNotDeleteElementsWithOt val foundWahlvorschlaege_OfWahlID1 = wahlvorschlaegeRepository.findByBezirkUndWahlID(bezirkUndWahlID1); val foundWahlvorschlagChilds_Of_wahlID1 = foundWahlvorschlaege_OfWahlID1.get().getWahlvorschlaege(); - val foundKandidatChildsOfAllWahlvorschlags_Of_wahlID1 = foundWahlvorschlaege_OfWahlID1.get().getWahlvorschlaege().stream().flatMap( wvorschlag -> wvorschlag.getKandidaten().stream()); - + val foundKandidatChildsOfAllWahlvorschlags_Of_wahlID1 = foundWahlvorschlaege_OfWahlID1.get().getWahlvorschlaege().stream() + .flatMap(wvorschlag -> wvorschlag.getKandidaten().stream()); Assertions.assertThat(foundWahlvorschlagChilds_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedWahlvorschlagChilds1); Assertions.assertThat(foundKandidatChildsOfAllWahlvorschlags_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedAllKandidatChilds1); @@ -120,7 +120,8 @@ public void method_deleteAllByBezirkUndWahlID_WahlID_doesNotDeleteElementsWithOt val foundWahlvorschlaege_OfWahlID2 = wahlvorschlaegeRepository.findByBezirkUndWahlID(bezirkUndWahlID2); val foundWahlvorschlagChilds_Of_wahlID2 = foundWahlvorschlaege_OfWahlID2.get().getWahlvorschlaege(); - val foundKandidatChildsOfAllWahlvorschlags_Of_wahlID2 = foundWahlvorschlaege_OfWahlID2.get().getWahlvorschlaege().stream().flatMap( wvorschlag -> wvorschlag.getKandidaten().stream()).toList(); + val foundKandidatChildsOfAllWahlvorschlags_Of_wahlID2 = foundWahlvorschlaege_OfWahlID2.get().getWahlvorschlaege().stream() + .flatMap(wvorschlag -> wvorschlag.getKandidaten().stream()).toList(); Assertions.assertThat(foundWahlvorschlagChilds_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedWahlvorschlagChilds2); Assertions.assertThat(foundKandidatChildsOfAllWahlvorschlags_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedAllKandidatChilds2); diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index 6a24a0cde..b63bf056e 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -260,8 +260,7 @@ private void setupWireMockForWahlClient(String wahlToDeleteID1, String wahlToDel .willReturn(WireMock.aResponse() .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(wahlclientResponse)) - .withStatus(HttpStatus.OK.value())) - ); + .withStatus(HttpStatus.OK.value()))); } private Wahl createWahlToDelete(final String wahlID, final LocalDate wahltag) { @@ -285,8 +284,7 @@ private Collection createKopfdatenToDelete(final Collection kopfdatenRepository.save( new Kopfdaten(new BezirkUndWahlID(wahlbezirk.getWahlID(), wahlbezirk.getWahlbezirkID()), "LHM", Stimmzettelgebietsart.WK, "1", - "SGZ 1_1", wahlbezirk.getWahlID(), wahlbezirk.getWahlbezirkID()) - )) + "SGZ 1_1", wahlbezirk.getWahlID(), wahlbezirk.getWahlbezirkID()))) .toList(); } @@ -367,9 +365,7 @@ void should_persistImportedData_when_wahltagIDIsValidWahltag() throws Exception new BasisstrukturdatenDTO().wahlID("wahlID2").wahltag(localDateOfWahltag).wahlbezirkID("wahlbezirkID2_1") .stimmzettelgebietID("sgzID2"), new BasisstrukturdatenDTO().wahlID("wahlID2").wahltag(localDateOfWahltag).wahlbezirkID("wahlbezirkID2_2") - .stimmzettelgebietID("sgzID2") - ) - ) + .stimmzettelgebietID("sgzID2"))) .stimmzettelgebiete( Set.of( new StimmzettelgebietDTO().wahltag(localDateOfWahltag).name("sgz1").identifikator("sgzID1").nummer("1") @@ -379,16 +375,13 @@ void should_persistImportedData_when_wahltagIDIsValidWahltag() throws Exception .stimmzettelgebietsart( StimmzettelgebietDTO.StimmzettelgebietsartEnum.WK) - ) - ) + )) .wahlen( Set.of( new WahlDTO().name("wahl 1").wahltag(localDateOfWahltag).identifikator("wahlID1").wahlart(WahlDTO.WahlartEnum.BTW) .nummer("1"), new WahlDTO().name("wahl 2").wahltag(localDateOfWahltag).identifikator("wahlID2").wahlart(WahlDTO.WahlartEnum.BTW) - .nummer("2") - ) - ) + .nummer("2"))) .wahlbezirke( Set.of( new WahlbezirkDTO().wahltag(localDateOfWahltag).wahlID("wahlID1").identifikator("wahlbezirkID1_1").nummer("1_1") @@ -405,16 +398,13 @@ void should_persistImportedData_when_wahltagIDIsValidWahltag() throws Exception WahlbezirkDTO.WahlbezirkArtEnum.UWB), new WahlbezirkDTO().wahltag(localDateOfWahltag).wahlID("wahlID2").identifikator("wahlbezirkID2_2").nummer("2_2") .wahlnummer("2").wahlbezirkArt( - WahlbezirkDTO.WahlbezirkArtEnum.UWB) - ) - ); + WahlbezirkDTO.WahlbezirkArtEnum.UWB))); WireMock.stubFor(WireMock.get(WireMock.urlPathMatching("/wahldaten/basisdaten")) .willReturn(WireMock.aResponse() .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(basisstrukturdatenToImport)) - .withStatus(HttpStatus.OK.value())) - ); + .withStatus(HttpStatus.OK.value()))); val request = MockMvcRequestBuilders.put("/businessActions/wahltermindaten/" + wahltagToGetWahltermindaten.getWahltagID()); mockMvc.perform(request).andExpect(status().isOk()); @@ -433,7 +423,6 @@ private void setupWireMockForWahltagClient(Wahltag wahltag) throws JsonProcessin .willReturn(WireMock.aResponse() .withHeader("Content-Type", "application/json") .withBody(objectMapper.writeValueAsString(wahltagClientResponse)) - .withStatus(HttpStatus.OK.value())) - ); + .withStatus(HttpStatus.OK.value()))); } } diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerTest.java index 07f51dc10..99922cc92 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerTest.java @@ -46,4 +46,4 @@ void should_callServiceWahltagID_when_givenWahltagID() { } -} \ No newline at end of file +} From e08ed5c1b6437184769b1bee80d2e111cb6f4c36 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 09:55:14 +0200 Subject: [PATCH 25/67] created WahltermindatenServiceTest --- .../WahltermindatenServiceTest.java | 247 ++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java new file mode 100644 index 000000000..2eded30fe --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java @@ -0,0 +1,247 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; + +import static org.mockito.ArgumentMatchers.any; + +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlbezirk; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlbezirkRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahl; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.WahlRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahlbezirkArtModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.InitializeKopfdaten; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.WahldatenClient; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModelMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModelMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltageService; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; +import java.time.LocalDate; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import lombok.val; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class WahltermindatenServiceTest { + + @Mock + WahltermindatenValidator wahltermindatenValidator; + + @Mock + WahltageService wahltageService; + + @Mock + WahldatenClient wahldatenClient; + + @Mock + WahlModelMapper wahlModelMapper; + + @Mock + WahlbezirkModelMapper wahlbezirkModelMapper; + + @Mock + WahlRepository wahlRepository; + + @Mock + WahlbezirkRepository wahlbezirkRepository; + + @Mock + KopfdatenRepository kopfdatenRepository; + + @Mock + WahlvorschlaegeRepository wahlvorschlaegeRepository; + + @Mock + ReferendumvorlagenRepository referendumvorlagenRepository; + + @Mock + InitializeKopfdaten kopfDataInitializer; + + @Mock + ExceptionFactory exceptionFactory; + + @InjectMocks + WahltermindatenService unitUnderTest; + + @Nested + class PutWahltermindaten { + + @Captor + ArgumentCaptor> wahlbezirkEntitiesCaptor; + + @Test + void should_throwException_when_wahltagIDIsInvalid() { + val wahltagID = "wahltagID"; + + val mockedValidationException = FachlicheWlsException.withCode("000").buildWithMessage("validation failed"); + + Mockito.doThrow(mockedValidationException).when(wahltermindatenValidator).validateParameterToInitWahltermindaten(wahltagID); + + Assertions.assertThatThrownBy(() -> unitUnderTest.putWahltermindaten(wahltagID)).isSameAs(mockedValidationException); + } + + @Test + void should_throwException_when_wahltagWithIDDoesNotExist() { + val wahltagID = "wahltagID"; + + val mockedWlsException = FachlicheWlsException.withCode("000").buildWithMessage("message"); + val mockedWahltageServiceResponse = List.of(new WahltagModel("otherWahltagID", LocalDate.now(), "", "")); + + Mockito.when(wahltageService.getWahltage()).thenReturn(mockedWahltageServiceResponse); + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_NO_WAHLTAG)).thenReturn(mockedWlsException); + + Assertions.assertThatThrownBy(() -> unitUnderTest.putWahltermindaten(wahltagID)).isSameAs(mockedWlsException); + } + + @Test + void should_throwException_when_noBasisdatenWhereFound() { + val wahltagID = "wahltagID"; + + val mockedMatchingWahltag = new WahltagModel(wahltagID, LocalDate.now(), "", "nummer"); + val mockedWahltageServiceResponse = List.of(mockedMatchingWahltag); + val mockedWlsException = FachlicheWlsException.withCode("000").buildWithMessage("message"); + + Mockito.when(wahltageService.getWahltage()).thenReturn(mockedWahltageServiceResponse); + Mockito.when(wahldatenClient.loadBasisdaten(new WahltagWithNummer(mockedMatchingWahltag.wahltag(), mockedMatchingWahltag.nummer()))) + .thenReturn(null); + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GET_BASISDATEN_NO_DATA)).thenReturn(mockedWlsException); + + Assertions.assertThatThrownBy(() -> unitUnderTest.putWahltermindaten(wahltagID)).isSameAs(mockedWlsException); + + } + + @Test + void should_persistData_when_gettingBasisdaten() { + val wahltagID = "wahltagID"; + + val mockedDataWahltag = LocalDate.now(); + + val mockedMatchingWahltag = new WahltagModel(wahltagID, mockedDataWahltag, "", "nummer"); + val mockedWahltageServiceResponse = List.of(mockedMatchingWahltag); + val mockedWahldatenClientResponse = createMockedBasisdatenModel(mockedDataWahltag); + val mockedWahlenMappedAsEntity = List.of(createWahlWithNummer("1"), createWahlWithNummer("2")); + val mockedWahlbezirkeMappedAsEntity = Set.of(createWahlbezirkWithWahlnummer("1"), createWahlbezirkWithWahlnummer("2")); + + Mockito.when(wahltageService.getWahltage()).thenReturn(mockedWahltageServiceResponse); + Mockito.when(wahldatenClient.loadBasisdaten(new WahltagWithNummer(mockedMatchingWahltag.wahltag(), mockedMatchingWahltag.nummer()))) + .thenReturn(mockedWahldatenClientResponse); + Mockito.when(wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities(any())).thenReturn(mockedWahlenMappedAsEntity); + Mockito.when(wahlbezirkModelMapper.fromListOfWahlbezirkModeltoListOfWahlbezirkEntities(any())).thenReturn(mockedWahlbezirkeMappedAsEntity); + + unitUnderTest.putWahltermindaten(wahltagID); + + Mockito.verify(wahlRepository).saveAll(mockedWahlenMappedAsEntity); + Mockito.verify(wahlbezirkRepository).saveAll(wahlbezirkEntitiesCaptor.capture()); + Mockito.verify(kopfDataInitializer).initKopfdaten(mockedWahldatenClientResponse); + + Assertions.assertThat(wahlbezirkEntitiesCaptor.getAllValues().size()).isEqualTo(1); + Assertions.assertThat(wahlbezirkEntitiesCaptor.getValue()).containsOnly( + new Wahlbezirk(null, null, null, null, "1", "wahlID1"), + new Wahlbezirk(null, null, null, null, "2", "wahlID2")); + } + + private static BasisdatenModel createMockedBasisdatenModel(LocalDate wahltagDate) { + val mockedWahldatenWahlen = Set.of(new WahlModel("wahlID1", "wahl 1", 1L, 1L, wahltagDate, Wahlart.BTW, null, "1"), + new WahlModel("wahlID2", "wahl 2", 1L, 1L, wahltagDate, Wahlart.BTW, null, "2")); + val mockedWahldatenWahlbezirke = Set.of(new WahlbezirkModel("wbz1", WahlbezirkArtModel.UWB, "1", wahltagDate, "1", "1"), + new WahlbezirkModel("wbz2", WahlbezirkArtModel.UWB, "1", wahltagDate, "2", "2")); + return new BasisdatenModel(Collections.emptySet(), mockedWahldatenWahlen, mockedWahldatenWahlbezirke, + Collections.emptySet()); + } + + private Wahl createWahlWithNummer(final String nummer) { + val wahl = new Wahl(); + wahl.setNummer(nummer); + + return wahl; + } + + private Wahlbezirk createWahlbezirkWithWahlnummer(final String wahlnummer) { + val wahlbezirk = new Wahlbezirk(); + wahlbezirk.setWahlnummer(wahlnummer); + + return wahlbezirk; + } + } + + @Nested + class DeleteWahltermindaten { + + @Test + void should_throwException_when_wahltagIDIsNotValid() { + val wahltagID = "wahltagID"; + + val mockedValidationException = FachlicheWlsException.withCode("000").buildWithMessage("validation failed"); + + Mockito.doThrow(mockedValidationException).when(wahltermindatenValidator).validateParameterToDeleteWahltermindaten(wahltagID); + + Assertions.assertThatThrownBy(() -> unitUnderTest.deleteWahltermindaten(wahltagID)).isSameAs(mockedValidationException); + } + + @Test + void should_throwException_when_wahltagOfIDDoesNotExist() { + val wahltagID = "wahltagID"; + + val mockedFachlicheWlsException = FachlicheWlsException.withCode("000").buildWithMessage("fachlicheWlsException"); + + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_DELETEWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG)) + .thenReturn(mockedFachlicheWlsException); + Mockito.when(wahltageService.getWahltage()).thenReturn(Collections.emptyList()); + + Assertions.assertThatThrownBy(() -> unitUnderTest.deleteWahltermindaten(wahltagID)).isSameAs(mockedFachlicheWlsException); + } + + @Test + void should_deleteDataInReposOfWahlen_when_wahltagIdHasWahltagWithBasisdaten() { + val wahltagID = "wahltagID"; + + val mockedDataWahltagDate = LocalDate.now(); + val mockedMatchingWahltag = new WahltagModel(wahltagID, mockedDataWahltagDate, "", "nummer"); + val mockedWahltageServiceResponse = List.of(mockedMatchingWahltag); + val mockedBasisstrukturdatenModels = Set.of(createBasisstrukturdatenModelWithWahlID("wahlID1"), createBasisstrukturdatenModelWithWahlID("wahlID2")); + val mockedWahldatenClientResponse = new BasisdatenModel(mockedBasisstrukturdatenModels, null, null, null); + + Mockito.when(wahltageService.getWahltage()).thenReturn(mockedWahltageServiceResponse); + Mockito.when(wahldatenClient.loadBasisdaten(new WahltagWithNummer(mockedDataWahltagDate, mockedMatchingWahltag.nummer()))) + .thenReturn(mockedWahldatenClientResponse); + + unitUnderTest.deleteWahltermindaten(wahltagID); + + Mockito.verify(wahlbezirkRepository).deleteByWahltag(mockedDataWahltagDate); + Mockito.verify(kopfdatenRepository).deleteAllByBezirkUndWahlID_WahlID("wahlID1"); + Mockito.verify(kopfdatenRepository).deleteAllByBezirkUndWahlID_WahlID("wahlID2"); + Mockito.verify(wahlRepository).deleteById("wahlID1"); + Mockito.verify(wahlRepository).deleteById("wahlID2"); + Mockito.verify(wahlvorschlaegeRepository).deleteAllByBezirkUndWahlID_WahlID("wahlID1"); + Mockito.verify(wahlvorschlaegeRepository).deleteAllByBezirkUndWahlID_WahlID("wahlID2"); + Mockito.verify(referendumvorlagenRepository).deleteAllByBezirkUndWahlID_WahlID("wahlID1"); + Mockito.verify(referendumvorlagenRepository).deleteAllByBezirkUndWahlID_WahlID("wahlID2"); + } + + private BasisstrukturdatenModel createBasisstrukturdatenModelWithWahlID(String wahlID) { + return new BasisstrukturdatenModel(wahlID, null, null, null); + } + } + +} From dca8f6d87ad06132b71d8a228e5d02adba8a09c1 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 09:55:44 +0200 Subject: [PATCH 26/67] removed unused class --- .../services/wahltermindaten/AsyncRequests.java | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncRequests.java diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncRequests.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncRequests.java deleted file mode 100644 index f08b6d831..000000000 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncRequests.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; - -import org.springframework.stereotype.Service; - -@Service -public class AsyncRequests { - -} From 4f802def6e4fa54e675d0632e98b4096fe8595ac Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 11:47:37 +0200 Subject: [PATCH 27/67] created tests WahltermindatenValidatorTest --- .../WahltermindatenValidatorTest.java | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidatorTest.java diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidatorTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidatorTest.java new file mode 100644 index 000000000..f369696b3 --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenValidatorTest.java @@ -0,0 +1,99 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; + +import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; +import lombok.val; +import org.assertj.core.api.Assertions; +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.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class WahltermindatenValidatorTest { + + @Mock + ExceptionFactory exceptionFactory; + + @InjectMocks + WahltermindatenValidator unitUnderTest; + + @Nested + class ValidateParameterToInitWahltermindaten { + + final FachlicheWlsException mockedWlsException = FachlicheWlsException.withCode("000").buildWithMessage("mocked wls exception"); + + @Test + void should_throwNoException_when_wahltagIDIsValid() { + val wahltagID = "wahltagID"; + + unitUnderTest.validateParameterToInitWahltermindaten(wahltagID); + } + + @Test + void should_throwException_when_wahltagIDIsNull() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG)) + .thenReturn(mockedWlsException); + + Assertions.assertThatThrownBy(() -> unitUnderTest.validateParameterToInitWahltermindaten(null)).isSameAs(mockedWlsException); + } + + @Test + void should_throwException_when_wahltagIDIsEmpty() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG)) + .thenReturn(mockedWlsException); + + Assertions.assertThatThrownBy(() -> unitUnderTest.validateParameterToInitWahltermindaten("")).isSameAs(mockedWlsException); + } + + @Test + void should_throwException_when_wahltagIDIsBlank() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG)) + .thenReturn(mockedWlsException); + + Assertions.assertThatThrownBy(() -> unitUnderTest.validateParameterToInitWahltermindaten(" ")).isSameAs(mockedWlsException); + } + } + + @Nested + class ValidateParameterToDeleteWahltermindaten { + + final FachlicheWlsException mockedWlsException = FachlicheWlsException.withCode("000").buildWithMessage("mocked wls exception"); + + @Test + void should_throwNoException_when_wahltagIDIsValid() { + val wahltagID = "wahltagID"; + + unitUnderTest.validateParameterToDeleteWahltermindaten(wahltagID); + } + + @Test + void should_throwException_when_wahltagIDIsNull() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_DELETEWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG)) + .thenReturn(mockedWlsException); + + Assertions.assertThatThrownBy(() -> unitUnderTest.validateParameterToDeleteWahltermindaten(null)).isSameAs(mockedWlsException); + } + + @Test + void should_throwException_when_wahltagIDIsEmpty() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_DELETEWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG)) + .thenReturn(mockedWlsException); + + Assertions.assertThatThrownBy(() -> unitUnderTest.validateParameterToDeleteWahltermindaten("")).isSameAs(mockedWlsException); + } + + @Test + void should_throwException_when_wahltagIDIsBlank() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_DELETEWAHLTERMINDATEN_PARAMETER_UNVOLLSTAENDIG)) + .thenReturn(mockedWlsException); + + Assertions.assertThatThrownBy(() -> unitUnderTest.validateParameterToDeleteWahltermindaten(" ")).isSameAs(mockedWlsException); + } + } + +} From d430c076a73a8739df9c74c72c43362b717a7573 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:10:12 +0200 Subject: [PATCH 28/67] spotless:apply --- .../basisdatenservice/clients/DummyClientImpl.java | 8 ++++---- .../wahltermindaten/AsyncWahltermindatenService.java | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java index b4bdd0769..b6f392013 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java @@ -50,8 +50,8 @@ public class DummyClientImpl public WahlvorschlaegeModel getWahlvorschlaege(BezirkUndWahlID bezirkUndWahlID) { return new WahlvorschlaegeModel(bezirkUndWahlID, "stimmzettelgebiedID", Set.of(new WahlvorschlagModel(UUID.randomUUID().toString(), 1L, "kurzname1", true, - Set.of(new KandidatModel(UUID.randomUUID().toString(), "kandidat11", 1L, true, 1L, true), - new KandidatModel(UUID.randomUUID().toString(), "kandidat21", 2L, false, 1L, false))), + Set.of(new KandidatModel(UUID.randomUUID().toString(), "kandidat11", 1L, true, 1L, true), + new KandidatModel(UUID.randomUUID().toString(), "kandidat21", 2L, false, 1L, false))), new WahlvorschlagModel(UUID.randomUUID().toString(), 2L, "kurzname2", true, Set.of(new KandidatModel(UUID.randomUUID().toString(), "kandidat21", 1L, true, 1L, true), new KandidatModel(UUID.randomUUID().toString(), "kandidat22", 2L, false, 1L, false))))); @@ -77,8 +77,8 @@ public List getWahlen(final WahltagWithNummer wahltagWithNummer) thro @Override public ReferendumvorlagenModel getReferendumvorlagen(ReferendumvorlagenReferenceModel referendumvorlagenReferenceModel) { return new ReferendumvorlagenModel("stimmzettelgebietID", Set.of(new ReferendumvorlageModel("wahlvorschlagID1", 1L, "kurzname1", "frage1", - Set.of(new ReferendumoptionModel("optionID11" + UUID.randomUUID(), "option11", 1L), - new ReferendumoptionModel("optionID12" + UUID.randomUUID(), "option12", 2L))), + Set.of(new ReferendumoptionModel("optionID11" + UUID.randomUUID(), "option11", 1L), + new ReferendumoptionModel("optionID12" + UUID.randomUUID(), "option12", 2L))), new ReferendumvorlageModel("wahlvorschlagID2", 2L, "kurzname2", "frage2", Set.of(new ReferendumoptionModel("optionID21" + UUID.randomUUID(), "option21", 1L), new ReferendumoptionModel("optionID22" + UUID.randomUUID(), "option22", 2L))))); diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java index fe5f7b934..b3a0dd593 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java @@ -56,8 +56,7 @@ private void initWahlvorschlaege(final BasisdatenModel basisdaten) { loadAndPersistWahlvorschlaege(wahl.wahlID(), wahlbezirk.wahlbezirkID(), wahlbezirk.nummer()); SecurityContextHolder.getContext().setAuthentication(null); } - }) - ); + })); } private void loadAndPersistWahlvorschlaege(String wahlID, String wahlbezirk, String nummer) { @@ -91,8 +90,7 @@ private void initReferendumvorlagen(final BasisdatenModel basisdaten) { loadAndPersistReferendumvorlagen(wahl.wahlID(), wahlbezirk.wahlbezirkID(), wahlbezirk.nummer()); SecurityContextHolder.getContext().setAuthentication(null); } - }) - ); + })); } private void loadAndPersistReferendumvorlagen(String wahlID, String wahlbezirk, String nummer) { From ce284ea0715d4b69ff52a2cc01c65cb42f4a8964 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:10:42 +0200 Subject: [PATCH 29/67] removed todo --- .../services/wahltermindaten/WahltermindatenService.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index f260884a8..37d56835d 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -71,11 +71,6 @@ public void putWahltermindaten(final String wahltagID) { kopfDataInitializer.initKopfdaten(basisdatenModel); asyncWahltermindatenService.initVorlagenAndVorschlaege(wahltagModel.wahltag(), wahltagModel.nummer(), basisdatenModel); - // ToDo: add async classes, adapt EAI client, improve async handlöing? - // Async - // asyncRequests.getAsyncProgress().reset(wahltag.getWahltag(), wahltag.getNummer()); - // asyncRequests.initWahlvorschlaege(wahlen, wahlbezirke); - // asyncRequests.initReferendumvorlagen(wahlen, wahlbezirke); } From 7e62351a7a4efd8ebd1949242d3f2c6b66fea5e4 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:11:00 +0200 Subject: [PATCH 30/67] update test for async call --- .../WahltermindatenControllerIntegrationTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index b63bf056e..6a17c4e67 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -3,12 +3,14 @@ import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_NO_SECURITY_PROFILE; import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_TEST_PROFILE; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.client.WireMock; import de.muenchen.oss.wahllokalsystem.basisdatenservice.MicroServiceApplication; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.clients.WahldatenClientMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Kandidat; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.KandidatRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlbezirk; @@ -37,6 +39,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlbezirkDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahltagDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten.AsyncWahltermindatenService; import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.Authorities; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import de.muenchen.oss.wahllokalsystem.wls.common.testing.SecurityUtils; @@ -94,9 +97,15 @@ public class WahltermindatenControllerIntegrationTest { @SpyBean KopfdatenRepository kopfdatenRepository; + @SpyBean + AsyncWahltermindatenService asyncWahltermindatenService; + @Autowired private WahltagRepository wahltagRepository; + @Autowired + WahldatenClientMapper wahldatenClientMapper; + @AfterEach void tearDown() { SecurityUtils.runWith(Authorities.REPOSITORY_DELETE_REFERENDUMVORLAGEN, Authorities.REPOSITORY_DELETE_WAHLVORSCHLAEGE, @@ -413,6 +422,10 @@ void should_persistImportedData_when_wahltagIDIsValidWahltag() throws Exception Assertions.assertThat(wahlbezirkRepository.count()).isEqualTo(5); Assertions.assertThat(wahlRepository.count()).isEqualTo(2); + val expectedBasisdatenModel = wahldatenClientMapper.fromRemoteClientDTOToModel(basisstrukturdatenToImport); + Mockito.verify(asyncWahltermindatenService) + .initVorlagenAndVorschlaege(eq(wahltagToGetWahltermindaten.getWahltag()), eq(wahltagToGetWahltermindaten.getNummer()), + eq(expectedBasisdatenModel)); } } From 05edb4779b2a74d0f7dd16fb2c4bf867ac14cb87 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:12:24 +0200 Subject: [PATCH 31/67] fix update of wrong progress --- .../services/wahltermindaten/AsyncWahltermindatenService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java index b3a0dd593..a0c52a051 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java @@ -103,7 +103,7 @@ private void loadAndPersistReferendumvorlagen(String wahlID, String wahlbezirk, } catch (final Exception e) { log.info("#initReferendumvorlage: Fehler bei initReferendumvorlage -> möglicherweise richtiges Verhalten; Fehler:", e); } finally { - asyncProgress.incWahlvorschlaegeFinished(); + asyncProgress.incReferendumVorlagenFinished(); } } } From 91b4b3d5735d8fe643f9375d9841aec7faa39280 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:12:48 +0200 Subject: [PATCH 32/67] created AsyncWahltermindatenServiceTest --- .../AsyncWahltermindatenServiceTest.java | 209 ++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java new file mode 100644 index 000000000..c952bd6ff --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java @@ -0,0 +1,209 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; + +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlvorschlaege; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahlbezirkArtModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenClient; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenModelMapper; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlvorschlag.WahlvorschlaegeClient; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlvorschlag.WahlvorschlaegeModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlvorschlag.WahlvorschlaegeModelMapper; +import java.time.LocalDate; +import java.util.Collections; +import java.util.Set; +import lombok.val; +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.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class AsyncWahltermindatenServiceTest { + + @Mock + AsyncProgress asyncProgress; + + @Mock + WahlvorschlaegeClient wahlvorschlaegeClient; + @Mock + ReferendumvorlagenClient referendumvorlagenClient; + + @Mock + WahlvorschlaegeRepository wahlvorschlaegeRepository; + @Mock + ReferendumvorlagenRepository referendumvorlagenRepository; + + @Mock + WahlvorschlaegeModelMapper wahlvorschlaegeModelMapper; + @Mock + ReferendumvorlagenModelMapper referendumvorlagenModelMapper; + + @InjectMocks + AsyncWahltermindatenService unitUnderTest; + + @Nested + class InitVorlagenAndVorschlaege { + + @Test + void should_resetProgress_when_methodIsCalled() { + val wahltagDate = LocalDate.now(); + val wahltagNummer = "wahltagNummer"; + val basisdatenModel = createEmptyBasisdatenModel(); + + unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + + Mockito.verify(asyncProgress).reset(wahltagDate, wahltagNummer); + } + + @Test + void should_persistWahlvorschlaege_when_basisdatenAreDelivered() { + val wahltagDate = LocalDate.now(); + val wahltagNummer = "wahltagNummer"; + val basisdatenModel = createBasisdatenModelWith2WahlenAnd2WahlbezirkeForEachWahl(wahltagDate, Wahlart.BTW); + + val mockedWahlvorschlaegeClientResponse = WahlvorschlaegeModel.builder().build(); + val mockedWahlvorschlaegeModelMappedAsEntity = new Wahlvorschlaege(); + + Mockito.when(wahlvorschlaegeClient.getWahlvorschlaege(any())).thenReturn(mockedWahlvorschlaegeClientResponse); + Mockito.when(wahlvorschlaegeModelMapper.toEntity(mockedWahlvorschlaegeClientResponse)).thenReturn(mockedWahlvorschlaegeModelMappedAsEntity); + + unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + + Mockito.verify(wahlvorschlaegeRepository, times(4)).save(mockedWahlvorschlaegeModelMappedAsEntity); + Mockito.verify(asyncProgress, times(4)).incWahlvorschlaegeFinished(); + Mockito.verify(asyncProgress, times(4)).setWahlvorschlaegeNext(any()); + } + + @Test + void should_increaseWahlvorstandProgressEven_when_savingFailed() { + val wahltagDate = LocalDate.now(); + val wahltagNummer = "wahltagNummer"; + val basisdatenModel = createBasisdatenModelWith2WahlenAnd2WahlbezirkeForEachWahl(wahltagDate, Wahlart.BTW); + + val mockedWahlvorschlaegeClientResponse = WahlvorschlaegeModel.builder().build(); + val mockedWahlvorschlaegeModelMappedAsEntity = new Wahlvorschlaege(); + + Mockito.when(wahlvorschlaegeClient.getWahlvorschlaege(any())).thenReturn(mockedWahlvorschlaegeClientResponse); + Mockito.when(wahlvorschlaegeModelMapper.toEntity(mockedWahlvorschlaegeClientResponse)).thenReturn(mockedWahlvorschlaegeModelMappedAsEntity); + Mockito.doThrow(new RuntimeException("saving failed")).when(wahlvorschlaegeRepository).save(mockedWahlvorschlaegeModelMappedAsEntity); + + unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + + Mockito.verify(asyncProgress, times(4)).incWahlvorschlaegeFinished(); + Mockito.verify(asyncProgress, times(4)).setWahlvorschlaegeNext(any()); + } + + @Test + void should_increaseWahlvorstandProgressEven_when_loadingWahlvorschlaegeFromClientFailed() { + val wahltagDate = LocalDate.now(); + val wahltagNummer = "wahltagNummer"; + val basisdatenModel = createBasisdatenModelWith2WahlenAnd2WahlbezirkeForEachWahl(wahltagDate, Wahlart.BTW); + + val mockedWahlvorschlaegeClientResponse = WahlvorschlaegeModel.builder().build(); + val mockedWahlvorschlaegeModelMappedAsEntity = new Wahlvorschlaege(); + + Mockito.doThrow(new RuntimeException("getting data from client failed")).when(wahlvorschlaegeClient).getWahlvorschlaege(any()); + + unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + + Mockito.verify(asyncProgress, times(4)).incWahlvorschlaegeFinished(); + Mockito.verify(asyncProgress, times(4)).setWahlvorschlaegeNext(any()); + } + + @Test + void should_persistReferendumvorlagen_when_basisdatenAreDelivered() { + val wahltagDate = LocalDate.now(); + val wahltagNummer = "wahltagNummer"; + val basisdatenModel = createBasisdatenModelWith2WahlenAnd2WahlbezirkeForEachWahl(wahltagDate, Wahlart.BEB); + + val mockedReferendumvorlagenClientResponse = createEmptyReferendumvorlagenModel(); + val mockedReferendumvorlagenModelMappedAsEntity = new Referendumvorlagen(); + + Mockito.when(referendumvorlagenClient.getReferendumvorlagen(any())).thenReturn(mockedReferendumvorlagenClientResponse); + Mockito.when(referendumvorlagenModelMapper.toEntity(eq(mockedReferendumvorlagenClientResponse), any())) + .thenReturn(mockedReferendumvorlagenModelMappedAsEntity); + + unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + + Mockito.verify(referendumvorlagenRepository, times(4)).save(mockedReferendumvorlagenModelMappedAsEntity); + Mockito.verify(asyncProgress, times(4)).incReferendumVorlagenFinished(); + Mockito.verify(asyncProgress, times(4)).setReferendumVorlagenNext(any()); + } + + @Test + void should_increaseReferendumvorlagenProgressEven_when_savingFailed() { + val wahltagDate = LocalDate.now(); + val wahltagNummer = "wahltagNummer"; + val basisdatenModel = createBasisdatenModelWith2WahlenAnd2WahlbezirkeForEachWahl(wahltagDate, Wahlart.BEB); + + val mockedReferendumvorlagenClientResponse = createEmptyReferendumvorlagenModel(); + val mockedReferendumvorlagenModelMappedAsEntity = new Referendumvorlagen(); + + Mockito.when(referendumvorlagenClient.getReferendumvorlagen(any())).thenReturn(mockedReferendumvorlagenClientResponse); + Mockito.when(referendumvorlagenModelMapper.toEntity(eq(mockedReferendumvorlagenClientResponse), any())) + .thenReturn(mockedReferendumvorlagenModelMappedAsEntity); + Mockito.doThrow(new RuntimeException("saving failed")).when(referendumvorlagenRepository).save(any()); + + unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + + Mockito.verify(asyncProgress, times(4)).incReferendumVorlagenFinished(); + Mockito.verify(asyncProgress, times(4)).setReferendumVorlagenNext(any()); + } + + @Test + void should_increaseReferendumvorlagenProgressEven_when_loadingReferendumvorlagenFromClientFailed() { + val wahltagDate = LocalDate.now(); + val wahltagNummer = "wahltagNummer"; + val basisdatenModel = createBasisdatenModelWith2WahlenAnd2WahlbezirkeForEachWahl(wahltagDate, Wahlart.BEB); + + Mockito.doThrow(new RuntimeException("getting data from client failed")).when(referendumvorlagenClient).getReferendumvorlagen(any()); + + unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + + Mockito.verify(asyncProgress, times(4)).incReferendumVorlagenFinished(); + Mockito.verify(asyncProgress, times(4)).setReferendumVorlagenNext(any()); + } + + @Test + void should_propagateAuthentication_when_repositioriesAreCalled() { + + } + + private ReferendumvorlagenModel createEmptyReferendumvorlagenModel() { + return new ReferendumvorlagenModel("sgzid", Collections.emptySet()); + } + + private BasisdatenModel createEmptyBasisdatenModel() { + return new BasisdatenModel(Collections.emptySet(), Collections.emptySet(), Collections.emptySet(), Collections.emptySet()); + } + + private BasisdatenModel createBasisdatenModelWith2WahlenAnd2WahlbezirkeForEachWahl(final LocalDate wahltagDate, final Wahlart wahlArt) { + val wahlenModels = Set.of( + new WahlModel("wahlID1", "wahl1", 1L, 1L, wahltagDate, wahlArt, null, "1"), + new WahlModel("wahlID2", "wahl2", 2L, 2L, wahltagDate, wahlArt, null, "2")); + + val wahlbezirkeModels = Set.of( + new WahlbezirkModel("wahlbezirkID1", WahlbezirkArtModel.UWB, "1", wahltagDate, "1", "wahlID1"), + new WahlbezirkModel("wahlbezirkID2", WahlbezirkArtModel.UWB, "2", wahltagDate, "1", "wahlID1"), + new WahlbezirkModel("wahlbezirkID3", WahlbezirkArtModel.UWB, "3", wahltagDate, "2", "wahlID2"), + new WahlbezirkModel("wahlbezirkID4", WahlbezirkArtModel.UWB, "4", wahltagDate, "2", "wahlID2")); + + return new BasisdatenModel(Collections.emptySet(), wahlenModels, wahlbezirkeModels, Collections.emptySet()); + } + } + +} From d8d0fe85d4c31a44dfd758cbd0569d860e481bd6 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:39:39 +0200 Subject: [PATCH 33/67] update WahltermindatenServiceTest --- .../wahltermindaten/WahltermindatenServiceTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java index 2eded30fe..843077640 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java @@ -1,6 +1,7 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlbezirk; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlbezirkRepository; @@ -81,6 +82,9 @@ class WahltermindatenServiceTest { @Mock ExceptionFactory exceptionFactory; + @Mock + AsyncWahltermindatenService asyncWahltermindatenService; + @InjectMocks WahltermindatenService unitUnderTest; @@ -154,6 +158,8 @@ void should_persistData_when_gettingBasisdaten() { Mockito.verify(wahlRepository).saveAll(mockedWahlenMappedAsEntity); Mockito.verify(wahlbezirkRepository).saveAll(wahlbezirkEntitiesCaptor.capture()); Mockito.verify(kopfDataInitializer).initKopfdaten(mockedWahldatenClientResponse); + Mockito.verify(asyncWahltermindatenService) + .initVorlagenAndVorschlaege(eq(mockedMatchingWahltag.wahltag()), eq(mockedMatchingWahltag.nummer()), eq(mockedWahldatenClientResponse)); Assertions.assertThat(wahlbezirkEntitiesCaptor.getAllValues().size()).isEqualTo(1); Assertions.assertThat(wahlbezirkEntitiesCaptor.getValue()).containsOnly( From 84d0efdbff7ae6c456f24768e3dae1f7080fd8f9 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:41:19 +0200 Subject: [PATCH 34/67] revert save changes --- .../services/referendumvorlagen/ReferendumvorlagenService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/referendumvorlagen/ReferendumvorlagenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/referendumvorlagen/ReferendumvorlagenService.java index 6c1cd8a5f..8630f1f27 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/referendumvorlagen/ReferendumvorlagenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/referendumvorlagen/ReferendumvorlagenService.java @@ -57,7 +57,7 @@ private void saveReferendumvorlagen(final Referendumvorlagen referendumvorlagenT try { transactionTemplate.executeWithoutResult(transactionStatus -> { referendumvorlagenRepository.save(referendumvorlagenToSave); - //referendumvorlageRepository.saveAll(referendumvorlagenToSave.getReferendumvorlagen()); + referendumvorlageRepository.saveAll(referendumvorlagenToSave.getReferendumvorlagen()); }); } catch (final Exception e) { log.error("#getReferendumvorlagen: Fehler beim Cachen", e); From c91c4fe2cebbcf78bbba45f6b984ddcb3b7f44d3 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:00:56 +0200 Subject: [PATCH 35/67] fixing imports after merge with dev --- .../AsyncWahltermindatenService.java | 4 +-- .../WahltermindatenService.java | 8 +++--- .../domain/WahlvorschlaegeRepositoryTest.java | 7 +++++ ...ltermindatenControllerIntegrationTest.java | 28 +++++++++---------- .../AsyncWahltermindatenServiceTest.java | 6 ++-- .../WahltermindatenServiceTest.java | 12 ++++---- 6 files changed, 36 insertions(+), 29 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java index a0c52a051..c60ed91c9 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java @@ -1,8 +1,8 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenClient; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenModelMapper; diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index 37d56835d..dacceb1b8 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -1,11 +1,11 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlbezirk; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlbezirkRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.WahlRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlbezirke.Wahlbezirk; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlbezirke.WahlbezirkRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.WahlRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.InitializeKopfdaten; diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java index d5dde4250..f30ab95a9 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java @@ -2,7 +2,14 @@ import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_NO_SECURITY_PROFILE; import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_TEST_PROFILE; + import de.muenchen.oss.wahllokalsystem.basisdatenservice.MicroServiceApplication; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Kandidat; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.KandidatRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlaege; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlag; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlagRepository; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.util.HashSet; import java.util.Optional; diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index 6a17c4e67..e35de6d7e 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -11,17 +11,7 @@ import com.github.tomakehurst.wiremock.client.WireMock; import de.muenchen.oss.wahllokalsystem.basisdatenservice.MicroServiceApplication; import de.muenchen.oss.wahllokalsystem.basisdatenservice.clients.WahldatenClientMapper; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Kandidat; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.KandidatRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlbezirk; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlbezirkArt; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlbezirkRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahltag; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahltagRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlvorschlaege; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlvorschlag; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlagRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.common.WahlbezirkArt; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.Kopfdaten; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.Stimmzettelgebietsart; @@ -30,9 +20,19 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlageRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahl; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.WahlRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlbezirke.Wahlbezirk; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlbezirke.WahlbezirkRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahl; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.WahlRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahltag.Wahltag; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahltag.WahltagRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Kandidat; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.KandidatRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlaege; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlag; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlagRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.BasisdatenDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.BasisstrukturdatenDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.StimmzettelgebietDTO; diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java index c952bd6ff..5351aca34 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java @@ -4,11 +4,11 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlvorschlaege; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlaege; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahlbezirkArtModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenClient; diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java index 843077640..fe73cde5a 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java @@ -3,14 +3,14 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.Wahlbezirk; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlbezirkRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahl; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.WahlRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahl.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlbezirke.Wahlbezirk; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlbezirke.WahlbezirkRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahl; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.WahlRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahlbezirkArtModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; From c9740383668243aac9b398839a0a3a0c49f06a6b Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:01:14 +0200 Subject: [PATCH 36/67] add final to parameter --- .../basisdatenservice/configuration/AsyncConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java index 29d8c270c..0f6b0e2dd 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java @@ -33,7 +33,7 @@ public ThreadPoolTaskExecutor threadPoolTaskExecutor() { } @Bean - public DelegatingSecurityContextAsyncTaskExecutor taskExecutor(ThreadPoolTaskExecutor threadPoolTaskExecutor) { + public DelegatingSecurityContextAsyncTaskExecutor taskExecutor(final ThreadPoolTaskExecutor threadPoolTaskExecutor) { return new DelegatingSecurityContextAsyncTaskExecutor(threadPoolTaskExecutor); } } From 681b5f508dd015fb5d65bac0a433d61ae093a10b Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 9 Oct 2024 09:40:04 +0200 Subject: [PATCH 37/67] moved constant value direct into other constant --- .../basisdatenservice/exception/ExceptionConstants.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java index 33fa19b92..a44bd53d1 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/exception/ExceptionConstants.java @@ -14,7 +14,6 @@ public class ExceptionConstants { private static final String CODE_UNSAVEABLE = "903"; private static final String MSG_UNSAVEABLE = "Fehler beim speichern: Daten konnten nicht gespeichert werden."; - private static final String CODE_NO_DATA_BASISDATEN = "401"; private static final String CODE_NO_DATA_WAHLBEZIRK = "402"; public static ExceptionDataWrapper SUCHKRITERIEN_UNVOLLSTAENDIG = new ExceptionDataWrapper(CODE_SUCHKRITERIEN_UNVOLLSTAENDIG, @@ -87,7 +86,7 @@ public class ExceptionConstants { public static ExceptionDataWrapper CODE_DELETEWAHLTERMINDATEN_LOESCHEN_UNVOLLSTAENDIG = new ExceptionDataWrapper("307", "deleteWahltermindaten: Die Wahltermindaten konnten aufgrund eines Fehlers nicht vollstaendig geloescht werden."); - public static final ExceptionDataWrapper GET_BASISDATEN_NO_DATA = new ExceptionDataWrapper(CODE_NO_DATA_BASISDATEN, + public static final ExceptionDataWrapper GET_BASISDATEN_NO_DATA = new ExceptionDataWrapper("401", "Es wurden keine Basisdaten gefunden."); } From 3f83af53a07e85e610b60c895752c40abb871c5a Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 9 Oct 2024 17:08:06 +0200 Subject: [PATCH 38/67] remove cascade.all changes --- .../domain/referendumvorlagen/Referendumvorlagen.java | 3 +-- .../domain/wahlvorschlag/Wahlvorschlaege.java | 3 +-- .../domain/wahlvorschlag/Wahlvorschlag.java | 3 +-- .../services/wahlvorschlag/WahlvorschlaegeService.java | 8 +++++++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/referendumvorlagen/Referendumvorlagen.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/referendumvorlagen/Referendumvorlagen.java index 8ba935e61..c6d452eb1 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/referendumvorlagen/Referendumvorlagen.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/referendumvorlagen/Referendumvorlagen.java @@ -3,7 +3,6 @@ import static java.sql.Types.VARCHAR; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; -import jakarta.persistence.CascadeType; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -46,7 +45,7 @@ public class Referendumvorlagen { @NotNull private String stimmzettelgebietID; - @OneToMany(mappedBy = "referendumvorlagen", orphanRemoval = true, cascade = CascadeType.ALL) + @OneToMany(mappedBy = "referendumvorlagen", orphanRemoval = true) @NotNull private Set referendumvorlagen = new HashSet<>(); diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/wahlvorschlag/Wahlvorschlaege.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/wahlvorschlag/Wahlvorschlaege.java index 3b7665430..e7426f9ba 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/wahlvorschlag/Wahlvorschlaege.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/wahlvorschlag/Wahlvorschlaege.java @@ -3,7 +3,6 @@ import static java.sql.Types.VARCHAR; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; -import jakarta.persistence.CascadeType; import jakarta.persistence.Embeddable; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; @@ -51,7 +50,7 @@ public class Wahlvorschlaege { @ToString.Include private String stimmzettelgebietID; - @OneToMany(mappedBy = "wahlvorschlaeage", orphanRemoval = true, cascade = CascadeType.ALL) + @OneToMany(mappedBy = "wahlvorschlaeage", orphanRemoval = true) @NotNull @Size(min = 1) private Set wahlvorschlaege = new LinkedHashSet<>(); diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/wahlvorschlag/Wahlvorschlag.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/wahlvorschlag/Wahlvorschlag.java index cfac61996..62ca6e7b9 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/wahlvorschlag/Wahlvorschlag.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/wahlvorschlag/Wahlvorschlag.java @@ -2,7 +2,6 @@ import static java.sql.Types.VARCHAR; -import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; @@ -61,7 +60,7 @@ public class Wahlvorschlag { @ToString.Include private boolean erhaeltStimmen; - @OneToMany(mappedBy = "wahlvorschlag", orphanRemoval = true, cascade = CascadeType.ALL) + @OneToMany(mappedBy = "wahlvorschlag", orphanRemoval = true) @NotNull private Set kandidaten = new LinkedHashSet<>(); diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeService.java index 70f3af9dd..7419cb4f7 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlvorschlag/WahlvorschlaegeService.java @@ -50,7 +50,13 @@ public WahlvorschlaegeModel getWahlvorschlaege(final BezirkUndWahlID bezirkUndWa protected Wahlvorschlaege persistWahlvorschlagModel(final WahlvorschlaegeModel wahlvorschlaegeModel) { val entityToCreate = wahlvorschlaegeModelMapper.toEntity(wahlvorschlaegeModel); - return wahlvorschlaegeRepository.save(entityToCreate); + val createdEntity = wahlvorschlaegeRepository.save(entityToCreate); + entityToCreate.getWahlvorschlaege().forEach(wahlvorschlag -> { + wahlvorschlagRepository.save(wahlvorschlag); + kandidatRepository.saveAll(wahlvorschlag.getKandidaten()); + }); + + return createdEntity; } } From f8c0fa61026e0ddb46df7372b37a6b2365c17ece Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 9 Oct 2024 17:47:22 +0200 Subject: [PATCH 39/67] created repo test for deleteAllByBezirkUndWahlID_WahlID --- .../domain/WahlvorschlaegeRepositoryTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java index f30ab95a9..a7ca2ac92 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java @@ -18,11 +18,13 @@ import lombok.val; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; @SpringBootTest( classes = { MicroServiceApplication.class }, @@ -41,6 +43,9 @@ class WahlvorschlaegeRepositoryTest { @Autowired private KandidatRepository kandidatRepository; + @Autowired + private TransactionTemplate transactionTemplate; + @AfterEach void tearDown() { kandidatRepository.deleteAll(); @@ -48,6 +53,73 @@ void tearDown() { wahlvorschlaegeRepository.deleteAll(); } + @Nested + class DeleteAllByBezirkUndWahlID_WahlID { + + @Test + void should_removeWahlvorschlaegeAndChildren_when_wahlIdMatches() { + val wahlIDToDelete = "wahlID"; + + val wahlvorschlaegeToKeep = transactionTemplate.execute(status -> { + persistWahlvorschlaege(createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk1", wahlIDToDelete)); + persistWahlvorschlaege(createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk2", wahlIDToDelete)); + + return persistWahlvorschlaege(createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk1", "wahlIDToKeep")); + }); + + wahlvorschlaegeRepository.deleteAllByBezirkUndWahlID_WahlID(wahlIDToDelete); + + Assertions.assertThat(wahlvorschlaegeRepository.count()).isEqualTo(1); + Assertions.assertThat(wahlvorschlaegeRepository.existsById(wahlvorschlaegeToKeep.getId())).isTrue(); + + Assertions.assertThat(wahlvorschlagRepository.count()).isEqualTo(wahlvorschlaegeToKeep.getWahlvorschlaege().size()); + wahlvorschlaegeToKeep.getWahlvorschlaege() + .forEach(wahlvorschlag -> Assertions.assertThat(wahlvorschlagRepository.existsById(wahlvorschlag.getId())).isTrue()); + + val expectedCountKandidaten = wahlvorschlaegeToKeep.getWahlvorschlaege().stream() + .map(wahlvorschlag -> wahlvorschlag.getKandidaten().size()) + .mapToLong(Integer::longValue) + .sum(); + Assertions.assertThat(kandidatRepository.count()).isEqualTo(expectedCountKandidaten); + wahlvorschlaegeToKeep.getWahlvorschlaege().stream().flatMap(wahlvorschlag -> wahlvorschlag.getKandidaten().stream()) + .forEach(kandidat -> Assertions.assertThat(kandidatRepository.existsById(kandidat.getId())).isTrue()); + } + + private Wahlvorschlaege persistWahlvorschlaege(final Wahlvorschlaege wahlvorschlaegeToPersist) { + val createdEntity = wahlvorschlaegeRepository.save(wahlvorschlaegeToPersist); + wahlvorschlaegeToPersist.getWahlvorschlaege().forEach(wahlvorschlag -> { + wahlvorschlagRepository.save(wahlvorschlag); + kandidatRepository.saveAll(wahlvorschlag.getKandidaten()); + }); + + return createdEntity; + } + + private Wahlvorschlaege createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID(final String wahlbezirkID, final String wahlID) { + val wahlvorschlaege = new Wahlvorschlaege(); + + wahlvorschlaege.setBezirkUndWahlID(new BezirkUndWahlID(wahlID, wahlbezirkID)); + wahlvorschlaege.setStimmzettelgebietID(wahlID); + + wahlvorschlaege.setWahlvorschlaege(new HashSet<>()); + val wahlvorschlag1 = new Wahlvorschlag(null, wahlbezirkID + "_" + wahlID + "_1", null, 1L, wahlID + "_1", true, new HashSet<>()); + wahlvorschlaege.addWahlvorschlag(wahlvorschlag1); + val wahlvorschlag2 = new Wahlvorschlag(null, wahlbezirkID + "_" + wahlID + "_2", null, 1L, wahlID + "_2", true, new HashSet<>()); + wahlvorschlaege.addWahlvorschlag(wahlvorschlag2); + + val kandidat1Vorschlag1 = new Kandidat(null, wahlvorschlag1.getIdentifikator() + "_1", null, "kandidat", 1L, true, 1L, true); + wahlvorschlag1.addKandidat(kandidat1Vorschlag1); + val kandidat2Vorschlag1 = new Kandidat(null, wahlvorschlag1.getIdentifikator() + "_2", null, "kandidat", 1L, true, 1L, true); + wahlvorschlag1.addKandidat(kandidat2Vorschlag1); + val kandidat1Vorschlag2 = new Kandidat(null, wahlvorschlag2.getIdentifikator() + "_1", null, "kandidat", 1L, true, 1L, true); + wahlvorschlag2.addKandidat(kandidat1Vorschlag2); + val kandidat2Vorschlag2 = new Kandidat(null, wahlvorschlag2.getIdentifikator() + "_2", null, "kandidat", 1L, true, 1L, true); + wahlvorschlag2.addKandidat(kandidat2Vorschlag2); + + return wahlvorschlaege; + } + } + @Test @Transactional public void wahlvorschlaegeRepositorySave() { From ab6b3616b5108c9d5ef322f90923ebf37c6a914e Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 9 Oct 2024 17:49:42 +0200 Subject: [PATCH 40/67] remove old tests --- .../domain/WahlvorschlaegeRepositoryTest.java | 118 ------------------ 1 file changed, 118 deletions(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java index a7ca2ac92..62f300530 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java @@ -12,8 +12,6 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlagRepository; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.util.HashSet; -import java.util.Optional; -import java.util.Set; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.assertj.core.api.Assertions; @@ -23,7 +21,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; @SpringBootTest( @@ -119,119 +116,4 @@ private Wahlvorschlaege createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID(f return wahlvorschlaege; } } - - @Test - @Transactional - public void wahlvorschlaegeRepositorySave() { - val wahlID = "wahlID"; - val wahlbezirkID = "wahlbezirkID"; - val wahlvorschlaegeEntity = createWahlvorschlaegeEntity(wahlID, wahlbezirkID); - val bezirkUndWahlID = wahlvorschlaegeEntity.getBezirkUndWahlID(); - - wahlvorschlaegeRepository.save(wahlvorschlaegeEntity); - - Optional persistedWahlvorschlaege = wahlvorschlaegeRepository.findByBezirkUndWahlID(bezirkUndWahlID); - - Assertions.assertThat(wahlvorschlaegeEntity).isEqualTo(persistedWahlvorschlaege.get()); - } - - @Test - @Transactional - public void savingParentWahlvorschlaegeIsAutomaticallySavingWahlvorschlagChildsAndHerKandidatChilds() { - val wahlID = "wahlID"; - val wahlbezirkID = "wahlbezirkID"; - val wahlvorschlaegeEntity = createWahlvorschlaegeEntity(wahlID, wahlbezirkID); - - val expectedWahlvorschlagChilds = wahlvorschlaegeEntity.getWahlvorschlaege(); - - Set expectedAllKandidatChilds = new HashSet<>(); - for (Wahlvorschlag expectedWahlvorschlagChild : expectedWahlvorschlagChilds) { - expectedAllKandidatChilds.addAll(expectedWahlvorschlagChild.getKandidaten()); - } - - wahlvorschlaegeRepository.save(wahlvorschlaegeEntity); - - val foundWahlvorschlagChilds = wahlvorschlagRepository.findAll(); - val foundKandidatChildsOfAllWahlvorschlags = kandidatRepository.findAll(); - - Assertions.assertThat(foundWahlvorschlagChilds).containsExactlyInAnyOrderElementsOf(expectedWahlvorschlagChilds); - Assertions.assertThat(foundKandidatChildsOfAllWahlvorschlags).containsExactlyInAnyOrderElementsOf(expectedAllKandidatChilds); - } - - @Test - @Transactional - public void method_deleteAllByBezirkUndWahlID_WahlID_doesNotDeleteElementsWithOtherWahlIDButSameWahlbezirkID() { - Assertions.assertThat(wahlvorschlaegeRepository.findAll()).isEmpty(); - Assertions.assertThat(wahlvorschlagRepository.findAll()).isEmpty(); - Assertions.assertThat(kandidatRepository.findAll()).isEmpty(); - - val wahlID_1 = "wahlID_1"; - val wahlbezirkID = "wahlbezirkID"; - val wahlID_2 = "wahlID_2"; - - val wahlvorschlaegeEntity1 = createWahlvorschlaegeEntity(wahlID_1, wahlbezirkID); - val bezirkUndWahlID1 = wahlvorschlaegeEntity1.getBezirkUndWahlID(); - val wahlvorschlaegeEntity2 = createWahlvorschlaegeEntity(wahlID_2, wahlbezirkID); - val bezirkUndWahlID2 = wahlvorschlaegeEntity2.getBezirkUndWahlID(); - - wahlvorschlaegeRepository.save(wahlvorschlaegeEntity1); - wahlvorschlaegeRepository.save(wahlvorschlaegeEntity2); - - val expectedWahlvorschlagChilds1 = wahlvorschlaegeEntity1.getWahlvorschlaege(); - Set expectedAllKandidatChilds1 = new HashSet<>(); - for (Wahlvorschlag expectedWahlvorschlagChild : expectedWahlvorschlagChilds1) { - expectedAllKandidatChilds1.addAll(expectedWahlvorschlagChild.getKandidaten()); - } - - val foundWahlvorschlaege_OfWahlID1 = wahlvorschlaegeRepository.findByBezirkUndWahlID(bezirkUndWahlID1); - val foundWahlvorschlagChilds_Of_wahlID1 = foundWahlvorschlaege_OfWahlID1.get().getWahlvorschlaege(); - val foundKandidatChildsOfAllWahlvorschlags_Of_wahlID1 = foundWahlvorschlaege_OfWahlID1.get().getWahlvorschlaege().stream() - .flatMap(wvorschlag -> wvorschlag.getKandidaten().stream()); - - Assertions.assertThat(foundWahlvorschlagChilds_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedWahlvorschlagChilds1); - Assertions.assertThat(foundKandidatChildsOfAllWahlvorschlags_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedAllKandidatChilds1); - - val expectedWahlvorschlagChilds2 = wahlvorschlaegeEntity2.getWahlvorschlaege(); - Set expectedAllKandidatChilds2 = new HashSet<>(); - for (Wahlvorschlag expectedWahlvorschlagChild : expectedWahlvorschlagChilds2) { - expectedAllKandidatChilds2.addAll(expectedWahlvorschlagChild.getKandidaten()); - } - - val foundWahlvorschlaege_OfWahlID2 = wahlvorschlaegeRepository.findByBezirkUndWahlID(bezirkUndWahlID2); - val foundWahlvorschlagChilds_Of_wahlID2 = foundWahlvorschlaege_OfWahlID2.get().getWahlvorschlaege(); - val foundKandidatChildsOfAllWahlvorschlags_Of_wahlID2 = foundWahlvorschlaege_OfWahlID2.get().getWahlvorschlaege().stream() - .flatMap(wvorschlag -> wvorschlag.getKandidaten().stream()).toList(); - - Assertions.assertThat(foundWahlvorschlagChilds_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedWahlvorschlagChilds2); - Assertions.assertThat(foundKandidatChildsOfAllWahlvorschlags_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedAllKandidatChilds2); - - wahlvorschlaegeRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID_1); - - val allRemainingWahlvorschlaege = wahlvorschlaegeRepository.findAll(); - val allRemainingWahlvorschlag = wahlvorschlagRepository.findAll(); - val allRemainingKandidat = kandidatRepository.findAll(); - - Assertions.assertThat(allRemainingWahlvorschlaege).containsExactlyInAnyOrderElementsOf(foundWahlvorschlaege_OfWahlID2.stream().toList()); - Assertions.assertThat(allRemainingWahlvorschlag).containsExactlyInAnyOrderElementsOf(foundWahlvorschlagChilds_Of_wahlID2); - Assertions.assertThat(allRemainingKandidat).containsExactlyInAnyOrderElementsOf(foundKandidatChildsOfAllWahlvorschlags_Of_wahlID2); - - } - - private Wahlvorschlaege createWahlvorschlaegeEntity(final String wahlID, final String wahlbezirkID) { - val entity = new Wahlvorschlaege(null, new BezirkUndWahlID(wahlID, wahlbezirkID), "stimmzettelgebietID", - null); - val wahlvorschlag1 = new Wahlvorschlag(null, "id1" + wahlID + wahlbezirkID, entity, 1L, "kurzname1", true, null); - val kandidat1 = new Kandidat(null, "kandidatID1" + wahlID + wahlbezirkID, wahlvorschlag1, "name1", 1L, true, 1L, true); - val kandidat2 = new Kandidat(null, "kandidatID2" + wahlID + wahlbezirkID, wahlvorschlag1, "name2", 2L, false, 2L, false); - wahlvorschlag1.setKandidaten(Set.of(kandidat1, kandidat2)); - - val wahlvorschlag2 = new Wahlvorschlag(null, "id2" + wahlID + wahlbezirkID, entity, 2L, "kurzname2", false, null); - val kandidat3 = new Kandidat(null, "kandidatID3" + wahlID + wahlbezirkID, wahlvorschlag2, "name3", 1L, true, 1L, true); - val kandidat4 = new Kandidat(null, "kandidatID4" + wahlID + wahlbezirkID, wahlvorschlag2, "name4", 2L, false, 2L, false); - wahlvorschlag2.setKandidaten(Set.of(kandidat3, kandidat4)); - - entity.setWahlvorschlaege(Set.of(wahlvorschlag1, wahlvorschlag2)); - - return entity; - } } From db23c2a5ea68169049069d412a403454ac184cc7 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:31:07 +0200 Subject: [PATCH 41/67] exclude of save kopfdaten from InitalizeKopfdaten --- .../services/kopfdaten/InitializeKopfdaten.java | 15 ++++++--------- .../wahltermindaten/WahltermindatenService.java | 10 +++++++++- .../WahltermindatenServiceTest.java | 12 +++++++++++- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java index 1fc9ae22f..300f55d1e 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java @@ -1,11 +1,11 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.val; import org.springframework.stereotype.Component; @@ -15,12 +15,11 @@ public class InitializeKopfdaten { private final ExceptionFactory exceptionFactory; - private final KopfdatenRepository kopfdatenRepository; - private final KopfdatenModelMapper kopfdatenModelMapper; - public void initKopfdaten(BasisdatenModel basisdatenModel) { - basisdatenModel.basisstrukturdaten() - .forEach(basisstrukturdaten -> initKopfdata(basisstrukturdaten.wahlID(), basisstrukturdaten.wahlbezirkID(), basisdatenModel)); + public List initKopfdaten(BasisdatenModel basisdatenModel) { + return basisdatenModel.basisstrukturdaten() + .stream().map(basisstrukturdaten -> initKopfdata(basisstrukturdaten.wahlID(), basisstrukturdaten.wahlbezirkID(), basisdatenModel)) + .toList(); } protected KopfdatenModel initKopfdata(String wahlID, String wahlbezirkID, BasisdatenModel basisdaten) { @@ -52,7 +51,7 @@ protected KopfdatenModel initKopfdata(String wahlID, String wahlbezirkID, Basisd private KopfdatenModel createKopfdaten(WahlModel wahl, WahlbezirkModel wahlbezirk, StimmzettelgebietModel stimmzettelgebiet) { val bezirkUndWahlID = new BezirkUndWahlID(wahl.wahlID(), wahlbezirk.wahlbezirkID()); val gemeinde = "LHM"; - val kopfdatenModel = new KopfdatenModel( + return new KopfdatenModel( bezirkUndWahlID, gemeinde, stimmzettelgebiet.stimmzettelgebietsart(), @@ -60,7 +59,5 @@ private KopfdatenModel createKopfdaten(WahlModel wahl, WahlbezirkModel wahlbezir stimmzettelgebiet.name(), wahl.name(), wahlbezirk.nummer()); - kopfdatenRepository.save(kopfdatenModelMapper.toEntity(kopfdatenModel)); - return kopfdatenModel; } } diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index dacceb1b8..54d048f70 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -9,6 +9,8 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.InitializeKopfdaten; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModelMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.WahldatenClient; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModelMapper; @@ -41,6 +43,7 @@ public class WahltermindatenService { private final WahlModelMapper wahlModelMapper; private final WahlbezirkModelMapper wahlbezirkModelMapper; + private final KopfdatenModelMapper kopfdatenModelMapper; private final WahlRepository wahlRepository; private final WahlbezirkRepository wahlbezirkRepository; @@ -68,7 +71,7 @@ public void putWahltermindaten(final String wahltagID) { persistWahlen(basisdatenModel.wahlen().stream().toList()); persistWahlbezirke(basisdatenModel.wahlbezirke(), basisdatenModel.wahlen()); - kopfDataInitializer.initKopfdaten(basisdatenModel); + persistKopfdaten(kopfDataInitializer.initKopfdaten(basisdatenModel)); asyncWahltermindatenService.initVorlagenAndVorschlaege(wahltagModel.wahltag(), wahltagModel.nummer(), basisdatenModel); @@ -101,6 +104,11 @@ private WahltagModel getWahltagByIdOrThrow(final String wahltagID, final Supplie return wahltagModel.orElseThrow(wlsExceptionSupplier); } + private void persistKopfdaten(List kopfdatenModels) { + val kopfdatenEntities = kopfdatenModels.stream().map(kopfdatenModelMapper::toEntity).toList(); + kopfdatenRepository.saveAll(kopfdatenEntities); + } + private void persistWahlen(final List wahlModelIterable) { val wahlenEntities = wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities(wahlModelIterable); wahlRepository.saveAll(wahlenEntities); diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java index fe73cde5a..bfbf8effc 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java @@ -3,6 +3,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.Kopfdaten; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlbezirke.Wahlbezirk; @@ -16,6 +17,8 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.InitializeKopfdaten; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModelMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.WahldatenClient; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModelMapper; @@ -61,6 +64,9 @@ class WahltermindatenServiceTest { @Mock WahlbezirkModelMapper wahlbezirkModelMapper; + @Mock + KopfdatenModelMapper kopfdatenModelMapper; + @Mock WahlRepository wahlRepository; @@ -146,20 +152,24 @@ void should_persistData_when_gettingBasisdaten() { val mockedWahldatenClientResponse = createMockedBasisdatenModel(mockedDataWahltag); val mockedWahlenMappedAsEntity = List.of(createWahlWithNummer("1"), createWahlWithNummer("2")); val mockedWahlbezirkeMappedAsEntity = Set.of(createWahlbezirkWithWahlnummer("1"), createWahlbezirkWithWahlnummer("2")); + val mockedKopfdatenListen = List.of(KopfdatenModel.builder().build(), KopfdatenModel.builder().build()); + val mockedKopfdatenMappedAsEntity = new Kopfdaten(); Mockito.when(wahltageService.getWahltage()).thenReturn(mockedWahltageServiceResponse); Mockito.when(wahldatenClient.loadBasisdaten(new WahltagWithNummer(mockedMatchingWahltag.wahltag(), mockedMatchingWahltag.nummer()))) .thenReturn(mockedWahldatenClientResponse); Mockito.when(wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities(any())).thenReturn(mockedWahlenMappedAsEntity); Mockito.when(wahlbezirkModelMapper.fromListOfWahlbezirkModeltoListOfWahlbezirkEntities(any())).thenReturn(mockedWahlbezirkeMappedAsEntity); + Mockito.when(kopfDataInitializer.initKopfdaten(mockedWahldatenClientResponse)).thenReturn(mockedKopfdatenListen); + Mockito.when(kopfdatenModelMapper.toEntity(any())).thenReturn(mockedKopfdatenMappedAsEntity); unitUnderTest.putWahltermindaten(wahltagID); Mockito.verify(wahlRepository).saveAll(mockedWahlenMappedAsEntity); Mockito.verify(wahlbezirkRepository).saveAll(wahlbezirkEntitiesCaptor.capture()); - Mockito.verify(kopfDataInitializer).initKopfdaten(mockedWahldatenClientResponse); Mockito.verify(asyncWahltermindatenService) .initVorlagenAndVorschlaege(eq(mockedMatchingWahltag.wahltag()), eq(mockedMatchingWahltag.nummer()), eq(mockedWahldatenClientResponse)); + Mockito.verify(kopfdatenRepository).saveAll(List.of(mockedKopfdatenMappedAsEntity, mockedKopfdatenMappedAsEntity)); Assertions.assertThat(wahlbezirkEntitiesCaptor.getAllValues().size()).isEqualTo(1); Assertions.assertThat(wahlbezirkEntitiesCaptor.getValue()).containsOnly( From aaac87bb6bb4bb218c6adcd805199a1a14398f8e Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:52:22 +0200 Subject: [PATCH 42/67] created testutils for persisting wahlvorschlaege or referendumvorlagen --- .../utils/PersistingUtils.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/PersistingUtils.java diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/PersistingUtils.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/PersistingUtils.java new file mode 100644 index 000000000..a6c73be8a --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/PersistingUtils.java @@ -0,0 +1,34 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.utils; + +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlageRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.KandidatRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlaege; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlagRepository; +import lombok.val; + +public class PersistingUtils { + + public static Wahlvorschlaege persistWahlvorschlaege(final WahlvorschlaegeRepository wahlvorschlaegeRepository, + final WahlvorschlagRepository wahlvorschlagRepository, + final KandidatRepository kandidatRepository, + final Wahlvorschlaege wahlvorschlaegeToPersist) { + val createdEntity = wahlvorschlaegeRepository.save(wahlvorschlaegeToPersist); + wahlvorschlaegeToPersist.getWahlvorschlaege().forEach(wahlvorschlag -> { + wahlvorschlagRepository.save(wahlvorschlag); + kandidatRepository.saveAll(wahlvorschlag.getKandidaten()); + }); + + return createdEntity; + } + + public static Referendumvorlagen persistReferendumvorlagen(final ReferendumvorlagenRepository referendumvorlagenRepository, + final ReferendumvorlageRepository referendumvorlageRepository, + final Referendumvorlagen referendumvorlagenToPersist) { + val savedReferendumvorlagen = referendumvorlagenRepository.save(referendumvorlagenToPersist); + referendumvorlageRepository.saveAll(referendumvorlagenToPersist.getReferendumvorlagen()); + return savedReferendumvorlagen; + } +} From bb179c907985a28eb39ec5cc9346adc244b644f9 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:53:14 +0200 Subject: [PATCH 43/67] use of utils class to persist testdata --- .../domain/WahlvorschlaegeRepositoryTest.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java index 62f300530..b6c8108eb 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java @@ -10,6 +10,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlag; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlagRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.PersistingUtils; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.util.HashSet; import lombok.extern.slf4j.Slf4j; @@ -58,10 +59,13 @@ void should_removeWahlvorschlaegeAndChildren_when_wahlIdMatches() { val wahlIDToDelete = "wahlID"; val wahlvorschlaegeToKeep = transactionTemplate.execute(status -> { - persistWahlvorschlaege(createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk1", wahlIDToDelete)); - persistWahlvorschlaege(createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk2", wahlIDToDelete)); + PersistingUtils.persistWahlvorschlaege(wahlvorschlaegeRepository, wahlvorschlagRepository, kandidatRepository, + createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk1", wahlIDToDelete)); + PersistingUtils.persistWahlvorschlaege(wahlvorschlaegeRepository, wahlvorschlagRepository, kandidatRepository, + createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk2", wahlIDToDelete)); - return persistWahlvorschlaege(createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk1", "wahlIDToKeep")); + return PersistingUtils.persistWahlvorschlaege(wahlvorschlaegeRepository, wahlvorschlagRepository, kandidatRepository, + createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk1", "wahlIDToKeep")); }); wahlvorschlaegeRepository.deleteAllByBezirkUndWahlID_WahlID(wahlIDToDelete); @@ -82,16 +86,6 @@ void should_removeWahlvorschlaegeAndChildren_when_wahlIdMatches() { .forEach(kandidat -> Assertions.assertThat(kandidatRepository.existsById(kandidat.getId())).isTrue()); } - private Wahlvorschlaege persistWahlvorschlaege(final Wahlvorschlaege wahlvorschlaegeToPersist) { - val createdEntity = wahlvorschlaegeRepository.save(wahlvorschlaegeToPersist); - wahlvorschlaegeToPersist.getWahlvorschlaege().forEach(wahlvorschlag -> { - wahlvorschlagRepository.save(wahlvorschlag); - kandidatRepository.saveAll(wahlvorschlag.getKandidaten()); - }); - - return createdEntity; - } - private Wahlvorschlaege createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID(final String wahlbezirkID, final String wahlID) { val wahlvorschlaege = new Wahlvorschlaege(); From a1db1a78b979574a08240719fdc3a4af0e72cb0d Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:53:31 +0200 Subject: [PATCH 44/67] fixing WahltermindatenControllerIntegrationTest --- ...ltermindatenControllerIntegrationTest.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index e35de6d7e..7173e0dae 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -41,6 +41,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahltagDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten.AsyncWahltermindatenService; import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.Authorities; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.PersistingUtils; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import de.muenchen.oss.wahllokalsystem.wls.common.testing.SecurityUtils; import java.time.LocalDate; @@ -310,45 +311,45 @@ private Collection createReferendumvorlagenToDelete(final Co } private Wahlvorschlaege createWahlvorschlaege(final String wahlID, final String wahlbezirkID, final String stimmzettelgebietID) { - val wahlvorschlaege = new Wahlvorschlaege(UUID.randomUUID(), new BezirkUndWahlID(wahlID, wahlbezirkID), stimmzettelgebietID, new HashSet<>()); + val wahlvorschlaege = new Wahlvorschlaege(null, new BezirkUndWahlID(wahlID, wahlbezirkID), stimmzettelgebietID, new HashSet<>()); - val wahlvorschlag1 = new Wahlvorschlag(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlaege, 1L, wahlID + wahlbezirkID, true, + val wahlvorschlag1 = new Wahlvorschlag(null, UUID.randomUUID().toString(), wahlvorschlaege, 1L, wahlID + wahlbezirkID, true, new HashSet<>()); wahlvorschlaege.addWahlvorschlag(wahlvorschlag1); - val kandidat1Vorschlag1 = new Kandidat(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlag1, "kandidat1", 1, false, 1L, false); + val kandidat1Vorschlag1 = new Kandidat(null, UUID.randomUUID().toString(), wahlvorschlag1, "kandidat1", 1, false, 1L, false); wahlvorschlag1.addKandidat(kandidat1Vorschlag1); - val kandidat2Vorschlag1 = new Kandidat(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlag1, "kandidat1", 1, false, 1L, false); + val kandidat2Vorschlag1 = new Kandidat(null, UUID.randomUUID().toString(), wahlvorschlag1, "kandidat1", 1, false, 1L, false); wahlvorschlag1.addKandidat(kandidat2Vorschlag1); - val wahlvorschlag2 = new Wahlvorschlag(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlaege, 1L, wahlID + wahlbezirkID, true, + val wahlvorschlag2 = new Wahlvorschlag(null, UUID.randomUUID().toString(), wahlvorschlaege, 1L, wahlID + wahlbezirkID, true, new HashSet<>()); wahlvorschlaege.addWahlvorschlag(wahlvorschlag2); - val kandidat1Vorschlag2 = new Kandidat(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlag2, "kandidat1", 1, false, 1L, false); + val kandidat1Vorschlag2 = new Kandidat(null, UUID.randomUUID().toString(), wahlvorschlag2, "kandidat1", 1, false, 1L, false); wahlvorschlag2.addKandidat(kandidat1Vorschlag2); - val kandidat2Vorschlag2 = new Kandidat(UUID.randomUUID(), UUID.randomUUID().toString(), wahlvorschlag2, "kandidat1", 1, false, 1L, false); + val kandidat2Vorschlag2 = new Kandidat(null, UUID.randomUUID().toString(), wahlvorschlag2, "kandidat1", 1, false, 1L, false); wahlvorschlag2.addKandidat(kandidat2Vorschlag2); - return wahlvorschlaegeRepository.save(wahlvorschlaege); + return PersistingUtils.persistWahlvorschlaege(wahlvorschlaegeRepository, wahlvorschlagRepository, kandidatRepository, wahlvorschlaege); } private Referendumvorlagen createReferendunvorlagen(final String wahlID, final String wahlbezirkID, final String stimmzettelgebietID) { - val referendumvorlagen = new Referendumvorlagen(UUID.randomUUID(), new BezirkUndWahlID(wahlID, wahlbezirkID), stimmzettelgebietID, new HashSet<>()); + val referendumvorlagen = new Referendumvorlagen(null, new BezirkUndWahlID(wahlID, wahlbezirkID), stimmzettelgebietID, new HashSet<>()); - val referendumvorlage1 = new Referendumvorlage(UUID.randomUUID(), referendumvorlagen, "1", 1L, wahlID + wahlbezirkID, "Frage 1", new HashSet<>()); + val referendumvorlage1 = new Referendumvorlage(null, referendumvorlagen, "1", 1L, wahlID + wahlbezirkID, "Frage 1", new HashSet<>()); referendumvorlagen.addReferendumvorlage(referendumvorlage1); val referendumOption1Vorlage1 = new Referendumoption(UUID.randomUUID().toString(), "Option 1", 1L); referendumvorlage1.getReferendumoptionen().add(referendumOption1Vorlage1); val referendumOption2Vorlage1 = new Referendumoption(UUID.randomUUID().toString(), "Option 2", 1L); referendumvorlage1.getReferendumoptionen().add(referendumOption2Vorlage1); - val referendumvorlage2 = new Referendumvorlage(UUID.randomUUID(), referendumvorlagen, "1", 1L, wahlID + wahlbezirkID, "Frage 1", new HashSet<>()); + val referendumvorlage2 = new Referendumvorlage(null, referendumvorlagen, "1", 1L, wahlID + wahlbezirkID, "Frage 1", new HashSet<>()); referendumvorlagen.addReferendumvorlage(referendumvorlage2); val referendumOption1Vorlage2 = new Referendumoption(UUID.randomUUID().toString(), "Option 1", 1L); referendumvorlage1.getReferendumoptionen().add(referendumOption1Vorlage2); val referendumOption2Vorlage2 = new Referendumoption(UUID.randomUUID().toString(), "Option 2", 1L); referendumvorlage1.getReferendumoptionen().add(referendumOption2Vorlage2); - return referendumvorlagenRepository.save(referendumvorlagen); + return PersistingUtils.persistReferendumvorlagen(referendumvorlagenRepository, referendumvorlageRepository, referendumvorlagen); } } From c78c1c06e25e6a58d6b0a9a00256e8b9d5d5904c Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:53:48 +0200 Subject: [PATCH 45/67] rework ReferendumvorlagenRepositoryTest --- .../ReferendumvorlagenRepositoryTest.java | 145 ++++++------------ 1 file changed, 45 insertions(+), 100 deletions(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java index a798259d7..0a571ee1f 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java @@ -2,25 +2,27 @@ import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_NO_SECURITY_PROFILE; import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_TEST_PROFILE; + import de.muenchen.oss.wahllokalsystem.basisdatenservice.MicroServiceApplication; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumoption; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlage; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlageRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.PersistingUtils; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.util.HashSet; -import java.util.Optional; -import java.util.Set; +import java.util.UUID; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; @SpringBootTest( classes = { MicroServiceApplication.class }, @@ -36,121 +38,64 @@ class ReferendumvorlagenRepositoryTest { @Autowired private ReferendumvorlageRepository referendumvorlageRepository; + @Autowired + private TransactionTemplate transactionTemplate; + @AfterEach void tearDown() { referendumvorlageRepository.deleteAll(); referendumvorlagenRepository.deleteAll(); } - @Test - @Transactional - public void referendumvorlagenRepositorySave() { - val wahlID = "wahlID"; - val wahlbezirkID = "wahlbezirkID"; - val referendumvorlagenEntity = createReferendumvorlagenEntity(wahlID, wahlbezirkID); - val bezirkUndWahlID = referendumvorlagenEntity.getBezirkUndWahlID(); + @Nested + class DeleteAllByBezirkUndWahlID_WahlID { - referendumvorlagenRepository.save(referendumvorlagenEntity); + @Test + void should_removeReferendumvorlagenAndChildren_when_wahlIdMatches() { + val wahlIDToDelete = "wahlID"; - Optional persistedReferendumvorlagen = referendumvorlagenRepository.findByBezirkUndWahlID(bezirkUndWahlID); + val referendumvorlagenToKeep = transactionTemplate.execute(status -> { + PersistingUtils.persistReferendumvorlagen(referendumvorlagenRepository, referendumvorlageRepository, + createReferendumvorlagenWithBezirkAndWahlID("wahlbezirk1", wahlIDToDelete)); + PersistingUtils.persistReferendumvorlagen(referendumvorlagenRepository, referendumvorlageRepository, + createReferendumvorlagenWithBezirkAndWahlID("wahlbezirk2", wahlIDToDelete)); - Assertions.assertThat(referendumvorlagenEntity).isEqualTo(persistedReferendumvorlagen.get()); - } + return PersistingUtils.persistReferendumvorlagen(referendumvorlagenRepository, referendumvorlageRepository, + createReferendumvorlagenWithBezirkAndWahlID("wahlbezirk1", "wahlIDToKeep")); + }); - @Test - @Transactional - public void savingParentReferendumvorlagenIsAutomaticallySavingReferendumvorlageChilds() { - val wahlID = "wahlID"; - val wahlbezirkID = "wahlbezirkID"; - val referendumvorlagenEntity = createReferendumvorlagenEntity(wahlID, wahlbezirkID); + transactionTemplate.executeWithoutResult(status -> referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlIDToDelete)); - val expectedReferendumvorlageChilds = referendumvorlagenEntity.getReferendumvorlagen(); + Assertions.assertThat(referendumvorlagenRepository.count()).isEqualTo(1); + Assertions.assertThat(referendumvorlagenRepository.existsById(referendumvorlagenToKeep.getId())).isTrue(); - Set expectedAllReferendumoptionChilds = new HashSet<>(); - for (Referendumvorlage expectedReferendumvorlageChild : expectedReferendumvorlageChilds) { - expectedAllReferendumoptionChilds.addAll(expectedReferendumvorlageChild.getReferendumoptionen()); + Assertions.assertThat(referendumvorlageRepository.count()).isEqualTo(referendumvorlagenToKeep.getReferendumvorlagen().size()); + referendumvorlagenToKeep.getReferendumvorlagen() + .forEach(referendumvorlage -> Assertions.assertThat(referendumvorlageRepository.existsById(referendumvorlage.getId())).isTrue()); } - referendumvorlagenRepository.save(referendumvorlagenEntity); - - val foundReferendumvorlageChilds = referendumvorlageRepository.findAll(); - val foundReferendumoptionChildsOfAllReferendumvorlages = foundReferendumvorlageChilds.stream() - .flatMap(rvorlage -> rvorlage.getReferendumoptionen().stream()).toList(); + private Referendumvorlagen createReferendumvorlagenWithBezirkAndWahlID(final String wahlbezirkID, final String wahlID) { + val referendumvorlagen = new Referendumvorlagen(); - Assertions.assertThat(foundReferendumvorlageChilds).containsExactlyInAnyOrderElementsOf(expectedReferendumvorlageChilds); - Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages).containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds); - } - - @Test - @Transactional - public void method_deleteAllByBezirkUndWahlID_WahlID_doesNotDeleteElementsWithOtherWahlIDButSameWahlbezirkID() { - Assertions.assertThat(referendumvorlagenRepository.findAll()).isEmpty(); - Assertions.assertThat(referendumvorlageRepository.findAll()).isEmpty(); - - val wahlID_1 = "wahlID_1"; - val wahlbezirkID = "wahlbezirkID"; - val wahlID_2 = "wahlID_2"; + referendumvorlagen.setBezirkUndWahlID(new BezirkUndWahlID(wahlID, wahlbezirkID)); + referendumvorlagen.setStimmzettelgebietID(wahlID); - val referendumvorlagenEntity1 = createReferendumvorlagenEntity(wahlID_1, wahlbezirkID); - val bezirkUndWahlID1 = referendumvorlagenEntity1.getBezirkUndWahlID(); - val referendumvorlagenEntity2 = createReferendumvorlagenEntity(wahlID_2, wahlbezirkID); - val bezirkUndWahlID2 = referendumvorlagenEntity2.getBezirkUndWahlID(); + referendumvorlagen.setReferendumvorlagen(new HashSet<>()); + val referendumvorlage1 = new Referendumvorlage(null, null, UUID.randomUUID().toString(), 1L, "", "", new HashSet<>()); + referendumvorlagen.addReferendumvorlage(referendumvorlage1); + val referendumvorlage2 = new Referendumvorlage(null, null, UUID.randomUUID().toString(), 1L, "", "", new HashSet<>()); + referendumvorlagen.addReferendumvorlage(referendumvorlage2); - referendumvorlagenRepository.save(referendumvorlagenEntity1); - referendumvorlagenRepository.save(referendumvorlagenEntity2); + val referendumoption1Vorlage1 = new Referendumoption(UUID.randomUUID().toString(), "", null); + referendumvorlage1.getReferendumoptionen().add(referendumoption1Vorlage1); + val referendumoption2Vorlage1 = new Referendumoption(UUID.randomUUID().toString(), "", null); + referendumvorlage1.getReferendumoptionen().add(referendumoption2Vorlage1); + val referendumoption1Vorlage2 = new Referendumoption(UUID.randomUUID().toString(), "", null); + referendumvorlage2.getReferendumoptionen().add(referendumoption1Vorlage2); + val referendumoption2Vorlage2 = new Referendumoption(UUID.randomUUID().toString(), "", null); + referendumvorlage2.getReferendumoptionen().add(referendumoption2Vorlage2); - val expectedReferendumvorlageChilds1 = referendumvorlagenEntity1.getReferendumvorlagen(); - Set expectedAllReferendumoptionChilds1 = new HashSet<>(); - for (Referendumvorlage expectedReferendumvorlageChild : expectedReferendumvorlageChilds1) { - expectedAllReferendumoptionChilds1.addAll(expectedReferendumvorlageChild.getReferendumoptionen()); + return referendumvorlagen; } - - val foundReferendumvorlagen_OfWahlID1 = referendumvorlagenRepository.findByBezirkUndWahlID(bezirkUndWahlID1); - val foundReferendumvorlageChilds_Of_wahlID1 = foundReferendumvorlagen_OfWahlID1.get().getReferendumvorlagen(); - val foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID1 = foundReferendumvorlagen_OfWahlID1.get().getReferendumvorlagen().stream() - .flatMap(rvorlage -> rvorlage.getReferendumoptionen().stream()); - - Assertions.assertThat(foundReferendumvorlageChilds_Of_wahlID1).containsExactlyInAnyOrderElementsOf(expectedReferendumvorlageChilds1); - Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID1) - .containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds1); - - val expectedReferendumvorlageChilds2 = referendumvorlagenEntity2.getReferendumvorlagen(); - Set expectedAllReferendumoptionChilds2 = new HashSet<>(); - for (Referendumvorlage expectedReferendumvorlageChild : expectedReferendumvorlageChilds2) { - expectedAllReferendumoptionChilds2.addAll(expectedReferendumvorlageChild.getReferendumoptionen()); - } - - val foundReferendumvorlagen_OfWahlID2 = referendumvorlagenRepository.findByBezirkUndWahlID(bezirkUndWahlID2); - val foundReferendumvorlageChilds_Of_wahlID2 = foundReferendumvorlagen_OfWahlID2.get().getReferendumvorlagen(); - val foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID2 = foundReferendumvorlagen_OfWahlID2.get().getReferendumvorlagen().stream() - .flatMap(rvorlage -> rvorlage.getReferendumoptionen().stream()).toList(); - - Assertions.assertThat(foundReferendumvorlageChilds_Of_wahlID2).containsExactlyInAnyOrderElementsOf(expectedReferendumvorlageChilds2); - Assertions.assertThat(foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID2) - .containsExactlyInAnyOrderElementsOf(expectedAllReferendumoptionChilds2); - - referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlID_1); - - val allRemainingReferendumvorlagen = referendumvorlagenRepository.findAll(); - val allRemainingReferendumvorlages = referendumvorlageRepository.findAll(); - val allRemainingReferendumoption = allRemainingReferendumvorlages.stream().flatMap(rvorlage -> rvorlage.getReferendumoptionen().stream()).toList(); - - Assertions.assertThat(allRemainingReferendumvorlagen).containsExactlyInAnyOrderElementsOf(foundReferendumvorlagen_OfWahlID2.stream().toList()); - Assertions.assertThat(allRemainingReferendumvorlages).containsExactlyInAnyOrderElementsOf(foundReferendumvorlageChilds_Of_wahlID2); - Assertions.assertThat(allRemainingReferendumoption).containsExactlyInAnyOrderElementsOf(foundReferendumoptionChildsOfAllReferendumvorlages_Of_wahlID2); - } - - private Referendumvorlagen createReferendumvorlagenEntity(final String wahlID, final String wahlbezirkID) { - val stimmzettelgebietID = "stimmzettelgebietID"; - val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); - val entity = new Referendumvorlagen(null, bezirkUndWahlID, stimmzettelgebietID, null); - val referendumvorlage_1 = new Referendumvorlage(null, entity, "wahlvorschlagID1", 1L, "kurzname1", "frage1", - Set.of(new Referendumoption("option11" + wahlID + wahlbezirkID, "optionsName11", 1L), - new Referendumoption("option12" + wahlID + wahlbezirkID, "optionsName12", 2L))); - val referendumvorlage_2 = new Referendumvorlage(null, entity, "wahlvorschlagID2", 2L, "kurzname2", "frage2", - Set.of(new Referendumoption("option21" + wahlID + wahlbezirkID, "optionsName21", 3L), - new Referendumoption("option22" + wahlID + wahlbezirkID, "optionsName22", 4L))); - entity.setReferendumvorlagen(Set.of(referendumvorlage_1, referendumvorlage_2)); - return entity; } } From 9db8af91d022e6fbaa148b50e53f9e1d64c17608 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:41:03 +0200 Subject: [PATCH 46/67] add 400 and 500 description to openApi doc --- .../WahltermindatenController.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenController.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenController.java index a5efefdb6..684aad941 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenController.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenController.java @@ -1,7 +1,10 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahltermindaten; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WlsExceptionDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten.WahltermindatenService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,6 +29,14 @@ public class WahltermindatenController { responses = { @ApiResponse( responseCode = "200", description = "Die Wahltermindaten werden angelegt." + ), + @ApiResponse( + responseCode = "400", description = "Es gibt keine Wahltag zu der ID", + content = @Content(mediaType = "application/json", schema = @Schema(implementation = WlsExceptionDTO.class)) + ), + @ApiResponse( + responseCode = "500", description = "Fehler während der Einrichtung", + content = @Content(mediaType = "application/json", schema = @Schema(implementation = WlsExceptionDTO.class)) ) } ) @@ -40,6 +51,14 @@ public void putWahltermindaten(@PathVariable("wahltagID") String wahltagID) { responses = { @ApiResponse( responseCode = "200", description = "Die Wahltermindaten werden gelöscht." + ), + @ApiResponse( + responseCode = "400", description = "Es gibt keine Wahltag zu der ID", + content = @Content(mediaType = "application/json", schema = @Schema(implementation = WlsExceptionDTO.class)) + ), + @ApiResponse( + responseCode = "500", description = "Fehler während des Löschens", + content = @Content(mediaType = "application/json", schema = @Schema(implementation = WlsExceptionDTO.class)) ) } ) From 07db056559eec2e2edefd41493da848a5218b2d1 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:41:20 +0200 Subject: [PATCH 47/67] add examples for failing requests --- .../src/test/resources/wahltermindaten.http | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/wls-basisdaten-service/src/test/resources/wahltermindaten.http b/wls-basisdaten-service/src/test/resources/wahltermindaten.http index c78765e0c..c03c36ce0 100644 --- a/wls-basisdaten-service/src/test/resources/wahltermindaten.http +++ b/wls-basisdaten-service/src/test/resources/wahltermindaten.http @@ -21,6 +21,14 @@ Authorization: {{ token_type }} {{ auth_token }} PUT {{ WLS_BASISDATEN_SERVICE_URL }}/businessActions/wahltermindaten/wahltagID1 Authorization: {{ token_type }} {{ auth_token }} +### Put Wahltermindaten - failed cause wahltagID does not exist +PUT {{ WLS_BASISDATEN_SERVICE_URL }}/businessActions/wahltermindaten/wahltagIDThatDoesNotExist +Authorization: {{ token_type }} {{ auth_token }} + ### Delete Wahltermindaten DELETE {{ WLS_BASISDATEN_SERVICE_URL }}/businessActions/wahltermindaten/wahltagID1 +Authorization: {{ token_type }} {{ auth_token }} + +### Delete Wahltermindaten - failed cause wahltagID does not exist +DELETE {{ WLS_BASISDATEN_SERVICE_URL }}/businessActions/wahltermindaten/wahltagIDThatDoesNotExist Authorization: {{ token_type }} {{ auth_token }} \ No newline at end of file From 262c12bda0970bd32ae91062b92166565df27de5 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:43:58 +0200 Subject: [PATCH 48/67] rename class to mapper cause of its function --- .../{InitializeKopfdaten.java => KopfdatenMapper.java} | 2 +- .../services/kopfdaten/KopfdatenService.java | 2 +- .../services/wahltermindaten/WahltermindatenService.java | 4 ++-- .../services/kopfdaten/KopfdatenServiceTest.java | 6 +++--- .../wahltermindaten/WahltermindatenServiceTest.java | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) rename wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/{InitializeKopfdaten.java => KopfdatenMapper.java} (98%) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenMapper.java similarity index 98% rename from wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java rename to wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenMapper.java index 300f55d1e..4ab56f28a 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/InitializeKopfdaten.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenMapper.java @@ -12,7 +12,7 @@ @RequiredArgsConstructor @Component -public class InitializeKopfdaten { +public class KopfdatenMapper { private final ExceptionFactory exceptionFactory; diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java index 7e11a3628..fb22e8439 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java @@ -20,7 +20,7 @@ public class KopfdatenService { private final WahldatenClient wahldatenClient; private final KopfdatenRepository kopfdatenRepository; private final KopfdatenModelMapper kopfdatenModelMapper; - private final InitializeKopfdaten kopfDataInitializer; + private final KopfdatenMapper kopfDataInitializer; @PreAuthorize("hasAuthority('Basisdaten_BUSINESSACTION_GetKopfdaten')") @Transactional diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index 54d048f70..b9a290f59 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -8,7 +8,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.InitializeKopfdaten; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModelMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.WahldatenClient; @@ -50,7 +50,7 @@ public class WahltermindatenService { private final KopfdatenRepository kopfdatenRepository; private final WahlvorschlaegeRepository wahlvorschlaegeRepository; private final ReferendumvorlagenRepository referendumvorlagenRepository; - private final InitializeKopfdaten kopfDataInitializer; + private final KopfdatenMapper kopfDataInitializer; private final AsyncWahltermindatenService asyncWahltermindatenService; diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java index 9931338a7..ba7dc36cc 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java @@ -33,7 +33,7 @@ class KopfdatenServiceTest { KopfdatenValidator kopfdatenValidator; @Mock - InitializeKopfdaten initializeKopfdaten; + KopfdatenMapper kopfdatenMapper; @Mock WahldatenClient wahldatenClient; @@ -62,9 +62,9 @@ void dataIsLoadedFromRemoteIfNotExistingInRepo() { Mockito.when(kopfdatenModelMapper.toEntity(mockedKopfdatenModelByInitializer)).thenReturn(mockedKopfdatenModelMappedToEntity); Mockito.when(konfigurierterWahltagClient.getKonfigurierterWahltag()).thenReturn(mockedKonfigurierterWahltagFromClient); Mockito.when(wahldatenClient.loadBasisdaten( - new WahltagWithNummer(mockedKonfigurierterWahltagFromClient.wahltag(), mockedKonfigurierterWahltagFromClient.nummer()))) + new WahltagWithNummer(mockedKonfigurierterWahltagFromClient.wahltag(), mockedKonfigurierterWahltagFromClient.nummer()))) .thenReturn(mockedBasisdatenModelFromClient); - Mockito.when(initializeKopfdaten.initKopfdata(wahlID, wahlbezrkID, mockedBasisdatenModelFromClient)).thenReturn(mockedKopfdatenModelByInitializer); + Mockito.when(kopfdatenMapper.initKopfdata(wahlID, wahlbezrkID, mockedBasisdatenModelFromClient)).thenReturn(mockedKopfdatenModelByInitializer); val result = unitUnderTest.getKopfdaten(bezirkUndWahlId); Assertions.assertThat(result).isEqualTo(mockedKopfdatenModelByInitializer); diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java index bfbf8effc..00e5a3ae3 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java @@ -16,7 +16,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahlbezirkArtModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.InitializeKopfdaten; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModelMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.WahldatenClient; @@ -83,7 +83,7 @@ class WahltermindatenServiceTest { ReferendumvorlagenRepository referendumvorlagenRepository; @Mock - InitializeKopfdaten kopfDataInitializer; + KopfdatenMapper kopfDataInitializer; @Mock ExceptionFactory exceptionFactory; From 624ef7d7bce15bd19297992a8308ddd0a12f3310 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:45:01 +0200 Subject: [PATCH 49/67] revert empty line change --- .../basisdatenservice/services/kopfdaten/KopfdatenMapper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenMapper.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenMapper.java index 4ab56f28a..0ffe4b586 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenMapper.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenMapper.java @@ -51,6 +51,7 @@ protected KopfdatenModel initKopfdata(String wahlID, String wahlbezirkID, Basisd private KopfdatenModel createKopfdaten(WahlModel wahl, WahlbezirkModel wahlbezirk, StimmzettelgebietModel stimmzettelgebiet) { val bezirkUndWahlID = new BezirkUndWahlID(wahl.wahlID(), wahlbezirk.wahlbezirkID()); val gemeinde = "LHM"; + return new KopfdatenModel( bezirkUndWahlID, gemeinde, From 3d4c0b1ab8f706d7508bd26b52ffb3c21b3c6888 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:47:39 +0200 Subject: [PATCH 50/67] remove unnecessary mapping method --- .../basisdatenservice/services/wahltag/WahltagModelMapper.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java index 6e846989d..2dbac61d0 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltag/WahltagModelMapper.java @@ -7,8 +7,6 @@ @Mapper public interface WahltagModelMapper { - Wahltag toEntity(WahltagModel wahltagModel); - WahltagModel toModel(Wahltag wahltag); List fromWahltagEntityToWahltagModelList(List entities); From 5dd3f49cff80b2da0a8cf2b08f1db481785dd462 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:48:36 +0200 Subject: [PATCH 51/67] spotless:apply --- .../services/kopfdaten/KopfdatenServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java index ba7dc36cc..9f7ec8c1e 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java @@ -62,7 +62,7 @@ void dataIsLoadedFromRemoteIfNotExistingInRepo() { Mockito.when(kopfdatenModelMapper.toEntity(mockedKopfdatenModelByInitializer)).thenReturn(mockedKopfdatenModelMappedToEntity); Mockito.when(konfigurierterWahltagClient.getKonfigurierterWahltag()).thenReturn(mockedKonfigurierterWahltagFromClient); Mockito.when(wahldatenClient.loadBasisdaten( - new WahltagWithNummer(mockedKonfigurierterWahltagFromClient.wahltag(), mockedKonfigurierterWahltagFromClient.nummer()))) + new WahltagWithNummer(mockedKonfigurierterWahltagFromClient.wahltag(), mockedKonfigurierterWahltagFromClient.nummer()))) .thenReturn(mockedBasisdatenModelFromClient); Mockito.when(kopfdatenMapper.initKopfdata(wahlID, wahlbezrkID, mockedBasisdatenModelFromClient)).thenReturn(mockedKopfdatenModelByInitializer); From c51d7d7d5fd4a4bac7f8a54210ddf5437c34016b Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:50:32 +0200 Subject: [PATCH 52/67] remove empty line --- .../services/wahltermindaten/WahltermindatenService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index b9a290f59..bb666e3d0 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -74,7 +74,6 @@ public void putWahltermindaten(final String wahltagID) { persistKopfdaten(kopfDataInitializer.initKopfdaten(basisdatenModel)); asyncWahltermindatenService.initVorlagenAndVorschlaege(wahltagModel.wahltag(), wahltagModel.nummer(), basisdatenModel); - } @PreAuthorize("hasAuthority('Basisdaten_BUSINESSACTION_DeleteWahltermindaten')") From bde55c6d026e99708559eee32390688041578e42 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:53:20 +0200 Subject: [PATCH 53/67] remove empty line --- .../services/wahltermindaten/WahltermindatenServiceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java index 00e5a3ae3..b61e43ad0 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java @@ -138,7 +138,6 @@ void should_throwException_when_noBasisdatenWhereFound() { Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GET_BASISDATEN_NO_DATA)).thenReturn(mockedWlsException); Assertions.assertThatThrownBy(() -> unitUnderTest.putWahltermindaten(wahltagID)).isSameAs(mockedWlsException); - } @Test From 2bc314a28a684ac8b436b830380e348e6865f2b3 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:57:48 +0200 Subject: [PATCH 54/67] removed testutil PersistingUtils.java --- .../ReferendumvorlagenRepositoryTest.java | 10 ++---- .../domain/WahlvorschlaegeRepositoryTest.java | 10 ++---- ...ltermindatenControllerIntegrationTest.java | 5 ++- .../utils/PersistingUtils.java | 34 ------------------- 4 files changed, 8 insertions(+), 51 deletions(-) delete mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/PersistingUtils.java diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java index 0a571ee1f..6bcf330a9 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/ReferendumvorlagenRepositoryTest.java @@ -9,7 +9,6 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlageRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.PersistingUtils; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.util.HashSet; import java.util.UUID; @@ -55,13 +54,10 @@ void should_removeReferendumvorlagenAndChildren_when_wahlIdMatches() { val wahlIDToDelete = "wahlID"; val referendumvorlagenToKeep = transactionTemplate.execute(status -> { - PersistingUtils.persistReferendumvorlagen(referendumvorlagenRepository, referendumvorlageRepository, - createReferendumvorlagenWithBezirkAndWahlID("wahlbezirk1", wahlIDToDelete)); - PersistingUtils.persistReferendumvorlagen(referendumvorlagenRepository, referendumvorlageRepository, - createReferendumvorlagenWithBezirkAndWahlID("wahlbezirk2", wahlIDToDelete)); + referendumvorlagenRepository.save(createReferendumvorlagenWithBezirkAndWahlID("wahlbezirk1", wahlIDToDelete)); + referendumvorlagenRepository.save(createReferendumvorlagenWithBezirkAndWahlID("wahlbezirk2", wahlIDToDelete)); - return PersistingUtils.persistReferendumvorlagen(referendumvorlagenRepository, referendumvorlageRepository, - createReferendumvorlagenWithBezirkAndWahlID("wahlbezirk1", "wahlIDToKeep")); + return referendumvorlagenRepository.save(createReferendumvorlagenWithBezirkAndWahlID("wahlbezirk1", "wahlIDToKeep")); }); transactionTemplate.executeWithoutResult(status -> referendumvorlagenRepository.deleteAllByBezirkUndWahlID_WahlID(wahlIDToDelete)); diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java index b6c8108eb..6cce1f5f6 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/domain/WahlvorschlaegeRepositoryTest.java @@ -10,7 +10,6 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlag; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlagRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.PersistingUtils; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.util.HashSet; import lombok.extern.slf4j.Slf4j; @@ -59,13 +58,10 @@ void should_removeWahlvorschlaegeAndChildren_when_wahlIdMatches() { val wahlIDToDelete = "wahlID"; val wahlvorschlaegeToKeep = transactionTemplate.execute(status -> { - PersistingUtils.persistWahlvorschlaege(wahlvorschlaegeRepository, wahlvorschlagRepository, kandidatRepository, - createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk1", wahlIDToDelete)); - PersistingUtils.persistWahlvorschlaege(wahlvorschlaegeRepository, wahlvorschlagRepository, kandidatRepository, - createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk2", wahlIDToDelete)); + wahlvorschlaegeRepository.save(createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk1", wahlIDToDelete)); + wahlvorschlaegeRepository.save(createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk2", wahlIDToDelete)); - return PersistingUtils.persistWahlvorschlaege(wahlvorschlaegeRepository, wahlvorschlagRepository, kandidatRepository, - createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk1", "wahlIDToKeep")); + return wahlvorschlaegeRepository.save(createWahlvorschlaegeWithKandidatenWithBezirkAndWahlID("wahlbezirk1", "wahlIDToKeep")); }); wahlvorschlaegeRepository.deleteAllByBezirkUndWahlID_WahlID(wahlIDToDelete); diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index 7173e0dae..36114e3e3 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -41,7 +41,6 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahltagDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten.AsyncWahltermindatenService; import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.Authorities; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.PersistingUtils; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import de.muenchen.oss.wahllokalsystem.wls.common.testing.SecurityUtils; import java.time.LocalDate; @@ -329,7 +328,7 @@ private Wahlvorschlaege createWahlvorschlaege(final String wahlID, final String val kandidat2Vorschlag2 = new Kandidat(null, UUID.randomUUID().toString(), wahlvorschlag2, "kandidat1", 1, false, 1L, false); wahlvorschlag2.addKandidat(kandidat2Vorschlag2); - return PersistingUtils.persistWahlvorschlaege(wahlvorschlaegeRepository, wahlvorschlagRepository, kandidatRepository, wahlvorschlaege); + return wahlvorschlaegeRepository.save(wahlvorschlaege); } private Referendumvorlagen createReferendunvorlagen(final String wahlID, final String wahlbezirkID, final String stimmzettelgebietID) { @@ -349,7 +348,7 @@ private Referendumvorlagen createReferendunvorlagen(final String wahlID, final S val referendumOption2Vorlage2 = new Referendumoption(UUID.randomUUID().toString(), "Option 2", 1L); referendumvorlage1.getReferendumoptionen().add(referendumOption2Vorlage2); - return PersistingUtils.persistReferendumvorlagen(referendumvorlagenRepository, referendumvorlageRepository, referendumvorlagen); + return referendumvorlagenRepository.save(referendumvorlagen); } } diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/PersistingUtils.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/PersistingUtils.java deleted file mode 100644 index a6c73be8a..000000000 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/PersistingUtils.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.muenchen.oss.wahllokalsystem.basisdatenservice.utils; - -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlageRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.KandidatRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlaege; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlagRepository; -import lombok.val; - -public class PersistingUtils { - - public static Wahlvorschlaege persistWahlvorschlaege(final WahlvorschlaegeRepository wahlvorschlaegeRepository, - final WahlvorschlagRepository wahlvorschlagRepository, - final KandidatRepository kandidatRepository, - final Wahlvorschlaege wahlvorschlaegeToPersist) { - val createdEntity = wahlvorschlaegeRepository.save(wahlvorschlaegeToPersist); - wahlvorschlaegeToPersist.getWahlvorschlaege().forEach(wahlvorschlag -> { - wahlvorschlagRepository.save(wahlvorschlag); - kandidatRepository.saveAll(wahlvorschlag.getKandidaten()); - }); - - return createdEntity; - } - - public static Referendumvorlagen persistReferendumvorlagen(final ReferendumvorlagenRepository referendumvorlagenRepository, - final ReferendumvorlageRepository referendumvorlageRepository, - final Referendumvorlagen referendumvorlagenToPersist) { - val savedReferendumvorlagen = referendumvorlagenRepository.save(referendumvorlagenToPersist); - referendumvorlageRepository.saveAll(referendumvorlagenToPersist.getReferendumvorlagen()); - return savedReferendumvorlagen; - } -} From 3af807ca762c43f26073378edf859ff8da75800c Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:29:14 +0200 Subject: [PATCH 55/67] removed todo: issue created: 465 --- .../services/wahltermindaten/WahltermindatenService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index bb666e3d0..25ffca23a 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -34,7 +34,6 @@ @Service @RequiredArgsConstructor @Slf4j -//TODO create Issue for Phase 3: this Service is a fassade for other services: wahlen, wahlbezirke, ... public class WahltermindatenService { private final WahltermindatenValidator wahltermindatenValidator; From 05e7c8b0b22f8731b7eae017f24ffdd916160b1a Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:33:04 +0200 Subject: [PATCH 56/67] extract data creation into separate method --- ...ltermindatenControllerIntegrationTest.java | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index 36114e3e3..a98fb62b6 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -362,7 +362,29 @@ void should_persistImportedData_when_wahltagIDIsValidWahltag() throws Exception setupWireMockForWahltagClient(wahltagToGetWahltermindaten); - val basisstrukturdatenToImport = new BasisdatenDTO() + val basisstrukturdatenToImport = createBasisdatenDTO(localDateOfWahltag); + + WireMock.stubFor(WireMock.get(WireMock.urlPathMatching("/wahldaten/basisdaten")) + .willReturn(WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(basisstrukturdatenToImport)) + .withStatus(HttpStatus.OK.value()))); + + val request = MockMvcRequestBuilders.put("/businessActions/wahltermindaten/" + wahltagToGetWahltermindaten.getWahltagID()); + mockMvc.perform(request).andExpect(status().isOk()); + + Assertions.assertThat(kopfdatenRepository.count()).isEqualTo(5); + Assertions.assertThat(wahlbezirkRepository.count()).isEqualTo(5); + Assertions.assertThat(wahlRepository.count()).isEqualTo(2); + + val expectedBasisdatenModel = wahldatenClientMapper.fromRemoteClientDTOToModel(basisstrukturdatenToImport); + Mockito.verify(asyncWahltermindatenService) + .initVorlagenAndVorschlaege(eq(wahltagToGetWahltermindaten.getWahltag()), eq(wahltagToGetWahltermindaten.getNummer()), + eq(expectedBasisdatenModel)); + } + + private static BasisdatenDTO createBasisdatenDTO(LocalDate localDateOfWahltag) { + return new BasisdatenDTO() .basisstrukturdaten( Set.of( new BasisstrukturdatenDTO().wahlID("wahlID1").wahltag(localDateOfWahltag).wahlbezirkID("wahlbezirkID1_1") @@ -408,24 +430,6 @@ void should_persistImportedData_when_wahltagIDIsValidWahltag() throws Exception new WahlbezirkDTO().wahltag(localDateOfWahltag).wahlID("wahlID2").identifikator("wahlbezirkID2_2").nummer("2_2") .wahlnummer("2").wahlbezirkArt( WahlbezirkDTO.WahlbezirkArtEnum.UWB))); - - WireMock.stubFor(WireMock.get(WireMock.urlPathMatching("/wahldaten/basisdaten")) - .willReturn(WireMock.aResponse() - .withHeader("Content-Type", "application/json") - .withBody(objectMapper.writeValueAsString(basisstrukturdatenToImport)) - .withStatus(HttpStatus.OK.value()))); - - val request = MockMvcRequestBuilders.put("/businessActions/wahltermindaten/" + wahltagToGetWahltermindaten.getWahltagID()); - mockMvc.perform(request).andExpect(status().isOk()); - - Assertions.assertThat(kopfdatenRepository.count()).isEqualTo(5); - Assertions.assertThat(wahlbezirkRepository.count()).isEqualTo(5); - Assertions.assertThat(wahlRepository.count()).isEqualTo(2); - - val expectedBasisdatenModel = wahldatenClientMapper.fromRemoteClientDTOToModel(basisstrukturdatenToImport); - Mockito.verify(asyncWahltermindatenService) - .initVorlagenAndVorschlaege(eq(wahltagToGetWahltermindaten.getWahltag()), eq(wahltagToGetWahltermindaten.getNummer()), - eq(expectedBasisdatenModel)); } } From d7ba19586916aad70f4a49b39081b7eb777047e3 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:45:40 +0200 Subject: [PATCH 57/67] add config property for threadnameprefix --- .../basisdatenservice/configuration/AsyncConfiguration.java | 3 +++ wls-basisdaten-service/src/main/resources/application.yml | 1 + 2 files changed, 4 insertions(+) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java index 0f6b0e2dd..631f0100e 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java @@ -21,6 +21,9 @@ public class AsyncConfiguration { @Value("${app.async.queueCapacity}") public int queueCapacity; + @Value("${app.async.threadNamePrefix}") + public String threadNamePrefix; + @Bean public ThreadPoolTaskExecutor threadPoolTaskExecutor() { val executor = new ThreadPoolTaskExecutor(); diff --git a/wls-basisdaten-service/src/main/resources/application.yml b/wls-basisdaten-service/src/main/resources/application.yml index 799937156..cadc2d4d5 100644 --- a/wls-basisdaten-service/src/main/resources/application.yml +++ b/wls-basisdaten-service/src/main/resources/application.yml @@ -68,6 +68,7 @@ app: corePoolSize: 2 maxPoolSize: 2 queueCapacity: 500 + threadNamePrefix: "taskExecutor-" clients: eai: basePath: http://localhost:39146 From a5450abaae1e84b0682aaa81a7858bb739092a54 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:46:13 +0200 Subject: [PATCH 58/67] fix: missing use of @Value properties --- .../configuration/AsyncConfiguration.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java index 631f0100e..c62cb7b1e 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/AsyncConfiguration.java @@ -27,10 +27,10 @@ public class AsyncConfiguration { @Bean public ThreadPoolTaskExecutor threadPoolTaskExecutor() { val executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(2); - executor.setMaxPoolSize(2); - executor.setQueueCapacity(500); - executor.setThreadNamePrefix("asyncTaskExecutor-"); + executor.setCorePoolSize(corePoolSize); + executor.setMaxPoolSize(maxPoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setThreadNamePrefix(threadNamePrefix); executor.initialize(); return executor; } From 50321d5ef62ab99d3fff35e8e92b4459f08c8dfb Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 12:58:30 +0200 Subject: [PATCH 59/67] created AsyncProgressTest --- .../wahltermindaten/AsyncProgressTest.java | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgressTest.java diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgressTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgressTest.java new file mode 100644 index 000000000..f4cc31673 --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncProgressTest.java @@ -0,0 +1,107 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; + +import lombok.val; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class AsyncProgressTest { + + AsyncProgress unitUnderTest = new AsyncProgress(); + + @Nested + class IncWahlvorschlaegeFinished { + + @Test + void should_increaseNumberOfFinishedWahlvorschlaege_when_called() { + val numberOfFinisheBeforeCall = unitUnderTest.getWahlvorschlageFinished(); + unitUnderTest.incWahlvorschlaegeFinished(); + val numberOfFinishedAfterCall = unitUnderTest.getWahlvorschlageFinished(); + + Assertions.assertThat(numberOfFinishedAfterCall).isEqualTo(numberOfFinisheBeforeCall + 1); + } + + @Test + void should_keepWahlvorschlaegeActiveTrue_when_finishedIsBelowTotal() { + unitUnderTest.setWahlvorschlaegeLoadingActive(true); + unitUnderTest.setWahlvorschlaegeTotal(10); + + unitUnderTest.incWahlvorschlaegeFinished(); + + Assertions.assertThat(unitUnderTest.isWahlvorschlaegeLoadingActive()).isTrue(); + } + + @Test + void should_setWahlvorschlaegeFinishedToFalse_when_totalIsReached() { + unitUnderTest.setWahlvorschlaegeLoadingActive(true); + unitUnderTest.setWahlvorschlaegeTotal(1); + + unitUnderTest.incWahlvorschlaegeFinished(); + + Assertions.assertThat(unitUnderTest.isWahlvorschlaegeLoadingActive()).isFalse(); + } + + @Test + void should_setLastFinishTime_when_wahlvorschlaegeAndReferendumvorlagenAreDone() { + unitUnderTest.setWahlvorschlaegeLoadingActive(true); + unitUnderTest.setReferendumLoadingActive(false); + unitUnderTest.setWahlvorschlaegeTotal(1); + unitUnderTest.setLastFinishTime(null); + + unitUnderTest.incWahlvorschlaegeFinished(); + + Assertions.assertThat(unitUnderTest.getLastFinishTime()).isNotNull(); + } + } + + @Nested + class IncReferendumVorlagenFinished { + + @Test + void should_increaseNumberOfFinishedReferendumvorlagen_when_called() { + val numberOfFinisheBeforeCall = unitUnderTest.getReferendumVorlagenFinished(); + unitUnderTest.incReferendumVorlagenFinished(); + val numberOfFinishedAfterCall = unitUnderTest.getReferendumVorlagenFinished(); + + Assertions.assertThat(numberOfFinishedAfterCall).isEqualTo(numberOfFinisheBeforeCall + 1); + } + + @Test + void should_keepReferndumvorlagenFinishedActiveTrue_when_finishedIsBelowTotal() { + unitUnderTest.setReferendumLoadingActive(true); + unitUnderTest.setReferendumVorlagenTotal(10); + + unitUnderTest.incReferendumVorlagenFinished(); + + Assertions.assertThat(unitUnderTest.isReferendumLoadingActive()).isTrue(); + } + + @Test + void should_setReferndumvorlagenFinishedToFalse_when_totalIsReached() { + unitUnderTest.setReferendumLoadingActive(true); + unitUnderTest.setReferendumVorlagenTotal(1); + + unitUnderTest.incReferendumVorlagenFinished(); + + Assertions.assertThat(unitUnderTest.isReferendumLoadingActive()).isFalse(); + } + + @Test + void should_setLastFinishTime_when_wahlvorschlaegeAndReferendumvorlagenAreDone() { + unitUnderTest.setWahlvorschlaegeLoadingActive(false); + unitUnderTest.setReferendumLoadingActive(true); + unitUnderTest.setWahlvorschlaegeTotal(1); + unitUnderTest.setLastFinishTime(null); + + unitUnderTest.incReferendumVorlagenFinished(); + + Assertions.assertThat(unitUnderTest.getLastFinishTime()).isNotNull(); + } + } + + @Nested + class Reset { + + } + +} From 45fbedb4a878b6d66afa0b51a0a833346f9c3da3 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 12:59:28 +0200 Subject: [PATCH 60/67] removed todo --- .../services/wahltermindaten/WahltermindatenService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index 25ffca23a..6fd31979e 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -96,7 +96,7 @@ public void deleteWahltermindaten(final String wahltagID) { } private WahltagModel getWahltagByIdOrThrow(final String wahltagID, final Supplier wlsExceptionSupplier) { - val wahltagModel = wahltageService.getWahltage().stream() //TODO wie wäre es mit getOptionalById oder findById aus dem WahltageService? + val wahltagModel = wahltageService.getWahltage().stream() .filter(w -> w.wahltagID().equals(wahltagID)) .findAny(); return wahltagModel.orElseThrow(wlsExceptionSupplier); From 03ce72a7e2403c0733d3c4e74c03ad692fccccf0 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:30:01 +0200 Subject: [PATCH 61/67] created WahltermindatenServiceSecurityTest --- .../WahltermindatenServiceSecurityTest.java | 288 ++++++++++++++++++ .../basisdatenservice/utils/Authorities.java | 34 +++ 2 files changed, 322 insertions(+) create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceSecurityTest.java diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceSecurityTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceSecurityTest.java new file mode 100644 index 000000000..46c09dcbd --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceSecurityTest.java @@ -0,0 +1,288 @@ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.tomakehurst.wiremock.client.WireMock; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.MicroServiceApplication; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlbezirke.WahlbezirkRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.WahlRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahltag.WahltagRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.BasisdatenDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.BasisstrukturdatenDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.KandidatDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumoptionDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlageDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlagenDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.StimmzettelgebietDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlbezirkDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahltagDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlvorschlaegeDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlvorschlagDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.Authorities; +import de.muenchen.oss.wahllokalsystem.wls.common.testing.SecurityUtils; +import java.time.LocalDate; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Stream; +import lombok.val; +import org.apache.commons.lang3.ArrayUtils; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.aggregator.ArgumentsAccessor; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.task.SyncTaskExecutor; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(classes = { MicroServiceApplication.class, WahltermindatenServiceSecurityTest.TestConfiguration.class }) +@ActiveProfiles({ TestConstants.SPRING_TEST_PROFILE }) +@AutoConfigureWireMock +public class WahltermindatenServiceSecurityTest { + + @Configuration + static class TestConfiguration { + + @Bean + @Primary + public SyncTaskExecutor syncTaskExecutor() { + return new SyncTaskExecutor(); + } + } + + @Autowired + WahltermindatenService unitUnderTest; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + WahlvorschlaegeRepository wahlvorschlaegeRepository; + + @Autowired + ReferendumvorlagenRepository referendumvorlagenRepository; + + @Autowired + KopfdatenRepository kopfdatenRepository; + + @Autowired + WahltagRepository wahltagRepository; + + @Autowired + WahlRepository wahlRepository; + + @Autowired + WahlbezirkRepository wahlbezirkRepository; + + @BeforeEach + void setup() { + SecurityContextHolder.clearContext(); + } + + @AfterEach + void teardown() { + SecurityUtils.runWith(Authorities.REPOSITORY_DELETE_WAHLTAG, Authorities.REPOSITORY_DELETE_WAHL, Authorities.REPOSITORY_DELETE_KOPFDATEN, + Authorities.REPOSITORY_DELETE_WAHLBEZIRK, + Authorities.REPOSITORY_DELETE_WAHLVORSCHLAEGE, + Authorities.REPOSITORY_DELETE_REFERENDUMVORLAGEN); + wahlvorschlaegeRepository.deleteAll(); + referendumvorlagenRepository.deleteAll(); + kopfdatenRepository.deleteAll(); + wahltagRepository.deleteAll(); + wahlRepository.deleteAll(); + wahlbezirkRepository.deleteAll(); + } + + @Nested + class PutWahltermindaten { + + @Test + void should_throwNoException_when_allRequiredAuthoritiesArePresent() throws Exception { + SecurityUtils.runWith(ArrayUtils.addAll(Authorities.ALL_AUTHORITIES_PUT_WAHLTERMINDATEN_THAT_GOT_CATCHED_ON_MISSING, + Authorities.ALL_AUTHORITIES_PUT_WAHLTERMINDATEN_THAT_GOT_NOT_CATCHED_ON_MISSING)); + + val wahltagID = "wahltagID"; + val stimmzettelgebietID = "sgzID"; + + //WireMock für getWahltag + setupWireMockForWahltagClient(wahltagID); + val wahlbezirkID = "wahlbezirkID"; + //WireMock für getBasisdaten + final String wahlID = "wahlID"; + setupWireMockForWahldatenClient(wahlID, wahlbezirkID, stimmzettelgebietID); + + //WireMock für getWahlvorschlaege + setupWireMockForWahlvorschlaege(wahlID, wahlbezirkID, stimmzettelgebietID); + //WireMock für getReferendumvorlagen + setupWireMockForReferendumvorlagen(wahlID); + + Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.putWahltermindaten(wahltagID)); + } + + @ParameterizedTest(name = "{index} - {1} missing") + @MethodSource("getMissingAuthoritiesVariationsWithUncatchedException") + void should_throwAccessDeniedException_when_oneRequiredAuthorityIsMissing(final ArgumentsAccessor argumentsAccessor) throws Exception { + SecurityUtils.runWith( + ArrayUtils.addAll(Authorities.ALL_AUTHORITIES_PUT_WAHLTERMINDATEN_THAT_GOT_CATCHED_ON_MISSING, argumentsAccessor.get(0, String[].class))); + + val wahltagID = "wahltagID"; + val wahlID = "wahlID"; + val stimmzettelgebietID = "sgzID"; + val wahlbezirkID = "wahlbezirkID"; + + setupWireMockForWahltagClient(wahltagID); + setupWireMockForWahldatenClient(wahlID, wahlbezirkID, stimmzettelgebietID); + setupWireMockForWahlvorschlaege(wahlID, wahlbezirkID, stimmzettelgebietID); + setupWireMockForReferendumvorlagen(wahlID); + + Assertions.assertThatThrownBy(() -> unitUnderTest.putWahltermindaten(wahltagID)) + .isInstanceOf(AccessDeniedException.class); + } + + @ParameterizedTest(name = "{index} - {1} missing") + @MethodSource("getMissingAuthoritiesVariationsWithCatchedException") + void should_notThrowAccessDeniedException_when_oneRequiredAuthorityIsMissingThatGotCatched(final ArgumentsAccessor argumentsAccessor) throws Exception { + SecurityUtils.runWith( + ArrayUtils.addAll(Authorities.ALL_AUTHORITIES_PUT_WAHLTERMINDATEN_THAT_GOT_NOT_CATCHED_ON_MISSING, + argumentsAccessor.get(0, String[].class))); + + val wahltagID = "wahltagID"; + val wahlID = "wahlID"; + val stimmzettelgebietID = "sgzID"; + val wahlbezirkID = "wahlbezirkID"; + + setupWireMockForWahltagClient(wahltagID); + setupWireMockForWahldatenClient(wahlID, wahlbezirkID, stimmzettelgebietID); + setupWireMockForWahlvorschlaege(wahlID, wahlbezirkID, stimmzettelgebietID); + setupWireMockForReferendumvorlagen(wahlID); + + Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.putWahltermindaten(wahltagID)); + } + + public static Stream getMissingAuthoritiesVariationsWithUncatchedException() { + return SecurityUtils.buildArgumentsForMissingAuthoritiesVariations(Authorities.ALL_AUTHORITIES_PUT_WAHLTERMINDATEN_THAT_GOT_NOT_CATCHED_ON_MISSING); + } + + public static Stream getMissingAuthoritiesVariationsWithCatchedException() { + return SecurityUtils.buildArgumentsForMissingAuthoritiesVariations(Authorities.ALL_AUTHORITIES_PUT_WAHLTERMINDATEN_THAT_GOT_CATCHED_ON_MISSING); + } + + } + + @Nested + class DeleteWahltermindaten { + + @Test + void should_throwNoException_when_allRequiredAuthoritiesArePresent() throws Exception { + SecurityUtils.runWith(Authorities.ALL_AUTHORITIES_DELETE_WAHLTERMINDTEN); + + val wahltagID = "wahltagID"; + val wahlID = "wahlID"; + val stimmzettelgebietID = "sgzID"; + val wahlbezirkID = "wahlbezirkID"; + + setupWireMockForWahltagClient(wahltagID); + setupWireMockForWahldatenClient(wahlID, wahlbezirkID, stimmzettelgebietID); + + Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.deleteWahltermindaten(wahltagID)); + } + + @ParameterizedTest(name = "{index} - {1} missing") + @MethodSource("getMissingAuthoritiesVariationsWithUncatchedException") + void should_throwAccessDeniedException_when_oneRequiredAuthorityIsMissing(final ArgumentsAccessor argumentsAccessor) throws Exception { + SecurityUtils.runWith( + ArrayUtils.addAll(Authorities.ALL_AUTHORITIES_PUT_WAHLTERMINDATEN_THAT_GOT_CATCHED_ON_MISSING, argumentsAccessor.get(0, String[].class))); + + val wahltagID = "wahltagID"; + val wahlID = "wahlID"; + val stimmzettelgebietID = "sgzID"; + val wahlbezirkID = "wahlbezirkID"; + + setupWireMockForWahltagClient(wahltagID); + setupWireMockForWahldatenClient(wahlID, wahlbezirkID, stimmzettelgebietID); + setupWireMockForWahlvorschlaege(wahlID, wahlbezirkID, stimmzettelgebietID); + setupWireMockForReferendumvorlagen(wahlID); + + Assertions.assertThatThrownBy(() -> unitUnderTest.putWahltermindaten(wahltagID)) + .isInstanceOf(AccessDeniedException.class); + } + + public static Stream getMissingAuthoritiesVariationsWithUncatchedException() { + return SecurityUtils.buildArgumentsForMissingAuthoritiesVariations(Authorities.ALL_AUTHORITIES_DELETE_WAHLTERMINDTEN); + } + + } + + private void setupWireMockForWahltagClient(final String wahltagID) throws JsonProcessingException { + val wahltagClientResponse = Set.of(new WahltagDTO().identifikator(wahltagID).tag(LocalDate.now()) + .nummer("0")); + WireMock.stubFor(WireMock.get(WireMock.urlPathMatching("/wahldaten/wahltage")) + .willReturn(WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(wahltagClientResponse)) + .withStatus(HttpStatus.OK.value()))); + } + + private void setupWireMockForWahldatenClient(final String wahlID, final String wahlbezirkID, final String stimmzettelgebietID) + throws JsonProcessingException { + val wahltagDate = LocalDate.now(); + val wahlclientResponse = new BasisdatenDTO().basisstrukturdaten( + Set.of(new BasisstrukturdatenDTO().wahlID(wahlID).wahlbezirkID(wahlbezirkID).stimmzettelgebietID(stimmzettelgebietID))) + .wahlbezirke(Set.of(new WahlbezirkDTO().identifikator(wahlbezirkID).wahltag(wahltagDate).wahlID(wahlID) + .wahlbezirkArt(WahlbezirkDTO.WahlbezirkArtEnum.UWB).nummer("0") + .wahlnummer("0"))) + .wahlen(Set.of(new WahlDTO().nummer("0").wahltag(wahltagDate).name("wahl").wahlart(WahlDTO.WahlartEnum.BTW).identifikator(wahlID))) + .stimmzettelgebiete( + Set.of(new StimmzettelgebietDTO().stimmzettelgebietsart(StimmzettelgebietDTO.StimmzettelgebietsartEnum.WK).wahltag(wahltagDate) + .nummer("0").identifikator(stimmzettelgebietID).name("name"))); + WireMock.stubFor(WireMock.get(WireMock.urlPathMatching("/wahldaten/basisdaten")) + .willReturn(WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(wahlclientResponse)) + .withStatus(HttpStatus.OK.value()))); + } + + private void setupWireMockForWahlvorschlaege(final String wahlID, final String wahlbezirkID, final String stimmzettelgebietID) + throws JsonProcessingException { + val wahlvorschlaege = new WahlvorschlaegeDTO().wahlID(wahlID) + .stimmzettelgebietID(stimmzettelgebietID) + .wahlbezirkID(wahlbezirkID) + .wahlvorschlaege(Set.of(new WahlvorschlagDTO().identifikator(UUID.randomUUID().toString()) + .kurzname("kurzname") + .addKandidatenItem(new KandidatDTO().identifikator(UUID.randomUUID().toString()).name("kandidat").direktkandidat(true)))); + WireMock.stubFor(WireMock.get(WireMock.urlPathMatching("/vorschlaege/wahl/.*/.*")) + .willReturn(WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(wahlvorschlaege)) + .withStatus(HttpStatus.OK.value()))); + } + + private void setupWireMockForReferendumvorlagen(final String stimmzettelgebietID) throws JsonProcessingException { + val referendumvorlagen = new ReferendumvorlagenDTO().stimmzettelgebietID(stimmzettelgebietID) + .referendumvorlagen( + Set.of(new ReferendumvorlageDTO().frage("frage") + .addReferendumoptionenItem(new ReferendumoptionDTO().id(UUID.randomUUID().toString()).name("option")))); + WireMock.stubFor(WireMock.get(WireMock.urlPathMatching("/vorschlaege/referendum/.*/.*")) + .willReturn(WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withBody(objectMapper.writeValueAsString(referendumvorlagen)) + .withStatus(HttpStatus.OK.value()))); + } +} diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/Authorities.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/Authorities.java index 59e059af2..62d598a3e 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/Authorities.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/utils/Authorities.java @@ -26,6 +26,9 @@ public class Authorities { public static final String SERVICE_GET_WAHLBEZIRKE = "Basisdaten_BUSINESSACTION_GetWahlbezirke"; + public static final String SERVICE_PUT_WAHLTERMINDATEN = "Basisdaten_BUSINESSACTION_PutWahltermindaten"; + public static final String SERVICE_DELETE_WAHLTERMINDATEN = "Basisdaten_BUSINESSACTION_DeleteWahltermindaten"; + public static final String REPOSITORY_READ_WAHLVORSCHLAEGE = "Basisdaten_READ_WLSWahlvorschlaege"; public static final String REPOSITORY_DELETE_WAHLVORSCHLAEGE = "Basisdaten_DELETE_WLSWahlvorschlaege"; public static final String REPOSITORY_WRITE_WAHLVORSCHLAEGE = "Basisdaten_WRITE_WLSWahlvorschlaege"; @@ -195,4 +198,35 @@ public class Authorities { REPOSITORY_READ_WAHLBEZIRK, REPOSITORY_WRITE_WAHLBEZIRK, }; + + public static final String[] ALL_AUTHORITIES_PUT_WAHLTERMINDATEN_THAT_GOT_NOT_CATCHED_ON_MISSING = { + SERVICE_PUT_WAHLTERMINDATEN, + + SERVICE_GET_WAHLTAGE, + REPOSITORY_WRITE_WAHLTAG, + REPOSITORY_READ_WAHLTAG, + + REPOSITORY_WRITE_WAHL, + REPOSITORY_WRITE_WAHLBEZIRK, + REPOSITORY_READ_KOPFDATEN + }; + + public static final String[] ALL_AUTHORITIES_PUT_WAHLTERMINDATEN_THAT_GOT_CATCHED_ON_MISSING = { + REPOSITORY_WRITE_WAHLVORSCHLAEGE, + REPOSITORY_WRITE_REFERENDUMVORLAGEN + }; + + public static final String[] ALL_AUTHORITIES_DELETE_WAHLTERMINDTEN = { + SERVICE_DELETE_WAHLTERMINDATEN, + + SERVICE_GET_WAHLTAGE, + REPOSITORY_WRITE_WAHLTAG, + REPOSITORY_READ_WAHLTAG, + + REPOSITORY_DELETE_WAHLBEZIRK, + REPOSITORY_DELETE_WAHL, + REPOSITORY_DELETE_KOPFDATEN, + REPOSITORY_DELETE_WAHLVORSCHLAEGE, + REPOSITORY_DELETE_REFERENDUMVORLAGEN + }; } From e70d77eb3ab4ebf56e19e6b0068b932d266d9b89 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:44:00 +0200 Subject: [PATCH 62/67] update doc with wahltermindaten --- docs/src/features/basisdaten-service/index.md | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/src/features/basisdaten-service/index.md b/docs/src/features/basisdaten-service/index.md index 4c396f926..3ed25d37d 100644 --- a/docs/src/features/basisdaten-service/index.md +++ b/docs/src/features/basisdaten-service/index.md @@ -18,6 +18,27 @@ Folgende Services werden zum Betrieb benötigt: - EAI-Service - Infomanagement-Service +## Datenmodell + +```mermaid + +classDiagram + Wahltermindaten + Wahlbezirk + Wahlvorschläge + Referendumvorlagen + Kopfdaten + + Wahltermindaten --> Wahlbezirk : uses + Wahltermindaten --> Kopfdaten : uses + Wahltermindaten --> Wahlvorschläge : uses + Wahltermindaten --> Referendumvorlagen : uses + + class Wahltermindaten { + LocalDate wahltag + } +``` + ## Handbuch In dem Service werden Handbücher verwaltet. Je Wahl und Wahlbezirkart kann ein Handbuch hinterlegt werden. @@ -29,6 +50,13 @@ Bei dem Handbuch soll es sich um ein PDF-Dokument handeln. Für Wahltage können Listen mit ungültigen Wahlscheinen verwaltet werden. Die Übermittlung der Daten erfolgt im csv-Format. Dieses umfasst eine Headerzeile, gefolgt von den Daten in den Spalten Name, Vorname und Nummer. +## Wahltermindaten + +Wahltermindaten sind eine virtuelle Zusammenfassung von Daten zu einem Wahltermin. + +Über den Service können diese Daten für einen Wahltag erstellt und gelöscht werden. Die zu erstellenden Daten +werden von dem EAI-Service importiert. + ## Konfigurationsparameter Alle Konfigurationsparameter beginnen mit `service.config` From cdce89c179fc3d4f40085a21a5c3b25b28f08604 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:46:22 +0200 Subject: [PATCH 63/67] mark Wahltermindaten in doc as virtual class --- docs/src/features/basisdaten-service/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/features/basisdaten-service/index.md b/docs/src/features/basisdaten-service/index.md index 3ed25d37d..4b7106831 100644 --- a/docs/src/features/basisdaten-service/index.md +++ b/docs/src/features/basisdaten-service/index.md @@ -35,6 +35,7 @@ classDiagram Wahltermindaten --> Referendumvorlagen : uses class Wahltermindaten { + <> LocalDate wahltag } ``` From 08df763011c8127ab93ad4e01b5bf65f1c4ccf1d Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:59:22 +0200 Subject: [PATCH 64/67] add configuration params for async processing in wahltermindaten --- docs/src/features/basisdaten-service/index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/src/features/basisdaten-service/index.md b/docs/src/features/basisdaten-service/index.md index 4b7106831..33614e44a 100644 --- a/docs/src/features/basisdaten-service/index.md +++ b/docs/src/features/basisdaten-service/index.md @@ -65,4 +65,8 @@ Alle Konfigurationsparameter beginnen mit `service.config` | Name | Beschreibung | Default | | ---- |---------------------------------------------------| ------- | | ungueltigewahlscheine.filenamesuffix | Dateinamenssuffix für die ungueltigen Wahlscheine | Ungueltigews.csv | -| manual.filenamesuffix | Dateinamenssuffix für das Handbuch | Handbuch.pdf | \ No newline at end of file +| manual.filenamesuffix | Dateinamenssuffix für das Handbuch | Handbuch.pdf | +| async.corePoolSize | core Poolsize von ThreadPoolTaskExecutor | 2 | +| async.maxPoolSize | max Poolsize von ThreadPoolTaskExecutor | 2 | +| async.queueCapacity | Kapazität für Queue von ThreadPoolTaskExecutor | 500 | +| async.threadNamePrefix | Prefix für Threads von ThreadPoolTaskExecutor | taskExecutor- | \ No newline at end of file From 2b7276adf5ffe23a20d27d2d865679730047eb27 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:00:38 +0200 Subject: [PATCH 65/67] add sequence chart for import wahltermindaten --- docs/src/features/basisdaten-service/index.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/src/features/basisdaten-service/index.md b/docs/src/features/basisdaten-service/index.md index 33614e44a..4d643bbe7 100644 --- a/docs/src/features/basisdaten-service/index.md +++ b/docs/src/features/basisdaten-service/index.md @@ -58,6 +58,44 @@ Wahltermindaten sind eine virtuelle Zusammenfassung von Daten zu einem Wahltermi Über den Service können diese Daten für einen Wahltag erstellt und gelöscht werden. Die zu erstellenden Daten werden von dem EAI-Service importiert. +### Ablauf des Imports + +```mermaid + +sequenceDiagram + + box BasisdatenService + participant WahltermindatenService + participant WahltagService + participant AsyncWahltermindatenService + end + box EAIService + participant Basisdaten + participant Wahlvorschlaege + participant Referendumvorlagen + end + + WahltermindatenService ->>+ WahltagService: request für Wahltag mit ID + WahltagService -->>- WahltermindatenService: Wahltag + + WahltermindatenService ->>+ Basisdaten : request Basisdaten für Wahltag + Basisdaten -->>- WahltermindatenService : Basisdaten + + WahltermindatenService ->> WahltermindatenService : Speichere Wahlen aus Basisdaten + WahltermindatenService ->> WahltermindatenService : Speicher Wahlbezirke der Basisdaten + WahltermindatenService ->> WahltermindatenService : Speicher Kopfdaten der Basisdaten + + WahltermindatenService -->> AsyncWahltermindatenService : Starte Initialisierung der
Wahlvorschläge und Referendumvorlagen + + AsyncWahltermindatenService ->>+ Wahlvorschlaege : lade request Wahlvorschläge für Bezirke der Wahlen + Wahlvorschlaege -->>- AsyncWahltermindatenService : Wahlvorschläge + AsyncWahltermindatenService ->> AsyncWahltermindatenService : speichere Wahlvorschläge + + AsyncWahltermindatenService ->>+ Referendumvorlagen : request Referendumvorlagen für Bezirke der Wahlen + Referendumvorlagen -->>- AsyncWahltermindatenService : Referendumvorlagen + AsyncWahltermindatenService ->> AsyncWahltermindatenService : speichere Referendumvorlagen +``` + ## Konfigurationsparameter Alle Konfigurationsparameter beginnen mit `service.config` From 9ad89ffb76774f1b295673c3d8f6cd5715933782 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:44:44 +0200 Subject: [PATCH 66/67] use wahltag with nummer and move WahltagWithNummer to common; its use by multiple services --- .../clients/DummyClientImpl.java | 2 +- .../clients/WahldatenClientImpl.java | 2 +- .../clients/WahlenClientImpl.java | 2 +- .../{wahlen => common}/WahltagWithNummer.java | 2 +- .../services/kopfdaten/KopfdatenService.java | 2 +- .../services/kopfdaten/WahldatenClient.java | 2 +- .../services/wahlen/WahlenClient.java | 1 + .../services/wahlen/WahlenService.java | 1 + .../AsyncWahltermindatenService.java | 6 +++--- .../wahltermindaten/WahltermindatenService.java | 8 ++++---- .../clients/DummyClientImplTest.java | 2 +- .../clients/WahldatenClientImplTest.java | 2 +- .../clients/WahlenClientImplTest.java | 2 +- .../WahltermindatenControllerIntegrationTest.java | 3 ++- .../services/kopfdaten/KopfdatenServiceTest.java | 2 +- .../services/wahlen/WahlenServiceTest.java | 1 + .../AsyncWahltermindatenServiceTest.java | 15 ++++++++------- .../WahltermindatenServiceTest.java | 5 +++-- 18 files changed, 33 insertions(+), 27 deletions(-) rename wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/{wahlen => common}/WahltagWithNummer.java (95%) diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java index 557b866ec..cb620195a 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImpl.java @@ -9,6 +9,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahlart; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.StimmzettelgebietsartModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahlbezirkArtModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KonfigurierterWahltagClient; @@ -24,7 +25,6 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkeClient; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlenClient; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltageClient; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlvorschlag.KandidatModel; diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahldatenClientImpl.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahldatenClientImpl.java index 9db35c2d2..22465b569 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahldatenClientImpl.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahldatenClientImpl.java @@ -4,9 +4,9 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.client.WahldatenControllerApi; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.BasisdatenDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.WahldatenClient; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.wls.common.exception.WlsException; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; import lombok.RequiredArgsConstructor; diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahlenClientImpl.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahlenClientImpl.java index fc1e771f2..cff30cf59 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahlenClientImpl.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahlenClientImpl.java @@ -4,9 +4,9 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.client.WahldatenControllerApi; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlenClient; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; import java.util.List; import java.util.Set; diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahltagWithNummer.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/common/WahltagWithNummer.java similarity index 95% rename from wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahltagWithNummer.java rename to wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/common/WahltagWithNummer.java index cf4401615..9ece4a1ce 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahltagWithNummer.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/common/WahltagWithNummer.java @@ -1,4 +1,4 @@ -package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen; +package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common; import jakarta.validation.constraints.NotNull; import java.time.LocalDate; diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java index fb22e8439..e8e8617c6 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenService.java @@ -1,7 +1,7 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/WahldatenClient.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/WahldatenClient.java index f47f60ff6..09309980c 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/WahldatenClient.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/WahldatenClient.java @@ -1,6 +1,6 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.wls.common.exception.WlsException; public interface WahldatenClient { diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenClient.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenClient.java index 9895c7e21..8feb22e8e 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenClient.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenClient.java @@ -1,5 +1,6 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.wls.common.exception.WlsException; import java.util.List; diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenService.java index b0814cff6..b789045f5 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenService.java @@ -4,6 +4,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahl; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.WahlRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltageService; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; import java.util.List; diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java index c60ed91c9..20c6577a7 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenService.java @@ -3,6 +3,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahlart; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenClient; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenModelMapper; @@ -10,7 +11,6 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlvorschlag.WahlvorschlaegeClient; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlvorschlag.WahlvorschlaegeModelMapper; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; -import java.time.LocalDate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -35,8 +35,8 @@ public class AsyncWahltermindatenService { private final ReferendumvorlagenModelMapper referendumvorlagenModelMapper; @Async - public void initVorlagenAndVorschlaege(final LocalDate wahltag, final String wahltagNummmer, final BasisdatenModel basisdaten) { - asyncProgress.reset(wahltag, wahltagNummmer); + public void initVorlagenAndVorschlaege(final WahltagWithNummer wahltagWithNummer, final BasisdatenModel basisdaten) { + asyncProgress.reset(wahltagWithNummer.wahltag(), wahltagWithNummer.wahltagNummer()); initWahlvorschlaege(basisdaten); initReferendumvorlagen(basisdaten); } diff --git a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java index 6fd31979e..637da1df1 100644 --- a/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java +++ b/wls-basisdaten-service/src/main/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenService.java @@ -7,6 +7,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.WahlRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenModel; @@ -16,7 +17,6 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModelMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModelMapper; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltageService; import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; @@ -62,8 +62,8 @@ public void putWahltermindaten(final String wahltagID) { wahltermindatenValidator.validateParameterToInitWahltermindaten(wahltagID); val wahltagModel = getWahltagByIdOrThrow(wahltagID, () -> exceptionFactory.createFachlicheWlsException(ExceptionConstants.CODE_PUTWAHLTERMINDATEN_NO_WAHLTAG)); - - val basisdatenModel = wahldatenClient.loadBasisdaten(new WahltagWithNummer(wahltagModel.wahltag(), wahltagModel.nummer())); + val wahltagWithNummer = new WahltagWithNummer(wahltagModel.wahltag(), wahltagModel.nummer()); + val basisdatenModel = wahldatenClient.loadBasisdaten(wahltagWithNummer); if (null == basisdatenModel) { throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.GET_BASISDATEN_NO_DATA); } @@ -72,7 +72,7 @@ public void putWahltermindaten(final String wahltagID) { persistWahlbezirke(basisdatenModel.wahlbezirke(), basisdatenModel.wahlen()); persistKopfdaten(kopfDataInitializer.initKopfdaten(basisdatenModel)); - asyncWahltermindatenService.initVorlagenAndVorschlaege(wahltagModel.wahltag(), wahltagModel.nummer(), basisdatenModel); + asyncWahltermindatenService.initVorlagenAndVorschlaege(wahltagWithNummer, basisdatenModel); } @PreAuthorize("hasAuthority('Basisdaten_BUSINESSACTION_DeleteWahltermindaten')") diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImplTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImplTest.java index 081b99a9c..fee226728 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImplTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/DummyClientImplTest.java @@ -1,7 +1,7 @@ package de.muenchen.oss.wahllokalsystem.basisdatenservice.clients; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.StimmzettelgebietModel; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.time.LocalDate; import lombok.val; diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahldatenClientImplTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahldatenClientImplTest.java index 1fc1a3f9d..ac004525e 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahldatenClientImplTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahldatenClientImplTest.java @@ -4,8 +4,8 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.client.WahldatenControllerApi; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.MockDataFactory; import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; import de.muenchen.oss.wahllokalsystem.wls.common.exception.TechnischeWlsException; diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahlenClientImplTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahlenClientImplTest.java index d3ee3cb2b..fc87369da 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahlenClientImplTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/clients/WahlenClientImplTest.java @@ -5,8 +5,8 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.client.WahldatenControllerApi; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; 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.util.ExceptionFactory; diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java index a98fb62b6..540f40e62 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/rest/wahltermindaten/WahltermindatenControllerIntegrationTest.java @@ -39,6 +39,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlbezirkDTO; import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahltagDTO; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltermindaten.AsyncWahltermindatenService; import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.Authorities; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; @@ -379,7 +380,7 @@ void should_persistImportedData_when_wahltagIDIsValidWahltag() throws Exception val expectedBasisdatenModel = wahldatenClientMapper.fromRemoteClientDTOToModel(basisstrukturdatenToImport); Mockito.verify(asyncWahltermindatenService) - .initVorlagenAndVorschlaege(eq(wahltagToGetWahltermindaten.getWahltag()), eq(wahltagToGetWahltermindaten.getNummer()), + .initVorlagenAndVorschlaege(eq(new WahltagWithNummer(wahltagToGetWahltermindaten.getWahltag(), wahltagToGetWahltermindaten.getNummer())), eq(expectedBasisdatenModel)); } diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java index 9f7ec8c1e..c62099993 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/kopfdaten/KopfdatenServiceTest.java @@ -5,7 +5,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.KopfdatenRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.kopfdaten.Stimmzettelgebietsart; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.StimmzettelgebietsartModel; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.MockDataFactory; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.time.LocalDate; diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenServiceTest.java index dbd816dee..cbfb7b209 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahlen/WahlenServiceTest.java @@ -5,6 +5,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.WahlRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahlart; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltageService; import de.muenchen.oss.wahllokalsystem.wls.common.exception.TechnischeWlsException; diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java index 5351aca34..d4f582393 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java @@ -10,6 +10,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlaege; import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahlbezirkArtModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenClient; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenModel; @@ -64,7 +65,7 @@ void should_resetProgress_when_methodIsCalled() { val wahltagNummer = "wahltagNummer"; val basisdatenModel = createEmptyBasisdatenModel(); - unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + unitUnderTest.initVorlagenAndVorschlaege(new WahltagWithNummer(wahltagDate, wahltagNummer), basisdatenModel); Mockito.verify(asyncProgress).reset(wahltagDate, wahltagNummer); } @@ -81,7 +82,7 @@ void should_persistWahlvorschlaege_when_basisdatenAreDelivered() { Mockito.when(wahlvorschlaegeClient.getWahlvorschlaege(any())).thenReturn(mockedWahlvorschlaegeClientResponse); Mockito.when(wahlvorschlaegeModelMapper.toEntity(mockedWahlvorschlaegeClientResponse)).thenReturn(mockedWahlvorschlaegeModelMappedAsEntity); - unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + unitUnderTest.initVorlagenAndVorschlaege(new WahltagWithNummer(wahltagDate, wahltagNummer), basisdatenModel); Mockito.verify(wahlvorschlaegeRepository, times(4)).save(mockedWahlvorschlaegeModelMappedAsEntity); Mockito.verify(asyncProgress, times(4)).incWahlvorschlaegeFinished(); @@ -101,7 +102,7 @@ void should_increaseWahlvorstandProgressEven_when_savingFailed() { Mockito.when(wahlvorschlaegeModelMapper.toEntity(mockedWahlvorschlaegeClientResponse)).thenReturn(mockedWahlvorschlaegeModelMappedAsEntity); Mockito.doThrow(new RuntimeException("saving failed")).when(wahlvorschlaegeRepository).save(mockedWahlvorschlaegeModelMappedAsEntity); - unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + unitUnderTest.initVorlagenAndVorschlaege(new WahltagWithNummer(wahltagDate, wahltagNummer), basisdatenModel); Mockito.verify(asyncProgress, times(4)).incWahlvorschlaegeFinished(); Mockito.verify(asyncProgress, times(4)).setWahlvorschlaegeNext(any()); @@ -118,7 +119,7 @@ void should_increaseWahlvorstandProgressEven_when_loadingWahlvorschlaegeFromClie Mockito.doThrow(new RuntimeException("getting data from client failed")).when(wahlvorschlaegeClient).getWahlvorschlaege(any()); - unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + unitUnderTest.initVorlagenAndVorschlaege(new WahltagWithNummer(wahltagDate, wahltagNummer), basisdatenModel); Mockito.verify(asyncProgress, times(4)).incWahlvorschlaegeFinished(); Mockito.verify(asyncProgress, times(4)).setWahlvorschlaegeNext(any()); @@ -137,7 +138,7 @@ void should_persistReferendumvorlagen_when_basisdatenAreDelivered() { Mockito.when(referendumvorlagenModelMapper.toEntity(eq(mockedReferendumvorlagenClientResponse), any())) .thenReturn(mockedReferendumvorlagenModelMappedAsEntity); - unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + unitUnderTest.initVorlagenAndVorschlaege(new WahltagWithNummer(wahltagDate, wahltagNummer), basisdatenModel); Mockito.verify(referendumvorlagenRepository, times(4)).save(mockedReferendumvorlagenModelMappedAsEntity); Mockito.verify(asyncProgress, times(4)).incReferendumVorlagenFinished(); @@ -158,7 +159,7 @@ void should_increaseReferendumvorlagenProgressEven_when_savingFailed() { .thenReturn(mockedReferendumvorlagenModelMappedAsEntity); Mockito.doThrow(new RuntimeException("saving failed")).when(referendumvorlagenRepository).save(any()); - unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + unitUnderTest.initVorlagenAndVorschlaege(new WahltagWithNummer(wahltagDate, wahltagNummer), basisdatenModel); Mockito.verify(asyncProgress, times(4)).incReferendumVorlagenFinished(); Mockito.verify(asyncProgress, times(4)).setReferendumVorlagenNext(any()); @@ -172,7 +173,7 @@ void should_increaseReferendumvorlagenProgressEven_when_loadingReferendumvorlage Mockito.doThrow(new RuntimeException("getting data from client failed")).when(referendumvorlagenClient).getReferendumvorlagen(any()); - unitUnderTest.initVorlagenAndVorschlaege(wahltagDate, wahltagNummer, basisdatenModel); + unitUnderTest.initVorlagenAndVorschlaege(new WahltagWithNummer(wahltagDate, wahltagNummer), basisdatenModel); Mockito.verify(asyncProgress, times(4)).incReferendumVorlagenFinished(); Mockito.verify(asyncProgress, times(4)).setReferendumVorlagenNext(any()); diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java index b61e43ad0..277534411 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/WahltermindatenServiceTest.java @@ -14,6 +14,7 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository; import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahlbezirkArtModel; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.common.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisstrukturdatenModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KopfdatenMapper; @@ -24,7 +25,6 @@ import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModelMapper; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModelMapper; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahltagWithNummer; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModel; import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltageService; import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; @@ -167,7 +167,8 @@ void should_persistData_when_gettingBasisdaten() { Mockito.verify(wahlRepository).saveAll(mockedWahlenMappedAsEntity); Mockito.verify(wahlbezirkRepository).saveAll(wahlbezirkEntitiesCaptor.capture()); Mockito.verify(asyncWahltermindatenService) - .initVorlagenAndVorschlaege(eq(mockedMatchingWahltag.wahltag()), eq(mockedMatchingWahltag.nummer()), eq(mockedWahldatenClientResponse)); + .initVorlagenAndVorschlaege(eq(new WahltagWithNummer(mockedMatchingWahltag.wahltag(), mockedMatchingWahltag.nummer())), + eq(mockedWahldatenClientResponse)); Mockito.verify(kopfdatenRepository).saveAll(List.of(mockedKopfdatenMappedAsEntity, mockedKopfdatenMappedAsEntity)); Assertions.assertThat(wahlbezirkEntitiesCaptor.getAllValues().size()).isEqualTo(1); From 2841456bcf7e7bd33684a5fe31f308e78bccfe75 Mon Sep 17 00:00:00 2001 From: MrSebastian <13592751+MrSebastian@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:53:53 +0200 Subject: [PATCH 67/67] remove unused variables --- .../wahltermindaten/AsyncWahltermindatenServiceTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java index d4f582393..59b4571d8 100644 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/services/wahltermindaten/AsyncWahltermindatenServiceTest.java @@ -114,9 +114,6 @@ void should_increaseWahlvorstandProgressEven_when_loadingWahlvorschlaegeFromClie val wahltagNummer = "wahltagNummer"; val basisdatenModel = createBasisdatenModelWith2WahlenAnd2WahlbezirkeForEachWahl(wahltagDate, Wahlart.BTW); - val mockedWahlvorschlaegeClientResponse = WahlvorschlaegeModel.builder().build(); - val mockedWahlvorschlaegeModelMappedAsEntity = new Wahlvorschlaege(); - Mockito.doThrow(new RuntimeException("getting data from client failed")).when(wahlvorschlaegeClient).getWahlvorschlaege(any()); unitUnderTest.initVorlagenAndVorschlaege(new WahltagWithNummer(wahltagDate, wahltagNummer), basisdatenModel);