From 30e2be95d13f576a35d5539222b512830649c122 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 11 Oct 2024 16:13:24 +0200 Subject: [PATCH 01/43] - TheEntity removed - pom.xml: wls-common and EAI-client generation added - domain class Waehleranzahl and repo added --- wls-monitoring-service/pom.xml | 95 +++++++++++++- .../MicroServiceApplication.java | 24 ++-- .../monitoringservice/domain/BaseEntity.java | 40 ------ .../monitoringservice/domain/TheEntity.java | 43 ------ .../domain/wahleranzahl/Waehleranzahl.java | 38 ++++++ .../wahleranzahl/WahleranzahlRepository.java | 46 +++++++ .../rest/TheEntityRepository.java | 124 ------------------ .../h2/V0_1__createTableTheEntity.sql | 5 - .../h2/V0_1__createTableWaehleranzahl.sql | 9 ++ .../oracle/V0_1__createTableTheEntity.sql | 5 - .../oracle/V0_1__createTableWaehleranzahl.sql | 9 ++ .../resources/openapis/openapi.eai.0.1.0.json | 1 + .../CacheControlConfigurationTest.java | 51 ------- .../UnicodeConfigurationTest.java | 23 ++-- .../rest/TheEntityRepositoryTest.java | 55 -------- 15 files changed, 215 insertions(+), 353 deletions(-) delete mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/BaseEntity.java delete mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/TheEntity.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/Waehleranzahl.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java delete mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/TheEntityRepository.java delete mode 100644 wls-monitoring-service/src/main/resources/db/migrations/h2/V0_1__createTableTheEntity.sql create mode 100644 wls-monitoring-service/src/main/resources/db/migrations/h2/V0_1__createTableWaehleranzahl.sql delete mode 100644 wls-monitoring-service/src/main/resources/db/migrations/oracle/V0_1__createTableTheEntity.sql create mode 100644 wls-monitoring-service/src/main/resources/db/migrations/oracle/V0_1__createTableWaehleranzahl.sql create mode 100644 wls-monitoring-service/src/main/resources/openapis/openapi.eai.0.1.0.json delete mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/CacheControlConfigurationTest.java delete mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/TheEntityRepositoryTest.java diff --git a/wls-monitoring-service/pom.xml b/wls-monitoring-service/pom.xml index 1d8bab3b6..a60591e79 100644 --- a/wls-monitoring-service/pom.xml +++ b/wls-monitoring-service/pom.xml @@ -36,7 +36,9 @@ 1.18.30 0.2.0 + 1.6.2 2.6.0 + 1.1.0 @@ -77,6 +79,13 @@ spring-boot-starter-actuator + + + de.muenchen.oss.wahllokalsystem.wls-common + exception + 1.1.0 + + org.springframework.boot @@ -165,6 +174,18 @@ springdoc-openapi-starter-webmvc-ui ${org.springdoc.version} + + org.openapitools + jackson-databind-nullable + 0.2.6 + + + + + de.muenchen.oss.wahllokalsystem.wls-common + security + ${wls.common.version} + @@ -187,6 +208,11 @@ spring-security-test test + + org.springframework.cloud + spring-cloud-starter-contract-stub-runner + test + org.junit.jupiter junit-jupiter-api @@ -197,6 +223,12 @@ junit-jupiter-engine test + + de.muenchen.oss.wahllokalsystem.wls-common + testing + ${wls.common.version} + test + @@ -328,14 +360,67 @@ lombok ${org.projectlombok.lombok.version} + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + org.projectlombok lombok-mapstruct-binding ${org.projectlombok.mapstructbinding.version} + + + -Amapstruct.defaultComponentModel=spring + + + -Amapstruct.unmappedTargetPolicy=ERROR + + + + org.openapitools + openapi-generator-maven-plugin + 7.7.0 + + + generateEAI + + generate + + + ${project.basedir}/src/main/resources/openapis/openapi.eai.0.1.0.json + + java + resttemplate + + ${project.groupId}.monitoringservice.eai.aou.client + ${project.groupId}.monitoringservice.eai.aou.model + + false + false + false + false + + + false + false + true + true + + + + + BaseApi.java,ApiClient.java,JavaTimeFormatter.java,Authentication.java,OAuth.java,ApiKeyAuth.java,HttpBasicAuth.java,HttpBearerAuth.java,RFC3339DateFormat.java + + + + + + maven-scm-plugin ${maven-scm-plugin.version} @@ -348,7 +433,7 @@ maven-surefire-plugin ${maven-surefire-plugin.version} - ${surefireArgLine} -Dfile.encoding=${project.build.sourceEncoding} + ${surefireArgLine} -Dfile.encoding=${project.build.sourceEncoding} @@ -368,10 +453,10 @@ prepare-agent - true - ${sonar.jacoco.reportPath} - - surefireArgLine + true + ${sonar.jacoco.reportPath} + + surefireArgLine diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java index fc0ca1aa2..5e583644f 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java @@ -16,21 +16,23 @@ */ @Configuration @ComponentScan( - basePackages = { - "org.springframework.data.jpa.convert.threeten", - "de.muenchen.oss.wahllokalsystem.monitoringservice" - } + basePackages = { + "org.springframework.data.jpa.convert.threeten", + "de.muenchen.oss.wahllokalsystem.monitoringservice", + "de.muenchen.oss.wahllokalsystem.wls.common.exception", + "de.muenchen.oss.wahllokalsystem.wls.common.security" + } ) @EntityScan( - basePackages = { - "org.springframework.data.jpa.convert.threeten", - "de.muenchen.oss.wahllokalsystem.monitoringservice" - } + basePackages = { + "org.springframework.data.jpa.convert.threeten", + "de.muenchen.oss.wahllokalsystem.monitoringservice" + } ) @EnableJpaRepositories( - basePackages = { - "de.muenchen.oss.wahllokalsystem.monitoringservice" - } + basePackages = { + "de.muenchen.oss.wahllokalsystem.monitoringservice" + } ) @EnableAutoConfiguration public class MicroServiceApplication { diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/BaseEntity.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/BaseEntity.java deleted file mode 100644 index 96233c6aa..000000000 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/BaseEntity.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik - * der Landeshauptstadt München, 2024 - */ -package de.muenchen.oss.wahllokalsystem.monitoringservice.domain; - -import static java.sql.Types.VARCHAR; - -import jakarta.persistence.Column; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.MappedSuperclass; -import java.io.Serializable; -import java.util.UUID; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.JdbcTypeCode; - -@MappedSuperclass -@NoArgsConstructor -@Getter -@Setter -@ToString -@EqualsAndHashCode -public abstract class BaseEntity implements Cloneable, Serializable { - - private static final long serialVersionUID = 1L; - - @Column(name = "id", length = 36) - @Id - @GeneratedValue(generator = "uuid") - @GenericGenerator(name = "uuid", strategy = "uuid2") - @JdbcTypeCode(VARCHAR) - private UUID id; - -} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/TheEntity.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/TheEntity.java deleted file mode 100644 index 5027146b5..000000000 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/TheEntity.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik - * der Landeshauptstadt München, 2024 - */ -package de.muenchen.oss.wahllokalsystem.monitoringservice.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; - -/** - * This class represents a TheEntity. - *

- * The entity's content will be loaded according to the reference variable. - *

- */ -@Entity -// Definition of getter, setter, ... -@Getter -@Setter -@ToString(callSuper = true) -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -public class TheEntity extends BaseEntity { - - private static final long serialVersionUID = 1L; - - // ========= // - // Variables // - // ========= // - - @Column(name = "textattribute", nullable = false, length = 8) - @NotNull - @Size(min = 2, max = 8) - private String textAttribute; - -} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/Waehleranzahl.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/Waehleranzahl.java new file mode 100644 index 000000000..a3c9d5816 --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/Waehleranzahl.java @@ -0,0 +1,38 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.domain.wahleranzahl; + +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import jakarta.persistence.Embeddable; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Entity +@Embeddable +@Getter +@Setter +@ToString +@EqualsAndHashCode +@NoArgsConstructor +@AllArgsConstructor + +public class Waehleranzahl { + + @EmbeddedId + @NotNull + private BezirkUndWahlID bezirkUndWahlID; + + @NotNull + private long anzahlWaehler; + + @NotNull + private java.time.LocalDateTime uhrzeit; + +} + + diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java new file mode 100644 index 000000000..afec507fc --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java @@ -0,0 +1,46 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.domain.wahleranzahl; + +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.util.Optional; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.repository.CrudRepository; +import org.springframework.security.access.prepost.PreAuthorize; + +public interface WahleranzahlRepository extends CrudRepository { + + String CACHE = "WAEHLERANZAHL_CACHE"; + + @Override + Iterable findAll(); + + @Override + @Cacheable(value = CACHE, key = "#p0") + Optional findById(BezirkUndWahlID bezirkUndWahlID); + + @Override + @CachePut(value = CACHE, key = "#p0.bezirkUndWahlID") + @PreAuthorize("hasAuthority('Monitoring_WRITE_Waehleranzahl')") + S save(S waehleranzahl); + + @Override + @CacheEvict(value = CACHE, key = "#p0") + @PreAuthorize("hasAuthority('Monitoring_DELETE_Waehleranzahl')") + void deleteById(BezirkUndWahlID bezirkUndWahlID); + + @Override + @CacheEvict(value = CACHE, key = "#p0.bezirkUndWahlID") + @PreAuthorize("hasAuthority('Monitoring_DELETE_Waehleranzahl')") + void delete(Waehleranzahl entity); + + @Override + @CacheEvict(value = CACHE, allEntries = true) + @PreAuthorize("hasAuthority('Monitoring_DELETE_Waehleranzahl')") + void deleteAll(Iterable entities); + + @Override + @CacheEvict(value = CACHE, allEntries = true) + @PreAuthorize("hasAuthority('Monitoring_DELETE_Waehleranzahl')") + void deleteAll(); +} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/TheEntityRepository.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/TheEntityRepository.java deleted file mode 100644 index 3c6211b44..000000000 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/TheEntityRepository.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik - * der Landeshauptstadt München, 2024 - */ -package de.muenchen.oss.wahllokalsystem.monitoringservice.rest; - -import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.TheEntity; -import java.util.Optional; -import java.util.UUID; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.CachePut; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.repository.CrudRepository; -import org.springframework.security.access.prepost.PreAuthorize; - -/** - * Provides a Repository for {@link TheEntity}. This Repository is exported as a REST resource. - *

- * The Repository handles CRUD Operations. Every Operation is secured and takes care of the tenancy. - * For specific Documentation on how the generated REST point - * behaves, please consider the Spring Data Rest Reference - * here. - *

- */ -@PreAuthorize("hasAuthority(T(de.muenchen.oss.wahllokalsystem.monitoringservice.security.AuthoritiesEnum).WLS_MONITORING_SERVICE_READ_THEENTITY.name())") -public interface TheEntityRepository extends CrudRepository { //NOSONAR - - /** - * Name for the specific cache. - */ - String CACHE = "THEENTITY_CACHE"; - - /** - * Get one specific {@link TheEntity} by its unique id. - * - * @param id The identifier of the {@link TheEntity}. - * @return The {@link TheEntity} with the requested id. - */ - @Override - @Cacheable(value = CACHE, key = "#p0") - Optional findById(UUID id); - - /** - * Create or update a {@link TheEntity}. - *

- * If the id already exists, the {@link TheEntity} will be overridden, hence update. If the id does - * not already exist, a new {@link TheEntity} will be - * created, hence create. - *

- * - * @param theEntity The {@link TheEntity} that will be saved. - * @return the saved {@link TheEntity}. - */ - @Override - @CachePut(value = CACHE, key = "#p0.id") - @PreAuthorize( - "hasAuthority(T(de.muenchen.oss.wahllokalsystem.monitoringservice.security.AuthoritiesEnum).WLS_MONITORING_SERVICE_WRITE_THEENTITY.name())" - ) - S save(S theEntity); - - /** - * Create or update a collection of {@link TheEntity}. - *

- * If the id already exists, the {@link TheEntity}s will be overridden, hence update. If the id does - * not already exist, the new {@link TheEntity}s will be - * created, hence create. - *

- * - * @param entities The {@link TheEntity} that will be saved. - * @return the collection saved {@link TheEntity}. - */ - @Override - @PreAuthorize( - "hasAuthority(T(de.muenchen.oss.wahllokalsystem.monitoringservice.security.AuthoritiesEnum).WLS_MONITORING_SERVICE_WRITE_THEENTITY.name())" - ) - Iterable saveAll(Iterable entities); - - /** - * Delete the {@link TheEntity} by a specified id. - * - * @param id the unique id of the {@link TheEntity} that will be deleted. - */ - @Override - @CacheEvict(value = CACHE, key = "#p0") - @PreAuthorize( - "hasAuthority(T(de.muenchen.oss.wahllokalsystem.monitoringservice.security.AuthoritiesEnum).WLS_MONITORING_SERVICE_DELETE_THEENTITY.name())" - ) - void deleteById(UUID id); - - /** - * Delete a {@link TheEntity} by entity. - * - * @param entity The {@link TheEntity} that will be deleted. - */ - @Override - @CacheEvict(value = CACHE, key = "#p0.id") - @PreAuthorize( - "hasAuthority(T(de.muenchen.oss.wahllokalsystem.monitoringservice.security.AuthoritiesEnum).WLS_MONITORING_SERVICE_DELETE_THEENTITY.name())" - ) - void delete(TheEntity entity); - - /** - * Delete multiple {@link TheEntity} entities by their id. - * - * @param entities The Iterable of {@link TheEntity} that will be deleted. - */ - @Override - @CacheEvict(value = CACHE, allEntries = true) - @PreAuthorize( - "hasAuthority(T(de.muenchen.oss.wahllokalsystem.monitoringservice.security.AuthoritiesEnum).WLS_MONITORING_SERVICE_DELETE_THEENTITY.name())" - ) - void deleteAll(Iterable entities); - - /** - * Delete all {@link TheEntity} entities. - */ - @Override - @CacheEvict(value = CACHE, allEntries = true) - @PreAuthorize( - "hasAuthority(T(de.muenchen.oss.wahllokalsystem.monitoringservice.security.AuthoritiesEnum).WLS_MONITORING_SERVICE_DELETE_THEENTITY.name())" - ) - void deleteAll(); - -} diff --git a/wls-monitoring-service/src/main/resources/db/migrations/h2/V0_1__createTableTheEntity.sql b/wls-monitoring-service/src/main/resources/db/migrations/h2/V0_1__createTableTheEntity.sql deleted file mode 100644 index 1f2b83f72..000000000 --- a/wls-monitoring-service/src/main/resources/db/migrations/h2/V0_1__createTableTheEntity.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE TABLE theEntity -( - id varchar2(36) NOT NULL primary key, - textAttribute varchar2(8) NOT NULL -) \ No newline at end of file diff --git a/wls-monitoring-service/src/main/resources/db/migrations/h2/V0_1__createTableWaehleranzahl.sql b/wls-monitoring-service/src/main/resources/db/migrations/h2/V0_1__createTableWaehleranzahl.sql new file mode 100644 index 000000000..51482aa2c --- /dev/null +++ b/wls-monitoring-service/src/main/resources/db/migrations/h2/V0_1__createTableWaehleranzahl.sql @@ -0,0 +1,9 @@ +CREATE TABLE Waehleranzahl +( + wahlID VARCHAR(255) NOT NULL, + wahlbezirkID VARCHAR(255) NOT NULL, + anzahlWaehler BIGINT NOT NULL, + uhrzeit DATETIME NOT NULL, + + PRIMARY KEY (wahlID, wahlbezirkID) +); \ No newline at end of file diff --git a/wls-monitoring-service/src/main/resources/db/migrations/oracle/V0_1__createTableTheEntity.sql b/wls-monitoring-service/src/main/resources/db/migrations/oracle/V0_1__createTableTheEntity.sql deleted file mode 100644 index 1f2b83f72..000000000 --- a/wls-monitoring-service/src/main/resources/db/migrations/oracle/V0_1__createTableTheEntity.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE TABLE theEntity -( - id varchar2(36) NOT NULL primary key, - textAttribute varchar2(8) NOT NULL -) \ No newline at end of file diff --git a/wls-monitoring-service/src/main/resources/db/migrations/oracle/V0_1__createTableWaehleranzahl.sql b/wls-monitoring-service/src/main/resources/db/migrations/oracle/V0_1__createTableWaehleranzahl.sql new file mode 100644 index 000000000..67e99c350 --- /dev/null +++ b/wls-monitoring-service/src/main/resources/db/migrations/oracle/V0_1__createTableWaehleranzahl.sql @@ -0,0 +1,9 @@ +CREATE TABLE Waehleranzahl +( + wahlID VARCHAR(255) NOT NULL, + wahlbezirkID VARCHAR(255) NOT NULL, + anzahlWaehler NUMBER NOT NULL, + uhrzeit TIMESTAMP NOT NULL, + + PRIMARY KEY (wahlID, wahlbezirkID) +); \ No newline at end of file diff --git a/wls-monitoring-service/src/main/resources/openapis/openapi.eai.0.1.0.json b/wls-monitoring-service/src/main/resources/openapis/openapi.eai.0.1.0.json new file mode 100644 index 000000000..de8c135d1 --- /dev/null +++ b/wls-monitoring-service/src/main/resources/openapis/openapi.eai.0.1.0.json @@ -0,0 +1 @@ +{"openapi":"3.0.1","info":{"title":"EAI Service","contact":{"name":"Your Name","email":"Your E-Mail-Address"},"version":"0.1.0"},"servers":[{"url":"http://localhost:8080","description":"Generated server url"}],"security":[{"bearerAuth":[]}],"paths":{"/wahlvorstaende/anwesenheit":{"put":{"tags":["wahlvorstand-controller"],"description":"Aktualisieren der Anwesenheit der Wahlvorstandsmitglieder eines bestimmten Wahlbezirkes","operationId":"saveAnwesenheit","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WahlvorstandsaktualisierungDTO"}}},"required":true},"responses":{"200":{"description":"OK"},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/wahllokalzustand":{"post":{"tags":["wahllokalzustand-controller"],"operationId":"saveWahllokalZustand","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WahllokalZustandDTO"}}},"required":true},"responses":{"200":{"description":"OK"},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/wahlergebnis":{"post":{"tags":["wahlergebnis-controller"],"operationId":"saveWahlergebnismeldung","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErgebnismeldungDTO"}}},"required":true},"responses":{"200":{"description":"OK"},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/wahlbeteiligung":{"post":{"tags":["wahlbeteiligung-controller"],"operationId":"saveWahlbeteiligung","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WahlbeteiligungsMeldungDTO"}}},"required":true},"responses":{"200":{"description":"OK"},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/wahlvorstaende":{"get":{"tags":["wahlvorstand-controller"],"description":"Abrufen des Wahlvorstandes für einen bestimmten Wahlbezirk","operationId":"loadWahlvorstand","parameters":[{"name":"wahlbezirkID","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WahlvorstandDTO"}}}},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/wahldaten/wahltage":{"get":{"tags":["wahldaten-controller"],"operationId":"loadWahltageSinceIncluding","parameters":[{"name":"includingSince","in":"query","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/WahltagDTO"}}}}},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/wahldaten/wahlen":{"get":{"tags":["wahldaten-controller"],"operationId":"loadWahlen","parameters":[{"name":"forDate","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"withNummer","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/WahlDTO"}}}}},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/wahldaten/wahlbezirke/{wahlbezirkID}/wahlberechtigte":{"get":{"tags":["wahldaten-controller"],"operationId":"loadWahlberechtigte","parameters":[{"name":"wahlbezirkID","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WahlberechtigteDTO"}}}}},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/wahldaten/wahlbezirk":{"get":{"tags":["wahldaten-controller"],"operationId":"loadWahlbezirke","parameters":[{"name":"forDate","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"withNummer","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/WahlbezirkDTO"}}}}},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/wahldaten/basisdaten":{"get":{"tags":["wahldaten-controller"],"operationId":"loadBasisdaten","parameters":[{"name":"forDate","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"withNummer","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/BasisdatenDTO"}}}},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/vorschlaege/wahl/{wahlID}/{wahlbezirkID}":{"get":{"tags":["wahlvorschlag-controller"],"operationId":"loadWahlvorschlaege","parameters":[{"name":"wahlID","in":"path","required":true,"schema":{"type":"string"}},{"name":"wahlbezirkID","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WahlvorschlaegeDTO"}}}},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/vorschlaege/wahl/{wahlID}/liste":{"get":{"tags":["wahlvorschlag-controller"],"operationId":"loadWahlvorschlaegeListe","parameters":[{"name":"forDate","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"wahlID","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WahlvorschlaegeListeDTO"}}}},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}},"/vorschlaege/referendum/{wahlID}/{wahlbezirkID}":{"get":{"tags":["wahlvorschlag-controller"],"operationId":"loadReferendumvorlagen","parameters":[{"name":"wahlID","in":"path","required":true,"schema":{"type":"string"}},{"name":"wahlbezirkID","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ReferendumvorlagenDTO"}}}},"400":{"description":"request body validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}},"404":{"description":"resource not found"},"500":{"description":"unhandled error during communication with other system","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WlsExceptionDTO"}}}}}}}},"components":{"schemas":{"WahlvorstandsaktualisierungDTO":{"required":["anwesenheitBeginn","mitglieder","wahlbezirkID"],"type":"object","properties":{"wahlbezirkID":{"type":"string"},"mitglieder":{"maxItems":2147483647,"minItems":1,"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/WahlvorstandsmitgliedAktualisierungDTO"}},"anwesenheitBeginn":{"type":"string","format":"date-time"}}},"WahlvorstandsmitgliedAktualisierungDTO":{"required":["anwesend","identifikator"],"type":"object","properties":{"identifikator":{"type":"string"},"anwesend":{"type":"boolean"}}},"DruckzustandDTO":{"required":["niederschriftDruckUhrzeit","niederschriftSendenUhrzeit","schnellmeldungDruckUhrzeit","schnellmeldungSendenUhrzeit","wahlID"],"type":"object","properties":{"wahlID":{"type":"string"},"schnellmeldungSendenUhrzeit":{"type":"string","format":"date-time"},"niederschriftSendenUhrzeit":{"type":"string","format":"date-time"},"schnellmeldungDruckUhrzeit":{"type":"string","format":"date-time"},"niederschriftDruckUhrzeit":{"type":"string","format":"date-time"}}},"WahllokalZustandDTO":{"required":["druckzustaende","letzteAbmeldung","wahlbezirkID","zuletztGesehen"],"type":"object","properties":{"wahlbezirkID":{"type":"string"},"zuletztGesehen":{"type":"string","format":"date-time"},"letzteAbmeldung":{"type":"string","format":"date-time"},"druckzustaende":{"maxItems":2147483647,"minItems":1,"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/DruckzustandDTO"}}}},"AWerteDTO":{"type":"object","properties":{"a1":{"type":"integer","format":"int64"},"a2":{"type":"integer","format":"int64"}}},"BWerteDTO":{"type":"object","properties":{"b":{"type":"integer","format":"int64"},"b1":{"type":"integer","format":"int64"},"b2":{"type":"integer","format":"int64"}}},"ErgebnisDTO":{"required":["ergebnis","kandidatID","stimmenart","wahlvorschlagID","wahlvorschlagsordnungszahl"],"type":"object","properties":{"stimmenart":{"type":"string"},"wahlvorschlagsordnungszahl":{"type":"integer","format":"int64"},"ergebnis":{"type":"integer","format":"int64"},"wahlvorschlagID":{"type":"string"},"kandidatID":{"type":"string"}}},"ErgebnismeldungDTO":{"required":["wahlID","wahlbezirkID"],"type":"object","properties":{"wahlbezirkID":{"type":"string"},"wahlID":{"type":"string"},"meldungsart":{"type":"string","enum":["NIEDERSCHRIFT","SCHNELLMELDUNG"]},"aWerte":{"$ref":"#/components/schemas/AWerteDTO"},"bWerte":{"$ref":"#/components/schemas/BWerteDTO"},"wahlbriefeWerte":{"$ref":"#/components/schemas/WahlbriefeWerteDTO"},"ungueltigeStimmzettels":{"type":"array","items":{"$ref":"#/components/schemas/UngueltigeStimmzettelDTO"}},"ungueltigeStimmzettelAnzahl":{"type":"integer","format":"int64"},"ergebnisse":{"type":"array","items":{"$ref":"#/components/schemas/ErgebnisDTO"}},"wahlart":{"type":"string","enum":["BAW","BEB","BTW","BZW","EUW","LTW","MBW","OBW","SRW","SVW","VE"]}}},"UngueltigeStimmzettelDTO":{"type":"object","properties":{"stimmenart":{"type":"string"},"anzahl":{"type":"integer","format":"int64"},"wahlvorschlagID":{"type":"string"}}},"WahlbriefeWerteDTO":{"type":"object","properties":{"zurueckgewiesenGesamt":{"type":"integer","format":"int64"}}},"WahlbeteiligungsMeldungDTO":{"required":["anzahlWaehler","meldeZeitpunkt","wahlID","wahlbezirkID"],"type":"object","properties":{"wahlID":{"type":"string"},"wahlbezirkID":{"type":"string"},"anzahlWaehler":{"type":"integer","format":"int64"},"meldeZeitpunkt":{"type":"string","format":"date-time"}}},"WahlvorstandDTO":{"required":["mitglieder","wahlbezirkID"],"type":"object","properties":{"wahlbezirkID":{"type":"string"},"mitglieder":{"maxItems":2147483647,"minItems":1,"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/WahlvorstandsmitgliedDTO"}}}},"WahlvorstandsmitgliedDTO":{"required":["anwesend","funktion","identifikator","nachname","vorname"],"type":"object","properties":{"identifikator":{"type":"string"},"vorname":{"type":"string"},"nachname":{"type":"string"},"funktion":{"type":"string","enum":["W","SB","SWB","SSB","B"]},"anwesend":{"type":"boolean"}}},"WahltagDTO":{"required":["beschreibung","identifikator","nummer","tag"],"type":"object","properties":{"identifikator":{"type":"string"},"tag":{"type":"string","format":"date"},"beschreibung":{"type":"string"},"nummer":{"type":"string"}}},"WahlDTO":{"required":["identifikator","name","nummer","wahlart","wahltag"],"type":"object","properties":{"identifikator":{"type":"string"},"name":{"type":"string"},"wahlart":{"type":"string","enum":["BAW","BEB","BTW","BZW","EUW","LTW","MBW","OBW","SRW","SVW","VE"]},"wahltag":{"type":"string","format":"date"},"nummer":{"type":"string"}}},"WahlberechtigteDTO":{"required":["a1","a2","a3","wahlID","wahlbezirkID"],"type":"object","properties":{"wahlID":{"type":"string"},"wahlbezirkID":{"type":"string"},"a1":{"type":"integer","format":"int64"},"a2":{"type":"integer","format":"int64"},"a3":{"type":"integer","format":"int64"}}},"WahlbezirkDTO":{"required":["identifikator","nummer","wahlID","wahlbezirkArt","wahlnummer","wahltag"],"type":"object","properties":{"identifikator":{"type":"string"},"wahlbezirkArt":{"type":"string","enum":["UWB","BWB"]},"nummer":{"type":"string"},"wahltag":{"type":"string","format":"date"},"wahlnummer":{"type":"string"},"wahlID":{"type":"string"}}},"BasisdatenDTO":{"required":["basisstrukturdaten","stimmzettelgebiete","wahlbezirke","wahlen"],"type":"object","properties":{"basisstrukturdaten":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/BasisstrukturdatenDTO"}},"wahlen":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/WahlDTO"}},"wahlbezirke":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/WahlbezirkDTO"}},"stimmzettelgebiete":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/StimmzettelgebietDTO"}}}},"BasisstrukturdatenDTO":{"required":["stimmzettelgebietID","wahlID","wahlbezirkID","wahltag"],"type":"object","properties":{"wahlID":{"type":"string"},"stimmzettelgebietID":{"type":"string"},"wahlbezirkID":{"type":"string"},"wahltag":{"type":"string","format":"date"}}},"StimmzettelgebietDTO":{"required":["stimmzettelgebietsart"],"type":"object","properties":{"identifikator":{"type":"string"},"nummer":{"type":"string"},"name":{"type":"string"},"wahltag":{"type":"string","format":"date"},"stimmzettelgebietsart":{"type":"string","enum":["SB","SG","SK","WK"]}}},"KandidatDTO":{"required":["direktkandidat","einzelbewerber","identifikator","listenposition","name","tabellenSpalteInNiederschrift"],"type":"object","properties":{"identifikator":{"type":"string"},"name":{"type":"string"},"listenposition":{"type":"integer","format":"int64"},"direktkandidat":{"type":"boolean"},"tabellenSpalteInNiederschrift":{"type":"integer","format":"int64"},"einzelbewerber":{"type":"boolean"}}},"WahlvorschlaegeDTO":{"required":["stimmzettelgebietID","wahlID","wahlbezirkID","wahlvorschlaege"],"type":"object","properties":{"wahlbezirkID":{"type":"string"},"wahlID":{"type":"string"},"stimmzettelgebietID":{"type":"string"},"wahlvorschlaege":{"maxItems":2147483647,"minItems":1,"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/WahlvorschlagDTO"}}}},"WahlvorschlagDTO":{"required":["erhaeltStimmen","identifikator","kurzname","ordnungszahl"],"type":"object","properties":{"identifikator":{"type":"string"},"ordnungszahl":{"type":"integer","format":"int64"},"kurzname":{"type":"string"},"erhaeltStimmen":{"type":"boolean"},"kandidaten":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/KandidatDTO"}}}},"WahlvorschlaegeListeDTO":{"required":["wahlID","wahlvorschlaegeliste"],"type":"object","properties":{"wahlID":{"type":"string"},"wahlvorschlaegeliste":{"maxItems":2147483647,"minItems":1,"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/WahlvorschlaegeDTO"}}}},"ReferendumoptionDTO":{"required":["id","name"],"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"position":{"type":"integer","format":"int64"}}},"ReferendumvorlageDTO":{"required":["frage","kurzname","ordnungszahl","referendumoptionen","wahlvorschlagID"],"type":"object","properties":{"wahlvorschlagID":{"type":"string"},"ordnungszahl":{"type":"integer","format":"int64"},"kurzname":{"type":"string"},"frage":{"type":"string"},"referendumoptionen":{"maxItems":2147483647,"minItems":1,"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/ReferendumoptionDTO"}}}},"ReferendumvorlagenDTO":{"required":["referendumvorlagen","stimmzettelgebietID"],"type":"object","properties":{"stimmzettelgebietID":{"type":"string"},"referendumvorlagen":{"maxItems":2147483647,"minItems":1,"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/ReferendumvorlageDTO"}}}},"WlsExceptionDTO":{"required":["category","code","message","service"],"type":"object","properties":{"category":{"type":"string","enum":["F","T","S","I"]},"code":{"type":"string"},"service":{"type":"string"},"message":{"type":"string"}}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}}} \ No newline at end of file diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/CacheControlConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/CacheControlConfigurationTest.java deleted file mode 100644 index 4d6ddbc57..000000000 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/CacheControlConfigurationTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik - * der Landeshauptstadt München, 2024 - */ -package de.muenchen.oss.wahllokalsystem.monitoringservice.configuration; - -import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_NO_SECURITY_PROFILE; -import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_TEST_PROFILE; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import de.muenchen.oss.wahllokalsystem.monitoringservice.MicroServiceApplication; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest( - classes = { MicroServiceApplication.class }, - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = { - "spring.datasource.url=jdbc:h2:mem:testexample;DB_CLOSE_ON_EXIT=FALSE", - "refarch.gracefulshutdown.pre-wait-seconds=0" - } -) -@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) -class CacheControlConfigurationTest { - - private static final String ENTITY_ENDPOINT_URL = "/theEntities"; - - private static final String EXPECTED_CACHE_CONTROL_HEADER_VALUES = "no-cache, no-store, must-revalidate"; - - @Autowired - private TestRestTemplate testRestTemplate; - - @Test - @Disabled - void testForCacheControlHeadersForEntityEndpoint() { - ResponseEntity response = testRestTemplate.exchange(ENTITY_ENDPOINT_URL, HttpMethod.GET, null, String.class); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertTrue(response.getHeaders().containsKey(HttpHeaders.CACHE_CONTROL)); - assertEquals(EXPECTED_CACHE_CONTROL_HEADER_VALUES, response.getHeaders().getCacheControl()); - } - -} diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java index 119a8b609..ab7d8492f 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java @@ -10,8 +10,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import de.muenchen.oss.wahllokalsystem.monitoringservice.MicroServiceApplication; -import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.TheEntity; -import de.muenchen.oss.wahllokalsystem.monitoringservice.rest.TheEntityRepository; import java.net.URI; import java.util.UUID; import org.apache.commons.lang3.StringUtils; @@ -23,12 +21,12 @@ import org.springframework.test.context.ActiveProfiles; @SpringBootTest( - classes = { MicroServiceApplication.class }, - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = { - "spring.datasource.url=jdbc:h2:mem:testexample;DB_CLOSE_ON_EXIT=FALSE", - "refarch.gracefulshutdown.pre-wait-seconds=0" - } + classes = { MicroServiceApplication.class }, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + properties = { + "spring.datasource.url=jdbc:h2:mem:testexample;DB_CLOSE_ON_EXIT=FALSE", + "refarch.gracefulshutdown.pre-wait-seconds=0" + } ) @ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) class UnicodeConfigurationTest { @@ -48,9 +46,6 @@ class UnicodeConfigurationTest { @Autowired private TestRestTemplate testRestTemplate; - @Autowired - private TheEntityRepository theEntityRepository; - @Test @Disabled void testForNfcNormalization() { @@ -68,9 +63,9 @@ void testForNfcNormalization() { final UUID uuid = UUID.fromString(StringUtils.substringAfterLast(response.getRequiredLink("self").getHref(), "/")); // Check persisted entity contains a composed string via JPA repository. - final TheEntity theEntity = theEntityRepository.findById(uuid).orElse(null); - assertEquals(TEXT_ATTRIBUTE_COMPOSED, theEntity.getTextAttribute()); - assertEquals(TEXT_ATTRIBUTE_COMPOSED.length(), theEntity.getTextAttribute().length()); + //final Waehleranzahl theEntity = theEntityRepository.findById(uuid).orElse(null); + //assertEquals(TEXT_ATTRIBUTE_COMPOSED, theEntity.getTextAttribute()); + //assertEquals(TEXT_ATTRIBUTE_COMPOSED.length(), theEntity.getTextAttribute().length()); } } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/TheEntityRepositoryTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/TheEntityRepositoryTest.java deleted file mode 100644 index b301a4131..000000000 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/TheEntityRepositoryTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik - * der Landeshauptstadt München, 2024 - */ -package de.muenchen.oss.wahllokalsystem.monitoringservice.rest; - -import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_NO_SECURITY_PROFILE; -import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_TEST_PROFILE; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import de.muenchen.oss.wahllokalsystem.monitoringservice.MicroServiceApplication; -import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.TheEntity; -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.Propagation; -import org.springframework.transaction.annotation.Transactional; - -@SpringBootTest( - classes = { MicroServiceApplication.class }, - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = { - "spring.datasource.url=jdbc:h2:mem:wls;DB_CLOSE_ON_EXIT=FALSE", - "refarch.gracefulshutdown.pre-wait-seconds=0" - } -) -@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) -class TheEntityRepositoryTest { - - @Autowired - private TheEntityRepository repository; - - @Test - @Transactional(propagation = Propagation.REQUIRED, noRollbackFor = Exception.class) - void testSave() { - - // Implement your logic here by replacing and/or extending the code - - // initialize - TheEntity original = new TheEntity(); - original.setTextAttribute("test"); - - // persist - original = repository.save(original); - - // check - TheEntity persisted = repository.findById(original.getId()).orElse(null); - assertNotNull(persisted); - assertEquals(original, persisted); - - } - -} From 9ecec684c0cda406c7140c34610c65044befd819 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Wed, 16 Oct 2024 18:57:50 +0200 Subject: [PATCH 02/43] Controller, Service, Mapper and Validators --- .../wahleranzahl/WahleranzahlRepository.java | 4 ++ .../exception/ExceptionConstants.java | 16 +++++++ .../WaehleranzahlController.java | 45 ++++++++++++++++++ .../rest/waehleranzahl/WaehleranzahlDTO.java | 13 ++++++ .../waehleranzahl/WaehleranzahlDTOMapper.java | 16 +++++++ .../waehleranzahl/WaehleranzahlModel.java | 13 ++++++ .../WaehleranzahlModelMapper.java | 13 ++++++ .../waehleranzahl/WaehleranzahlService.java | 46 +++++++++++++++++++ .../waehleranzahl/WaehleranzahlValidator.java | 26 +++++++++++ .../SecurityConfigurationTest.java | 42 ++++++++++++++--- 10 files changed, 227 insertions(+), 7 deletions(-) create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTO.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapper.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModel.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapper.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidator.java diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java index afec507fc..df1a1a515 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.repository.CrudRepository; import org.springframework.security.access.prepost.PreAuthorize; +@PreAuthorize("hasAuthority('Monitoring_READ_Waehleranzahl')") public interface WahleranzahlRepository extends CrudRepository { String CACHE = "WAEHLERANZAHL_CACHE"; @@ -43,4 +44,7 @@ public interface WahleranzahlRepository extends CrudRepository Date: Thu, 17 Oct 2024 12:13:30 +0200 Subject: [PATCH 03/43] EAI call implemented --- .../MicroServiceApplication.java | 26 ++++++------ .../client/waehleranzahl/DummyClientImpl.java | 27 ++++++++++++ .../WaehleranzahlClientImpl.java | 37 ++++++++++++++++ .../WaehleranzahlClientMapper.java | 26 ++++++++++++ .../configuration/BasePathConfiguration.java | 21 ++++++++++ .../configuration/ClientConfiguration.java | 42 +++++++++++++++++++ .../configuration/Profiles.java | 12 ++++++ .../Waehleranzahl.java | 4 +- .../WaehleranzahlRepository.java} | 4 +- .../exception/ExceptionConstants.java | 9 ++-- .../WaehleranzahlController.java | 4 +- .../waehleranzahl/WaehleranzahlClient.java | 15 +++++++ .../WaehleranzahlModelMapper.java | 2 +- .../waehleranzahl/WaehleranzahlService.java | 12 ++---- .../waehleranzahl/WaehleranzahlValidator.java | 2 +- .../src/main/resources/application.yml | 10 +++++ .../SecurityConfigurationTest.java | 14 +++---- .../UnicodeConfigurationTest.java | 12 +++--- 18 files changed, 233 insertions(+), 46 deletions(-) create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/DummyClientImpl.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/BasePathConfiguration.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/ClientConfiguration.java create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/Profiles.java rename wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/{wahleranzahl => waehleranzahl}/Waehleranzahl.java (97%) rename wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/{wahleranzahl/WahleranzahlRepository.java => waehleranzahl/WaehleranzahlRepository.java} (93%) create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlClient.java diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java index 5e583644f..9e743431a 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java @@ -16,23 +16,23 @@ */ @Configuration @ComponentScan( - basePackages = { - "org.springframework.data.jpa.convert.threeten", - "de.muenchen.oss.wahllokalsystem.monitoringservice", - "de.muenchen.oss.wahllokalsystem.wls.common.exception", - "de.muenchen.oss.wahllokalsystem.wls.common.security" - } + basePackages = { + "org.springframework.data.jpa.convert.threeten", + "de.muenchen.oss.wahllokalsystem.monitoringservice", + "de.muenchen.oss.wahllokalsystem.wls.common.exception", + "de.muenchen.oss.wahllokalsystem.wls.common.security" + } ) @EntityScan( - basePackages = { - "org.springframework.data.jpa.convert.threeten", - "de.muenchen.oss.wahllokalsystem.monitoringservice" - } + basePackages = { + "org.springframework.data.jpa.convert.threeten", + "de.muenchen.oss.wahllokalsystem.monitoringservice" + } ) @EnableJpaRepositories( - basePackages = { - "de.muenchen.oss.wahllokalsystem.monitoringservice" - } + basePackages = { + "de.muenchen.oss.wahllokalsystem.monitoringservice" + } ) @EnableAutoConfiguration public class MicroServiceApplication { diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/DummyClientImpl.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/DummyClientImpl.java new file mode 100644 index 000000000..c229cacda --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/DummyClientImpl.java @@ -0,0 +1,27 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.client.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.configuration.Profiles; +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlClient; +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.WlsException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +@Component +@Profile(Profiles.DUMMY_CLIENTS) +@RequiredArgsConstructor +@Slf4j +public class DummyClientImpl implements WaehleranzahlClient { + + private final WaehleranzahlClientMapper waehleranzahlClientMapper; + + @Override + public void postWahlbeteiligung(WaehleranzahlModel waehleranzahlModel) throws WlsException { + + val wahlbeteiligungsMeldungDTO = waehleranzahlClientMapper.toDTO(waehleranzahlModel); + log.info("Dummy client postWahlbeteiligung() called instead of EAI with: " + wahlbeteiligungsMeldungDTO); + } +} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java new file mode 100644 index 000000000..69ae3bc30 --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java @@ -0,0 +1,37 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.client.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.configuration.Profiles; +import de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.client.WahlbeteiligungControllerApi; +import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlClient; +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.WlsException; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +@Component +@Profile(Profiles.NOT + Profiles.DUMMY_CLIENTS) +@RequiredArgsConstructor +@Slf4j +public class WaehleranzahlClientImpl implements WaehleranzahlClient { + + private final ExceptionFactory exceptionFactory; + + private final WahlbeteiligungControllerApi wahlbeteiligungControllerApi; + private final WaehleranzahlClientMapper waehleranzahlClientMapper; + + @Override + public void postWahlbeteiligung(WaehleranzahlModel waehleranzahlModel) throws WlsException { + val wahlbeteiligungsMeldungDTO = waehleranzahlClientMapper.toDTO(waehleranzahlModel); + try { + wahlbeteiligungControllerApi.saveWahlbeteiligung(wahlbeteiligungsMeldungDTO); + } catch (final Exception exception) { + log.info("exception on postWahlbeteiligung from external", exception); + throw exceptionFactory.createTechnischeWlsException(ExceptionConstants.FAILED_COMMUNICATION_WITH_EAI); + } + } +} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java new file mode 100644 index 000000000..d11bea6dd --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java @@ -0,0 +1,26 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.client.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.model.WahlbeteiligungsMeldungDTO; +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Named; + +@Mapper +public interface WaehleranzahlClientMapper { + + ZoneOffset DEFAULT_ZONE = ZoneOffset.UTC; + + @Mapping(target = "wahlID", source = "bezirkUndWahlID.wahlID") + @Mapping(target = "wahlbezirkID", source = "bezirkUndWahlID.wahlbezirkID") + @Mapping(target = "meldeZeitpunkt", source = "uhrzeit", qualifiedByName = "localDateTimeToOffsetDateTime") + WahlbeteiligungsMeldungDTO toDTO(WaehleranzahlModel waehleranzahlModel); + + @Named("localDateTimeToOffsetDateTime") + default OffsetDateTime localDateTimeToOffsetDateTime(LocalDateTime localDateTime) { + return localDateTime.atOffset(DEFAULT_ZONE); + } +} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/BasePathConfiguration.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/BasePathConfiguration.java new file mode 100644 index 000000000..f8837fc58 --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/BasePathConfiguration.java @@ -0,0 +1,21 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.configuration; + +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RequiredArgsConstructor +public class BasePathConfiguration { + + @Value("${app.clients.eai.basePath}") + String eaiBasePath; + + private final de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.ApiClient eaiApiClient; + + @PostConstruct + public void updateBasePaths() { + eaiApiClient.setBasePath(eaiBasePath); + } +} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/ClientConfiguration.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/ClientConfiguration.java new file mode 100644 index 000000000..36762b320 --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/ClientConfiguration.java @@ -0,0 +1,42 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.configuration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.errorhandler.WlsResponseErrorHandler; +import lombok.val; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.AbstractOAuth2Token; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class ClientConfiguration { + + @Bean + public WlsResponseErrorHandler wlsResponseErrorHandler(final ObjectMapper objectMapper) { + return new WlsResponseErrorHandler(objectMapper); + } + + @Bean + public RestTemplate restTemplate(final WlsResponseErrorHandler wlsResponseErrorHandler) { + val restTemplate = new RestTemplate(); + + restTemplate.setErrorHandler(wlsResponseErrorHandler); + restTemplate.getInterceptors().add((request, body, execution) -> { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + return execution.execute(request, body); + } + + if (!(authentication.getCredentials() instanceof AbstractOAuth2Token token)) { + return execution.execute(request, body); + } + + request.getHeaders().setBearerAuth(token.getTokenValue()); + return execution.execute(request, body); + }); + + return restTemplate; + } +} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/Profiles.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/Profiles.java new file mode 100644 index 000000000..88d27a22e --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/Profiles.java @@ -0,0 +1,12 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.configuration; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class Profiles { + + public static final String NOT = "!"; + + public static final String DUMMY_CLIENTS = "dummy.clients"; +} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/Waehleranzahl.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java similarity index 97% rename from wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/Waehleranzahl.java rename to wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java index a3c9d5816..d309b4eb7 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/Waehleranzahl.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java @@ -1,4 +1,4 @@ -package de.muenchen.oss.wahllokalsystem.monitoringservice.domain.wahleranzahl; +package de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import jakarta.persistence.Embeddable; @@ -34,5 +34,3 @@ public class Waehleranzahl { private java.time.LocalDateTime uhrzeit; } - - diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepository.java similarity index 93% rename from wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java rename to wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepository.java index df1a1a515..e119421a3 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/wahleranzahl/WahleranzahlRepository.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepository.java @@ -1,4 +1,4 @@ -package de.muenchen.oss.wahllokalsystem.monitoringservice.domain.wahleranzahl; +package de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.util.Optional; @@ -9,7 +9,7 @@ import org.springframework.security.access.prepost.PreAuthorize; @PreAuthorize("hasAuthority('Monitoring_READ_Waehleranzahl')") -public interface WahleranzahlRepository extends CrudRepository { +public interface WaehleranzahlRepository extends CrudRepository { String CACHE = "WAEHLERANZAHL_CACHE"; diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java index e2c82c958..be20ff26d 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java @@ -9,8 +9,11 @@ public class ExceptionConstants { //waehleranzahl public static final ExceptionDataWrapper GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG = new ExceptionDataWrapper("102", - "Fehler in getWahlbeteiligung(): Parameter unvollstaendig."); + "Fehler in getWahlbeteiligung(): Parameter unvollstaendig."); public static final ExceptionDataWrapper POSTWAHLBETEILIGUNG_UNSAVEABLE = new ExceptionDataWrapper("101", - "Fehler in postWahlbeteiligung(): Waehleranzahl konnte nicht gespeichert werden."); - ; + "Fehler in postWahlbeteiligung(): Waehleranzahl konnte nicht gespeichert werden."); + + public static ExceptionDataWrapper FAILED_COMMUNICATION_WITH_EAI = new ExceptionDataWrapper("100", + "Bei der Kommunikation mit dem Aoueai-Service ist ein Fehler aufgetreten. Es konnten daher keine Daten geladen werden."); + } diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java index 27c3f9233..670d2809a 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java @@ -26,7 +26,7 @@ public class WaehleranzahlController { @GetMapping("/{wahlID}/{wahlbezirkID}") WaehleranzahlDTO getWahlbeteiligung(@PathVariable("wahlID") String wahlID, @PathVariable("wahlbezirkID") String wahlbezirkID) { return waehleranzahlDTOMapper.toDTO( - waehleranzahlService.getWahlbeteiligung(new BezirkUndWahlID(wahlID, wahlbezirkID))); + waehleranzahlService.getWahlbeteiligung(new BezirkUndWahlID(wahlID, wahlbezirkID))); } /** @@ -35,7 +35,7 @@ WaehleranzahlDTO getWahlbeteiligung(@PathVariable("wahlID") String wahlID, @Path @Operation(description = "Speichern und Weiterleiten der Wahlbeteiligung für die Wahl {wahlID} für den Wahlbezirk {wahlbezirkID}.") @PostMapping("/{wahlID}/{wahlbezirkID}") public void postWahlbeteiligung(@PathVariable("wahlbezirkID") String wahlbezirkID, @PathVariable("wahlID") String wahlID, - @RequestBody WaehleranzahlDTO waehleranzahl) { + @RequestBody WaehleranzahlDTO waehleranzahl) { log.info("postWahlbeteiligung {}", wahlbezirkID); val waehleranzahlSetModel = waehleranzahlDTOMapper.toSetModel(new BezirkUndWahlID(wahlID, wahlbezirkID), waehleranzahl); diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlClient.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlClient.java new file mode 100644 index 000000000..6aeabdd14 --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlClient.java @@ -0,0 +1,15 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.wls.common.exception.WlsException; + +public interface WaehleranzahlClient { + + /** + * @param waehleranzahlModel references a specific number of voters for a wahlId, wahlbezirkID and + * time + * @throws WlsException + * {@link de.muenchen.oss.wahllokalsystem.wls.common.exception.TechnischeWlsException} + * if there were trouble during communication + */ + void postWahlbeteiligung(final WaehleranzahlModel waehleranzahlModel) throws WlsException; +} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapper.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapper.java index 0fb85afaf..84554e90e 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapper.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapper.java @@ -1,6 +1,6 @@ package de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl; -import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.wahleranzahl.Waehleranzahl; +import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; import org.mapstruct.Mapper; @Mapper diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java index 116b5f833..1e3d858cd 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java @@ -1,6 +1,6 @@ package de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl; -import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.wahleranzahl.WahleranzahlRepository; +import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; @@ -14,9 +14,10 @@ public class WaehleranzahlService { private final WaehleranzahlValidator waehleranzahlValidator; - private final WahleranzahlRepository waehleranzahlRepository; + private final WaehleranzahlRepository waehleranzahlRepository; private final WaehleranzahlModelMapper waehleranzahlModelMapper; private final ExceptionFactory exceptionFactory; + private final WaehleranzahlClient waehleranzahlClient; public WaehleranzahlModel getWahlbeteiligung(BezirkUndWahlID bezirkUndWahlID) { @@ -25,9 +26,6 @@ public WaehleranzahlModel getWahlbeteiligung(BezirkUndWahlID bezirkUndWahlID) { return waehleranzahlModelMapper.toModel(waehleranzahlRepository.findFirstByBezirkUndWahlIDOrderByUhrzeitDesc(bezirkUndWahlID)); } - /** - * This BusinessAction's purpose is: Speichern und Weiterleiten der Wahlbeteiligung. - */ public void postWahlbeteiligung(WaehleranzahlModel waehleranzahl) { waehleranzahlValidator.validWaehleranzahlSetModel(waehleranzahl); @@ -39,8 +37,6 @@ public void postWahlbeteiligung(WaehleranzahlModel waehleranzahl) { throw exceptionFactory.createTechnischeWlsException(ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE); } - // - // waehleranzahl.setBezirkUndWahlID(new BezirkUndWahlID(waehleranzahl.getBezirkUndWahlID().getWahlbezirkID(), null)); - // aoueaiTemplate.saveWahlbeteiligung(getWahlbeteiligungsMeldung_(waehleranzahl)); + waehleranzahlClient.postWahlbeteiligung(waehleranzahl); } } diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidator.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidator.java index 9b612dc02..b1eb60492 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidator.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidator.java @@ -15,7 +15,7 @@ public class WaehleranzahlValidator { public void validWahlIdUndWahlbezirkIDOrThrow(final BezirkUndWahlID bezirkUndWahlID) { if (bezirkUndWahlID == null || StringUtils.isEmpty(bezirkUndWahlID.getWahlID()) || StringUtils.isEmpty(bezirkUndWahlID.getWahlbezirkID()) || - StringUtils.isBlank(bezirkUndWahlID.getWahlID()) || StringUtils.isBlank(bezirkUndWahlID.getWahlbezirkID())) { + StringUtils.isBlank(bezirkUndWahlID.getWahlID()) || StringUtils.isBlank(bezirkUndWahlID.getWahlbezirkID())) { throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG); } } diff --git a/wls-monitoring-service/src/main/resources/application.yml b/wls-monitoring-service/src/main/resources/application.yml index 075fe3973..a52841768 100644 --- a/wls-monitoring-service/src/main/resources/application.yml +++ b/wls-monitoring-service/src/main/resources/application.yml @@ -5,6 +5,7 @@ spring: group: local: - db-h2 + - dummy.clients flyway: locations: - classpath:db/migrations/{vendor} @@ -24,6 +25,10 @@ security: oauth2: resource.user-info-uri: http://kubernetes.docker.internal:8100/auth/realms/${realm}/protocol/openid-connect/userinfo +service: + info: + oid: WLS-MONITORING + # Define the local keycloak realm here realm: wls_realm @@ -57,3 +62,8 @@ management: enabled: true info.application.name: @project.artifactId@ info.application.version: @project.version@ + +app: + clients: + eai: + basePath: http://localhost:39146 \ No newline at end of file diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java index fb2d3bc1b..8d1e83f5a 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java @@ -39,43 +39,43 @@ class SecurityConfigurationTest { @Test void accessSecuredResourceRootThenUnauthorized() throws Exception { api.perform(get("/")) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test void accessSecuredResourceActuatorThenUnauthorized() throws Exception { api.perform(get("/actuator")) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test void accessUnsecuredResourceActuatorHealthThenOk() throws Exception { api.perform(get("/actuator/health")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceActuatorInfoThenOk() throws Exception { api.perform(get("/actuator/info")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceActuatorMetricsThenOk() throws Exception { api.perform(get("/actuator/metrics")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceV3ApiDocsThenOk() throws Exception { api.perform(get("/v3/api-docs")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceSwaggerUiThenOk() throws Exception { api.perform(get("/swagger-ui/index.html")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Nested diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java index ab7d8492f..1f1d9e1c5 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java @@ -21,12 +21,12 @@ import org.springframework.test.context.ActiveProfiles; @SpringBootTest( - classes = { MicroServiceApplication.class }, - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = { - "spring.datasource.url=jdbc:h2:mem:testexample;DB_CLOSE_ON_EXIT=FALSE", - "refarch.gracefulshutdown.pre-wait-seconds=0" - } + classes = { MicroServiceApplication.class }, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + properties = { + "spring.datasource.url=jdbc:h2:mem:testexample;DB_CLOSE_ON_EXIT=FALSE", + "refarch.gracefulshutdown.pre-wait-seconds=0" + } ) @ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) class UnicodeConfigurationTest { From 9eab7e248004516124c39976df331ddce5191440 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Thu, 17 Oct 2024 15:53:08 +0200 Subject: [PATCH 04/43] test implemented --- .../SecurityConfigurationTest.java | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java index 8d1e83f5a..bc64bc9cc 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java @@ -1,14 +1,16 @@ package de.muenchen.oss.wahllokalsystem.monitoringservice.configuration; import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_TEST_PROFILE; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.fasterxml.jackson.databind.ObjectMapper; import de.muenchen.oss.wahllokalsystem.monitoringservice.MicroServiceApplication; +import de.muenchen.oss.wahllokalsystem.monitoringservice.rest.waehleranzahl.WaehleranzahlDTO; import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlService; import lombok.val; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -16,10 +18,11 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithAnonymousUser; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @SpringBootTest(classes = MicroServiceApplication.class, webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc @@ -39,55 +42,74 @@ class SecurityConfigurationTest { @Test void accessSecuredResourceRootThenUnauthorized() throws Exception { api.perform(get("/")) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test void accessSecuredResourceActuatorThenUnauthorized() throws Exception { api.perform(get("/actuator")) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test void accessUnsecuredResourceActuatorHealthThenOk() throws Exception { api.perform(get("/actuator/health")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceActuatorInfoThenOk() throws Exception { api.perform(get("/actuator/info")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceActuatorMetricsThenOk() throws Exception { api.perform(get("/actuator/metrics")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceV3ApiDocsThenOk() throws Exception { api.perform(get("/v3/api-docs")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceSwaggerUiThenOk() throws Exception { api.perform(get("/swagger-ui/index.html")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Nested class Waehleranzahl { @Test - @Disabled @WithAnonymousUser - void accessGetWaehleranzahlUnauthorizedThenUnauthorized() throws Exception { - val request = MockMvcRequestBuilders.get("/businessActions/waehleranzahl"); + void get_should_return401Unauthorized_when_UnauthorizedAnonymousUser() throws Exception { + api.perform(get("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID")).andExpect(status().isUnauthorized()); + } + + @Test + @WithMockUser + void get_should_return200OK_when_AuthorizedMockUser() throws Exception { + api.perform(get("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID")).andExpect(status().isOk()); + } + + @Test + @WithAnonymousUser + void post_should_return401Unauthorized_when_UnauthorizedAnonymousUser() throws Exception { + api.perform(post("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID").with(csrf())).andExpect(status().isUnauthorized()); + } + + @Test + @WithMockUser + void post_should_return200OK_when_AuthorizedMockUser() throws Exception { + val requestBody = new WaehleranzahlDTO(null, null, null, null); + val request = post("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID").with(csrf()).contentType(MediaType.APPLICATION_JSON).content( + objectMapper.writeValueAsString(requestBody)); - api.perform(request).andExpect(status().isUnauthorized()); + api.perform(request).andExpect(status().isOk()); } } From 2466f617f5f731e9f47d16b9523635699d125ef6 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Thu, 17 Oct 2024 15:54:26 +0200 Subject: [PATCH 05/43] test deleted - no string property available --- .../UnicodeConfigurationTest.java | 89 ------------------- 1 file changed, 89 deletions(-) delete mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/UnicodeConfigurationTest.java diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/UnicodeConfigurationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/UnicodeConfigurationTest.java deleted file mode 100644 index 2efbce9b0..000000000 --- a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/UnicodeConfigurationTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik - * der Landeshauptstadt München, 2024 - */ -package de.muenchen.oss.wahllokalsystem.basisdatenservice.configuration; - -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.wahltag.Wahltag; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahltag.WahltagRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Farbe; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.WahlRepository; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahlart; -import de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO; -import java.net.URI; -import java.time.LocalDate; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import lombok.val; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest( - classes = { MicroServiceApplication.class }, - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = { - "spring.datasource.url=jdbc:h2:mem:testexample;DB_CLOSE_ON_EXIT=FALSE", - "refarch.gracefulshutdown.pre-wait-seconds=0" - } -) -@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) -class UnicodeConfigurationTest { - - private static final String WAHLEN_ENDPOINT_URL = "/businessActions/wahlen/"; - - /** - * Decomposed string: String "Ä-é" represented with unicode letters "A◌̈-e◌́" - */ - private static final String TEXT_ATTRIBUTE_DECOMPOSED = "\u0041\u0308-\u0065\u0301"; - - /** - * Composed string: String "Ä-é" represented with unicode letters "Ä-é". - */ - private static final String TEXT_ATTRIBUTE_COMPOSED = "\u00c4-\u00e9"; - - @Autowired - private TestRestTemplate testRestTemplate; - - @Autowired - private WahlRepository wahlRepository; - - @Autowired - WahltagRepository wahltagRepository; - - @Test - void testForNfcNormalization() { - - // Persist entity with decomposed string - // wahltag required for next step to store a list of wahlen - var searchingForWahltag = new Wahltag("wahltagID", LocalDate.now(), "beschreibung5", "1"); - wahltagRepository.save(searchingForWahltag); - // create a list of Wahl with only one Wahl containing the TEXT_ATTRIBUTE_DECOMPOSED as 'name' - val wahlDTOList = createControllerListOfWahlDTO(searchingForWahltag); - Assertions.assertThat(wahlDTOList.get(0).name()).hasSize(TEXT_ATTRIBUTE_DECOMPOSED.length()); - // store list of Wahl - testRestTemplate.postForEntity(URI.create(WAHLEN_ENDPOINT_URL + searchingForWahltag.getWahltagID()), wahlDTOList, Void.class); - - // Get the one and only Wahl from repo which now should contain a composed string in the 'name' attribute - val wahl = wahlRepository.findById("wahlID1").orElseThrow(); - Assertions.assertThat(TEXT_ATTRIBUTE_COMPOSED).isEqualTo(wahl.getName()); - Assertions.assertThat(wahl.getName()).hasSize(TEXT_ATTRIBUTE_COMPOSED.length()); - } - - private List createControllerListOfWahlDTO(Wahltag searchingForWahltag) { - val wahl1 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO("wahlID1", TEXT_ATTRIBUTE_DECOMPOSED, 3L, 1L, - searchingForWahltag.getWahltag(), - Wahlart.BAW, new Farbe(1, 1, 1), "1"); - - return Stream.of(wahl1).filter(wahl -> (wahl.wahltag().equals(searchingForWahltag.getWahltag()))).collect(Collectors.toList()); - } - -} From 53b0383e030734fbaef0b8e8b4525d97b470b924 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Thu, 17 Oct 2024 15:57:28 +0200 Subject: [PATCH 06/43] Revert "test deleted - no string property available" This reverts commit 2466f617f5f731e9f47d16b9523635699d125ef6. --- .../UnicodeConfigurationTest.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/UnicodeConfigurationTest.java diff --git a/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/UnicodeConfigurationTest.java b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/UnicodeConfigurationTest.java new file mode 100644 index 000000000..2efbce9b0 --- /dev/null +++ b/wls-basisdaten-service/src/test/java/de/muenchen/oss/wahllokalsystem/basisdatenservice/configuration/UnicodeConfigurationTest.java @@ -0,0 +1,89 @@ +/* + * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik + * der Landeshauptstadt München, 2024 + */ +package de.muenchen.oss.wahllokalsystem.basisdatenservice.configuration; + +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.wahltag.Wahltag; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahltag.WahltagRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Farbe; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.WahlRepository; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlen.Wahlart; +import de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO; +import java.net.URI; +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import lombok.val; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest( + classes = { MicroServiceApplication.class }, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + properties = { + "spring.datasource.url=jdbc:h2:mem:testexample;DB_CLOSE_ON_EXIT=FALSE", + "refarch.gracefulshutdown.pre-wait-seconds=0" + } +) +@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) +class UnicodeConfigurationTest { + + private static final String WAHLEN_ENDPOINT_URL = "/businessActions/wahlen/"; + + /** + * Decomposed string: String "Ä-é" represented with unicode letters "A◌̈-e◌́" + */ + private static final String TEXT_ATTRIBUTE_DECOMPOSED = "\u0041\u0308-\u0065\u0301"; + + /** + * Composed string: String "Ä-é" represented with unicode letters "Ä-é". + */ + private static final String TEXT_ATTRIBUTE_COMPOSED = "\u00c4-\u00e9"; + + @Autowired + private TestRestTemplate testRestTemplate; + + @Autowired + private WahlRepository wahlRepository; + + @Autowired + WahltagRepository wahltagRepository; + + @Test + void testForNfcNormalization() { + + // Persist entity with decomposed string + // wahltag required for next step to store a list of wahlen + var searchingForWahltag = new Wahltag("wahltagID", LocalDate.now(), "beschreibung5", "1"); + wahltagRepository.save(searchingForWahltag); + // create a list of Wahl with only one Wahl containing the TEXT_ATTRIBUTE_DECOMPOSED as 'name' + val wahlDTOList = createControllerListOfWahlDTO(searchingForWahltag); + Assertions.assertThat(wahlDTOList.get(0).name()).hasSize(TEXT_ATTRIBUTE_DECOMPOSED.length()); + // store list of Wahl + testRestTemplate.postForEntity(URI.create(WAHLEN_ENDPOINT_URL + searchingForWahltag.getWahltagID()), wahlDTOList, Void.class); + + // Get the one and only Wahl from repo which now should contain a composed string in the 'name' attribute + val wahl = wahlRepository.findById("wahlID1").orElseThrow(); + Assertions.assertThat(TEXT_ATTRIBUTE_COMPOSED).isEqualTo(wahl.getName()); + Assertions.assertThat(wahl.getName()).hasSize(TEXT_ATTRIBUTE_COMPOSED.length()); + } + + private List createControllerListOfWahlDTO(Wahltag searchingForWahltag) { + val wahl1 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO("wahlID1", TEXT_ATTRIBUTE_DECOMPOSED, 3L, 1L, + searchingForWahltag.getWahltag(), + Wahlart.BAW, new Farbe(1, 1, 1), "1"); + + return Stream.of(wahl1).filter(wahl -> (wahl.wahltag().equals(searchingForWahltag.getWahltag()))).collect(Collectors.toList()); + } + +} From c4274588193ae5f12ede8fbd21310867d90d621e Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Thu, 17 Oct 2024 15:58:33 +0200 Subject: [PATCH 07/43] test deleted - no string property available --- .../UnicodeConfigurationTest.java | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java deleted file mode 100644 index 1f1d9e1c5..000000000 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/UnicodeConfigurationTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik - * der Landeshauptstadt München, 2024 - */ -package de.muenchen.oss.wahllokalsystem.monitoringservice.configuration; - -import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_NO_SECURITY_PROFILE; -import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_TEST_PROFILE; -import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.TheEntityDto; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import de.muenchen.oss.wahllokalsystem.monitoringservice.MicroServiceApplication; -import java.net.URI; -import java.util.UUID; -import org.apache.commons.lang3.StringUtils; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest( - classes = { MicroServiceApplication.class }, - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = { - "spring.datasource.url=jdbc:h2:mem:testexample;DB_CLOSE_ON_EXIT=FALSE", - "refarch.gracefulshutdown.pre-wait-seconds=0" - } -) -@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) -class UnicodeConfigurationTest { - - private static final String ENTITY_ENDPOINT_URL = "/theEntities"; - - /** - * Decomposed string: String "Ä-é" represented with unicode letters "A◌̈-e◌́" - */ - private static final String TEXT_ATTRIBUTE_DECOMPOSED = "\u0041\u0308-\u0065\u0301"; - - /** - * Composed string: String "Ä-é" represented with unicode letters "Ä-é". - */ - private static final String TEXT_ATTRIBUTE_COMPOSED = "\u00c4-\u00e9"; - - @Autowired - private TestRestTemplate testRestTemplate; - - @Test - @Disabled - void testForNfcNormalization() { - // Persist entity with decomposed string. - final TheEntityDto theEntityDto = new TheEntityDto(); - theEntityDto.setTextAttribute(TEXT_ATTRIBUTE_DECOMPOSED); - assertEquals(TEXT_ATTRIBUTE_DECOMPOSED.length(), theEntityDto.getTextAttribute().length()); - final TheEntityDto response = testRestTemplate.postForEntity(URI.create(ENTITY_ENDPOINT_URL), theEntityDto, TheEntityDto.class).getBody(); - - // Check whether response contains a composed string. - assertEquals(TEXT_ATTRIBUTE_COMPOSED, response.getTextAttribute()); - assertEquals(TEXT_ATTRIBUTE_COMPOSED.length(), response.getTextAttribute().length()); - - // Extract uuid from self link. - final UUID uuid = UUID.fromString(StringUtils.substringAfterLast(response.getRequiredLink("self").getHref(), "/")); - - // Check persisted entity contains a composed string via JPA repository. - //final Waehleranzahl theEntity = theEntityRepository.findById(uuid).orElse(null); - //assertEquals(TEXT_ATTRIBUTE_COMPOSED, theEntity.getTextAttribute()); - //assertEquals(TEXT_ATTRIBUTE_COMPOSED.length(), theEntity.getTextAttribute().length()); - } - -} From ec6b84923954a4c40c86a8c6f1a7d77f905293e5 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Thu, 17 Oct 2024 17:13:04 +0200 Subject: [PATCH 08/43] useless method in repository removed --- .../WaehleranzahlRepository.java | 3 -- .../waehleranzahl/WaehleranzahlService.java | 8 ++- .../monitoringservice/TestConstants.java | 16 ------ .../WaehleranzahlRepositoryTest.java | 54 +++++++++++++++++++ 4 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepository.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepository.java index e119421a3..c6da41725 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepository.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepository.java @@ -44,7 +44,4 @@ public interface WaehleranzahlRepository extends CrudRepository exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)); } public void postWahlbeteiligung(WaehleranzahlModel waehleranzahl) { diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/TestConstants.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/TestConstants.java index 4baaa9a9e..6668e6af7 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/TestConstants.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/TestConstants.java @@ -5,12 +5,7 @@ package de.muenchen.oss.wahllokalsystem.monitoringservice; import lombok.AccessLevel; -import lombok.EqualsAndHashCode; -import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import org.springframework.hateoas.RepresentationModel; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class TestConstants { @@ -19,15 +14,4 @@ public final class TestConstants { public static final String SPRING_NO_SECURITY_PROFILE = "no-security"; - @NoArgsConstructor - @Getter - @Setter - @EqualsAndHashCode(callSuper = true) - @ToString(callSuper = true) - public static class TheEntityDto extends RepresentationModel { - - private String textAttribute; - - } - } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java new file mode 100644 index 000000000..fc27b364a --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java @@ -0,0 +1,54 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl; + +import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_NO_SECURITY_PROFILE; +import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_TEST_PROFILE; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.MicroServiceApplication; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; +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; + +@SpringBootTest( + classes = { MicroServiceApplication.class }, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT +) +@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) +@Slf4j +class WaehleranzahlRepositoryTest { + + @Autowired + private WaehleranzahlRepository waehleranzahlRepository; + + @AfterEach + void tearDown() { + waehleranzahlRepository.deleteAll(); + } + + /** + * Tests if found Waehleranzahl is the one with the latest 'uhrzeit' + */ + @Test + void findFirstByBezirkUndWahlIDOrderByUhrzeitDesc() { + val waehleranzahl4 = new Waehleranzahl(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 40, LocalDateTime.now().minusHours(4)); + val waehleranzahl1 = new Waehleranzahl(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 10, LocalDateTime.now()); + val waehleranzahl3 = new Waehleranzahl(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 30, LocalDateTime.now().minusHours(3)); + val waehleranzahl2 = new Waehleranzahl(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 20, LocalDateTime.now().minusHours(2)); + List waehleranzahlToSave = Arrays.asList(waehleranzahl2, waehleranzahl1, waehleranzahl3, waehleranzahl4); + + waehleranzahlRepository.saveAll(waehleranzahlToSave); + val alle = waehleranzahlRepository.findAll(); + + Waehleranzahl waehleranzahl = waehleranzahlRepository.findFirstByBezirkUndWahlIDOrderByUhrzeitDesc(new BezirkUndWahlID("wahlID01", "wahlbezirkID01")); + + Assertions.assertThat(waehleranzahl).isEqualTo(waehleranzahl1); + } +} From e7fca84b6a792cf46bcebd6d14be94a4c5f76f5a Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Thu, 17 Oct 2024 17:14:31 +0200 Subject: [PATCH 09/43] typo and spotless:apply --- .../waehleranzahl/WaehleranzahlService.java | 4 ++-- .../configuration/SecurityConfigurationTest.java | 16 ++++++++-------- .../WaehleranzahlRepositoryTest.java | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java index f9be519d2..9a15fda06 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java @@ -1,6 +1,6 @@ package de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl; -unneeded import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; +import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; @@ -27,7 +27,7 @@ public WaehleranzahlModel getWahlbeteiligung(BezirkUndWahlID bezirkUndWahlID) { private Waehleranzahl getWahltagByIDOrThrow(final BezirkUndWahlID bezirkUndWahlID) { return waehleranzahlRepository.findById(bezirkUndWahlID) - .orElseThrow(() -> exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)); + .orElseThrow(() -> exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)); } public void postWahlbeteiligung(WaehleranzahlModel waehleranzahl) { diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java index bc64bc9cc..f177e67b0 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java @@ -42,43 +42,43 @@ class SecurityConfigurationTest { @Test void accessSecuredResourceRootThenUnauthorized() throws Exception { api.perform(get("/")) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test void accessSecuredResourceActuatorThenUnauthorized() throws Exception { api.perform(get("/actuator")) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test void accessUnsecuredResourceActuatorHealthThenOk() throws Exception { api.perform(get("/actuator/health")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceActuatorInfoThenOk() throws Exception { api.perform(get("/actuator/info")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceActuatorMetricsThenOk() throws Exception { api.perform(get("/actuator/metrics")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceV3ApiDocsThenOk() throws Exception { api.perform(get("/v3/api-docs")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceSwaggerUiThenOk() throws Exception { api.perform(get("/swagger-ui/index.html")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Nested @@ -107,7 +107,7 @@ void post_should_return401Unauthorized_when_UnauthorizedAnonymousUser() throws E void post_should_return200OK_when_AuthorizedMockUser() throws Exception { val requestBody = new WaehleranzahlDTO(null, null, null, null); val request = post("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID").with(csrf()).contentType(MediaType.APPLICATION_JSON).content( - objectMapper.writeValueAsString(requestBody)); + objectMapper.writeValueAsString(requestBody)); api.perform(request).andExpect(status().isOk()); } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java index fc27b364a..c9fe56c5f 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java @@ -18,8 +18,8 @@ import org.springframework.test.context.ActiveProfiles; @SpringBootTest( - classes = { MicroServiceApplication.class }, - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT + classes = { MicroServiceApplication.class }, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT ) @ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) @Slf4j From 7d0cd901a405c5b4576a06e0102225fcb812916b Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Thu, 17 Oct 2024 17:15:40 +0200 Subject: [PATCH 10/43] test not needed --- .../WaehleranzahlRepositoryTest.java | 54 ------------------- 1 file changed, 54 deletions(-) delete mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java deleted file mode 100644 index c9fe56c5f..000000000 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/WaehleranzahlRepositoryTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl; - -import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_NO_SECURITY_PROFILE; -import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_TEST_PROFILE; - -import de.muenchen.oss.wahllokalsystem.monitoringservice.MicroServiceApplication; -import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.List; -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; - -@SpringBootTest( - classes = { MicroServiceApplication.class }, - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT -) -@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) -@Slf4j -class WaehleranzahlRepositoryTest { - - @Autowired - private WaehleranzahlRepository waehleranzahlRepository; - - @AfterEach - void tearDown() { - waehleranzahlRepository.deleteAll(); - } - - /** - * Tests if found Waehleranzahl is the one with the latest 'uhrzeit' - */ - @Test - void findFirstByBezirkUndWahlIDOrderByUhrzeitDesc() { - val waehleranzahl4 = new Waehleranzahl(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 40, LocalDateTime.now().minusHours(4)); - val waehleranzahl1 = new Waehleranzahl(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 10, LocalDateTime.now()); - val waehleranzahl3 = new Waehleranzahl(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 30, LocalDateTime.now().minusHours(3)); - val waehleranzahl2 = new Waehleranzahl(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 20, LocalDateTime.now().minusHours(2)); - List waehleranzahlToSave = Arrays.asList(waehleranzahl2, waehleranzahl1, waehleranzahl3, waehleranzahl4); - - waehleranzahlRepository.saveAll(waehleranzahlToSave); - val alle = waehleranzahlRepository.findAll(); - - Waehleranzahl waehleranzahl = waehleranzahlRepository.findFirstByBezirkUndWahlIDOrderByUhrzeitDesc(new BezirkUndWahlID("wahlID01", "wahlbezirkID01")); - - Assertions.assertThat(waehleranzahl).isEqualTo(waehleranzahl1); - } -} From 42fb6ffa2a87f93cf81d51bae752dd404e489281 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 18 Oct 2024 09:35:09 +0200 Subject: [PATCH 11/43] test added; method renamed according to our conventions --- .../SecurityConfigurationTest.java | 24 +++++----- .../WaehleranzahlModelMapperTest.java | 46 +++++++++++++++++++ 2 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java index f177e67b0..861e7adad 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java @@ -42,43 +42,43 @@ class SecurityConfigurationTest { @Test void accessSecuredResourceRootThenUnauthorized() throws Exception { api.perform(get("/")) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test void accessSecuredResourceActuatorThenUnauthorized() throws Exception { api.perform(get("/actuator")) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test void accessUnsecuredResourceActuatorHealthThenOk() throws Exception { api.perform(get("/actuator/health")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceActuatorInfoThenOk() throws Exception { api.perform(get("/actuator/info")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceActuatorMetricsThenOk() throws Exception { api.perform(get("/actuator/metrics")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceV3ApiDocsThenOk() throws Exception { api.perform(get("/v3/api-docs")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceSwaggerUiThenOk() throws Exception { api.perform(get("/swagger-ui/index.html")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Nested @@ -86,28 +86,28 @@ class Waehleranzahl { @Test @WithAnonymousUser - void get_should_return401Unauthorized_when_UnauthorizedAnonymousUser() throws Exception { + void should_return401Unauthorized_when_GetWithUnauthorizedAnonymousUser() throws Exception { api.perform(get("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID")).andExpect(status().isUnauthorized()); } @Test @WithMockUser - void get_should_return200OK_when_AuthorizedMockUser() throws Exception { + void should_return200OK_when_GetWithAuthorizedMockUser() throws Exception { api.perform(get("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID")).andExpect(status().isOk()); } @Test @WithAnonymousUser - void post_should_return401Unauthorized_when_UnauthorizedAnonymousUser() throws Exception { + void should_return401Unauthorized_when_PostWithUnauthorizedAnonymousUser() throws Exception { api.perform(post("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID").with(csrf())).andExpect(status().isUnauthorized()); } @Test @WithMockUser - void post_should_return200OK_when_AuthorizedMockUser() throws Exception { + void should_return200OK_when_PostWithAuthorizedMockUser() throws Exception { val requestBody = new WaehleranzahlDTO(null, null, null, null); val request = post("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID").with(csrf()).contentType(MediaType.APPLICATION_JSON).content( - objectMapper.writeValueAsString(requestBody)); + objectMapper.writeValueAsString(requestBody)); api.perform(request).andExpect(status().isOk()); } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java new file mode 100644 index 000000000..9c0f088e0 --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java @@ -0,0 +1,46 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.time.LocalDateTime; +import lombok.val; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +class WaehleranzahlModelMapperTest { + + private final WaehleranzahlModelMapper unitUnderTest = Mappers.getMapper(WaehleranzahlModelMapper.class); + + @Test + void should_returnEqualWaehleranzahlModel_when_WaehleranzahlIsMapped() { + val wahlID = "wahlID01"; + val wahlbezirkID = "wahlbezirkID01"; + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val anzahlWaehler = 99L; + LocalDateTime uhrzeit = LocalDateTime.now(); + val waehleranzahlEntity = new Waehleranzahl(bezirkUndWahlID, anzahlWaehler, uhrzeit); + + val waehleranzahlModel = unitUnderTest.toModel(waehleranzahlEntity); + + val expectedResult = new WaehleranzahlModel(bezirkUndWahlID, anzahlWaehler, uhrzeit); + + Assertions.assertThat(waehleranzahlModel).isEqualTo(expectedResult); + } + + @Test + void should_returnEqualWaehleranzahl_when_WaehleranzahlModelIsMapped() { + val wahlID = "wahlID01"; + val wahlbezirkID = "wahlbezirkID01"; + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val anzahlWaehler = 99L; + LocalDateTime uhrzeit = LocalDateTime.now(); + val waehleranzahlModel = new WaehleranzahlModel(bezirkUndWahlID, anzahlWaehler, uhrzeit); + + val waehleranzahlEntity = unitUnderTest.toEntity(waehleranzahlModel); + + val expectedResult = new Waehleranzahl(bezirkUndWahlID, anzahlWaehler, uhrzeit); + + Assertions.assertThat(waehleranzahlEntity).isEqualTo(expectedResult); + } +} From e1037370ad3de5575a0f8e79497575527e6941da Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 18 Oct 2024 13:15:56 +0200 Subject: [PATCH 12/43] service tests added --- .../KonfigurationServiceSecurityTest.java | 21 +-- .../exception/ExceptionConstants.java | 1 + .../WaehleranzahlController.java | 3 - .../waehleranzahl/WaehleranzahlService.java | 9 +- .../SecurityConfigurationTest.java | 18 +-- .../WaehleranzahlServiceSecurityTest.java | 149 ++++++++++++++++++ .../WaehleranzahlServiceTest.java | 116 ++++++++++++++ .../monitoringservice/utils/Authorities.java | 24 +++ .../src/test/resources/application-test.yml | 27 ++++ 9 files changed, 341 insertions(+), 27 deletions(-) create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/Authorities.java create mode 100644 wls-monitoring-service/src/test/resources/application-test.yml diff --git a/wls-infomanagement-service/src/test/java/de/muenchen/oss/wahllokalsystem/infomanagementservice/service/konfiguration/KonfigurationServiceSecurityTest.java b/wls-infomanagement-service/src/test/java/de/muenchen/oss/wahllokalsystem/infomanagementservice/service/konfiguration/KonfigurationServiceSecurityTest.java index fd604dbaf..94ef22bcc 100644 --- a/wls-infomanagement-service/src/test/java/de/muenchen/oss/wahllokalsystem/infomanagementservice/service/konfiguration/KonfigurationServiceSecurityTest.java +++ b/wls-infomanagement-service/src/test/java/de/muenchen/oss/wahllokalsystem/infomanagementservice/service/konfiguration/KonfigurationServiceSecurityTest.java @@ -1,5 +1,7 @@ package de.muenchen.oss.wahllokalsystem.infomanagementservice.service.konfiguration; +import static org.springframework.security.core.context.SecurityContextHolder.clearContext; + import de.muenchen.oss.wahllokalsystem.infomanagementservice.MicroServiceApplication; import de.muenchen.oss.wahllokalsystem.infomanagementservice.TestConstants; import de.muenchen.oss.wahllokalsystem.infomanagementservice.domain.konfiguration.Konfiguration; @@ -25,7 +27,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.ActiveProfiles; @SpringBootTest(classes = MicroServiceApplication.class) @@ -43,7 +44,7 @@ public class KonfigurationServiceSecurityTest { @BeforeEach void setup() { - SecurityContextHolder.clearContext(); + clearContext(); } @AfterEach @@ -68,7 +69,7 @@ void anyMissingAuthorityCausesFail(final ArgumentsAccessor argumentsAccessor) { SecurityUtils.runWith(argumentsAccessor.get(0, String[].class)); Assertions.assertThatThrownBy(() -> konfigurationService.getKonfiguration(KonfigurationKonfigKey.WILLKOMMENSTEXT)) - .isInstanceOf(AccessDeniedException.class); + .isInstanceOf(AccessDeniedException.class); } private static Stream getMissingAuthoritiesVariations() { @@ -91,23 +92,23 @@ void accessGranted() { @Test void accessDeniedOnMissingServiceAuthority() { SecurityUtils.runWith( - removeAuthority(Authorities.ALL_AUTHORITIES_SET_KONFIGURATION, Authorities.SERVICE_POST_KONFIGURATION)); + removeAuthority(Authorities.ALL_AUTHORITIES_SET_KONFIGURATION, Authorities.SERVICE_POST_KONFIGURATION)); val konfigurationSetModel = new KonfigurationSetModel("schluessel", "wert", "beschreibung", "standwert"); Assertions.assertThatThrownBy(() -> konfigurationService.setKonfiguration(konfigurationSetModel)) - .isInstanceOf(AccessDeniedException.class); + .isInstanceOf(AccessDeniedException.class); } @Test void wlsExceptionOnMissingWriteAuthority() { SecurityUtils.runWith( - removeAuthority(Authorities.ALL_AUTHORITIES_SET_KONFIGURATION, Authorities.REPOSITORY_WRITE_KONFIGURATION)); + removeAuthority(Authorities.ALL_AUTHORITIES_SET_KONFIGURATION, Authorities.REPOSITORY_WRITE_KONFIGURATION)); val konfigurationSetModel = new KonfigurationSetModel("schluessel", "wert", "beschreibung", "standwert"); Assertions.assertThatThrownBy(() -> konfigurationService.setKonfiguration(konfigurationSetModel)) - .isInstanceOf(TechnischeWlsException.class); + .isInstanceOf(TechnischeWlsException.class); } private String[] removeAuthority(final String[] authorities, final String authorityToRemove) { @@ -132,7 +133,7 @@ void anyMissingAuthorityCausesFail(final ArgumentsAccessor argumentsAccessor) { SecurityUtils.runWith(argumentsAccessor.get(0, String[].class)); Assertions.assertThatThrownBy(() -> konfigurationService.getAllKonfigurations()) - .isInstanceOf(AccessDeniedException.class); + .isInstanceOf(AccessDeniedException.class); } private static Stream getMissingAuthoritiesVariations() { @@ -162,7 +163,7 @@ void anyMissingAuthorityCausesFail(final ArgumentsAccessor argumentsAccessor) { SecurityUtils.runWith(argumentsAccessor.get(0, String[].class)); Assertions.assertThatThrownBy(() -> konfigurationService.getKennbuchstabenListen()) - .isInstanceOf(AccessDeniedException.class); + .isInstanceOf(AccessDeniedException.class); } private static Stream getMissingAuthoritiesVariations() { @@ -174,7 +175,7 @@ private static Stream getMissingAuthoritiesVariations() { class GetKonfigurationUnauthorized { @Test void accessGranted() { - SecurityContextHolder.clearContext(); + clearContext(); Assertions.assertThatNoException().isThrownBy(() -> konfigurationService.getKonfigurationUnauthorized(KonfigurationKonfigKey.WILLKOMMENSTEXT)); } diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java index be20ff26d..231a5170a 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java @@ -10,6 +10,7 @@ public class ExceptionConstants { //waehleranzahl public static final ExceptionDataWrapper GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG = new ExceptionDataWrapper("102", "Fehler in getWahlbeteiligung(): Parameter unvollstaendig."); + public static ExceptionDataWrapper GETWAHLBETEILIGUNG_KEINE_DATEN = new ExceptionDataWrapper("302", "Die Wahlbeteiligung konnte nicht geladen werden."); public static final ExceptionDataWrapper POSTWAHLBETEILIGUNG_UNSAVEABLE = new ExceptionDataWrapper("101", "Fehler in postWahlbeteiligung(): Waehleranzahl konnte nicht gespeichert werden."); diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java index 670d2809a..0277962ca 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java @@ -29,9 +29,6 @@ WaehleranzahlDTO getWahlbeteiligung(@PathVariable("wahlID") String wahlID, @Path waehleranzahlService.getWahlbeteiligung(new BezirkUndWahlID(wahlID, wahlbezirkID))); } - /** - * This BusinessAction's purpose is: Speichern und Weiterleiten der Wahlbeteiligung. - */ @Operation(description = "Speichern und Weiterleiten der Wahlbeteiligung für die Wahl {wahlID} für den Wahlbezirk {wahlbezirkID}.") @PostMapping("/{wahlID}/{wahlbezirkID}") public void postWahlbeteiligung(@PathVariable("wahlbezirkID") String wahlbezirkID, @PathVariable("wahlID") String wahlID, diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java index 9a15fda06..0cd581a1d 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java @@ -7,6 +7,7 @@ import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; @Service @@ -20,6 +21,7 @@ public class WaehleranzahlService { private final ExceptionFactory exceptionFactory; private final WaehleranzahlClient waehleranzahlClient; + @PreAuthorize("hasAuthority('Monitoring_BUSINESSACTION_GetWahlbeteiligung')") public WaehleranzahlModel getWahlbeteiligung(BezirkUndWahlID bezirkUndWahlID) { waehleranzahlValidator.validWahlIdUndWahlbezirkIDOrThrow(bezirkUndWahlID); return waehleranzahlModelMapper.toModel(getWahltagByIDOrThrow(bezirkUndWahlID)); @@ -27,20 +29,19 @@ public WaehleranzahlModel getWahlbeteiligung(BezirkUndWahlID bezirkUndWahlID) { private Waehleranzahl getWahltagByIDOrThrow(final BezirkUndWahlID bezirkUndWahlID) { return waehleranzahlRepository.findById(bezirkUndWahlID) - .orElseThrow(() -> exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)); + .orElseThrow(() -> exceptionFactory.createTechnischeWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_KEINE_DATEN)); } + @PreAuthorize("hasAuthority('Monitoring_BUSINESSACTION_PostWahlbeteiligung')") public void postWahlbeteiligung(WaehleranzahlModel waehleranzahl) { - waehleranzahlValidator.validWaehleranzahlSetModel(waehleranzahl); try { waehleranzahlRepository.save(waehleranzahlModelMapper.toEntity(waehleranzahl)); } catch (Exception e) { log.error("#postWahlbeteiligung: Die Wahlen konnten aufgrund eines Fehlers nicht gespeichert werden:", e); - throw exceptionFactory.createTechnischeWlsException(ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE); + throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE); } - waehleranzahlClient.postWahlbeteiligung(waehleranzahl); } } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java index 861e7adad..990ec4ead 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java @@ -42,43 +42,43 @@ class SecurityConfigurationTest { @Test void accessSecuredResourceRootThenUnauthorized() throws Exception { api.perform(get("/")) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test void accessSecuredResourceActuatorThenUnauthorized() throws Exception { api.perform(get("/actuator")) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); } @Test void accessUnsecuredResourceActuatorHealthThenOk() throws Exception { api.perform(get("/actuator/health")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceActuatorInfoThenOk() throws Exception { api.perform(get("/actuator/info")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceActuatorMetricsThenOk() throws Exception { api.perform(get("/actuator/metrics")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceV3ApiDocsThenOk() throws Exception { api.perform(get("/v3/api-docs")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test void accessUnsecuredResourceSwaggerUiThenOk() throws Exception { api.perform(get("/swagger-ui/index.html")) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Nested @@ -107,11 +107,9 @@ void should_return401Unauthorized_when_PostWithUnauthorizedAnonymousUser() throw void should_return200OK_when_PostWithAuthorizedMockUser() throws Exception { val requestBody = new WaehleranzahlDTO(null, null, null, null); val request = post("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID").with(csrf()).contentType(MediaType.APPLICATION_JSON).content( - objectMapper.writeValueAsString(requestBody)); + objectMapper.writeValueAsString(requestBody)); api.perform(request).andExpect(status().isOk()); } - } - } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java new file mode 100644 index 000000000..346efc042 --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java @@ -0,0 +1,149 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl; + +import static org.springframework.security.core.context.SecurityContextHolder.clearContext; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.tomakehurst.wiremock.client.WireMock; +import de.muenchen.oss.wahllokalsystem.monitoringservice.MicroServiceApplication; +import de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants; +import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; +import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; +import de.muenchen.oss.wahllokalsystem.monitoringservice.rest.waehleranzahl.WaehleranzahlDTOMapper; +import de.muenchen.oss.wahllokalsystem.monitoringservice.utils.Authorities; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import de.muenchen.oss.wahllokalsystem.wls.common.testing.SecurityUtils; +import java.time.LocalDateTime; +import java.util.stream.Stream; +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.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.boot.test.mock.mockito.MockBean; +import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(classes = MicroServiceApplication.class) +@ActiveProfiles({ TestConstants.SPRING_TEST_PROFILE }) +@AutoConfigureWireMock +public class WaehleranzahlServiceSecurityTest { + + @Autowired + WaehleranzahlService waehleranzahlService; + + @Autowired + WaehleranzahlRepository waehleranzahlRepository; + + @Autowired + WaehleranzahlDTOMapper waehleranzahlDTOMapper; + + @Autowired + ObjectMapper objectMapper; + + @MockBean + WaehleranzahlValidator waehleranzahlValidator; + + @BeforeEach + void setup() { + clearContext(); + } + + @AfterEach + void tearDown() { + SecurityUtils.runWith(Authorities.REPOSITORY_DELETE_WAEHLERANZAHL); + waehleranzahlRepository.deleteAll(); + } + + @Nested + class GetWahlbeteiligung { + + @Test + void should_grantAccessAndThrowNoException_when_AuthoritiesAreValid() { + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID("wahlID01", "wahlbezirkID01"); + SecurityUtils.runWith(Authorities.REPOSITORY_WRITE_WAEHLERANZAHL); + waehleranzahlRepository.save(new Waehleranzahl(bezirkUndWahlID, 99, LocalDateTime.now())); + + SecurityUtils.runWith(Authorities.ALL_AUTHORITIES_GET_WAEHLERANZAHL); + + Assertions.assertThatNoException().isThrownBy(() -> waehleranzahlService.getWahlbeteiligung(bezirkUndWahlID)); + } + + @ParameterizedTest(name = "{index} - {1} missing") + @MethodSource("getMissingAuthoritiesVariations") + void should_FailWithAccessDeniedException_when_AnyAuthorityIsMissing(final ArgumentsAccessor argumentsAccessor) { + SecurityUtils.runWith(argumentsAccessor.get(0, String[].class)); + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID("wahlID01", "wahlbezirkID01"); + Assertions.assertThatThrownBy(() -> waehleranzahlService.getWahlbeteiligung(bezirkUndWahlID)).isInstanceOf(AccessDeniedException.class); + } + + private static Stream getMissingAuthoritiesVariations() { + return SecurityUtils.buildArgumentsForMissingAuthoritiesVariations(Authorities.ALL_AUTHORITIES_GET_WAEHLERANZAHL); + } + } + + @Nested + class PostWahlbeteiligung { + + @Test + void should_grantAccessAndThrowNoException_when_AuthoritiesAreValid() throws Exception { + SecurityUtils.runWith(Authorities.ALL_AUTHORITIES_SET_WAEHLERANZAHL); + String wahlID = "wahlID01"; + String wahlbezirkID = "wahlbezirkID01"; + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val waehleranzahlToSave = new WaehleranzahlModel(bezirkUndWahlID, 99L, LocalDateTime.now()); + + val waehleranzahlDTO = waehleranzahlDTOMapper.toDTO(waehleranzahlToSave); + WireMock.stubFor(WireMock.post("/wahlbeteiligung") + .willReturn(WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.OK.value()) + .withBody(objectMapper.writeValueAsBytes(waehleranzahlDTO)))); + + Assertions.assertThatNoException().isThrownBy(() -> waehleranzahlService.postWahlbeteiligung(waehleranzahlToSave)); + } + + @Test + void should_FailWithAccessDeniedException_when_ServiceAuthorityIsMissing() throws Exception { + SecurityUtils.runWith(Authorities.REPOSITORY_WRITE_WAEHLERANZAHL); + + String wahlID = "wahlID01"; + String wahlbezirkID = "wahlbezirkID01"; + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val waehleranzahlToSave = new WaehleranzahlModel(bezirkUndWahlID, 99L, LocalDateTime.now()); + + val waehleranzahlDTO = waehleranzahlDTOMapper.toDTO(waehleranzahlToSave); + WireMock.stubFor(WireMock.post("/wahlbeteiligung") + .willReturn(WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.OK.value()) + .withBody(objectMapper.writeValueAsBytes(waehleranzahlDTO)))); + + Assertions.assertThatThrownBy(() -> waehleranzahlService.postWahlbeteiligung(waehleranzahlToSave)).isInstanceOf(AccessDeniedException.class); + } + + @Test + void should_FailWithFachlicheWlsException_when_RepoAuthorityIsMissing() throws Exception { + SecurityUtils.runWith(Authorities.SERVICE_POST_WAEHLERANZAHL); + + String wahlID = "wahlID01"; + String wahlbezirkID = "wahlbezirkID01"; + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val waehleranzahlToSave = new WaehleranzahlModel(bezirkUndWahlID, 99L, LocalDateTime.now()); + + val waehleranzahlDTO = waehleranzahlDTOMapper.toDTO(waehleranzahlToSave); + WireMock.stubFor(WireMock.post("/wahlbeteiligung") + .willReturn(WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.OK.value()) + .withBody(objectMapper.writeValueAsBytes(waehleranzahlDTO)))); + + Assertions.assertThatThrownBy(() -> waehleranzahlService.postWahlbeteiligung(waehleranzahlToSave)).isInstanceOf(FachlicheWlsException.class); + } + + } + +} diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java new file mode 100644 index 000000000..03ed40d88 --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java @@ -0,0 +1,116 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; +import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; +import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; +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; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.time.LocalDateTime; +import java.util.Optional; +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) +public class WaehleranzahlServiceTest { + + @Mock + WaehleranzahlRepository waehleranzahlRepository; + @Mock + WaehleranzahlModelMapper waehleranzahlModelMapper; + @Mock + WaehleranzahlValidator waehleranzahlValidator; + @Mock + WaehleranzahlClient waehleranzahlClient; + @Mock + ExceptionFactory exceptionFactory; + + @InjectMocks + WaehleranzahlService unitUnderTest; + + @Nested + class GetWahlbeteiligung { + + @Test + void should_returnRepoData_when_RepoDataFound() { + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID("wahlID01", "wahlbezirkID01"); + + val mockedRepoResponse = new Waehleranzahl(); + val mockedMappedRepoResponse = new WaehleranzahlModel(bezirkUndWahlID, 99L, LocalDateTime.now()); + Mockito.doNothing().when(waehleranzahlValidator).validWahlIdUndWahlbezirkIDOrThrow(bezirkUndWahlID); + + Mockito.when(waehleranzahlRepository.findById(bezirkUndWahlID)).thenReturn(Optional.of(mockedRepoResponse)); + Mockito.when(waehleranzahlModelMapper.toModel(mockedRepoResponse)).thenReturn(mockedMappedRepoResponse); + + Assertions.assertThat(unitUnderTest.getWahlbeteiligung(bezirkUndWahlID)).isSameAs(mockedMappedRepoResponse); + } + + @Test + void should_returnException_when_RepoDataNotFound() { + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID("wahlID01", "wahlbezirkID01"); + + val mockedWlsException = FachlicheWlsException.withCode("").buildWithMessage(""); + + Mockito.when(waehleranzahlRepository.findById(bezirkUndWahlID)).thenReturn(Optional.empty()); + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) + .thenReturn(mockedWlsException); + + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.getWahlbeteiligung(bezirkUndWahlID)).isSameAs(mockedWlsException); + } + } + + @Nested + class PostWahlbeteiligung { + + @Test + void should_notThrowExceptionAndSaveDataInRepo_when_ValidModelIsGiven() { + + val waehleranzahlSetModel = WaehleranzahlModel.builder().build(); + val mockedKonfigurationEntity = new Waehleranzahl(); + + Mockito.doNothing().when(waehleranzahlValidator).validWaehleranzahlSetModel(waehleranzahlSetModel); + Mockito.when(waehleranzahlModelMapper.toEntity(waehleranzahlSetModel)).thenReturn(mockedKonfigurationEntity); + + Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlSetModel)); + + Mockito.verify(waehleranzahlRepository).save(mockedKonfigurationEntity); + } + + @Test + void should_throwUnhandledExceptionFromValidation_when_validationFails() { + val waehleranzahlSetModel = WaehleranzahlModel.builder().build(); + + val mockedValidatorException = new IllegalArgumentException("WRONG!!!"); + + Mockito.doThrow(mockedValidatorException).when(waehleranzahlValidator).validWaehleranzahlSetModel(waehleranzahlSetModel); + + Assertions.assertThatThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlSetModel)).isSameAs(mockedValidatorException); + } + + @Test + void should_handleRepoExceptionAndthrowTechnischeException_when_saveInRepoFails() { + val waehleranzahlSetModel = WaehleranzahlModel.builder().build(); + + val mockedRepositoryException = new IllegalArgumentException("i cant saved"); + val mockedExceptionFactoryWlsException = TechnischeWlsException.withCode("").buildWithMessage(""); + val mockedKonfigurationEntity = new Waehleranzahl(); + + Mockito.doNothing().when(waehleranzahlValidator).validWaehleranzahlSetModel(waehleranzahlSetModel); + Mockito.when(waehleranzahlModelMapper.toEntity(waehleranzahlSetModel)).thenReturn(mockedKonfigurationEntity); + Mockito.when(waehleranzahlRepository.save(mockedKonfigurationEntity)).thenThrow(mockedRepositoryException); + Mockito.when(exceptionFactory.createTechnischeWlsException(ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE)) + .thenReturn(mockedExceptionFactoryWlsException); + + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlSetModel)) + .isSameAs(mockedExceptionFactoryWlsException); + } + } +} diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/Authorities.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/Authorities.java new file mode 100644 index 000000000..fba20d202 --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/Authorities.java @@ -0,0 +1,24 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.utils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class Authorities { + + public static final String SERVICE_GET_WAEHLERANZAHL = "Monitoring_BUSINESSACTION_GetWahlbeteiligung"; + public static final String SERVICE_POST_WAEHLERANZAHL = "Monitoring_BUSINESSACTION_PostWahlbeteiligung"; + + public static final String REPOSITORY_READ_WAEHLERANZAHL = "Monitoring_READ_Waehleranzahl"; + public static final String REPOSITORY_DELETE_WAEHLERANZAHL = "Monitoring_DELETE_Waehleranzahl"; + public static final String REPOSITORY_WRITE_WAEHLERANZAHL = "Monitoring_WRITE_Waehleranzahl"; + + public static final String[] ALL_AUTHORITIES_GET_WAEHLERANZAHL = new String[] { + SERVICE_GET_WAEHLERANZAHL, + REPOSITORY_READ_WAEHLERANZAHL + }; + public static final String[] ALL_AUTHORITIES_SET_WAEHLERANZAHL = new String[] { + SERVICE_POST_WAEHLERANZAHL, + REPOSITORY_WRITE_WAEHLERANZAHL + }; +} diff --git a/wls-monitoring-service/src/test/resources/application-test.yml b/wls-monitoring-service/src/test/resources/application-test.yml new file mode 100644 index 000000000..bc7348bfa --- /dev/null +++ b/wls-monitoring-service/src/test/resources/application-test.yml @@ -0,0 +1,27 @@ +app: + clients: + eai: + basePath: http://localhost:${wiremock.server.port}/ + monitoring: + basePath: http://localhost:${wiremock.server.port}/ + +spring: + # Spring JPA + h2.console.enabled: true + jpa: + database: H2 + hibernate: + # always drop and create the db should be the best + # configuration for local (development) mode. this + # is also the default, that spring offers by convention. + # but here explicite: + ddl-auto: validate + naming.physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + # Logging for database operation + show-sql: true + properties: + hibernate: + format_sql: true +wiremock: + server: + port: 0 From 7d5492de423e5ea5c4715518ac7acf353012087b Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 18 Oct 2024 16:25:22 +0200 Subject: [PATCH 13/43] service returns Optional now --- .../monitoringservice/rest/AbstractController.java | 11 +++++++++++ .../rest/waehleranzahl/WaehleranzahlController.java | 13 ++++++++----- .../service/waehleranzahl/WaehleranzahlService.java | 12 +++++------- 3 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/AbstractController.java diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/AbstractController.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/AbstractController.java new file mode 100644 index 000000000..0377cbb3d --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/AbstractController.java @@ -0,0 +1,11 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.rest; + +import java.util.Optional; +import org.springframework.http.ResponseEntity; + +public abstract class AbstractController { + + protected ResponseEntity okWithBodyOrNoContent(final Optional body) { + return body.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.noContent().build()); + } +} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java index 0277962ca..d93fcb168 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java @@ -1,11 +1,13 @@ package de.muenchen.oss.wahllokalsystem.monitoringservice.rest.waehleranzahl; +import de.muenchen.oss.wahllokalsystem.monitoringservice.rest.AbstractController; import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlService; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -17,22 +19,23 @@ @RequestMapping("/businessActions/wahlbeteiligung") @RequiredArgsConstructor @Slf4j -public class WaehleranzahlController { +public class WaehleranzahlController extends AbstractController { private final WaehleranzahlService waehleranzahlService; private final WaehleranzahlDTOMapper waehleranzahlDTOMapper; @Operation(description = "Laden der zuvor gespeicherten Wahlbeteiligung für die Wahl {wahlID} für den Wahlbezirk {wahlbezirkID}.") @GetMapping("/{wahlID}/{wahlbezirkID}") - WaehleranzahlDTO getWahlbeteiligung(@PathVariable("wahlID") String wahlID, @PathVariable("wahlbezirkID") String wahlbezirkID) { - return waehleranzahlDTOMapper.toDTO( - waehleranzahlService.getWahlbeteiligung(new BezirkUndWahlID(wahlID, wahlbezirkID))); + ResponseEntity getWahlbeteiligung(@PathVariable("wahlID") String wahlID, @PathVariable("wahlbezirkID") String wahlbezirkID) { + val waehleranzahlModel = waehleranzahlService.getWahlbeteiligung(new BezirkUndWahlID(wahlID, wahlbezirkID)); + + return okWithBodyOrNoContent(waehleranzahlModel.map(waehleranzahlDTOMapper::toDTO)); } @Operation(description = "Speichern und Weiterleiten der Wahlbeteiligung für die Wahl {wahlID} für den Wahlbezirk {wahlbezirkID}.") @PostMapping("/{wahlID}/{wahlbezirkID}") public void postWahlbeteiligung(@PathVariable("wahlbezirkID") String wahlbezirkID, @PathVariable("wahlID") String wahlID, - @RequestBody WaehleranzahlDTO waehleranzahl) { + @RequestBody WaehleranzahlDTO waehleranzahl) { log.info("postWahlbeteiligung {}", wahlbezirkID); val waehleranzahlSetModel = waehleranzahlDTOMapper.toSetModel(new BezirkUndWahlID(wahlID, wahlbezirkID), waehleranzahl); diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java index 0cd581a1d..02446bd5a 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java @@ -1,12 +1,13 @@ package de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl; -import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import lombok.val; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; @@ -22,14 +23,11 @@ public class WaehleranzahlService { private final WaehleranzahlClient waehleranzahlClient; @PreAuthorize("hasAuthority('Monitoring_BUSINESSACTION_GetWahlbeteiligung')") - public WaehleranzahlModel getWahlbeteiligung(BezirkUndWahlID bezirkUndWahlID) { + public Optional getWahlbeteiligung(BezirkUndWahlID bezirkUndWahlID) { waehleranzahlValidator.validWahlIdUndWahlbezirkIDOrThrow(bezirkUndWahlID); - return waehleranzahlModelMapper.toModel(getWahltagByIDOrThrow(bezirkUndWahlID)); - } + val waehleranzahlFromRepo = waehleranzahlRepository.findById(bezirkUndWahlID); - private Waehleranzahl getWahltagByIDOrThrow(final BezirkUndWahlID bezirkUndWahlID) { - return waehleranzahlRepository.findById(bezirkUndWahlID) - .orElseThrow(() -> exceptionFactory.createTechnischeWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_KEINE_DATEN)); + return waehleranzahlFromRepo.map(waehleranzahlModelMapper::toModel); } @PreAuthorize("hasAuthority('Monitoring_BUSINESSACTION_PostWahlbeteiligung')") From 0391ec231d460e5b11abc578ddce3434587713f6 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 18 Oct 2024 16:42:09 +0200 Subject: [PATCH 14/43] some more tests and helper classes --- ...aehleranzahlControllerIntegrationTest.java | 89 +++++++++++++++++++ .../WaehleranzahlControllerTest.java | 66 ++++++++++++++ .../WaehleranzahlDTOMapperTest.java | 59 ++++++++++++ .../WaehleranzahlServiceTest.java | 32 +------ .../utils/WithMockUserAsJwt.java | 35 ++++++++ ...thMockUserAsJwtSecurityContextFactory.java | 67 ++++++++++++++ 6 files changed, 320 insertions(+), 28 deletions(-) create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwt.java create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwtSecurityContextFactory.java diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java new file mode 100644 index 000000000..69019a65d --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java @@ -0,0 +1,89 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.rest.waehleranzahl; + +import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_NO_SECURITY_PROFILE; +import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_TEST_PROFILE; +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.monitoringservice.MicroServiceApplication; +import de.muenchen.oss.wahllokalsystem.monitoringservice.client.waehleranzahl.WaehleranzahlClientMapper; +import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModelMapper; +import de.muenchen.oss.wahllokalsystem.monitoringservice.utils.Authorities; +import de.muenchen.oss.wahllokalsystem.monitoringservice.utils.WithMockUserAsJwt; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import de.muenchen.oss.wahllokalsystem.wls.common.testing.SecurityUtils; +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.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.cloud.contract.wiremock.AutoConfigureWireMock; +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, webEnvironment = SpringBootTest.WebEnvironment.MOCK) +@AutoConfigureMockMvc +@AutoConfigureWireMock +@ActiveProfiles(profiles = { SPRING_TEST_PROFILE, SPRING_NO_SECURITY_PROFILE }) +public class WaehleranzahlControllerIntegrationTest { + + @Value("${service.info.oid}") + String serviceID; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + WaehleranzahlRepository wahleranzahlRepository; + + @Autowired + WaehleranzahlDTOMapper dtoMapper; + + @Autowired + WaehleranzahlModelMapper waehleranzahlModelMapper; + + @Autowired + WaehleranzahlClientMapper waehleranzahlClientMapper; + + @Autowired + MockMvc api; + + @Autowired + WaehleranzahlRepository waehleranzahlRepository; + + @AfterEach + void tearDown() { + SecurityUtils.runWith(Authorities.REPOSITORY_DELETE_WAEHLERANZAHL); + waehleranzahlRepository.deleteAll(); + } + + @BeforeEach + void setup() { + WireMock.resetAllRequests(); + } + + @Nested + class GetWahlbeteiligung { + + @Test + @WithMockUserAsJwt(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) + void emptyResponse() throws Exception { + String wahlID = "wahlID01"; + String wahlbezirkID = "wahlbezirkID01"; + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val request = MockMvcRequestBuilders.get("/businessActions/wahlbeteiligung/" + wahlID + "/" + wahlbezirkID); + + val response = api.perform(request).andExpect(status().isNoContent()).andReturn(); + + Assertions.assertThat(response.getResponse().getContentAsString()).isEmpty(); + } + } +} diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java new file mode 100644 index 000000000..db4ae6fd5 --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java @@ -0,0 +1,66 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.rest.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlService; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.util.Optional; +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; +import org.springframework.http.HttpStatus; + +@ExtendWith(MockitoExtension.class) +public class WaehleranzahlControllerTest { + @Mock + WaehleranzahlService waehleranzahlService; + + @Mock + WaehleranzahlDTOMapper waehleranzahlDTOMapper; + + @InjectMocks + WaehleranzahlController unitUnderTest; + + @Nested + class GetWahlbeteiligung { + + @Test + void should_returnHttp204AndBodyIsNull_when_serviceIsCalledWithNoData() { + String wahlID = "wahlID01"; + String wahlbezirkID = "wahlbezirkID01"; + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + + Mockito.when(waehleranzahlService.getWahlbeteiligung(bezirkUndWahlID)).thenReturn(Optional.empty()); + + val result = unitUnderTest.getWahlbeteiligung(wahlID, wahlbezirkID); + + Assertions.assertThat(result.getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); + Assertions.assertThat(result.getBody()).isNull(); + } + } + + @Nested + class PostWahlbeteiligung { + + @Test + void should_notThrowException_when_serviceIsCalled() { + String wahlID = "wahlID01"; + String wahlbezirkID = "wahlbezirkID01"; + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + + val requestBody = Mockito.mock(WaehleranzahlDTO.class); + val mockedMappedRequest = Mockito.mock(WaehleranzahlModel.class); + + Mockito.when(waehleranzahlDTOMapper.toSetModel(bezirkUndWahlID, requestBody)).thenReturn(mockedMappedRequest); + + unitUnderTest.postWahlbeteiligung(wahlbezirkID, wahlID, requestBody); + + Mockito.verify(waehleranzahlService).postWahlbeteiligung(mockedMappedRequest); + } + } +} diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java new file mode 100644 index 000000000..670ac9f03 --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java @@ -0,0 +1,59 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.rest.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.time.LocalDateTime; +import lombok.val; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +class WaehleranzahlDTOMapperTest { + + private final WaehleranzahlDTOMapper unitUnderTest = Mappers.getMapper(WaehleranzahlDTOMapper.class); + + @Nested + class ToDTO { + + @Test + void should_returnNull_when_ModelIsNull() { + Assertions.assertThat(unitUnderTest.toDTO(null)).isNull(); + } + + @Test + void should_returnNull_when_DTOIsNull() { + Assertions.assertThat(unitUnderTest.toSetModel(null, null)).isNull(); + } + + @Test + void should_mapModelToDto_when_ModelIsNotNull() { + String wahlID = "wahlID01"; + String wahlbezirkID = "wahlbezirkID01"; + long anzahlWaehler = 99L; + LocalDateTime uhrzeit = LocalDateTime.now(); + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + + val modelInput = new WaehleranzahlModel(bezirkUndWahlID, anzahlWaehler, uhrzeit); + val dtoExpected = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler, uhrzeit); + + val result = unitUnderTest.toDTO(modelInput); + Assertions.assertThat(result).isEqualTo(dtoExpected); + } + + @Test + void should_mapDtoToModel_when_DtoIsNotNull() { + String wahlID = "wahlID01"; + String wahlbezirkID = "wahlbezirkID01"; + long anzahlWaehler = 99L; + LocalDateTime uhrzeit = LocalDateTime.now(); + BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + + val dtoInput = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler, uhrzeit); + val modelExpected = new WaehleranzahlModel(bezirkUndWahlID, anzahlWaehler, uhrzeit); + + val result = unitUnderTest.toSetModel(bezirkUndWahlID, dtoInput); + Assertions.assertThat(result).isEqualTo(modelExpected); + } + } +} diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java index 03ed40d88..8dcc22204 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java @@ -2,9 +2,6 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; -import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; -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; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.time.LocalDateTime; @@ -50,20 +47,17 @@ void should_returnRepoData_when_RepoDataFound() { Mockito.when(waehleranzahlRepository.findById(bezirkUndWahlID)).thenReturn(Optional.of(mockedRepoResponse)); Mockito.when(waehleranzahlModelMapper.toModel(mockedRepoResponse)).thenReturn(mockedMappedRepoResponse); - Assertions.assertThat(unitUnderTest.getWahlbeteiligung(bezirkUndWahlID)).isSameAs(mockedMappedRepoResponse); + Assertions.assertThat(unitUnderTest.getWahlbeteiligung(bezirkUndWahlID).get()).isSameAs(mockedMappedRepoResponse); } @Test - void should_returnException_when_RepoDataNotFound() { + void should_returnEmptyResult_when_RepoDataNotFound() { BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID("wahlID01", "wahlbezirkID01"); - val mockedWlsException = FachlicheWlsException.withCode("").buildWithMessage(""); - Mockito.when(waehleranzahlRepository.findById(bezirkUndWahlID)).thenReturn(Optional.empty()); - Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) - .thenReturn(mockedWlsException); - Assertions.assertThatException().isThrownBy(() -> unitUnderTest.getWahlbeteiligung(bezirkUndWahlID)).isSameAs(mockedWlsException); + val result = unitUnderTest.getWahlbeteiligung(bezirkUndWahlID); + Assertions.assertThat(result).isEmpty(); } } @@ -94,23 +88,5 @@ void should_throwUnhandledExceptionFromValidation_when_validationFails() { Assertions.assertThatThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlSetModel)).isSameAs(mockedValidatorException); } - - @Test - void should_handleRepoExceptionAndthrowTechnischeException_when_saveInRepoFails() { - val waehleranzahlSetModel = WaehleranzahlModel.builder().build(); - - val mockedRepositoryException = new IllegalArgumentException("i cant saved"); - val mockedExceptionFactoryWlsException = TechnischeWlsException.withCode("").buildWithMessage(""); - val mockedKonfigurationEntity = new Waehleranzahl(); - - Mockito.doNothing().when(waehleranzahlValidator).validWaehleranzahlSetModel(waehleranzahlSetModel); - Mockito.when(waehleranzahlModelMapper.toEntity(waehleranzahlSetModel)).thenReturn(mockedKonfigurationEntity); - Mockito.when(waehleranzahlRepository.save(mockedKonfigurationEntity)).thenThrow(mockedRepositoryException); - Mockito.when(exceptionFactory.createTechnischeWlsException(ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE)) - .thenReturn(mockedExceptionFactoryWlsException); - - Assertions.assertThatException().isThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlSetModel)) - .isSameAs(mockedExceptionFactoryWlsException); - } } } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwt.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwt.java new file mode 100644 index 000000000..c0a82294a --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwt.java @@ -0,0 +1,35 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.utils; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.core.annotation.AliasFor; +import org.springframework.security.test.context.support.TestExecutionEvent; +import org.springframework.security.test.context.support.WithSecurityContext; + +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +@WithSecurityContext(factory = WithMockUserAsJwtSecurityContextFactory.class) +public @interface WithMockUserAsJwt { + + String value() default "user"; + + String[] authorities() default {}; + + String[] claimProperties() default {}; + + String claimPropertiesSeparator() default "="; + + int issuedBeforeHours() default 1; + + int expiredInHours() default 1; + + @AliasFor(annotation = WithSecurityContext.class) + TestExecutionEvent setupBefore() default TestExecutionEvent.TEST_METHOD; + +} diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwtSecurityContextFactory.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwtSecurityContextFactory.java new file mode 100644 index 000000000..651d29098 --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwtSecurityContextFactory.java @@ -0,0 +1,67 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.utils; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import lombok.val; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.context.SecurityContextHolderStrategy; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; +import org.springframework.security.test.context.support.WithSecurityContextFactory; +import org.springframework.util.Assert; + +/* + * inspired by org.springframework.security.test.context.support.WithMockUserSecurityContextFactory + */ +final public class WithMockUserAsJwtSecurityContextFactory implements WithSecurityContextFactory { + + private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder + .getContextHolderStrategy(); + + @Override + public SecurityContext createSecurityContext(WithMockUserAsJwt withUser) { + val username = withUser.value(); + Assert.notNull(username, () -> withUser + " cannot have null username on both username and value properties"); + + val issuedAt = Instant.now().minus(withUser.issuedBeforeHours(), ChronoUnit.HOURS); + val expiresAt = Instant.now().plus(withUser.expiredInHours(), ChronoUnit.HOURS); + val headers = Map.of("jwtDummyHeader", (Object) "jwtDummyValue"); + + val claims = new HashMap(); + claims.put("dummyClaim", "dummyClaimValue"); + claims.putAll(createClaimsMap(withUser.claimProperties(), withUser.claimPropertiesSeparator())); + + val jwt = new Jwt(username, issuedAt, expiresAt, headers, claims); + + List grantedAuthorities = new ArrayList<>(); + for (String authority : withUser.authorities()) { + grantedAuthorities.add(new SimpleGrantedAuthority(authority)); + } + + val authentication = new JwtAuthenticationToken(jwt, grantedAuthorities); + + val context = this.securityContextHolderStrategy.createEmptyContext(); + context.setAuthentication(authentication); + return context; + } + + @Autowired(required = false) + void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy) { + this.securityContextHolderStrategy = securityContextHolderStrategy; + } + + private Map createClaimsMap(final String[] concatedClaimProperties, final String keyValueSeparator) { + return Arrays.stream(concatedClaimProperties).map(concatedClaimProperty -> concatedClaimProperty.split(keyValueSeparator)) + .collect(Collectors.toMap(propertyAsArray -> propertyAsArray[0], propertyAsArray -> propertyAsArray[1])); + } +} From c9f981495963007e820cd6325a4a043c08746ccf Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 18 Oct 2024 18:01:21 +0200 Subject: [PATCH 15/43] some more tests --- ...aehleranzahlControllerIntegrationTest.java | 112 +++++++++++++++++- 1 file changed, 107 insertions(+), 5 deletions(-) diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java index 69019a65d..a7295bf74 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java @@ -2,22 +2,30 @@ import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_NO_SECURITY_PROFILE; import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_TEST_PROFILE; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.client.WireMock; import de.muenchen.oss.wahllokalsystem.monitoringservice.MicroServiceApplication; import de.muenchen.oss.wahllokalsystem.monitoringservice.client.waehleranzahl.WaehleranzahlClientMapper; +import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; +import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModelMapper; import de.muenchen.oss.wahllokalsystem.monitoringservice.utils.Authorities; import de.muenchen.oss.wahllokalsystem.monitoringservice.utils.WithMockUserAsJwt; +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 java.time.LocalDateTime; 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.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -25,8 +33,11 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @SpringBootTest(classes = MicroServiceApplication.class, webEnvironment = SpringBootTest.WebEnvironment.MOCK) @@ -45,7 +56,7 @@ public class WaehleranzahlControllerIntegrationTest { WaehleranzahlRepository wahleranzahlRepository; @Autowired - WaehleranzahlDTOMapper dtoMapper; + WaehleranzahlDTOMapper waehleranzahlDTOMapper; @Autowired WaehleranzahlModelMapper waehleranzahlModelMapper; @@ -75,15 +86,106 @@ class GetWahlbeteiligung { @Test @WithMockUserAsJwt(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) - void emptyResponse() throws Exception { - String wahlID = "wahlID01"; - String wahlbezirkID = "wahlbezirkID01"; - BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + void should_returnEmptyResponse_when_NoDataFound() throws Exception { + val wahlID = "wahlID01"; + val wahlbezirkID = "wahlbezirkID01"; val request = MockMvcRequestBuilders.get("/businessActions/wahlbeteiligung/" + wahlID + "/" + wahlbezirkID); val response = api.perform(request).andExpect(status().isNoContent()).andReturn(); Assertions.assertThat(response.getResponse().getContentAsString()).isEmpty(); } + + @Test + @WithMockUserAsJwt(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) + void should_returnOkAndData_when_DataFound() throws Exception { + val wahlID = "wahlID01"; + val wahlbezirkID = "wahlbezirkID01"; + val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val anzahlWaehler = 99; + val uhrzeit = LocalDateTime.parse("2024-09-13T12:11:21.343"); + + val waehleranzahlToFind = new Waehleranzahl(bezirkUndWahlID, anzahlWaehler, uhrzeit); + waehleranzahlRepository.save(waehleranzahlToFind); + val expectedResponseBody = waehleranzahlDTOMapper.toDTO(waehleranzahlModelMapper.toModel(waehleranzahlToFind)); + + val request = MockMvcRequestBuilders.get("/businessActions/wahlbeteiligung/" + wahlID + "/" + wahlbezirkID); + + val response = api.perform(request).andExpect(status().isOk()).andReturn(); + val responseBodyAsDTO = objectMapper.readValue(response.getResponse().getContentAsString(), WaehleranzahlDTO.class); + + Assertions.assertThat(responseBodyAsDTO).isEqualTo(expectedResponseBody); + } + + @Nested + class PostBriefwahlvorbereitung { + @Test + @WithMockUserAsJwt(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) + void should_overwriteExistingData_when_NewDataIsStoredWithSameID() throws Exception { + val wahlID = "wahlID01"; + val wahlbezirkID = "wahlbezirkID01"; + val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val anzahlWaehler_1 = 99L; + val uhrzeit_1 = LocalDateTime.parse("2024-09-13T12:11:21.343"); + + val waehleranzahlDTO_1 = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler_1, uhrzeit_1); + + WireMock.stubFor(WireMock.post("/wahlbeteiligung") + .willReturn(WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.OK.value()) + .withBody(objectMapper.writeValueAsBytes(waehleranzahlDTO_1)))); + + val request_1 = buildPostRequest(wahlID, wahlbezirkID, waehleranzahlDTO_1); + api.perform(request_1).andExpect(status().isOk()).andReturn(); + + SecurityUtils.runWith(Authorities.REPOSITORY_READ_WAEHLERANZAHL); + val waehleranzahlFromRepo_1 = waehleranzahlRepository.findById(bezirkUndWahlID).get(); + val expectedWaehleranzahl_1 = waehleranzahlModelMapper.toEntity(waehleranzahlDTOMapper.toSetModel(bezirkUndWahlID, waehleranzahlDTO_1)); + + Assertions.assertThat(waehleranzahlFromRepo_1).usingRecursiveComparison().isEqualTo(expectedWaehleranzahl_1); + + // Overwrite existing data + val anzahlWaehler_2 = 55L; + val uhrzeit_2 = LocalDateTime.parse("2024-09-13T12:11:21.666"); + val waehleranzahlDTO_2 = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler_2, uhrzeit_2); + + val request_2 = buildPostRequest(wahlID, wahlbezirkID, waehleranzahlDTO_2); + api.perform(request_2).andExpect(status().isOk()).andReturn(); + + SecurityUtils.runWith(Authorities.REPOSITORY_READ_WAEHLERANZAHL); + val waehleranzahlFromRepo_2 = waehleranzahlRepository.findById(bezirkUndWahlID).get(); + val expectedWaehleranzahl_2 = waehleranzahlModelMapper.toEntity(waehleranzahlDTOMapper.toSetModel(bezirkUndWahlID, waehleranzahlDTO_2)); + + Assertions.assertThat(waehleranzahlFromRepo_2).usingRecursiveComparison().isEqualTo(expectedWaehleranzahl_2); + } + } + + @Test + @Disabled + @WithMockUserAsJwt(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) + void should_throwFachlicheWlsException_when_requestIsInvalid() throws Exception { + val wahlID = "_ "; + val wahlbezirkID = "wahlbezirkID01"; + val anzahlWaehler = 99L; + val uhrzeit = LocalDateTime.parse("2024-09-13T12:11:21.343"); + val waehleranzahlDTO = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler, uhrzeit); + + val request = MockMvcRequestBuilders.post("/businessActions/wahlbeteiligung/" + wahlID + "/" + wahlbezirkID).with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content( + objectMapper.writeValueAsString(waehleranzahlDTO)); + val response = api.perform(request).andExpect(status().isNotFound()).andReturn(); + + val responseBodyAsWlsExceptionDTO = objectMapper.readValue(response.getResponse().getContentAsByteArray(), WlsExceptionDTO.class); + + val expectedWlsExceptionDTO = new WlsExceptionDTO(WlsExceptionCategory.F, ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE.code(), + serviceID, ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE.message()); + + Assertions.assertThat(responseBodyAsWlsExceptionDTO).isEqualTo(expectedWlsExceptionDTO); + } + + private RequestBuilder buildPostRequest(final String wahlID, final String wahlbezirkID, final WaehleranzahlDTO requestBody) throws Exception { + return post("/businessActions/wahlbeteiligung/" + wahlID + "/" + wahlbezirkID).with(csrf()).contentType(MediaType.APPLICATION_JSON).content( + objectMapper.writeValueAsString(requestBody)); + } } } From cf42458d4b2af6f127d8edc242751ca57fbcebb3 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Mon, 21 Oct 2024 12:51:10 +0200 Subject: [PATCH 16/43] tests finished --- .../client/waehleranzahl/DummyClientImpl.java | 7 +- .../WaehleranzahlClientImpl.java | 2 +- .../WaehleranzahlClientMapper.java | 2 +- .../exception/GlobalExceptionHandler.java | 33 ++++++++ .../WaehleranzahlController.java | 2 +- .../waehleranzahl/WaehleranzahlService.java | 4 +- .../WaehleranzahlClientImplTest.java | 77 +++++++++++++++++++ .../WaehleranzahlClientMapperTest.java | 39 ++++++++++ .../SecurityConfigurationTest.java | 4 +- ...aehleranzahlControllerIntegrationTest.java | 40 +++++----- .../WaehleranzahlServiceSecurityTest.java | 6 +- .../WaehleranzahlServiceTest.java | 14 +--- .../utils/WithMockUserAsJwt.java | 35 --------- ...thMockUserAsJwtSecurityContextFactory.java | 67 ---------------- 14 files changed, 182 insertions(+), 150 deletions(-) create mode 100644 wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/GlobalExceptionHandler.java create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java delete mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwt.java delete mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwtSecurityContextFactory.java diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/DummyClientImpl.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/DummyClientImpl.java index c229cacda..4f7e6212b 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/DummyClientImpl.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/DummyClientImpl.java @@ -6,7 +6,6 @@ import de.muenchen.oss.wahllokalsystem.wls.common.exception.WlsException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import lombok.val; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @@ -16,12 +15,8 @@ @Slf4j public class DummyClientImpl implements WaehleranzahlClient { - private final WaehleranzahlClientMapper waehleranzahlClientMapper; - @Override public void postWahlbeteiligung(WaehleranzahlModel waehleranzahlModel) throws WlsException { - - val wahlbeteiligungsMeldungDTO = waehleranzahlClientMapper.toDTO(waehleranzahlModel); - log.info("Dummy client postWahlbeteiligung() called instead of EAI with: " + wahlbeteiligungsMeldungDTO); + log.info("Dummy client postWahlbeteiligung() called instead of EAI with: {}", waehleranzahlModel); } } diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java index 69ae3bc30..7516dc960 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java @@ -26,7 +26,7 @@ public class WaehleranzahlClientImpl implements WaehleranzahlClient { @Override public void postWahlbeteiligung(WaehleranzahlModel waehleranzahlModel) throws WlsException { - val wahlbeteiligungsMeldungDTO = waehleranzahlClientMapper.toDTO(waehleranzahlModel); + val wahlbeteiligungsMeldungDTO = waehleranzahlClientMapper.fromModelToRemoteClientDTO(waehleranzahlModel); try { wahlbeteiligungControllerApi.saveWahlbeteiligung(wahlbeteiligungsMeldungDTO); } catch (final Exception exception) { diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java index d11bea6dd..7b63e8496 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java @@ -17,7 +17,7 @@ public interface WaehleranzahlClientMapper { @Mapping(target = "wahlID", source = "bezirkUndWahlID.wahlID") @Mapping(target = "wahlbezirkID", source = "bezirkUndWahlID.wahlbezirkID") @Mapping(target = "meldeZeitpunkt", source = "uhrzeit", qualifiedByName = "localDateTimeToOffsetDateTime") - WahlbeteiligungsMeldungDTO toDTO(WaehleranzahlModel waehleranzahlModel); + WahlbeteiligungsMeldungDTO fromModelToRemoteClientDTO(WaehleranzahlModel waehleranzahlModel); @Named("localDateTimeToOffsetDateTime") default OffsetDateTime localDateTimeToOffsetDateTime(LocalDateTime localDateTime) { diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/GlobalExceptionHandler.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/GlobalExceptionHandler.java new file mode 100644 index 000000000..24a71555f --- /dev/null +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/GlobalExceptionHandler.java @@ -0,0 +1,33 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.exception; + +import de.muenchen.oss.wahllokalsystem.wls.common.exception.errorhandler.AbstractExceptionHandler; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.rest.model.DTOMapper; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.rest.model.WlsExceptionDTO; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ServiceIDFormatter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +@Slf4j +public class GlobalExceptionHandler extends AbstractExceptionHandler { + + private final ServiceIDFormatter serviceIDFormatter; + + public GlobalExceptionHandler(final ServiceIDFormatter serviceIDFormatter, final DTOMapper dtoMapper) { + super(dtoMapper); + this.serviceIDFormatter = serviceIDFormatter; + } + + @ExceptionHandler + public ResponseEntity handleThrowables(final Throwable throwable) { + log.info("handling throwable", throwable); + return createResponse(getWahlExceptionDTO(throwable)); + } + + @Override + protected String getService() { + return serviceIDFormatter.getId(); + } +} diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java index d93fcb168..84915f2ef 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java @@ -35,7 +35,7 @@ ResponseEntity getWahlbeteiligung(@PathVariable("wahlID") Stri @Operation(description = "Speichern und Weiterleiten der Wahlbeteiligung für die Wahl {wahlID} für den Wahlbezirk {wahlbezirkID}.") @PostMapping("/{wahlID}/{wahlbezirkID}") public void postWahlbeteiligung(@PathVariable("wahlbezirkID") String wahlbezirkID, @PathVariable("wahlID") String wahlID, - @RequestBody WaehleranzahlDTO waehleranzahl) { + @RequestBody WaehleranzahlDTO waehleranzahl) { log.info("postWahlbeteiligung {}", wahlbezirkID); val waehleranzahlSetModel = waehleranzahlDTOMapper.toSetModel(new BezirkUndWahlID(wahlID, wahlbezirkID), waehleranzahl); diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java index 02446bd5a..58218c212 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlService.java @@ -32,13 +32,11 @@ public Optional getWahlbeteiligung(BezirkUndWahlID bezirkUnd @PreAuthorize("hasAuthority('Monitoring_BUSINESSACTION_PostWahlbeteiligung')") public void postWahlbeteiligung(WaehleranzahlModel waehleranzahl) { - waehleranzahlValidator.validWaehleranzahlSetModel(waehleranzahl); - try { waehleranzahlRepository.save(waehleranzahlModelMapper.toEntity(waehleranzahl)); } catch (Exception e) { log.error("#postWahlbeteiligung: Die Wahlen konnten aufgrund eines Fehlers nicht gespeichert werden:", e); - throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE); + throw exceptionFactory.createTechnischeWlsException(ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE); } waehleranzahlClient.postWahlbeteiligung(waehleranzahl); } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java new file mode 100644 index 000000000..125abef4b --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java @@ -0,0 +1,77 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.client.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.client.WahlbeteiligungControllerApi; +import de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.model.WahlbeteiligungsMeldungDTO; +import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.TechnischeWlsException; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +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 WaehleranzahlClientImplTest { + + @Mock + ExceptionFactory exceptionFactory; + + @Mock + WahlbeteiligungControllerApi wahlbeteiligungControllerApi; + + @Mock + WaehleranzahlClientMapper waehleranzahlClientMapper; + + @InjectMocks + WaehleranzahlClientImpl unitUnderTest; + + @Nested + class PostWahlbeteiligung { + + @Test + void should_callEaiApiWithDTO_when_clientIsCalledWithModel() { + + val waehleranzahlModel = new WaehleranzahlModel(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 99L, LocalDateTime.now()); + val mockedWahlbeteiligungsMeldungDTO = createWahlbeteiligungsMeldungDTO(); + Mockito.when(waehleranzahlClientMapper.fromModelToRemoteClientDTO(waehleranzahlModel)).thenReturn(mockedWahlbeteiligungsMeldungDTO); + + unitUnderTest.postWahlbeteiligung(waehleranzahlModel); + Mockito.verify(wahlbeteiligungControllerApi).saveWahlbeteiligung(mockedWahlbeteiligungsMeldungDTO); + } + + @Test + void should_throwTechnischeWlsException_when_eaiApiThrowsAnyException() { + + val waehleranzahlModel = new WaehleranzahlModel(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 99L, LocalDateTime.now()); + val mockedWahlbeteiligungsMeldungDTO = createWahlbeteiligungsMeldungDTO(); + Mockito.when(waehleranzahlClientMapper.fromModelToRemoteClientDTO(waehleranzahlModel)).thenReturn(mockedWahlbeteiligungsMeldungDTO); + + val mockedWlsException = TechnischeWlsException.withCode("007").buildWithMessage("Dummy-Msg"); + Mockito.when(exceptionFactory.createTechnischeWlsException(ExceptionConstants.FAILED_COMMUNICATION_WITH_EAI)).thenReturn(mockedWlsException); + + val mockedApiException = new IllegalArgumentException("Nix-Connect"); + Mockito.doThrow(mockedApiException).when(wahlbeteiligungControllerApi).saveWahlbeteiligung(mockedWahlbeteiligungsMeldungDTO); + + Assertions.assertThatThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlModel)).isSameAs(mockedWlsException); + } + + private WahlbeteiligungsMeldungDTO createWahlbeteiligungsMeldungDTO() { + val wahlID = "wahlID01"; + val wahlbezirkID = "wahlbezirkID01"; + val anzahlWahler = 99L; + val meldeZeitpunkt = OffsetDateTime.now(); + return new WahlbeteiligungsMeldungDTO().wahlID(wahlID).wahlbezirkID(wahlbezirkID).anzahlWaehler(anzahlWahler) + .meldeZeitpunkt(meldeZeitpunkt); + } + } + +} diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java new file mode 100644 index 000000000..a625ce5d6 --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java @@ -0,0 +1,39 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.client.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.model.WahlbeteiligungsMeldungDTO; +import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import lombok.val; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +public class WaehleranzahlClientMapperTest { + + private final WaehleranzahlClientMapper unitUnderTest = Mappers.getMapper(WaehleranzahlClientMapper.class); + + @Nested + class FromModelToRemoteClientDTO { + + @Test + void isMappedWithSomething() { + val wahlID = "wahlID01"; + val wahlbezirkID = "wahlbezirkID01"; + val anzahlWahler = 99L; + val meldeZeitpunkt = LocalDateTime.now(); + val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + + val waehleranzahlModel = new WaehleranzahlModel(bezirkUndWahlID, anzahlWahler, meldeZeitpunkt); + Assertions.assertThat(waehleranzahlModel).hasNoNullFieldsOrProperties(); + + val result = unitUnderTest.fromModelToRemoteClientDTO(waehleranzahlModel); + + val expectedWahlbeteiligungsMeldungDTO = new WahlbeteiligungsMeldungDTO().wahlID(wahlID).wahlbezirkID(wahlbezirkID).anzahlWaehler(anzahlWahler) + .meldeZeitpunkt(meldeZeitpunkt.atOffset(ZoneOffset.UTC)); + Assertions.assertThat(result).isEqualTo(expectedWahlbeteiligungsMeldungDTO); + } + } +} diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java index 990ec4ead..f0dd47862 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java @@ -92,8 +92,8 @@ void should_return401Unauthorized_when_GetWithUnauthorizedAnonymousUser() throws @Test @WithMockUser - void should_return200OK_when_GetWithAuthorizedMockUser() throws Exception { - api.perform(get("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID")).andExpect(status().isOk()); + void should_return204NoContent_when_GetWithAuthorizedMockUser() throws Exception { + api.perform(get("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID")).andExpect(status().isNoContent()); } @Test diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java index a7295bf74..12222564f 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java @@ -2,6 +2,7 @@ import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_NO_SECURITY_PROFILE; import static de.muenchen.oss.wahllokalsystem.monitoringservice.TestConstants.SPRING_TEST_PROFILE; +import static org.mockito.ArgumentMatchers.any; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -15,7 +16,6 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModelMapper; import de.muenchen.oss.wahllokalsystem.monitoringservice.utils.Authorities; -import de.muenchen.oss.wahllokalsystem.monitoringservice.utils.WithMockUserAsJwt; 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; @@ -25,16 +25,18 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; 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.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.RequestBuilder; @@ -52,7 +54,7 @@ public class WaehleranzahlControllerIntegrationTest { @Autowired ObjectMapper objectMapper; - @Autowired + @SpyBean WaehleranzahlRepository wahleranzahlRepository; @Autowired @@ -85,7 +87,7 @@ void setup() { class GetWahlbeteiligung { @Test - @WithMockUserAsJwt(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) + @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) void should_returnEmptyResponse_when_NoDataFound() throws Exception { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; @@ -97,7 +99,7 @@ void should_returnEmptyResponse_when_NoDataFound() throws Exception { } @Test - @WithMockUserAsJwt(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) + @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) void should_returnOkAndData_when_DataFound() throws Exception { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; @@ -120,7 +122,7 @@ void should_returnOkAndData_when_DataFound() throws Exception { @Nested class PostBriefwahlvorbereitung { @Test - @WithMockUserAsJwt(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) + @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) void should_overwriteExistingData_when_NewDataIsStoredWithSameID() throws Exception { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; @@ -131,8 +133,8 @@ void should_overwriteExistingData_when_NewDataIsStoredWithSameID() throws Except val waehleranzahlDTO_1 = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler_1, uhrzeit_1); WireMock.stubFor(WireMock.post("/wahlbeteiligung") - .willReturn(WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.OK.value()) - .withBody(objectMapper.writeValueAsBytes(waehleranzahlDTO_1)))); + .willReturn(WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.OK.value()) + .withBody(objectMapper.writeValueAsBytes(waehleranzahlDTO_1)))); val request_1 = buildPostRequest(wahlID, wahlbezirkID, waehleranzahlDTO_1); api.perform(request_1).andExpect(status().isOk()).andReturn(); @@ -160,9 +162,8 @@ void should_overwriteExistingData_when_NewDataIsStoredWithSameID() throws Except } @Test - @Disabled - @WithMockUserAsJwt(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) - void should_throwFachlicheWlsException_when_requestIsInvalid() throws Exception { + @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) + void should_throwTechnischeWlsException_when_requestIsInvalid() throws Exception { val wahlID = "_ "; val wahlbezirkID = "wahlbezirkID01"; val anzahlWaehler = 99L; @@ -170,22 +171,25 @@ void should_throwFachlicheWlsException_when_requestIsInvalid() throws Exception val waehleranzahlDTO = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler, uhrzeit); val request = MockMvcRequestBuilders.post("/businessActions/wahlbeteiligung/" + wahlID + "/" + wahlbezirkID).with(csrf()) - .contentType(MediaType.APPLICATION_JSON) - .content( - objectMapper.writeValueAsString(waehleranzahlDTO)); - val response = api.perform(request).andExpect(status().isNotFound()).andReturn(); + .contentType(MediaType.APPLICATION_JSON) + .content( + objectMapper.writeValueAsString(waehleranzahlDTO)); + + Mockito.doThrow(new RuntimeException("DB-Error")).when(wahleranzahlRepository).save(any()); + + val response = api.perform(request).andExpect(status().isInternalServerError()).andReturn(); val responseBodyAsWlsExceptionDTO = objectMapper.readValue(response.getResponse().getContentAsByteArray(), WlsExceptionDTO.class); - val expectedWlsExceptionDTO = new WlsExceptionDTO(WlsExceptionCategory.F, ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE.code(), - serviceID, ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE.message()); + val expectedWlsExceptionDTO = new WlsExceptionDTO(WlsExceptionCategory.T, ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE.code(), + serviceID, ExceptionConstants.POSTWAHLBETEILIGUNG_UNSAVEABLE.message()); Assertions.assertThat(responseBodyAsWlsExceptionDTO).isEqualTo(expectedWlsExceptionDTO); } private RequestBuilder buildPostRequest(final String wahlID, final String wahlbezirkID, final WaehleranzahlDTO requestBody) throws Exception { return post("/businessActions/wahlbeteiligung/" + wahlID + "/" + wahlbezirkID).with(csrf()).contentType(MediaType.APPLICATION_JSON).content( - objectMapper.writeValueAsString(requestBody)); + objectMapper.writeValueAsString(requestBody)); } } } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java index 346efc042..c601a2cfb 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java @@ -10,7 +10,7 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; import de.muenchen.oss.wahllokalsystem.monitoringservice.rest.waehleranzahl.WaehleranzahlDTOMapper; import de.muenchen.oss.wahllokalsystem.monitoringservice.utils.Authorities; -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.security.domain.BezirkUndWahlID; import de.muenchen.oss.wahllokalsystem.wls.common.testing.SecurityUtils; import java.time.LocalDateTime; @@ -128,7 +128,7 @@ void should_FailWithAccessDeniedException_when_ServiceAuthorityIsMissing() throw } @Test - void should_FailWithFachlicheWlsException_when_RepoAuthorityIsMissing() throws Exception { + void should_FailWithTechnischeWlsException_when_RepoAuthorityIsMissing() throws Exception { SecurityUtils.runWith(Authorities.SERVICE_POST_WAEHLERANZAHL); String wahlID = "wahlID01"; @@ -141,7 +141,7 @@ void should_FailWithFachlicheWlsException_when_RepoAuthorityIsMissing() throws E .willReturn(WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.OK.value()) .withBody(objectMapper.writeValueAsBytes(waehleranzahlDTO)))); - Assertions.assertThatThrownBy(() -> waehleranzahlService.postWahlbeteiligung(waehleranzahlToSave)).isInstanceOf(FachlicheWlsException.class); + Assertions.assertThatThrownBy(() -> waehleranzahlService.postWahlbeteiligung(waehleranzahlToSave)).isInstanceOf(TechnischeWlsException.class); } } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java index 8dcc22204..6aee20dd7 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java @@ -65,28 +65,16 @@ void should_returnEmptyResult_when_RepoDataNotFound() { class PostWahlbeteiligung { @Test - void should_notThrowExceptionAndSaveDataInRepo_when_ValidModelIsGiven() { + void should_notThrowExceptionAndSaveDataInRepo_when_ModelIsGiven() { val waehleranzahlSetModel = WaehleranzahlModel.builder().build(); val mockedKonfigurationEntity = new Waehleranzahl(); - Mockito.doNothing().when(waehleranzahlValidator).validWaehleranzahlSetModel(waehleranzahlSetModel); Mockito.when(waehleranzahlModelMapper.toEntity(waehleranzahlSetModel)).thenReturn(mockedKonfigurationEntity); Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlSetModel)); Mockito.verify(waehleranzahlRepository).save(mockedKonfigurationEntity); } - - @Test - void should_throwUnhandledExceptionFromValidation_when_validationFails() { - val waehleranzahlSetModel = WaehleranzahlModel.builder().build(); - - val mockedValidatorException = new IllegalArgumentException("WRONG!!!"); - - Mockito.doThrow(mockedValidatorException).when(waehleranzahlValidator).validWaehleranzahlSetModel(waehleranzahlSetModel); - - Assertions.assertThatThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlSetModel)).isSameAs(mockedValidatorException); - } } } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwt.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwt.java deleted file mode 100644 index c0a82294a..000000000 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwt.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.muenchen.oss.wahllokalsystem.monitoringservice.utils; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import org.springframework.core.annotation.AliasFor; -import org.springframework.security.test.context.support.TestExecutionEvent; -import org.springframework.security.test.context.support.WithSecurityContext; - -@Target({ ElementType.METHOD, ElementType.TYPE }) -@Retention(RetentionPolicy.RUNTIME) -@Inherited -@Documented -@WithSecurityContext(factory = WithMockUserAsJwtSecurityContextFactory.class) -public @interface WithMockUserAsJwt { - - String value() default "user"; - - String[] authorities() default {}; - - String[] claimProperties() default {}; - - String claimPropertiesSeparator() default "="; - - int issuedBeforeHours() default 1; - - int expiredInHours() default 1; - - @AliasFor(annotation = WithSecurityContext.class) - TestExecutionEvent setupBefore() default TestExecutionEvent.TEST_METHOD; - -} diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwtSecurityContextFactory.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwtSecurityContextFactory.java deleted file mode 100644 index 651d29098..000000000 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/utils/WithMockUserAsJwtSecurityContextFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -package de.muenchen.oss.wahllokalsystem.monitoringservice.utils; - -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import lombok.val; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.context.SecurityContextHolderStrategy; -import org.springframework.security.oauth2.jwt.Jwt; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; -import org.springframework.security.test.context.support.WithSecurityContextFactory; -import org.springframework.util.Assert; - -/* - * inspired by org.springframework.security.test.context.support.WithMockUserSecurityContextFactory - */ -final public class WithMockUserAsJwtSecurityContextFactory implements WithSecurityContextFactory { - - private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder - .getContextHolderStrategy(); - - @Override - public SecurityContext createSecurityContext(WithMockUserAsJwt withUser) { - val username = withUser.value(); - Assert.notNull(username, () -> withUser + " cannot have null username on both username and value properties"); - - val issuedAt = Instant.now().minus(withUser.issuedBeforeHours(), ChronoUnit.HOURS); - val expiresAt = Instant.now().plus(withUser.expiredInHours(), ChronoUnit.HOURS); - val headers = Map.of("jwtDummyHeader", (Object) "jwtDummyValue"); - - val claims = new HashMap(); - claims.put("dummyClaim", "dummyClaimValue"); - claims.putAll(createClaimsMap(withUser.claimProperties(), withUser.claimPropertiesSeparator())); - - val jwt = new Jwt(username, issuedAt, expiresAt, headers, claims); - - List grantedAuthorities = new ArrayList<>(); - for (String authority : withUser.authorities()) { - grantedAuthorities.add(new SimpleGrantedAuthority(authority)); - } - - val authentication = new JwtAuthenticationToken(jwt, grantedAuthorities); - - val context = this.securityContextHolderStrategy.createEmptyContext(); - context.setAuthentication(authentication); - return context; - } - - @Autowired(required = false) - void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy) { - this.securityContextHolderStrategy = securityContextHolderStrategy; - } - - private Map createClaimsMap(final String[] concatedClaimProperties, final String keyValueSeparator) { - return Arrays.stream(concatedClaimProperties).map(concatedClaimProperty -> concatedClaimProperty.split(keyValueSeparator)) - .collect(Collectors.toMap(propertyAsArray -> propertyAsArray[0], propertyAsArray -> propertyAsArray[1])); - } -} From 819f42230a063e9ffeaed48a019bfd0b9c106f03 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Mon, 21 Oct 2024 12:55:12 +0200 Subject: [PATCH 17/43] named type mapping removed --- .../client/waehleranzahl/WaehleranzahlClientMapper.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java index 7b63e8496..e1d4aa3f7 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java @@ -7,7 +7,6 @@ import java.time.ZoneOffset; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -import org.mapstruct.Named; @Mapper public interface WaehleranzahlClientMapper { @@ -16,10 +15,9 @@ public interface WaehleranzahlClientMapper { @Mapping(target = "wahlID", source = "bezirkUndWahlID.wahlID") @Mapping(target = "wahlbezirkID", source = "bezirkUndWahlID.wahlbezirkID") - @Mapping(target = "meldeZeitpunkt", source = "uhrzeit", qualifiedByName = "localDateTimeToOffsetDateTime") + @Mapping(target = "meldeZeitpunkt", source = "uhrzeit") WahlbeteiligungsMeldungDTO fromModelToRemoteClientDTO(WaehleranzahlModel waehleranzahlModel); - @Named("localDateTimeToOffsetDateTime") default OffsetDateTime localDateTimeToOffsetDateTime(LocalDateTime localDateTime) { return localDateTime.atOffset(DEFAULT_ZONE); } From 8a329ea21ec5c64b8919560b4019acd2275bb3df Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Mon, 21 Oct 2024 16:30:28 +0200 Subject: [PATCH 18/43] authorities and example request added --- ...d-authorities-monitoring-waehleranzahl.yml | 46 +++++++++++++++++++ ...reate-group-all-monitoring-authorities.yml | 9 ++++ .../keycloak/migration/keycloak-changelog.yml | 2 + .../http.request/http-client.env.json | 10 ++++ .../resources/http.request/waehleranzahl.http | 34 ++++++++++++++ 5 files changed, 101 insertions(+) create mode 100644 stack/keycloak/migration/add-authorities-monitoring-waehleranzahl.yml create mode 100644 stack/keycloak/migration/create-group-all-monitoring-authorities.yml create mode 100644 wls-monitoring-service/src/test/resources/http.request/http-client.env.json create mode 100644 wls-monitoring-service/src/test/resources/http.request/waehleranzahl.http diff --git a/stack/keycloak/migration/add-authorities-monitoring-waehleranzahl.yml b/stack/keycloak/migration/add-authorities-monitoring-waehleranzahl.yml new file mode 100644 index 000000000..92a9454a7 --- /dev/null +++ b/stack/keycloak/migration/add-authorities-monitoring-waehleranzahl.yml @@ -0,0 +1,46 @@ +id: add authorities monitoring waehleranzahl +author: dragonfly28 +realm: ${SSO_REALM} +changes: + - addRole: + name: Monitoring_BUSINESSACTION_GetWahlbeteiligung + clientRole: true + clientId: ${SSO_CLIENT_ID} + - assignRoleToGroup: + group: allMonitoringAuthorities + role: Monitoring_BUSINESSACTION_GetWahlbeteiligung + clientId: ${SSO_CLIENT_ID} + + - addRole: + name: Monitoring_BUSINESSACTION_PostWahlbeteiligung + clientRole: true + clientId: ${SSO_CLIENT_ID} + - assignRoleToGroup: + group: allMonitoringAuthorities + role: Monitoring_BUSINESSACTION_PostWahlbeteiligung + clientId: ${SSO_CLIENT_ID} + + - addRole: + name: Monitoring_READ_Waehleranzahl + clientRole: true + clientId: ${SSO_CLIENT_ID} + - assignRoleToGroup: + group: allMonitoringAuthorities + role: Monitoring_READ_Waehleranzahl + clientId: ${SSO_CLIENT_ID} + - addRole: + name: Monitoring_WRITE_Waehleranzahl + clientRole: true + clientId: ${SSO_CLIENT_ID} + - assignRoleToGroup: + group: allMonitoringAuthorities + role: Monitoring_WRITE_Waehleranzahl + clientId: ${SSO_CLIENT_ID} + - addRole: + name: Monitoring_DELETE_Waehleranzahl + clientRole: true + clientId: ${SSO_CLIENT_ID} + - assignRoleToGroup: + group: allMonitoringAuthorities + role: Monitoring_DELETE_Waehleranzahl + clientId: ${SSO_CLIENT_ID} \ No newline at end of file diff --git a/stack/keycloak/migration/create-group-all-monitoring-authorities.yml b/stack/keycloak/migration/create-group-all-monitoring-authorities.yml new file mode 100644 index 000000000..8401f4db2 --- /dev/null +++ b/stack/keycloak/migration/create-group-all-monitoring-authorities.yml @@ -0,0 +1,9 @@ +id: create group allEaiAuthorities and link wls_all* +author: MrSebastian +realm: ${SSO_REALM} +changes: + - addGroup: + name: allMonitoringAuthorities + - assignGroup: + user: wls_all + group: allMonitoringAuthorities \ No newline at end of file diff --git a/stack/keycloak/migration/keycloak-changelog.yml b/stack/keycloak/migration/keycloak-changelog.yml index 5c6ebe284..344fc930a 100644 --- a/stack/keycloak/migration/keycloak-changelog.yml +++ b/stack/keycloak/migration/keycloak-changelog.yml @@ -43,3 +43,5 @@ includes: - path: create-group-all-vorfaelleundvorkommnisse-authorities.yml - path: add-authorities-vorfaelleundvorkommnisse.yml - path: add-authorities-eai-ergebnismeldung.yml + - path: create-group-all-monitoring-authorities.yml + - path: add-authorities-monitoring-waehleranzahl.yml diff --git a/wls-monitoring-service/src/test/resources/http.request/http-client.env.json b/wls-monitoring-service/src/test/resources/http.request/http-client.env.json new file mode 100644 index 000000000..c89909e7a --- /dev/null +++ b/wls-monitoring-service/src/test/resources/http.request/http-client.env.json @@ -0,0 +1,10 @@ +{ + "docker": { + "WLS_MONITORING_SERVICE_URL": "http://localhost:8201", + "SSO_URL": "http://kubernetes.docker.internal:8100" + }, + "nonDocker": { + "WLS_MONITORING_SERVICE_URL": "http://localhost:39154", + "SSO_URL": "http://kubernetes.docker.internal:8100" + } +} \ No newline at end of file diff --git a/wls-monitoring-service/src/test/resources/http.request/waehleranzahl.http b/wls-monitoring-service/src/test/resources/http.request/waehleranzahl.http new file mode 100644 index 000000000..db6c1d12a --- /dev/null +++ b/wls-monitoring-service/src/test/resources/http.request/waehleranzahl.http @@ -0,0 +1,34 @@ +### 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 }} + +### get wahleranzahl by wahlID and wahlbezirkID +GET {{ WLS_MONITORING_SERVICE_URL }}/businessActions/wahlbeteiligung/wahlID01/wahlbezirkID01 +Authorization: {{ token_type }} {{ auth_token }} + +### POST waehleranzahl +POST {{ WLS_MONITORING_SERVICE_URL }}/businessActions/wahlbeteiligung/wahlID01/wahlbezirkID01 +Authorization: {{ token_type }} {{ auth_token }} +Content-Type: application/json + +{ + "wahlID": "wahlID01", + "wahlbezirkID": "wahlbezirk01", + "anzahlWaehler": 99, + "uhrzeit": "2024-10-21T23:59:12.123" +} From bd6cf225ddebd970879469c31dbb5108863273e8 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Mon, 21 Oct 2024 17:36:08 +0200 Subject: [PATCH 19/43] revert commit --- .../KonfigurationServiceSecurityTest.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/wls-infomanagement-service/src/test/java/de/muenchen/oss/wahllokalsystem/infomanagementservice/service/konfiguration/KonfigurationServiceSecurityTest.java b/wls-infomanagement-service/src/test/java/de/muenchen/oss/wahllokalsystem/infomanagementservice/service/konfiguration/KonfigurationServiceSecurityTest.java index 94ef22bcc..fd604dbaf 100644 --- a/wls-infomanagement-service/src/test/java/de/muenchen/oss/wahllokalsystem/infomanagementservice/service/konfiguration/KonfigurationServiceSecurityTest.java +++ b/wls-infomanagement-service/src/test/java/de/muenchen/oss/wahllokalsystem/infomanagementservice/service/konfiguration/KonfigurationServiceSecurityTest.java @@ -1,7 +1,5 @@ package de.muenchen.oss.wahllokalsystem.infomanagementservice.service.konfiguration; -import static org.springframework.security.core.context.SecurityContextHolder.clearContext; - import de.muenchen.oss.wahllokalsystem.infomanagementservice.MicroServiceApplication; import de.muenchen.oss.wahllokalsystem.infomanagementservice.TestConstants; import de.muenchen.oss.wahllokalsystem.infomanagementservice.domain.konfiguration.Konfiguration; @@ -27,6 +25,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.ActiveProfiles; @SpringBootTest(classes = MicroServiceApplication.class) @@ -44,7 +43,7 @@ public class KonfigurationServiceSecurityTest { @BeforeEach void setup() { - clearContext(); + SecurityContextHolder.clearContext(); } @AfterEach @@ -69,7 +68,7 @@ void anyMissingAuthorityCausesFail(final ArgumentsAccessor argumentsAccessor) { SecurityUtils.runWith(argumentsAccessor.get(0, String[].class)); Assertions.assertThatThrownBy(() -> konfigurationService.getKonfiguration(KonfigurationKonfigKey.WILLKOMMENSTEXT)) - .isInstanceOf(AccessDeniedException.class); + .isInstanceOf(AccessDeniedException.class); } private static Stream getMissingAuthoritiesVariations() { @@ -92,23 +91,23 @@ void accessGranted() { @Test void accessDeniedOnMissingServiceAuthority() { SecurityUtils.runWith( - removeAuthority(Authorities.ALL_AUTHORITIES_SET_KONFIGURATION, Authorities.SERVICE_POST_KONFIGURATION)); + removeAuthority(Authorities.ALL_AUTHORITIES_SET_KONFIGURATION, Authorities.SERVICE_POST_KONFIGURATION)); val konfigurationSetModel = new KonfigurationSetModel("schluessel", "wert", "beschreibung", "standwert"); Assertions.assertThatThrownBy(() -> konfigurationService.setKonfiguration(konfigurationSetModel)) - .isInstanceOf(AccessDeniedException.class); + .isInstanceOf(AccessDeniedException.class); } @Test void wlsExceptionOnMissingWriteAuthority() { SecurityUtils.runWith( - removeAuthority(Authorities.ALL_AUTHORITIES_SET_KONFIGURATION, Authorities.REPOSITORY_WRITE_KONFIGURATION)); + removeAuthority(Authorities.ALL_AUTHORITIES_SET_KONFIGURATION, Authorities.REPOSITORY_WRITE_KONFIGURATION)); val konfigurationSetModel = new KonfigurationSetModel("schluessel", "wert", "beschreibung", "standwert"); Assertions.assertThatThrownBy(() -> konfigurationService.setKonfiguration(konfigurationSetModel)) - .isInstanceOf(TechnischeWlsException.class); + .isInstanceOf(TechnischeWlsException.class); } private String[] removeAuthority(final String[] authorities, final String authorityToRemove) { @@ -133,7 +132,7 @@ void anyMissingAuthorityCausesFail(final ArgumentsAccessor argumentsAccessor) { SecurityUtils.runWith(argumentsAccessor.get(0, String[].class)); Assertions.assertThatThrownBy(() -> konfigurationService.getAllKonfigurations()) - .isInstanceOf(AccessDeniedException.class); + .isInstanceOf(AccessDeniedException.class); } private static Stream getMissingAuthoritiesVariations() { @@ -163,7 +162,7 @@ void anyMissingAuthorityCausesFail(final ArgumentsAccessor argumentsAccessor) { SecurityUtils.runWith(argumentsAccessor.get(0, String[].class)); Assertions.assertThatThrownBy(() -> konfigurationService.getKennbuchstabenListen()) - .isInstanceOf(AccessDeniedException.class); + .isInstanceOf(AccessDeniedException.class); } private static Stream getMissingAuthoritiesVariations() { @@ -175,7 +174,7 @@ private static Stream getMissingAuthoritiesVariations() { class GetKonfigurationUnauthorized { @Test void accessGranted() { - clearContext(); + SecurityContextHolder.clearContext(); Assertions.assertThatNoException().isThrownBy(() -> konfigurationService.getKonfigurationUnauthorized(KonfigurationKonfigKey.WILLKOMMENSTEXT)); } From d0dffecff329cdb6684e6dff55da6da1f0454a50 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 13:41:09 +0200 Subject: [PATCH 20/43] Apply suggestions from code review renamings of test methods, unused code Co-authored-by: MrSebastian <13592751+MrSebastian@users.noreply.github.com> --- .../waehleranzahl/WaehleranzahlClientImpl.java | 2 +- .../domain/waehleranzahl/Waehleranzahl.java | 2 -- .../exception/ExceptionConstants.java | 1 - .../waehleranzahl/WaehleranzahlController.java | 4 ++-- .../waehleranzahl/WaehleranzahlValidator.java | 4 ---- .../WaehleranzahlClientImplTest.java | 2 -- .../configuration/SecurityConfigurationTest.java | 8 ++++---- .../WaehleranzahlControllerIntegrationTest.java | 15 ++++----------- .../WaehleranzahlControllerTest.java | 3 ++- .../waehleranzahl/WaehleranzahlDTOMapperTest.java | 4 ++-- .../WaehleranzahlModelMapperTest.java | 4 ++-- .../WaehleranzahlServiceSecurityTest.java | 10 +++++----- .../waehleranzahl/WaehleranzahlServiceTest.java | 5 ++--- .../src/test/resources/application-test.yml | 2 -- 14 files changed, 24 insertions(+), 42 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java index 7516dc960..777d36b8c 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java @@ -25,7 +25,7 @@ public class WaehleranzahlClientImpl implements WaehleranzahlClient { private final WaehleranzahlClientMapper waehleranzahlClientMapper; @Override - public void postWahlbeteiligung(WaehleranzahlModel waehleranzahlModel) throws WlsException { + public void postWahlbeteiligung(final WaehleranzahlModel waehleranzahlModel) throws WlsException { val wahlbeteiligungsMeldungDTO = waehleranzahlClientMapper.fromModelToRemoteClientDTO(waehleranzahlModel); try { wahlbeteiligungControllerApi.saveWahlbeteiligung(wahlbeteiligungsMeldungDTO); diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java index d309b4eb7..02b4fa1a4 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java @@ -13,14 +13,12 @@ import lombok.ToString; @Entity -@Embeddable @Getter @Setter @ToString @EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor - public class Waehleranzahl { @EmbeddedId diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java index 231a5170a..be20ff26d 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/exception/ExceptionConstants.java @@ -10,7 +10,6 @@ public class ExceptionConstants { //waehleranzahl public static final ExceptionDataWrapper GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG = new ExceptionDataWrapper("102", "Fehler in getWahlbeteiligung(): Parameter unvollstaendig."); - public static ExceptionDataWrapper GETWAHLBETEILIGUNG_KEINE_DATEN = new ExceptionDataWrapper("302", "Die Wahlbeteiligung konnte nicht geladen werden."); public static final ExceptionDataWrapper POSTWAHLBETEILIGUNG_UNSAVEABLE = new ExceptionDataWrapper("101", "Fehler in postWahlbeteiligung(): Waehleranzahl konnte nicht gespeichert werden."); diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java index 84915f2ef..b28bbf0f5 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlController.java @@ -26,7 +26,7 @@ public class WaehleranzahlController extends AbstractController { @Operation(description = "Laden der zuvor gespeicherten Wahlbeteiligung für die Wahl {wahlID} für den Wahlbezirk {wahlbezirkID}.") @GetMapping("/{wahlID}/{wahlbezirkID}") - ResponseEntity getWahlbeteiligung(@PathVariable("wahlID") String wahlID, @PathVariable("wahlbezirkID") String wahlbezirkID) { + ResponseEntity getWahlbeteiligung(@PathVariable("wahlID") final String wahlID, @PathVariable("wahlbezirkID") final String wahlbezirkID) { val waehleranzahlModel = waehleranzahlService.getWahlbeteiligung(new BezirkUndWahlID(wahlID, wahlbezirkID)); return okWithBodyOrNoContent(waehleranzahlModel.map(waehleranzahlDTOMapper::toDTO)); @@ -34,7 +34,7 @@ ResponseEntity getWahlbeteiligung(@PathVariable("wahlID") Stri @Operation(description = "Speichern und Weiterleiten der Wahlbeteiligung für die Wahl {wahlID} für den Wahlbezirk {wahlbezirkID}.") @PostMapping("/{wahlID}/{wahlbezirkID}") - public void postWahlbeteiligung(@PathVariable("wahlbezirkID") String wahlbezirkID, @PathVariable("wahlID") String wahlID, + public void postWahlbeteiligung(@PathVariable("wahlbezirkID") final String wahlbezirkID, @PathVariable("wahlID") final String wahlID, @RequestBody WaehleranzahlDTO waehleranzahl) { log.info("postWahlbeteiligung {}", wahlbezirkID); diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidator.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidator.java index b1eb60492..32ddb42fb 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidator.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidator.java @@ -19,8 +19,4 @@ public void validWahlIdUndWahlbezirkIDOrThrow(final BezirkUndWahlID bezirkUndWah throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG); } } - - public void validWaehleranzahlSetModel(WaehleranzahlModel waehleranzahl) { - validWahlIdUndWahlbezirkIDOrThrow(waehleranzahl.bezirkUndWahlID()); - } } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java index 125abef4b..65219d080 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java @@ -39,7 +39,6 @@ class PostWahlbeteiligung { @Test void should_callEaiApiWithDTO_when_clientIsCalledWithModel() { - val waehleranzahlModel = new WaehleranzahlModel(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 99L, LocalDateTime.now()); val mockedWahlbeteiligungsMeldungDTO = createWahlbeteiligungsMeldungDTO(); Mockito.when(waehleranzahlClientMapper.fromModelToRemoteClientDTO(waehleranzahlModel)).thenReturn(mockedWahlbeteiligungsMeldungDTO); @@ -50,7 +49,6 @@ void should_callEaiApiWithDTO_when_clientIsCalledWithModel() { @Test void should_throwTechnischeWlsException_when_eaiApiThrowsAnyException() { - val waehleranzahlModel = new WaehleranzahlModel(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 99L, LocalDateTime.now()); val mockedWahlbeteiligungsMeldungDTO = createWahlbeteiligungsMeldungDTO(); Mockito.when(waehleranzahlClientMapper.fromModelToRemoteClientDTO(waehleranzahlModel)).thenReturn(mockedWahlbeteiligungsMeldungDTO); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java index f0dd47862..9762b69b1 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java @@ -86,25 +86,25 @@ class Waehleranzahl { @Test @WithAnonymousUser - void should_return401Unauthorized_when_GetWithUnauthorizedAnonymousUser() throws Exception { + void should_return401Unauthorized_when_getWithUnauthorizedAnonymousUser() throws Exception { api.perform(get("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID")).andExpect(status().isUnauthorized()); } @Test @WithMockUser - void should_return204NoContent_when_GetWithAuthorizedMockUser() throws Exception { + void should_return204NoContent_when_getWithAuthorizedMockUser() throws Exception { api.perform(get("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID")).andExpect(status().isNoContent()); } @Test @WithAnonymousUser - void should_return401Unauthorized_when_PostWithUnauthorizedAnonymousUser() throws Exception { + void should_return401Unauthorized_when_postWithUnauthorizedAnonymousUser() throws Exception { api.perform(post("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID").with(csrf())).andExpect(status().isUnauthorized()); } @Test @WithMockUser - void should_return200OK_when_PostWithAuthorizedMockUser() throws Exception { + void should_return200OK_when_postWithAuthorizedMockUser() throws Exception { val requestBody = new WaehleranzahlDTO(null, null, null, null); val request = post("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID").with(csrf()).contentType(MediaType.APPLICATION_JSON).content( objectMapper.writeValueAsString(requestBody)); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java index 12222564f..3e154ec79 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java @@ -63,9 +63,6 @@ public class WaehleranzahlControllerIntegrationTest { @Autowired WaehleranzahlModelMapper waehleranzahlModelMapper; - @Autowired - WaehleranzahlClientMapper waehleranzahlClientMapper; - @Autowired MockMvc api; @@ -78,17 +75,12 @@ void tearDown() { waehleranzahlRepository.deleteAll(); } - @BeforeEach - void setup() { - WireMock.resetAllRequests(); - } - @Nested class GetWahlbeteiligung { @Test @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) - void should_returnEmptyResponse_when_NoDataFound() throws Exception { + void should_returnEmptyResponse_when_noDataFound() throws Exception { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; val request = MockMvcRequestBuilders.get("/businessActions/wahlbeteiligung/" + wahlID + "/" + wahlbezirkID); @@ -100,7 +92,7 @@ void should_returnEmptyResponse_when_NoDataFound() throws Exception { @Test @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) - void should_returnOkAndData_when_DataFound() throws Exception { + void should_returnOkAndData_when_dataFound() throws Exception { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); @@ -121,9 +113,10 @@ void should_returnOkAndData_when_DataFound() throws Exception { @Nested class PostBriefwahlvorbereitung { + @Test @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) - void should_overwriteExistingData_when_NewDataIsStoredWithSameID() throws Exception { + void should_overwriteExistingData_when_newDataIsStoredWithSameID() throws Exception { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java index db4ae6fd5..58dfaef90 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java @@ -17,6 +17,7 @@ @ExtendWith(MockitoExtension.class) public class WaehleranzahlControllerTest { + @Mock WaehleranzahlService waehleranzahlService; @@ -30,7 +31,7 @@ public class WaehleranzahlControllerTest { class GetWahlbeteiligung { @Test - void should_returnHttp204AndBodyIsNull_when_serviceIsCalledWithNoData() { + void should_returnHttp204AndBodyIsNull_when_serviceIsReturnsNoData() { String wahlID = "wahlID01"; String wahlbezirkID = "wahlbezirkID01"; BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java index 670ac9f03..ce3f4b4d5 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java @@ -17,12 +17,12 @@ class WaehleranzahlDTOMapperTest { class ToDTO { @Test - void should_returnNull_when_ModelIsNull() { + void should_returnNull_when_modelIsNull() { Assertions.assertThat(unitUnderTest.toDTO(null)).isNull(); } @Test - void should_returnNull_when_DTOIsNull() { + void should_returnNull_when_dtoIsNull() { Assertions.assertThat(unitUnderTest.toSetModel(null, null)).isNull(); } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java index 9c0f088e0..fda1be556 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java @@ -13,7 +13,7 @@ class WaehleranzahlModelMapperTest { private final WaehleranzahlModelMapper unitUnderTest = Mappers.getMapper(WaehleranzahlModelMapper.class); @Test - void should_returnEqualWaehleranzahlModel_when_WaehleranzahlIsMapped() { + void should_returnEqualWaehleranzahlModel_when_waehleranzahlIsMapped() { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); @@ -29,7 +29,7 @@ void should_returnEqualWaehleranzahlModel_when_WaehleranzahlIsMapped() { } @Test - void should_returnEqualWaehleranzahl_when_WaehleranzahlModelIsMapped() { + void should_returnEqualWaehleranzahl_when_waehleranzahlModelIsMapped() { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java index c601a2cfb..dd59ec9d2 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceSecurityTest.java @@ -68,7 +68,7 @@ void tearDown() { class GetWahlbeteiligung { @Test - void should_grantAccessAndThrowNoException_when_AuthoritiesAreValid() { + void should_grantAccessAndThrowNoException_when_authoritiesAreValid() { BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID("wahlID01", "wahlbezirkID01"); SecurityUtils.runWith(Authorities.REPOSITORY_WRITE_WAEHLERANZAHL); waehleranzahlRepository.save(new Waehleranzahl(bezirkUndWahlID, 99, LocalDateTime.now())); @@ -80,7 +80,7 @@ void should_grantAccessAndThrowNoException_when_AuthoritiesAreValid() { @ParameterizedTest(name = "{index} - {1} missing") @MethodSource("getMissingAuthoritiesVariations") - void should_FailWithAccessDeniedException_when_AnyAuthorityIsMissing(final ArgumentsAccessor argumentsAccessor) { + void should_failWithAccessDeniedException_when_anyAuthorityIsMissing(final ArgumentsAccessor argumentsAccessor) { SecurityUtils.runWith(argumentsAccessor.get(0, String[].class)); BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID("wahlID01", "wahlbezirkID01"); Assertions.assertThatThrownBy(() -> waehleranzahlService.getWahlbeteiligung(bezirkUndWahlID)).isInstanceOf(AccessDeniedException.class); @@ -95,7 +95,7 @@ private static Stream getMissingAuthoritiesVariations() { class PostWahlbeteiligung { @Test - void should_grantAccessAndThrowNoException_when_AuthoritiesAreValid() throws Exception { + void should_grantAccessAndThrowNoException_when_authoritiesAreValid() throws Exception { SecurityUtils.runWith(Authorities.ALL_AUTHORITIES_SET_WAEHLERANZAHL); String wahlID = "wahlID01"; String wahlbezirkID = "wahlbezirkID01"; @@ -111,7 +111,7 @@ void should_grantAccessAndThrowNoException_when_AuthoritiesAreValid() throws Exc } @Test - void should_FailWithAccessDeniedException_when_ServiceAuthorityIsMissing() throws Exception { + void should_failWithAccessDeniedException_when_serviceAuthorityIsMissing() throws Exception { SecurityUtils.runWith(Authorities.REPOSITORY_WRITE_WAEHLERANZAHL); String wahlID = "wahlID01"; @@ -128,7 +128,7 @@ void should_FailWithAccessDeniedException_when_ServiceAuthorityIsMissing() throw } @Test - void should_FailWithTechnischeWlsException_when_RepoAuthorityIsMissing() throws Exception { + void should_failWithTechnischeWlsException_when_repoAuthorityIsMissing() throws Exception { SecurityUtils.runWith(Authorities.SERVICE_POST_WAEHLERANZAHL); String wahlID = "wahlID01"; diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java index 6aee20dd7..844f803cb 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java @@ -37,7 +37,7 @@ public class WaehleranzahlServiceTest { class GetWahlbeteiligung { @Test - void should_returnRepoData_when_RepoDataFound() { + void should_returnRepoData_when_repoDataFound() { BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID("wahlID01", "wahlbezirkID01"); val mockedRepoResponse = new Waehleranzahl(); @@ -51,7 +51,7 @@ void should_returnRepoData_when_RepoDataFound() { } @Test - void should_returnEmptyResult_when_RepoDataNotFound() { + void should_returnEmptyResult_when_repoDataNotFound() { BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID("wahlID01", "wahlbezirkID01"); Mockito.when(waehleranzahlRepository.findById(bezirkUndWahlID)).thenReturn(Optional.empty()); @@ -66,7 +66,6 @@ class PostWahlbeteiligung { @Test void should_notThrowExceptionAndSaveDataInRepo_when_ModelIsGiven() { - val waehleranzahlSetModel = WaehleranzahlModel.builder().build(); val mockedKonfigurationEntity = new Waehleranzahl(); diff --git a/wls-monitoring-service/src/test/resources/application-test.yml b/wls-monitoring-service/src/test/resources/application-test.yml index bc7348bfa..7b6942275 100644 --- a/wls-monitoring-service/src/test/resources/application-test.yml +++ b/wls-monitoring-service/src/test/resources/application-test.yml @@ -2,8 +2,6 @@ app: clients: eai: basePath: http://localhost:${wiremock.server.port}/ - monitoring: - basePath: http://localhost:${wiremock.server.port}/ spring: # Spring JPA From 5aab721b3c3816668c36c5bbcba1cf9831e00f6f Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 13:43:11 +0200 Subject: [PATCH 21/43] =?UTF-8?q?wls=5Fall=5Fuwb=20und=20wls=5Fall=5Fbwb?= =?UTF-8?q?=20hinzugef=C3=BCgt,=20id=20und=20author=20angepasst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../create-group-all-monitoring-authorities.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/stack/keycloak/migration/create-group-all-monitoring-authorities.yml b/stack/keycloak/migration/create-group-all-monitoring-authorities.yml index 8401f4db2..5b06ee5dd 100644 --- a/stack/keycloak/migration/create-group-all-monitoring-authorities.yml +++ b/stack/keycloak/migration/create-group-all-monitoring-authorities.yml @@ -1,9 +1,15 @@ -id: create group allEaiAuthorities and link wls_all* -author: MrSebastian +id: create group allMonitoringAuthorities and link wls_all* +author: dragonfly28 realm: ${SSO_REALM} changes: - addGroup: name: allMonitoringAuthorities - assignGroup: user: wls_all + group: allMonitoringAuthorities + - assignGroup: + user: wls_all_uwb + group: allMonitoringAuthorities + - assignGroup: + user: wls_all_bwb group: allMonitoringAuthorities \ No newline at end of file From 6081ea730a42f4ba143ce5351e7a708f4d5dfef2 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 13:46:02 +0200 Subject: [PATCH 22/43] =?UTF-8?q?wls=5Fall=5Fuwb=20und=20wls=5Fall=5Fbwb?= =?UTF-8?q?=20hinzugef=C3=BCgt,=20id=20und=20author=20angepasst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitoringservice/MicroServiceApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java index 9e743431a..4f197abc7 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java @@ -20,7 +20,6 @@ "org.springframework.data.jpa.convert.threeten", "de.muenchen.oss.wahllokalsystem.monitoringservice", "de.muenchen.oss.wahllokalsystem.wls.common.exception", - "de.muenchen.oss.wahllokalsystem.wls.common.security" } ) @EntityScan( From 9d9fb5e40205f05142c089ffbdec6427929d881f Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 13:48:34 +0200 Subject: [PATCH 23/43] =?UTF-8?q?Revert=20"wls=5Fall=5Fuwb=20und=20wls=5Fa?= =?UTF-8?q?ll=5Fbwb=20hinzugef=C3=BCgt,=20id=20und=20author=20angepasst"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 6081ea730a42f4ba143ce5351e7a708f4d5dfef2. --- .../monitoringservice/MicroServiceApplication.java | 1 + 1 file changed, 1 insertion(+) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java index 4f197abc7..9e743431a 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java @@ -20,6 +20,7 @@ "org.springframework.data.jpa.convert.threeten", "de.muenchen.oss.wahllokalsystem.monitoringservice", "de.muenchen.oss.wahllokalsystem.wls.common.exception", + "de.muenchen.oss.wahllokalsystem.wls.common.security" } ) @EntityScan( From 7c00e297b25de5f83893aef57b9378362694e3a8 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 13:49:02 +0200 Subject: [PATCH 24/43] =?UTF-8?q?unn=C3=B6tiger=20scan=20entfernt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MicroServiceApplication.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java index 9e743431a..581fadb37 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java @@ -16,23 +16,22 @@ */ @Configuration @ComponentScan( - basePackages = { - "org.springframework.data.jpa.convert.threeten", - "de.muenchen.oss.wahllokalsystem.monitoringservice", - "de.muenchen.oss.wahllokalsystem.wls.common.exception", - "de.muenchen.oss.wahllokalsystem.wls.common.security" - } + basePackages = { + "org.springframework.data.jpa.convert.threeten", + "de.muenchen.oss.wahllokalsystem.monitoringservice", + "de.muenchen.oss.wahllokalsystem.wls.common.exception", + } ) @EntityScan( - basePackages = { - "org.springframework.data.jpa.convert.threeten", - "de.muenchen.oss.wahllokalsystem.monitoringservice" - } + basePackages = { + "org.springframework.data.jpa.convert.threeten", + "de.muenchen.oss.wahllokalsystem.monitoringservice" + } ) @EnableJpaRepositories( - basePackages = { - "de.muenchen.oss.wahllokalsystem.monitoringservice" - } + basePackages = { + "de.muenchen.oss.wahllokalsystem.monitoringservice" + } ) @EnableAutoConfiguration public class MicroServiceApplication { From 9eaced22649005a8a4de122632cd655506325c3a Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 13:52:47 +0200 Subject: [PATCH 25/43] import statt referenzierung absolut --- .../monitoringservice/domain/waehleranzahl/Waehleranzahl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java index 02b4fa1a4..f7c3b8cf6 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/domain/waehleranzahl/Waehleranzahl.java @@ -1,10 +1,10 @@ package de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; -import jakarta.persistence.Embeddable; import jakarta.persistence.EmbeddedId; import jakarta.persistence.Entity; import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -29,6 +29,6 @@ public class Waehleranzahl { private long anzahlWaehler; @NotNull - private java.time.LocalDateTime uhrzeit; + private LocalDateTime uhrzeit; } From 3334485304749c2cb06400982315785c5ace1e2e Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 13:56:32 +0200 Subject: [PATCH 26/43] C&P-Error behoben, Klasse umbenannt --- .../waehleranzahl/WaehleranzahlControllerIntegrationTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java index 3e154ec79..def75dfa3 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java @@ -10,7 +10,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.client.WireMock; import de.muenchen.oss.wahllokalsystem.monitoringservice.MicroServiceApplication; -import de.muenchen.oss.wahllokalsystem.monitoringservice.client.waehleranzahl.WaehleranzahlClientMapper; import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; @@ -24,7 +23,6 @@ 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; @@ -112,7 +110,7 @@ void should_returnOkAndData_when_dataFound() throws Exception { } @Nested - class PostBriefwahlvorbereitung { + class PostWahlbeteiligung { @Test @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) From e1c50ad25eab8fae8b92cd830d4f59d6342c209b Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 14:01:13 +0200 Subject: [PATCH 27/43] eai-port angepasst --- wls-monitoring-service/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wls-monitoring-service/src/main/resources/application.yml b/wls-monitoring-service/src/main/resources/application.yml index a52841768..5e80699c6 100644 --- a/wls-monitoring-service/src/main/resources/application.yml +++ b/wls-monitoring-service/src/main/resources/application.yml @@ -66,4 +66,4 @@ info.application.version: @project.version@ app: clients: eai: - basePath: http://localhost:39146 \ No newline at end of file + basePath: http://localhost:39149 \ No newline at end of file From bcb33ea882264cf76f100f7170e214c772b6b0bd Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 14:03:04 +0200 Subject: [PATCH 28/43] import verwenden --- .../monitoringservice/configuration/BasePathConfiguration.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/BasePathConfiguration.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/BasePathConfiguration.java index f8837fc58..6af3d48cf 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/BasePathConfiguration.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/BasePathConfiguration.java @@ -1,5 +1,6 @@ package de.muenchen.oss.wahllokalsystem.monitoringservice.configuration; +import de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.ApiClient; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; @@ -12,7 +13,7 @@ public class BasePathConfiguration { @Value("${app.clients.eai.basePath}") String eaiBasePath; - private final de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.ApiClient eaiApiClient; + private final ApiClient eaiApiClient; @PostConstruct public void updateBasePaths() { From 78e2e63c9e1e00c26f320adc205014cb98a33f8e Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 14:06:32 +0200 Subject: [PATCH 29/43] Werfen der technischen Exception entfernen, log.error statt log.info und Text der Message angepasst wie im Altsystem --- .../waehleranzahl/WaehleranzahlClientImpl.java | 7 +------ .../waehleranzahl/WaehleranzahlClientImplTest.java | 13 ++----------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java index 777d36b8c..fa079f830 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImpl.java @@ -2,11 +2,9 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.configuration.Profiles; import de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.client.WahlbeteiligungControllerApi; -import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlClient; import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; import de.muenchen.oss.wahllokalsystem.wls.common.exception.WlsException; -import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -19,8 +17,6 @@ @Slf4j public class WaehleranzahlClientImpl implements WaehleranzahlClient { - private final ExceptionFactory exceptionFactory; - private final WahlbeteiligungControllerApi wahlbeteiligungControllerApi; private final WaehleranzahlClientMapper waehleranzahlClientMapper; @@ -30,8 +26,7 @@ public void postWahlbeteiligung(final WaehleranzahlModel waehleranzahlModel) thr try { wahlbeteiligungControllerApi.saveWahlbeteiligung(wahlbeteiligungsMeldungDTO); } catch (final Exception exception) { - log.info("exception on postWahlbeteiligung from external", exception); - throw exceptionFactory.createTechnischeWlsException(ExceptionConstants.FAILED_COMMUNICATION_WITH_EAI); + log.error("Wahllokalzustand nicht gesendet. Exception: ", exception); } } } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java index 65219d080..f255a8201 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientImplTest.java @@ -2,10 +2,7 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.client.WahlbeteiligungControllerApi; import de.muenchen.oss.wahllokalsystem.monitoringservice.eai.aou.model.WahlbeteiligungsMeldungDTO; -import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; -import de.muenchen.oss.wahllokalsystem.wls.common.exception.TechnischeWlsException; -import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.time.LocalDateTime; import java.time.OffsetDateTime; @@ -22,9 +19,6 @@ @ExtendWith(MockitoExtension.class) class WaehleranzahlClientImplTest { - @Mock - ExceptionFactory exceptionFactory; - @Mock WahlbeteiligungControllerApi wahlbeteiligungControllerApi; @@ -48,18 +42,15 @@ void should_callEaiApiWithDTO_when_clientIsCalledWithModel() { } @Test - void should_throwTechnischeWlsException_when_eaiApiThrowsAnyException() { + void should_notThrowException_when_eaiApiThrowsAnyException() { val waehleranzahlModel = new WaehleranzahlModel(new BezirkUndWahlID("wahlID01", "wahlbezirkID01"), 99L, LocalDateTime.now()); val mockedWahlbeteiligungsMeldungDTO = createWahlbeteiligungsMeldungDTO(); Mockito.when(waehleranzahlClientMapper.fromModelToRemoteClientDTO(waehleranzahlModel)).thenReturn(mockedWahlbeteiligungsMeldungDTO); - val mockedWlsException = TechnischeWlsException.withCode("007").buildWithMessage("Dummy-Msg"); - Mockito.when(exceptionFactory.createTechnischeWlsException(ExceptionConstants.FAILED_COMMUNICATION_WITH_EAI)).thenReturn(mockedWlsException); - val mockedApiException = new IllegalArgumentException("Nix-Connect"); Mockito.doThrow(mockedApiException).when(wahlbeteiligungControllerApi).saveWahlbeteiligung(mockedWahlbeteiligungsMeldungDTO); - Assertions.assertThatThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlModel)).isSameAs(mockedWlsException); + Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlModel)); } private WahlbeteiligungsMeldungDTO createWahlbeteiligungsMeldungDTO() { From f4703aa5893c5d3d25d0cfdfd572730c12dc8086 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 14:08:22 +0200 Subject: [PATCH 30/43] Mapping der wahlID auf null wie im Altsystem --- .../client/waehleranzahl/WaehleranzahlClientMapper.java | 2 +- .../client/waehleranzahl/WaehleranzahlClientMapperTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java index e1d4aa3f7..340a99e8c 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java @@ -13,7 +13,7 @@ public interface WaehleranzahlClientMapper { ZoneOffset DEFAULT_ZONE = ZoneOffset.UTC; - @Mapping(target = "wahlID", source = "bezirkUndWahlID.wahlID") + @Mapping(target = "wahlID", ignore = true) @Mapping(target = "wahlbezirkID", source = "bezirkUndWahlID.wahlbezirkID") @Mapping(target = "meldeZeitpunkt", source = "uhrzeit") WahlbeteiligungsMeldungDTO fromModelToRemoteClientDTO(WaehleranzahlModel waehleranzahlModel); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java index a625ce5d6..144acc11a 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java @@ -31,7 +31,7 @@ void isMappedWithSomething() { val result = unitUnderTest.fromModelToRemoteClientDTO(waehleranzahlModel); - val expectedWahlbeteiligungsMeldungDTO = new WahlbeteiligungsMeldungDTO().wahlID(wahlID).wahlbezirkID(wahlbezirkID).anzahlWaehler(anzahlWahler) + val expectedWahlbeteiligungsMeldungDTO = new WahlbeteiligungsMeldungDTO().wahlID(null).wahlbezirkID(wahlbezirkID).anzahlWaehler(anzahlWahler) .meldeZeitpunkt(meldeZeitpunkt.atOffset(ZoneOffset.UTC)); Assertions.assertThat(result).isEqualTo(expectedWahlbeteiligungsMeldungDTO); } From 0864c4298a13145f6132a76334797115213c7e0f Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 15:08:13 +0200 Subject: [PATCH 31/43] test class added for validator --- .../WaehleranzahlValidatorTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidatorTest.java diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidatorTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidatorTest.java new file mode 100644 index 000000000..400febb0a --- /dev/null +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidatorTest.java @@ -0,0 +1,75 @@ +package de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl; + +import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.FachlicheWlsException; +import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; +import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +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 WaehleranzahlValidatorTest { + + @Mock + ExceptionFactory exceptionFactory; + + @InjectMocks + WaehleranzahlValidator unitUnderTest; + + @Nested + class ValidWahlIdUndWahlbezirkIDOrThrow { + + private final FachlicheWlsException mockedFachlicheWlsException = FachlicheWlsException.withCode("").buildWithMessage(""); + + @Test + void noExceptionWhenValid() { + Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(new BezirkUndWahlID("wahlID", "wahlbezirkID"))); + } + + @Test + void exceptionWhenParameterIsNull() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) + .thenReturn(mockedFachlicheWlsException); + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(null)).isSameAs(mockedFachlicheWlsException); + } + + @Test + void exceptionWhenWahlIDIsNull() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) + .thenReturn(mockedFachlicheWlsException); + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(new BezirkUndWahlID(null, "wahlbezirkID"))) + .isSameAs(mockedFachlicheWlsException); + } + + @Test + void exceptionWhenWahlIDIsEmptyString() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) + .thenReturn(mockedFachlicheWlsException); + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(new BezirkUndWahlID("", "wahlbezirkID"))) + .isSameAs(mockedFachlicheWlsException); + } + + @Test + void exceptionWhenWahlbezirkIDIsNull() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) + .thenReturn(mockedFachlicheWlsException); + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(new BezirkUndWahlID("wahlID", null))) + .isSameAs(mockedFachlicheWlsException); + } + + @Test + void exceptionWhenWahlbezirkIDIsEmptyString() { + Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) + .thenReturn(mockedFachlicheWlsException); + Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(new BezirkUndWahlID("wahlID", ""))) + .isSameAs(mockedFachlicheWlsException); + } + } + +} From edc7596acf0a8ac65bb5ad6bd8f26ec14cb1cbc5 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 15:26:46 +0200 Subject: [PATCH 32/43] =?UTF-8?q?wahlID=20und=20wahlbezirkID=20aus=20DTO?= =?UTF-8?q?=20entfernt=20weil=20im=20Controller=20=C3=BCber=20Pfadvariable?= =?UTF-8?q?n=20gesetzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rest/waehleranzahl/WaehleranzahlDTO.java | 2 -- .../rest/waehleranzahl/WaehleranzahlDTOMapper.java | 3 --- .../configuration/SecurityConfigurationTest.java | 2 +- .../WaehleranzahlControllerIntegrationTest.java | 6 +++--- .../rest/waehleranzahl/WaehleranzahlDTOMapperTest.java | 4 ++-- 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTO.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTO.java index 8c4e98e52..35fb96c23 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTO.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTO.java @@ -6,8 +6,6 @@ @Builder public record WaehleranzahlDTO( - @NotNull String wahlID, - @NotNull String wahlbezirkID, @NotNull Long anzahlWaehler, @NotNull LocalDateTime uhrzeit) { } diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapper.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapper.java index b41cfc5cf..291968704 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapper.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapper.java @@ -3,13 +3,10 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import org.mapstruct.Mapper; -import org.mapstruct.Mapping; @Mapper public interface WaehleranzahlDTOMapper { - @Mapping(source = "bezirkUndWahlID.wahlID", target = "wahlID") - @Mapping(source = "bezirkUndWahlID.wahlbezirkID", target = "wahlbezirkID") WaehleranzahlDTO toDTO(WaehleranzahlModel waehleranzahlModel); WaehleranzahlModel toSetModel(BezirkUndWahlID bezirkUndWahlID, WaehleranzahlDTO waehleranzahlDTO); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java index 9762b69b1..10cf64d31 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/configuration/SecurityConfigurationTest.java @@ -105,7 +105,7 @@ void should_return401Unauthorized_when_postWithUnauthorizedAnonymousUser() throw @Test @WithMockUser void should_return200OK_when_postWithAuthorizedMockUser() throws Exception { - val requestBody = new WaehleranzahlDTO(null, null, null, null); + val requestBody = new WaehleranzahlDTO(null, null); val request = post("/businessActions/wahlbeteiligung/wahlID/wahlbezirkID").with(csrf()).contentType(MediaType.APPLICATION_JSON).content( objectMapper.writeValueAsString(requestBody)); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java index def75dfa3..27136be0a 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java @@ -121,7 +121,7 @@ void should_overwriteExistingData_when_newDataIsStoredWithSameID() throws Except val anzahlWaehler_1 = 99L; val uhrzeit_1 = LocalDateTime.parse("2024-09-13T12:11:21.343"); - val waehleranzahlDTO_1 = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler_1, uhrzeit_1); + val waehleranzahlDTO_1 = new WaehleranzahlDTO(anzahlWaehler_1, uhrzeit_1); WireMock.stubFor(WireMock.post("/wahlbeteiligung") .willReturn(WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.OK.value()) @@ -139,7 +139,7 @@ void should_overwriteExistingData_when_newDataIsStoredWithSameID() throws Except // Overwrite existing data val anzahlWaehler_2 = 55L; val uhrzeit_2 = LocalDateTime.parse("2024-09-13T12:11:21.666"); - val waehleranzahlDTO_2 = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler_2, uhrzeit_2); + val waehleranzahlDTO_2 = new WaehleranzahlDTO(anzahlWaehler_2, uhrzeit_2); val request_2 = buildPostRequest(wahlID, wahlbezirkID, waehleranzahlDTO_2); api.perform(request_2).andExpect(status().isOk()).andReturn(); @@ -159,7 +159,7 @@ void should_throwTechnischeWlsException_when_requestIsInvalid() throws Exception val wahlbezirkID = "wahlbezirkID01"; val anzahlWaehler = 99L; val uhrzeit = LocalDateTime.parse("2024-09-13T12:11:21.343"); - val waehleranzahlDTO = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler, uhrzeit); + val waehleranzahlDTO = new WaehleranzahlDTO(anzahlWaehler, uhrzeit); val request = MockMvcRequestBuilders.post("/businessActions/wahlbeteiligung/" + wahlID + "/" + wahlbezirkID).with(csrf()) .contentType(MediaType.APPLICATION_JSON) diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java index ce3f4b4d5..93c7d099d 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java @@ -35,7 +35,7 @@ void should_mapModelToDto_when_ModelIsNotNull() { BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); val modelInput = new WaehleranzahlModel(bezirkUndWahlID, anzahlWaehler, uhrzeit); - val dtoExpected = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler, uhrzeit); + val dtoExpected = new WaehleranzahlDTO(anzahlWaehler, uhrzeit); val result = unitUnderTest.toDTO(modelInput); Assertions.assertThat(result).isEqualTo(dtoExpected); @@ -49,7 +49,7 @@ void should_mapDtoToModel_when_DtoIsNotNull() { LocalDateTime uhrzeit = LocalDateTime.now(); BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); - val dtoInput = new WaehleranzahlDTO(wahlID, wahlbezirkID, anzahlWaehler, uhrzeit); + val dtoInput = new WaehleranzahlDTO(anzahlWaehler, uhrzeit); val modelExpected = new WaehleranzahlModel(bezirkUndWahlID, anzahlWaehler, uhrzeit); val result = unitUnderTest.toSetModel(bezirkUndWahlID, dtoInput); From b3cb94d8c809f57786cecf7d746ee3ff8e2e58ee Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 15:35:07 +0200 Subject: [PATCH 33/43] long verwenden statt Long --- .../service/waehleranzahl/WaehleranzahlModel.java | 2 +- .../service/waehleranzahl/WaehleranzahlModelMapperTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModel.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModel.java index e93c28850..f3f8fdfd0 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModel.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModel.java @@ -8,6 +8,6 @@ @Builder public record WaehleranzahlModel( @NotNull BezirkUndWahlID bezirkUndWahlID, - @NotNull Long anzahlWaehler, + @NotNull long anzahlWaehler, @NotNull LocalDateTime uhrzeit) { } diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java index fda1be556..0e587b890 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlModelMapperTest.java @@ -17,7 +17,7 @@ void should_returnEqualWaehleranzahlModel_when_waehleranzahlIsMapped() { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); - val anzahlWaehler = 99L; + val anzahlWaehler = 99; LocalDateTime uhrzeit = LocalDateTime.now(); val waehleranzahlEntity = new Waehleranzahl(bezirkUndWahlID, anzahlWaehler, uhrzeit); @@ -33,7 +33,7 @@ void should_returnEqualWaehleranzahl_when_waehleranzahlModelIsMapped() { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); - val anzahlWaehler = 99L; + val anzahlWaehler = 99; LocalDateTime uhrzeit = LocalDateTime.now(); val waehleranzahlModel = new WaehleranzahlModel(bezirkUndWahlID, anzahlWaehler, uhrzeit); From b4dbcec214c78fd2d0b22302b06651ef28f012c7 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 15:42:58 +0200 Subject: [PATCH 34/43] fix for unsubstituted variables --- .../src/test/resources/http.request/http-client.env.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wls-monitoring-service/src/test/resources/http.request/http-client.env.json b/wls-monitoring-service/src/test/resources/http.request/http-client.env.json index c89909e7a..00eae94a3 100644 --- a/wls-monitoring-service/src/test/resources/http.request/http-client.env.json +++ b/wls-monitoring-service/src/test/resources/http.request/http-client.env.json @@ -1,9 +1,13 @@ { "docker": { + "token_type": "", + "auth_token": "", "WLS_MONITORING_SERVICE_URL": "http://localhost:8201", "SSO_URL": "http://kubernetes.docker.internal:8100" }, "nonDocker": { + "token_type": "", + "auth_token": "", "WLS_MONITORING_SERVICE_URL": "http://localhost:39154", "SSO_URL": "http://kubernetes.docker.internal:8100" } From 0cd325a648dce4163486e3628a94925e26f37e62 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 15:48:00 +0200 Subject: [PATCH 35/43] nested class toSetModel erstellt und Methoden verschoben --- .../WaehleranzahlDTOMapperTest.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java index 93c7d099d..7605b5806 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlDTOMapperTest.java @@ -21,11 +21,6 @@ void should_returnNull_when_modelIsNull() { Assertions.assertThat(unitUnderTest.toDTO(null)).isNull(); } - @Test - void should_returnNull_when_dtoIsNull() { - Assertions.assertThat(unitUnderTest.toSetModel(null, null)).isNull(); - } - @Test void should_mapModelToDto_when_ModelIsNotNull() { String wahlID = "wahlID01"; @@ -41,6 +36,16 @@ void should_mapModelToDto_when_ModelIsNotNull() { Assertions.assertThat(result).isEqualTo(dtoExpected); } + } + + @Nested + class ToSetModel { + + @Test + void should_returnNull_when_dtoIsNull() { + Assertions.assertThat(unitUnderTest.toSetModel(null, null)).isNull(); + } + @Test void should_mapDtoToModel_when_DtoIsNotNull() { String wahlID = "wahlID01"; @@ -55,5 +60,6 @@ void should_mapDtoToModel_when_DtoIsNotNull() { val result = unitUnderTest.toSetModel(bezirkUndWahlID, dtoInput); Assertions.assertThat(result).isEqualTo(modelExpected); } + } } From c067ea20ec9033869cd9955e2741e410c57be979 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Fri, 25 Oct 2024 16:38:14 +0200 Subject: [PATCH 36/43] mvn spotless:apply --- .../MicroServiceApplication.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java index 581fadb37..4f197abc7 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/MicroServiceApplication.java @@ -16,22 +16,22 @@ */ @Configuration @ComponentScan( - basePackages = { - "org.springframework.data.jpa.convert.threeten", - "de.muenchen.oss.wahllokalsystem.monitoringservice", - "de.muenchen.oss.wahllokalsystem.wls.common.exception", - } + basePackages = { + "org.springframework.data.jpa.convert.threeten", + "de.muenchen.oss.wahllokalsystem.monitoringservice", + "de.muenchen.oss.wahllokalsystem.wls.common.exception", + } ) @EntityScan( - basePackages = { - "org.springframework.data.jpa.convert.threeten", - "de.muenchen.oss.wahllokalsystem.monitoringservice" - } + basePackages = { + "org.springframework.data.jpa.convert.threeten", + "de.muenchen.oss.wahllokalsystem.monitoringservice" + } ) @EnableJpaRepositories( - basePackages = { - "de.muenchen.oss.wahllokalsystem.monitoringservice" - } + basePackages = { + "de.muenchen.oss.wahllokalsystem.monitoringservice" + } ) @EnableAutoConfiguration public class MicroServiceApplication { From 010e5cbc2aa612d35a184bd2ddfacbf336e611b9 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Wed, 30 Oct 2024 10:45:24 +0100 Subject: [PATCH 37/43] Review-Anmerkungen eingearbeitet: - Nameneskonventionen - fehlende Tests - Vereinfachungen --- ...aehleranzahlControllerIntegrationTest.java | 23 +++--------- .../WaehleranzahlControllerTest.java | 35 +++++++++++++++---- .../WaehleranzahlServiceTest.java | 5 +-- .../WaehleranzahlValidatorTest.java | 12 +++---- 4 files changed, 40 insertions(+), 35 deletions(-) diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java index 27136be0a..a2c0e0d54 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java @@ -8,7 +8,6 @@ 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.monitoringservice.MicroServiceApplication; import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; @@ -32,7 +31,6 @@ 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.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; @@ -99,13 +97,13 @@ void should_returnOkAndData_when_dataFound() throws Exception { val waehleranzahlToFind = new Waehleranzahl(bezirkUndWahlID, anzahlWaehler, uhrzeit); waehleranzahlRepository.save(waehleranzahlToFind); - val expectedResponseBody = waehleranzahlDTOMapper.toDTO(waehleranzahlModelMapper.toModel(waehleranzahlToFind)); val request = MockMvcRequestBuilders.get("/businessActions/wahlbeteiligung/" + wahlID + "/" + wahlbezirkID); val response = api.perform(request).andExpect(status().isOk()).andReturn(); val responseBodyAsDTO = objectMapper.readValue(response.getResponse().getContentAsString(), WaehleranzahlDTO.class); + val expectedResponseBody = waehleranzahlDTOMapper.toDTO(waehleranzahlModelMapper.toModel(waehleranzahlToFind)); Assertions.assertThat(responseBodyAsDTO).isEqualTo(expectedResponseBody); } @@ -121,22 +119,11 @@ void should_overwriteExistingData_when_newDataIsStoredWithSameID() throws Except val anzahlWaehler_1 = 99L; val uhrzeit_1 = LocalDateTime.parse("2024-09-13T12:11:21.343"); - val waehleranzahlDTO_1 = new WaehleranzahlDTO(anzahlWaehler_1, uhrzeit_1); - - WireMock.stubFor(WireMock.post("/wahlbeteiligung") - .willReturn(WireMock.aResponse().withHeader("Content-Type", "application/json").withStatus(HttpStatus.OK.value()) - .withBody(objectMapper.writeValueAsBytes(waehleranzahlDTO_1)))); - - val request_1 = buildPostRequest(wahlID, wahlbezirkID, waehleranzahlDTO_1); - api.perform(request_1).andExpect(status().isOk()).andReturn(); - - SecurityUtils.runWith(Authorities.REPOSITORY_READ_WAEHLERANZAHL); - val waehleranzahlFromRepo_1 = waehleranzahlRepository.findById(bezirkUndWahlID).get(); - val expectedWaehleranzahl_1 = waehleranzahlModelMapper.toEntity(waehleranzahlDTOMapper.toSetModel(bezirkUndWahlID, waehleranzahlDTO_1)); - - Assertions.assertThat(waehleranzahlFromRepo_1).usingRecursiveComparison().isEqualTo(expectedWaehleranzahl_1); + // store data with bezirkUndWahlID + val waehleranzahlToFind = new Waehleranzahl(bezirkUndWahlID, anzahlWaehler_1, uhrzeit_1); + waehleranzahlRepository.save(waehleranzahlToFind); - // Overwrite existing data + // Overwrite existing data with same bezirkUndWahlID val anzahlWaehler_2 = 55L; val uhrzeit_2 = LocalDateTime.parse("2024-09-13T12:11:21.666"); val waehleranzahlDTO_2 = new WaehleranzahlDTO(anzahlWaehler_2, uhrzeit_2); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java index 58dfaef90..ee08ff25f 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerTest.java @@ -3,6 +3,7 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlService; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; +import java.time.LocalDateTime; import java.util.Optional; import lombok.val; import org.assertj.core.api.Assertions; @@ -31,10 +32,30 @@ public class WaehleranzahlControllerTest { class GetWahlbeteiligung { @Test - void should_returnHttp204AndBodyIsNull_when_serviceIsReturnsNoData() { - String wahlID = "wahlID01"; - String wahlbezirkID = "wahlbezirkID01"; - BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + void should_returnHttp200AndData_when_dataIsFound() { + + val wahlID = "wahlID01"; + val wahlbezirkID = "wahlbezirkID01"; + val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val uhrzeit = LocalDateTime.now(); + + val mockedServiceModel = new WaehleranzahlModel(null, 0, null); + val mockedMappedServiceDTO = new WaehleranzahlDTO(99L, uhrzeit); + + Mockito.when(waehleranzahlService.getWahlbeteiligung(bezirkUndWahlID)).thenReturn(Optional.of(mockedServiceModel)); + Mockito.when(waehleranzahlDTOMapper.toDTO(mockedServiceModel)).thenReturn(mockedMappedServiceDTO); + + val result = unitUnderTest.getWahlbeteiligung(wahlID, wahlbezirkID); + + Assertions.assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); + Assertions.assertThat(result.getBody()).isSameAs(mockedMappedServiceDTO); + } + + @Test + void should_returnHttp204AndBodyIsNull_when_serviceReturnsNoData() { + val wahlID = "wahlID01"; + val wahlbezirkID = "wahlbezirkID01"; + val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); Mockito.when(waehleranzahlService.getWahlbeteiligung(bezirkUndWahlID)).thenReturn(Optional.empty()); @@ -50,9 +71,9 @@ class PostWahlbeteiligung { @Test void should_notThrowException_when_serviceIsCalled() { - String wahlID = "wahlID01"; - String wahlbezirkID = "wahlbezirkID01"; - BezirkUndWahlID bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); + val wahlID = "wahlID01"; + val wahlbezirkID = "wahlbezirkID01"; + val bezirkUndWahlID = new BezirkUndWahlID(wahlID, wahlbezirkID); val requestBody = Mockito.mock(WaehleranzahlDTO.class); val mockedMappedRequest = Mockito.mock(WaehleranzahlModel.class); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java index 844f803cb..f75ac64e0 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java @@ -2,7 +2,6 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.Waehleranzahl; import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; -import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.time.LocalDateTime; import java.util.Optional; @@ -27,8 +26,6 @@ public class WaehleranzahlServiceTest { WaehleranzahlValidator waehleranzahlValidator; @Mock WaehleranzahlClient waehleranzahlClient; - @Mock - ExceptionFactory exceptionFactory; @InjectMocks WaehleranzahlService unitUnderTest; @@ -65,7 +62,7 @@ void should_returnEmptyResult_when_repoDataNotFound() { class PostWahlbeteiligung { @Test - void should_notThrowExceptionAndSaveDataInRepo_when_ModelIsGiven() { + void should_notThrowExceptionAndSaveDataInRepo_when_modelIsGiven() { val waehleranzahlSetModel = WaehleranzahlModel.builder().build(); val mockedKonfigurationEntity = new Waehleranzahl(); diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidatorTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidatorTest.java index 400febb0a..80f8bd84a 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidatorTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlValidatorTest.java @@ -28,19 +28,19 @@ class ValidWahlIdUndWahlbezirkIDOrThrow { private final FachlicheWlsException mockedFachlicheWlsException = FachlicheWlsException.withCode("").buildWithMessage(""); @Test - void noExceptionWhenValid() { + void should_throwNoException_when_valid() { Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(new BezirkUndWahlID("wahlID", "wahlbezirkID"))); } @Test - void exceptionWhenParameterIsNull() { + void should_throwException_when_parameterIsNull() { Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) .thenReturn(mockedFachlicheWlsException); Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(null)).isSameAs(mockedFachlicheWlsException); } @Test - void exceptionWhenWahlIDIsNull() { + void should_throwException_when_wahlIDIsNull() { Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) .thenReturn(mockedFachlicheWlsException); Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(new BezirkUndWahlID(null, "wahlbezirkID"))) @@ -48,7 +48,7 @@ void exceptionWhenWahlIDIsNull() { } @Test - void exceptionWhenWahlIDIsEmptyString() { + void should_throwException_when_wahlIDIsEmptyString() { Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) .thenReturn(mockedFachlicheWlsException); Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(new BezirkUndWahlID("", "wahlbezirkID"))) @@ -56,7 +56,7 @@ void exceptionWhenWahlIDIsEmptyString() { } @Test - void exceptionWhenWahlbezirkIDIsNull() { + void should_throwException_when_wahlbezirkIDIsNull() { Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) .thenReturn(mockedFachlicheWlsException); Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(new BezirkUndWahlID("wahlID", null))) @@ -64,7 +64,7 @@ void exceptionWhenWahlbezirkIDIsNull() { } @Test - void exceptionWhenWahlbezirkIDIsEmptyString() { + void should_throwException_when_wahlbezirkIDIsEmptyString() { Mockito.when(exceptionFactory.createFachlicheWlsException(ExceptionConstants.GETWAHLBETEILIGUNG_SUCHKRITERIEN_UNVOLLSTAENDIG)) .thenReturn(mockedFachlicheWlsException); Assertions.assertThatException().isThrownBy(() -> unitUnderTest.validWahlIdUndWahlbezirkIDOrThrow(new BezirkUndWahlID("wahlID", ""))) From c44eb211a9e66dcf052b260dcee64ccc2d9dfaaf Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Wed, 30 Oct 2024 11:09:33 +0100 Subject: [PATCH 38/43] security code not needed for profile "SPRING_NO_SECURITY_PROFILE"; test renamed --- .../WaehleranzahlControllerIntegrationTest.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java index a2c0e0d54..e73bf7bb7 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/rest/waehleranzahl/WaehleranzahlControllerIntegrationTest.java @@ -13,11 +13,9 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.domain.waehleranzahl.WaehleranzahlRepository; import de.muenchen.oss.wahllokalsystem.monitoringservice.exception.ExceptionConstants; import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModelMapper; -import de.muenchen.oss.wahllokalsystem.monitoringservice.utils.Authorities; 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 java.time.LocalDateTime; import lombok.val; import org.assertj.core.api.Assertions; @@ -32,7 +30,6 @@ import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.RequestBuilder; @@ -67,7 +64,6 @@ public class WaehleranzahlControllerIntegrationTest { @AfterEach void tearDown() { - SecurityUtils.runWith(Authorities.REPOSITORY_DELETE_WAEHLERANZAHL); waehleranzahlRepository.deleteAll(); } @@ -75,7 +71,6 @@ void tearDown() { class GetWahlbeteiligung { @Test - @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) void should_returnEmptyResponse_when_noDataFound() throws Exception { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; @@ -87,7 +82,6 @@ void should_returnEmptyResponse_when_noDataFound() throws Exception { } @Test - @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) void should_returnOkAndData_when_dataFound() throws Exception { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; @@ -111,7 +105,6 @@ void should_returnOkAndData_when_dataFound() throws Exception { class PostWahlbeteiligung { @Test - @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) void should_overwriteExistingData_when_newDataIsStoredWithSameID() throws Exception { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; @@ -131,7 +124,6 @@ void should_overwriteExistingData_when_newDataIsStoredWithSameID() throws Except val request_2 = buildPostRequest(wahlID, wahlbezirkID, waehleranzahlDTO_2); api.perform(request_2).andExpect(status().isOk()).andReturn(); - SecurityUtils.runWith(Authorities.REPOSITORY_READ_WAEHLERANZAHL); val waehleranzahlFromRepo_2 = waehleranzahlRepository.findById(bezirkUndWahlID).get(); val expectedWaehleranzahl_2 = waehleranzahlModelMapper.toEntity(waehleranzahlDTOMapper.toSetModel(bezirkUndWahlID, waehleranzahlDTO_2)); @@ -140,8 +132,7 @@ void should_overwriteExistingData_when_newDataIsStoredWithSameID() throws Except } @Test - @WithMockUser(authorities = { Authorities.SERVICE_GET_WAEHLERANZAHL, Authorities.REPOSITORY_READ_WAEHLERANZAHL }) - void should_throwTechnischeWlsException_when_requestIsInvalid() throws Exception { + void should_throwTechnischeWlsException_when_saveInDBFails() throws Exception { val wahlID = "_ "; val wahlbezirkID = "wahlbezirkID01"; val anzahlWaehler = 99L; From 5b2d3effb5dc83710fb34564278038bad629fc18 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Mon, 4 Nov 2024 12:12:32 +0100 Subject: [PATCH 39/43] Update wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java Co-authored-by: MrSebastian <13592751+MrSebastian@users.noreply.github.com> --- .../client/waehleranzahl/WaehleranzahlClientMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java index 340a99e8c..00923f4c7 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java @@ -11,7 +11,7 @@ @Mapper public interface WaehleranzahlClientMapper { - ZoneOffset DEFAULT_ZONE = ZoneOffset.UTC; + ZoneId DEFAULT_ZONE_ID = ZoneId.systemDefault(); @Mapping(target = "wahlID", ignore = true) @Mapping(target = "wahlbezirkID", source = "bezirkUndWahlID.wahlbezirkID") From 7fa07a69650b0ed5c34d26902bc60f1ed887c6d4 Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Mon, 4 Nov 2024 12:13:45 +0100 Subject: [PATCH 40/43] Update wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java Co-authored-by: MrSebastian <13592751+MrSebastian@users.noreply.github.com> --- .../client/waehleranzahl/WaehleranzahlClientMapper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java index 00923f4c7..a549fafd8 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java @@ -19,6 +19,11 @@ public interface WaehleranzahlClientMapper { WahlbeteiligungsMeldungDTO fromModelToRemoteClientDTO(WaehleranzahlModel waehleranzahlModel); default OffsetDateTime localDateTimeToOffsetDateTime(LocalDateTime localDateTime) { - return localDateTime.atOffset(DEFAULT_ZONE); + return localDateTimeToOffsetDateTime(localDateTime, DEFAULT_ZONE_ID); + } + + default OffsetDateTime localDateTimeToOffsetDateTime(LocalDateTime localDateTime, ZoneId zoneId) { + val zoneOffset = zoneId.getRules().getOffset(localDateTime); + return localDateTime.atOffset(zoneOffset); } } From 270fb0c6312b3b72c7ad9654b6674ed6aa47498c Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Mon, 4 Nov 2024 12:25:44 +0100 Subject: [PATCH 41/43] Update wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java Co-authored-by: MrSebastian <13592751+MrSebastian@users.noreply.github.com> --- .../WaehleranzahlClientMapperTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java index 144acc11a..8124e37bb 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java @@ -36,4 +36,33 @@ void isMappedWithSomething() { Assertions.assertThat(result).isEqualTo(expectedWahlbeteiligungsMeldungDTO); } } + + @Nested + class LocalDateTimeToOffsetDateTime { + + @Nested + class WithZoneIdWithDaylightSavingTime { + + @Test + void should_useSummerSeasonOffset_when_mapping() { + val localDateTime = LocalDateTime.parse("2024-06-12T12:13:14.567"); + val zoneID = ZoneId.of("Europe/Berlin"); + + val result = unitUnderTest.localDateTimeToOffsetDateTime(localDateTime, zoneID); + + val expectedResult = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(2)); + Assertions.assertThat(result).isEqualTo(expectedResult); + } + + @Test + void should_useWinterSeasonOffset_when_mapping() { + val localDateTime = LocalDateTime.parse("2024-11-12T12:13:14.567"); + val zoneID = ZoneId.of("Europe/Berlin"); + val result = unitUnderTest.localDateTimeToOffsetDateTime(localDateTime, zoneID); + + val expectedResult = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(1)); + Assertions.assertThat(result).isEqualTo(expectedResult); + } + } + } } From eefcc74078f1c748e0662fcbf985fde0c3377e6b Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Mon, 4 Nov 2024 12:42:27 +0100 Subject: [PATCH 42/43] imports added after applying review suggestions, naming conventions for tests --- .../WaehleranzahlClientMapper.java | 3 +- .../WaehleranzahlClientMapperTest.java | 41 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java index a549fafd8..3c798e2a9 100644 --- a/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java +++ b/wls-monitoring-service/src/main/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapper.java @@ -4,7 +4,8 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; import java.time.LocalDateTime; import java.time.OffsetDateTime; -import java.time.ZoneOffset; +import java.time.ZoneId; +import lombok.val; import org.mapstruct.Mapper; import org.mapstruct.Mapping; diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java index 8124e37bb..d10dd75af 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/client/waehleranzahl/WaehleranzahlClientMapperTest.java @@ -4,6 +4,8 @@ import de.muenchen.oss.wahllokalsystem.monitoringservice.service.waehleranzahl.WaehleranzahlModel; import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID; import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneId; import java.time.ZoneOffset; import lombok.val; import org.assertj.core.api.Assertions; @@ -19,7 +21,7 @@ public class WaehleranzahlClientMapperTest { class FromModelToRemoteClientDTO { @Test - void isMappedWithSomething() { + void should_return_RemoteClientDTO_when_modelIsGiven() { val wahlID = "wahlID01"; val wahlbezirkID = "wahlbezirkID01"; val anzahlWahler = 99L; @@ -31,8 +33,9 @@ void isMappedWithSomething() { val result = unitUnderTest.fromModelToRemoteClientDTO(waehleranzahlModel); + val zoneOffset = ZoneId.systemDefault().getRules().getOffset(meldeZeitpunkt); val expectedWahlbeteiligungsMeldungDTO = new WahlbeteiligungsMeldungDTO().wahlID(null).wahlbezirkID(wahlbezirkID).anzahlWaehler(anzahlWahler) - .meldeZeitpunkt(meldeZeitpunkt.atOffset(ZoneOffset.UTC)); + .meldeZeitpunkt(meldeZeitpunkt.atOffset(zoneOffset)); Assertions.assertThat(result).isEqualTo(expectedWahlbeteiligungsMeldungDTO); } } @@ -40,29 +43,25 @@ void isMappedWithSomething() { @Nested class LocalDateTimeToOffsetDateTime { - @Nested - class WithZoneIdWithDaylightSavingTime { - - @Test - void should_useSummerSeasonOffset_when_mapping() { - val localDateTime = LocalDateTime.parse("2024-06-12T12:13:14.567"); - val zoneID = ZoneId.of("Europe/Berlin"); + @Test + void should_useSummerSeasonOffset_when_mapping() { + val localDateTime = LocalDateTime.parse("2024-06-12T12:13:14.567"); + val zoneID = ZoneId.of("Europe/Berlin"); - val result = unitUnderTest.localDateTimeToOffsetDateTime(localDateTime, zoneID); + val result = unitUnderTest.localDateTimeToOffsetDateTime(localDateTime, zoneID); - val expectedResult = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(2)); - Assertions.assertThat(result).isEqualTo(expectedResult); - } + val expectedResult = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(2)); + Assertions.assertThat(result).isEqualTo(expectedResult); + } - @Test - void should_useWinterSeasonOffset_when_mapping() { - val localDateTime = LocalDateTime.parse("2024-11-12T12:13:14.567"); - val zoneID = ZoneId.of("Europe/Berlin"); - val result = unitUnderTest.localDateTimeToOffsetDateTime(localDateTime, zoneID); + @Test + void should_useWinterSeasonOffset_when_mapping() { + val localDateTime = LocalDateTime.parse("2024-11-12T12:13:14.567"); + val zoneID = ZoneId.of("Europe/Berlin"); + val result = unitUnderTest.localDateTimeToOffsetDateTime(localDateTime, zoneID); - val expectedResult = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(1)); - Assertions.assertThat(result).isEqualTo(expectedResult); - } + val expectedResult = OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(1)); + Assertions.assertThat(result).isEqualTo(expectedResult); } } } From b6ce4f36e2c95dd179269e7c1fe00d4f2983afbd Mon Sep 17 00:00:00 2001 From: Robert Jasny Date: Mon, 4 Nov 2024 13:09:54 +0100 Subject: [PATCH 43/43] =?UTF-8?q?test=20f=C3=BCr=20Client-Aufruf=20hinzuge?= =?UTF-8?q?f=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/waehleranzahl/WaehleranzahlServiceTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java index f75ac64e0..9be7aeb77 100644 --- a/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java +++ b/wls-monitoring-service/src/test/java/de/muenchen/oss/wahllokalsystem/monitoringservice/service/waehleranzahl/WaehleranzahlServiceTest.java @@ -70,6 +70,7 @@ void should_notThrowExceptionAndSaveDataInRepo_when_modelIsGiven() { Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.postWahlbeteiligung(waehleranzahlSetModel)); + Mockito.verify(waehleranzahlClient).postWahlbeteiligung(waehleranzahlSetModel); Mockito.verify(waehleranzahlRepository).save(mockedKonfigurationEntity); } }