Skip to content
Snippets Groups Projects
Commit 89cc0c51 authored by OZGCloud's avatar OZGCloud
Browse files

Merge pull request 'ozg-4860-ZufiManager-bereit-stellen' (#55) from...

Merge pull request 'ozg-4860-ZufiManager-bereit-stellen' (#55) from ozg-4860-ZufiManager-bereit-stellen into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/zufi-manager/pulls/55


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents 7d9dcf9d bd960714
Branches
Tags
No related merge requests found
Showing
with 479 additions and 448 deletions
...@@ -242,24 +242,23 @@ pipeline { ...@@ -242,24 +242,23 @@ pipeline {
} }
} }
// TODO: Rollout Zufi deployment on test, when it is ready stage('Trigger Test') {
// stage('Trigger Test') { when {
// when { branch 'release'
// branch 'release' }
// }
// steps { steps {
// script { script {
// FAILED_STAGE = env.STAGE_NAME FAILED_STAGE = env.STAGE_NAME
// cloneGitopsRepo() cloneGitopsRepo()
// setNewTestZufiVersion() setNewTestZufiVersion()
// pushTestGitopsRepo() pushTestGitopsRepo()
// } }
// } }
// } }
} }
post { post {
......
...@@ -46,26 +46,22 @@ ...@@ -46,26 +46,22 @@
<module>zufi-manager-server</module> <module>zufi-manager-server</module>
</modules> </modules>
<licenses>
<license>
<name>EUPL-1.2</name>
<url>https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12</url>
<distribution>repo</distribution>
</license>
</licenses>
<properties> <properties>
<jaxb.version>4.0.2</jaxb.version> <jaxb.version>4.0.2</jaxb.version>
<protoc-jar-plugin.version>3.11.4</protoc-jar-plugin.version>
<jaxb-impl.version>4.0.5</jaxb-impl.version> <jaxb-impl.version>4.0.5</jaxb-impl.version>
<reactor-test.version>3.6.5</reactor-test.version>
<compiler-plugin.version>3.8.1</compiler-plugin.version>
<mojo-jaxb2-plugin.version>3.2.0</mojo-jaxb2-plugin.version> <mojo-jaxb2-plugin.version>3.2.0</mojo-jaxb2-plugin.version>
<mojo-jaxb2-plugin-activation.version>1.1.1</mojo-jaxb2-plugin-activation.version>
<find-and-replace-maven-plugin.version>1.2.0</find-and-replace-maven-plugin.version>
<protoc-jar-plugin.version>3.11.4</protoc-jar-plugin.version>
<jakarta.activation.api.version>2.1.3</jakarta.activation.api.version> <jakarta.activation.api.version>2.1.3</jakarta.activation.api.version>
<wiremock-standalone.version>3.5.4</wiremock-standalone.version>
<testcontainers-keycloak.version>3.3.1</testcontainers-keycloak.version> <wiremock-standalone.version>3.8.0</wiremock-standalone.version>
<testcontainers-keycloak.version>3.4.0</testcontainers-keycloak.version>
<testcontainers.version>1.19.8</testcontainers.version> <testcontainers.version>1.19.8</testcontainers.version>
<!-- version in ozgcloud-common (1.3.0) was obsolete, remove this when fixed -->
<ozgcloud.license.version>1.6.0</ozgcloud.license.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
...@@ -75,6 +71,16 @@ ...@@ -75,6 +71,16 @@
<artifactId>jakarta.xml.bind-api</artifactId> <artifactId>jakarta.xml.bind-api</artifactId>
<version>${jaxb.version}</version> <version>${jaxb.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jaxb.version}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>${jaxb-impl.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.wiremock</groupId> <groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId> <artifactId>wiremock-standalone</artifactId>
...@@ -100,55 +106,31 @@ ...@@ -100,55 +106,31 @@
<artifactId>mapstruct-processor</artifactId> <artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version> <version>${mapstruct.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jaxb.version}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>${jaxb-impl.version}</version>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<version>${reactor-test.version}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<build> <build>
<pluginManagement>
<plugins> <plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin> <plugin>
<groupId>com.mycila</groupId> <groupId>com.mycila</groupId>
<artifactId>license-maven-plugin</artifactId> <artifactId>license-maven-plugin</artifactId>
<version>4.1</version> </plugin>
<configuration> <plugin>
<mapping> <groupId>io.github.git-commit-id</groupId>
<config>SCRIPT_STYLE</config> <artifactId>git-commit-id-maven-plugin</artifactId>
</mapping>
<licenseSets>
<licenseSet>
<header>license/eupl_v1_2_de/header.txt</header>
<excludes>
<exclude>**/README</exclude>
<exclude>src/test/resources/**</exclude>
<exclude>src/main/resources/**</exclude>
</excludes>
</licenseSet>
</licenseSets>
</configuration>
<dependencies>
<dependency>
<groupId>de.ozgcloud.common</groupId>
<artifactId>ozgcloud-common-license</artifactId>
<version>${ozgcloud.license.version}</version>
</dependency>
</dependencies>
</plugin> </plugin>
</plugins> </plugins>
</pluginManagement>
</build> </build>
</project> </project>
...@@ -38,11 +38,6 @@ ...@@ -38,11 +38,6 @@
<name>OZG-Cloud Zufi Manager Interface</name> <name>OZG-Cloud Zufi Manager Interface</name>
<description>gRPC Api for Zufi Manager</description> <description>gRPC Api for Zufi Manager</description>
<properties>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<find-and-replace-maven-plugin.version>1.1.0</find-and-replace-maven-plugin.version>
</properties>
<dependencies> <dependencies>
<!-- GRPC --> <!-- GRPC -->
<dependency> <dependency>
...@@ -131,26 +126,6 @@ ...@@ -131,26 +126,6 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<groupId>com.mycila</groupId>
<artifactId>license-maven-plugin</artifactId>
<configuration>
<mapping>
<proto>SLASHSTAR_STYLE</proto>
<config>SCRIPT_STYLE</config>
</mapping>
<licenseSets>
<licenseSet>
<header>license/eupl_v1_2_de/header.txt</header>
<excludes>
<exclude>**/*.yaml</exclude>
<exclude>**/*.yml</exclude>
<exclude>README.md</exclude>
</excludes>
</licenseSet>
</licenseSets>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
</project> </project>
...@@ -2,12 +2,13 @@ ...@@ -2,12 +2,13 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>de.ozgcloud.zufi</groupId> <groupId>de.ozgcloud.zufi</groupId>
<artifactId>zufi-manager</artifactId> <artifactId>zufi-manager</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
</parent> </parent>
<groupId>de.ozgcloud.zufi</groupId>
<artifactId>zufi-manager-model</artifactId> <artifactId>zufi-manager-model</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
<name>OZG-Cloud Zufi Manager Model</name> <name>OZG-Cloud Zufi Manager Model</name>
...@@ -38,23 +39,6 @@ ...@@ -38,23 +39,6 @@
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>io.github.git-commit-id</groupId>
<artifactId>git-commit-id-maven-plugin</artifactId>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId> <artifactId>maven-jar-plugin</artifactId>
......
...@@ -2,20 +2,23 @@ ...@@ -2,20 +2,23 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>de.ozgcloud.zufi</groupId> <groupId>de.ozgcloud.zufi</groupId>
<artifactId>zufi-manager</artifactId> <artifactId>zufi-manager</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
</parent> </parent>
<groupId>de.ozgcloud.zufi</groupId>
<artifactId>zufi-manager-pvog</artifactId> <artifactId>zufi-manager-pvog</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
<name>OZG-Cloud Zufi Manager PVOG</name> <name>OZG-Cloud Zufi Manager PVOG</name>
<properties> <properties>
<imageName>docker.ozg-sh.de/zufi-manager</imageName> <imageName>docker.ozg-sh.de/zufi-manager</imageName>
<imageTag>build-latest</imageTag> <imageTag>build-latest</imageTag>
<publishImage>false</publishImage> <publishImage>false</publishImage>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>de.ozgcloud.zufi</groupId> <groupId>de.ozgcloud.zufi</groupId>
...@@ -238,48 +241,6 @@ ...@@ -238,48 +241,6 @@
</excludes> </excludes>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<fork>true</fork>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
<showWarnings>true</showWarnings>
<compilerArgs>
<arg>-parameters</arg>
<compilerArg>
-Amapstruct.defaultComponentModel=spring
</compilerArg>
<compilerArg>
-Amapstruct.unmappedTargetPolicy=WARN
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
</plugins> </plugins>
</build> </build>
......
...@@ -27,7 +27,6 @@ import java.util.Set; ...@@ -27,7 +27,6 @@ import java.util.Set;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.common.logging.OzgCloudLogging; import de.ozgcloud.common.logging.OzgCloudLogging;
import de.ozgcloud.zufi.metadocument.MetaDocumentService; import de.ozgcloud.zufi.metadocument.MetaDocumentService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -38,8 +37,6 @@ import lombok.extern.log4j.Log4j2; ...@@ -38,8 +37,6 @@ import lombok.extern.log4j.Log4j2;
@Log4j2 @Log4j2
@RequiredArgsConstructor @RequiredArgsConstructor
public class PvogProcessor { public class PvogProcessor {
static final String INVALID_DATA_RECEICED_FROM_PVOG_SERVICE = "Invalid data receiced from PVOG Service";
static final String GENERAL_ERROR_PROCESSING_PVOG_DATA = "General error processing PVOG data";
private final PvogService pvogService; private final PvogService pvogService;
...@@ -47,56 +44,78 @@ public class PvogProcessor { ...@@ -47,56 +44,78 @@ public class PvogProcessor {
private final Set<TransferOperationEntryProcessor> processors; private final Set<TransferOperationEntryProcessor> processors;
private final TransferOperationMapper transferOperationMapper;
public void process() { public void process() {
var startIndex = metaDocumentService.findNaechsterIndex(); int startIndex = getStartIndex();
logSyncStarted(startIndex);
startIndex.ifPresentOrElse( processFromIndex(startIndex);
index -> { logSyncFinished();
LOG.info("Start incremental sync with index {}", index); }
processFromIndex(index);
}, int getStartIndex() {
() -> { return metaDocumentService.findNaechsterIndex().orElse(0);
}
void logSyncStarted(int startIndex) {
if (startIndex == 0) {
LOG.info("Start full sync"); LOG.info("Start full sync");
processFromIndex(0); } else {
}); LOG.info("Start incremental sync with index {}", startIndex);
}
}
void logSyncFinished() {
LOG.info("Finished sync"); LOG.info("Finished sync");
} }
void processFromIndex(int startIndex) { void processFromIndex(int startIndex) {
int index = startIndex; var importState = new ImportState(startIndex);
AntwortTransfernachricht transfernachricht;
var indexChanged = true;
do { do {
LOG.info("Fetching further data using naechsterIndex {}", index); var antwortTransfernachricht = fetchVerwaltungsObjekteAt(importState.index());
process(antwortTransfernachricht);
transfernachricht = pvogService.getIncrementVerwaltungsObjekte(index); importState = importState.nextState(antwortTransfernachricht);
} while (!isFinished(importState));
}
if (pvogService.dataAvailable(transfernachricht)) { AntwortTransfernachricht fetchVerwaltungsObjekteAt(int index) {
handleAntwortTransfernachricht(transfernachricht); LOG.info("Fetching further data using index {}", index);
return pvogService.getVerwaltungsObjekteAt(index);
} }
if (transfernachricht.naechsterIndex() == index) { void process(AntwortTransfernachricht antwortTransfernachricht) {
indexChanged = false; if (pvogService.containsVerwaltungsObjekte(antwortTransfernachricht)) {
LOG.warn("PVOG service returned naechsterIndex {} twice. Aborting synchronization.", index); processVerwaltungsObjekteAndUpdateMetaData(antwortTransfernachricht);
}
} }
index = transfernachricht.naechsterIndex(); void processVerwaltungsObjekteAndUpdateMetaData(AntwortTransfernachricht antwortTransfernachricht) {
process(toTransferOperation(antwortTransfernachricht));
metaDocumentService.saveMetaDocument(antwortTransfernachricht);
}
} while (pvogService.hasMoreData(transfernachricht) && indexChanged); private TransferOperation toTransferOperation(AntwortTransfernachricht transfernachricht) {
return transferOperationMapper.fromAntwortTransfernachricht(transfernachricht);
} }
void handleAntwortTransfernachricht(AntwortTransfernachricht transfernachricht) { private void process(TransferOperation transferOperation) {
try { transferOperation.getEntries().forEach(entry -> processors.forEach(p -> p.process(entry)));
var transferOperation = pvogService.parseXml(transfernachricht.xzufiObjekte());
processTransferOperation(transferOperation);
metaDocumentService.saveMetaDocument(transfernachricht);
} catch (Exception e) {
throw new TechnicalException(GENERAL_ERROR_PROCESSING_PVOG_DATA, e);
} }
boolean isFinished(ImportState importState) {
return !(pvogService.hasMoreData(importState.antwortTransfernachricht()) && importState.indexChanged());
} }
void processTransferOperation(TransferOperation transferOperation) { record ImportState(int index, boolean indexChanged, AntwortTransfernachricht antwortTransfernachricht) {
transferOperation.getEntries().forEach(entry -> processors.forEach(p -> p.process(entry)));
ImportState(int index) {
this(index, true, null);
}
ImportState nextState(AntwortTransfernachricht antwortTransfernachricht) {
return (antwortTransfernachricht.naechsterIndex() == index)
? new ImportState(index, false, antwortTransfernachricht)
: new ImportState(antwortTransfernachricht.naechsterIndex(), true, antwortTransfernachricht);
}
} }
} }
...@@ -40,10 +40,8 @@ class PvogService { ...@@ -40,10 +40,8 @@ class PvogService {
private final PvogRemoteService remoteService; private final PvogRemoteService remoteService;
private final ZufiProperties zufiProperties; private final ZufiProperties zufiProperties;
private final TransferOperationMapper mapper;
private final XzufiObjekteUnmarshaller xzufiObjekteUnmarshaller;
public AntwortTransfernachricht getIncrementVerwaltungsObjekte(int index) { public AntwortTransfernachricht getVerwaltungsObjekteAt(int index) {
try { try {
return remoteService.getVerwaltungsObjekte(index, zufiProperties.getAmtlicheRegionalSchluessel()); return remoteService.getVerwaltungsObjekte(index, zufiProperties.getAmtlicheRegionalSchluessel());
} catch (TechnicalException e) { } catch (TechnicalException e) {
...@@ -53,11 +51,7 @@ class PvogService { ...@@ -53,11 +51,7 @@ class PvogService {
} }
} }
public TransferOperation parseXml(String xzufiObjekte) { public boolean containsVerwaltungsObjekte(AntwortTransfernachricht transfernachricht) {
return mapper.fromJaxb(xzufiObjekteUnmarshaller.unmarshal(xzufiObjekte));
}
public boolean dataAvailable(AntwortTransfernachricht transfernachricht) {
return StringUtils.isNotEmpty(transfernachricht.xzufiObjekte()); return StringUtils.isNotEmpty(transfernachricht.xzufiObjekte());
} }
......
...@@ -26,13 +26,21 @@ package de.ozgcloud.zufi.pvog; ...@@ -26,13 +26,21 @@ package de.ozgcloud.zufi.pvog;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy; import org.mapstruct.ReportingPolicy;
import org.springframework.beans.factory.annotation.Autowired;
import de.ozgcloud.zufi.schema.TransferOperation040502; import de.ozgcloud.zufi.schema.TransferOperation040502;
@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, uses = TransferOperationEntryMapper.class) @Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, uses = TransferOperationEntryMapper.class)
interface TransferOperationMapper { abstract class TransferOperationMapper {
@Autowired
private XzufiObjekteUnmarshaller xzufiObjekteUnmarshaller;
public TransferOperation fromAntwortTransfernachricht(AntwortTransfernachricht antwortTransfernachricht) {
return fromXzufi(xzufiObjekteUnmarshaller.unmarshal(antwortTransfernachricht.xzufiObjekte()));
}
@Mapping(target = "entries", source = "transferOperation") @Mapping(target = "entries", source = "transferOperation")
TransferOperation fromJaxb(TransferOperation040502 transferOperation); abstract TransferOperation fromXzufi(TransferOperation040502 transferOperation);
} }
package de.ozgcloud.zufi; package de.ozgcloud.zufi;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
...@@ -7,6 +8,7 @@ import org.junit.jupiter.api.Test; ...@@ -7,6 +8,7 @@ import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.zufi.pvog.PvogProcessor; import de.ozgcloud.zufi.pvog.PvogProcessor;
class PvogProcessorRunnerTest { class PvogProcessorRunnerTest {
...@@ -19,6 +21,7 @@ class PvogProcessorRunnerTest { ...@@ -19,6 +21,7 @@ class PvogProcessorRunnerTest {
@Nested @Nested
class TestRun { class TestRun {
@Test @Test
void shouldRunPvogProcessRunner() { void shouldRunPvogProcessRunner() {
runner.run(); runner.run();
...@@ -26,6 +29,13 @@ class PvogProcessorRunnerTest { ...@@ -26,6 +29,13 @@ class PvogProcessorRunnerTest {
verify(processor).process(); verify(processor).process();
} }
@Test
void shouldRethrowException() {
var exception = new TechnicalException("something bad happened");
doThrow(exception).when(processor).process();
assertThatThrownBy(() -> runner.run()).isEqualTo(exception);
}
} }
} }
\ No newline at end of file
...@@ -6,14 +6,13 @@ import static de.ozgcloud.zufi.pvog.AntwortTransfernachrichtTestFactory.*; ...@@ -6,14 +6,13 @@ import static de.ozgcloud.zufi.pvog.AntwortTransfernachrichtTestFactory.*;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import jakarta.ws.rs.core.MediaType;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo;
import de.ozgcloud.zufi.pvog.PvogProperties; import de.ozgcloud.zufi.pvog.PvogProperties;
import jakarta.ws.rs.core.MediaType;
public class PvogServiceStubSetup { public class PvogServiceStubSetup {
...@@ -56,6 +55,6 @@ public class PvogServiceStubSetup { ...@@ -56,6 +55,6 @@ public class PvogServiceStubSetup {
.withBody(StringUtils.EMPTY))); .withBody(StringUtils.EMPTY)));
} }
public static record QueryParams(String index, String ars) { public record QueryParams(String index, String ars) {
} }
} }
...@@ -77,15 +77,15 @@ class PvogProcessorITCase { ...@@ -77,15 +77,15 @@ class PvogProcessorITCase {
@BeforeEach @BeforeEach
void initRemoteService() { void initRemoteService() {
doReturn(AntwortTransfernachrichtTestFactory.create()).when(pvogService).getIncrementVerwaltungsObjekte(0); doReturn(AntwortTransfernachrichtTestFactory.create()).when(pvogService).getVerwaltungsObjekteAt(0);
doReturn(AntwortTransfernachrichtTestFactory.createBuilder().xzufiObjekte(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE_INCREMENT) doReturn(AntwortTransfernachrichtTestFactory.createBuilder().xzufiObjekte(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE_INCREMENT)
.build()) .build())
.when(pvogService).getIncrementVerwaltungsObjekte(AntwortTransfernachrichtTestFactory.NEXT_INDEX); .when(pvogService).getVerwaltungsObjekteAt(AntwortTransfernachrichtTestFactory.NEXT_INDEX);
} }
@BeforeEach @BeforeEach
void init() { void init() {
doReturn(true).when(pvogService).dataAvailable(any()); doReturn(true).when(pvogService).containsVerwaltungsObjekte(any());
} }
@Test @Test
...@@ -116,8 +116,8 @@ class PvogProcessorITCase { ...@@ -116,8 +116,8 @@ class PvogProcessorITCase {
@BeforeEach @BeforeEach
void initData() { void initData() {
doReturn(AntwortTransfernachrichtTestFactory.createBuilder().xzufiObjekte(createLoescheTransferObject()).build()) doReturn(AntwortTransfernachrichtTestFactory.createBuilder().xzufiObjekte(createLoescheTransferObject()).build())
.when(pvogService).getIncrementVerwaltungsObjekte(anyInt()); .when(pvogService).getVerwaltungsObjekteAt(anyInt());
doReturn(true).when(pvogService).dataAvailable(any()); doReturn(true).when(pvogService).containsVerwaltungsObjekte(any());
processor.process(); processor.process();
} }
......
...@@ -24,24 +24,25 @@ ...@@ -24,24 +24,25 @@
package de.ozgcloud.zufi.pvog; package de.ozgcloud.zufi.pvog;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Random;
import java.util.Set; import java.util.Set;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.zufi.metadocument.MetaDocumentService; import de.ozgcloud.zufi.metadocument.MetaDocumentService;
import de.ozgcloud.zufi.metadocument.MetaDocumentTestFactory; import de.ozgcloud.zufi.metadocument.MetaDocumentTestFactory;
import de.ozgcloud.zufi.pvog.PvogProcessor.ImportState;
class PvogProcessorTest { class PvogProcessorTest {
@Spy @Spy
...@@ -53,238 +54,366 @@ class PvogProcessorTest { ...@@ -53,238 +54,366 @@ class PvogProcessorTest {
private MetaDocumentService metaDocumentService; private MetaDocumentService metaDocumentService;
@Mock @Mock
private Set<TransferOperationEntryProcessor> entryProcessors; private Set<TransferOperationEntryProcessor> entryProcessors;
@Mock
private TransferOperationMapper transferOperationMapper;
@DisplayName("Test processing the PVOG data")
@Nested @Nested
class TestProcess { class TestProcess {
@DisplayName("when it is a full sync") private static final int INDEX = new Random().nextInt();
@Nested
class OnFullSync {
@BeforeEach @BeforeEach
void init() { void init() {
when(metaDocumentService.findNaechsterIndex()).thenReturn(Optional.empty()); doReturn(INDEX).when(processor).getStartIndex();
doNothing().when(processor).processFromIndex(0); doNothing().when(processor).processFromIndex(INDEX);
} }
@Test @Test
void shouldFindNaechsterIndex() { void shouldGetStartIndex() {
processor.process(); processor.process();
verify(metaDocumentService).findNaechsterIndex(); verify(processor).getStartIndex();
} }
@Test @Test
void shouldProcessFromIndex() { void shouldProcessFromIndex() {
processor.process(); processor.process();
verify(processor).processFromIndex(0); verify(processor).processFromIndex(INDEX);
}
} }
@DisplayName("when it is a incremental sync") @Test
@Nested void shouldLogSyncStarted() {
class OnIncrementalSync { processor.process();
@BeforeEach verify(processor).logSyncStarted(INDEX);
void init() {
when(metaDocumentService.findNaechsterIndex()).thenReturn(Optional.of(MetaDocumentTestFactory.NAECHSTER_INDEX));
doNothing().when(processor).processFromIndex(MetaDocumentTestFactory.NAECHSTER_INDEX);
} }
@Test @Test
void shouldFindNaechsterIndex() { void shouldLogSyncFinished() {
processor.process(); processor.process();
verify(processor).logSyncFinished();
}
}
@Nested
class TestGetStartIndex {
@Test
void shouldFindNextIndex() {
givenFindNaechsterIndexReturnsNextIndex();
processor.getStartIndex();
verify(metaDocumentService).findNaechsterIndex(); verify(metaDocumentService).findNaechsterIndex();
} }
@Test @Test
void shouldProcessFromIndex() { void shouldReturnNextIndex() {
processor.process(); givenFindNaechsterIndexReturnsNextIndex();
verify(processor).processFromIndex(MetaDocumentTestFactory.NAECHSTER_INDEX); var startIndex = processor.getStartIndex();
assertThat(startIndex).isEqualTo(MetaDocumentTestFactory.NAECHSTER_INDEX);
} }
@Test
void shouldReturnZeroIfNextIndexNotFound() {
givenFindNaechsterIndexReturnsEmpty();
var startIndex = processor.getStartIndex();
assertThat(startIndex).isZero();
} }
private void givenFindNaechsterIndexReturnsNextIndex() {
when(metaDocumentService.findNaechsterIndex()).thenReturn(Optional.of(MetaDocumentTestFactory.NAECHSTER_INDEX));
}
private void givenFindNaechsterIndexReturnsEmpty() {
when(metaDocumentService.findNaechsterIndex()).thenReturn(Optional.empty());
}
} }
@Nested @Nested
class TestProcessFromIndex { class TestProcessFromIndex {
private static final int START_INDEX = 1000;
private static final int IMPORT_STATE_1_INDEX = 2000;
private final AntwortTransfernachricht antwortTransfernachricht1 = AntwortTransfernachrichtTestFactory.createBuilder().naechsterIndex(IMPORT_STATE_1_INDEX).build();
private final ImportState importState1 = new ImportState(IMPORT_STATE_1_INDEX, true, antwortTransfernachricht1);
@BeforeEach
void mockProcessorMethods() {
doReturn(antwortTransfernachricht1).when(processor).fetchVerwaltungsObjekteAt(START_INDEX);
doNothing().when(processor).process(antwortTransfernachricht1);
}
@Nested @Nested
class TestWithChangedNaechsterIndex { class OnIsFinishedAfterProcessingFirstIndex {
private final AntwortTransfernachricht antwortTransfernachricht = AntwortTransfernachrichtTestFactory.create();
private final AntwortTransfernachricht nextAntwortTransfernachricht = AntwortTransfernachrichtTestFactory.createBuilder()
.naechsterIndex(MetaDocumentTestFactory.NAECHSTER_INDEX + 100).build();
@BeforeEach @BeforeEach
void init() { void mockIsFinished() {
when(service.getIncrementVerwaltungsObjekte(MetaDocumentTestFactory.NAECHSTER_INDEX)).thenReturn(antwortTransfernachricht); doReturn(true).when(processor).isFinished(importState1);
} }
@Test @Test
void shouldGetIncrementVerwaltungsObjekte() { void shouldFetchVerwaltungsObjekteAtIndex() {
when(service.hasMoreData(antwortTransfernachricht)).thenReturn(false); processFromStartIndex();
callProcessor(); verify(processor).fetchVerwaltungsObjekteAt(START_INDEX);
verify(service).getIncrementVerwaltungsObjekte(MetaDocumentTestFactory.NAECHSTER_INDEX);
} }
@Test @Test
void shouldNotHandleAntwortTransfernachrichtWithoutData() { void shouldProcessAntwortTransfernachricht() {
when(service.hasMoreData(antwortTransfernachricht)).thenReturn(false); processFromStartIndex();
when(service.dataAvailable(antwortTransfernachricht)).thenReturn(false);
callProcessor(); verify(processor).process(antwortTransfernachricht1);
verify(processor, never()).handleAntwortTransfernachricht(any());
} }
@Test @Test
void shouldHandleAntwortTransfernachrichtWithData() { void shouldCheckIfImportIsFinishedBasedOnNextState() {
when(service.hasMoreData(antwortTransfernachricht)).thenReturn(false); processFromStartIndex();
when(service.dataAvailable(antwortTransfernachricht)).thenReturn(true);
doNothing().when(processor).handleAntwortTransfernachricht(antwortTransfernachricht);
callProcessor(); verify(processor).isFinished(importState1);
}
}
verify(processor).handleAntwortTransfernachricht(antwortTransfernachricht); @Nested
class OnIsNotFinishedAfterProcessingFirstIndex {
private static final int IMPORT_STATE_2_INDEX = 3000;
private final AntwortTransfernachricht antwortTransfernachricht2 = AntwortTransfernachrichtTestFactory.createBuilder().naechsterIndex(IMPORT_STATE_2_INDEX).build();
private final ImportState importState2 = new ImportState(IMPORT_STATE_2_INDEX, true, antwortTransfernachricht2);
@BeforeEach
void mockProcessorMethods() {
doReturn(antwortTransfernachricht2).when(processor).fetchVerwaltungsObjekteAt(IMPORT_STATE_1_INDEX);
doNothing().when(processor).process(antwortTransfernachricht2);
}
@BeforeEach
void mockIsFinished() {
doReturn(false).when(processor).isFinished(importState1);
doReturn(true).when(processor).isFinished(importState2);
} }
@Test @Test
void shouldNotProcessNextIndex() { void shouldFetchVerwaltungsObjekteAtIndex() {
when(service.hasMoreData(antwortTransfernachricht)).thenReturn(false); processFromStartIndex();
when(service.dataAvailable(antwortTransfernachricht)).thenReturn(false);
callProcessor(); verify(processor).fetchVerwaltungsObjekteAt(IMPORT_STATE_1_INDEX);
}
@Test
void shouldProcessAntwortTransfernachricht() {
processFromStartIndex();
verify(service, never()).getIncrementVerwaltungsObjekte(AntwortTransfernachrichtTestFactory.NEXT_INDEX); verify(processor).process(antwortTransfernachricht2);
} }
@Test @Test
void shouldProcessNextIndex() { void shouldCheckIfImportIsFinishedBasedOnNextState() {
when(service.hasMoreData(antwortTransfernachricht)).thenReturn(true); processFromStartIndex();
when(service.hasMoreData(nextAntwortTransfernachricht)).thenReturn(false);
when(service.dataAvailable(any())).thenReturn(false);
when(service.getIncrementVerwaltungsObjekte(AntwortTransfernachrichtTestFactory.NEXT_INDEX)).thenReturn(nextAntwortTransfernachricht);
callProcessor(); verify(processor).isFinished(importState2);
}
}
verify(service).getIncrementVerwaltungsObjekte(AntwortTransfernachrichtTestFactory.NEXT_INDEX); private void processFromStartIndex() {
processor.processFromIndex(START_INDEX);
} }
} }
@Nested @Nested
class TestWithSameNaechsterIndex { class TestFetchVerwaltungsObjekteAtIndex {
private final AntwortTransfernachricht antwortTransfernachricht = AntwortTransfernachrichtTestFactory.createBuilder()
.naechsterIndex(MetaDocumentTestFactory.NAECHSTER_INDEX).build(); private static final int INDEX = new Random().nextInt();
@Test @Test
void shouldExitLoopOnRepeatedNextIndex() { void shouldCallPvogService() {
when(service.getIncrementVerwaltungsObjekte(MetaDocumentTestFactory.NAECHSTER_INDEX)).thenReturn(antwortTransfernachricht); processor.fetchVerwaltungsObjekteAt(INDEX);
when(service.dataAvailable(antwortTransfernachricht)).thenReturn(false);
when(service.hasMoreData(antwortTransfernachricht)).thenReturn(true);
callProcessor(); verify(service).getVerwaltungsObjekteAt(INDEX);
}
}
@Nested
class TestProcessAntwortTransfernachricht {
private final AntwortTransfernachricht antwortTransfernachricht = AntwortTransfernachrichtTestFactory.create();
@Test
void shouldCheckForVerwaltungsObjekte() {
processor.process(antwortTransfernachricht);
verify(service, times(1)).getIncrementVerwaltungsObjekte(MetaDocumentTestFactory.NAECHSTER_INDEX); verify(service).containsVerwaltungsObjekte(antwortTransfernachricht);
} }
@Test
void shouldDoNothingIfAntwortDoesNotContainVerwaltungsObjekte() {
when(service.containsVerwaltungsObjekte(antwortTransfernachricht)).thenReturn(false);
processor.process(antwortTransfernachricht);
verify(processor, never()).processVerwaltungsObjekteAndUpdateMetaData(any());
} }
private void callProcessor() { @Test
processor.processFromIndex(MetaDocumentTestFactory.NAECHSTER_INDEX); void shouldProcessVerwaltungsObjekte() {
when(service.containsVerwaltungsObjekte(antwortTransfernachricht)).thenReturn(true);
doNothing().when(processor).processVerwaltungsObjekteAndUpdateMetaData(antwortTransfernachricht);
processor.process(antwortTransfernachricht);
verify(processor).processVerwaltungsObjekteAndUpdateMetaData(antwortTransfernachricht);
} }
} }
@Nested @Nested
class TestHandleAntwortTransfernachricht { class TestProcessVerwaltungsObjekteAndUpdateMetaData {
private final AntwortTransfernachricht antwortTransfernachricht = AntwortTransfernachrichtTestFactory.create();
private final TransferOperation transferOperation = TransferOperationTestFactory.create();
@Nested
class OnNoException {
@BeforeEach private final AntwortTransfernachricht antwortTransfernachricht = AntwortTransfernachrichtTestFactory.create();
void setUpMocks() {
when(service.parseXml(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE)).thenReturn(transferOperation);
doNothing().when(processor).processTransferOperation(transferOperation);
}
@Test @Test
void shouldCallParseXml() { void shouldProcessOneEntry() {
callProcessor(); var entry = TransferOperationEntryTestFactory.createWriteEntry();
var transferOperation = TransferOperationTestFactory.createBuilder().entries(List.of(entry)).build();
when(transferOperationMapper.fromAntwortTransfernachricht(antwortTransfernachricht)).thenReturn(transferOperation);
processor.processVerwaltungsObjekteAndUpdateMetaData(antwortTransfernachricht);
verify(service).parseXml(any()); entryProcessors.forEach(entryProcessor -> verify(entryProcessor).process(entry));
} }
@Test @Test
void shouldProcessTransferOperation() { void shouldProcessMultipleEntries() {
callProcessor(); var entry1 = TransferOperationEntryTestFactory.createWriteEntry();
var entry2 = TransferOperationEntryTestFactory.createWriteEntry();
var entry3 = TransferOperationEntryTestFactory.createDeleteEntry();
var transferOperation = TransferOperationTestFactory.createBuilder().entries(List.of(entry1, entry2, entry3)).build();
when(transferOperationMapper.fromAntwortTransfernachricht(antwortTransfernachricht)).thenReturn(transferOperation);
processor.processVerwaltungsObjekteAndUpdateMetaData(antwortTransfernachricht);
verify(processor).processTransferOperation(transferOperation); entryProcessors.forEach(entryProcessor -> verify(entryProcessor).process(entry1));
entryProcessors.forEach(entryProcessor -> verify(entryProcessor).process(entry2));
entryProcessors.forEach(entryProcessor -> verify(entryProcessor).process(entry3));
} }
@Test @Test
void shouldSaveMetaDocument() { void shouldUpdateMetaData() {
callProcessor(); var transferOperation = TransferOperationTestFactory.create();
when(transferOperationMapper.fromAntwortTransfernachricht(antwortTransfernachricht)).thenReturn(transferOperation);
processor.processVerwaltungsObjekteAndUpdateMetaData(antwortTransfernachricht);
verify(metaDocumentService).saveMetaDocument(antwortTransfernachricht); verify(metaDocumentService).saveMetaDocument(antwortTransfernachricht);
} }
} }
@DisplayName("check error handling")
@Nested @Nested
class OnException { class TestIsFinished {
private static final int DUMMY_INDEX = 100;
private final AntwortTransfernachricht antwortTransfernachricht = AntwortTransfernachrichtTestFactory.create();
@ParameterizedTest
@ValueSource(booleans = {true, false})
void shouldReturnTrueIfHasNoMoreData(boolean indexChanged) {
var importState = new ImportState(DUMMY_INDEX, indexChanged, antwortTransfernachricht);
when(service.hasMoreData(antwortTransfernachricht)).thenReturn(false);
var finished = processor.isFinished(importState);
assertThat(finished).isTrue();
}
@ParameterizedTest
@ValueSource(booleans = {true, false})
void shouldReturnTrueIfIndexNotChanged(boolean hasMoreData) {
var importState = new ImportState(DUMMY_INDEX, false, antwortTransfernachricht);
when(service.hasMoreData(antwortTransfernachricht)).thenReturn(hasMoreData);
var finished = processor.isFinished(importState);
assertThat(finished).isTrue();
}
@Test @Test
void shouldThrowTechnicalExceptionOnError() { void shouldReturnFalseIfHasMoreDataAndIndexChanged() {
doThrow(new RuntimeException()).when(processor).processTransferOperation(any()); var importState = new ImportState(DUMMY_INDEX, true, antwortTransfernachricht);
when(service.hasMoreData(antwortTransfernachricht)).thenReturn(true);
assertThatExceptionOfType(TechnicalException.class).isThrownBy( // NOSONAR var finished = processor.isFinished(importState);
() -> processor.handleAntwortTransfernachricht(
AntwortTransfernachrichtTestFactory.create()))
.withMessageContaining(PvogProcessor.GENERAL_ERROR_PROCESSING_PVOG_DATA);
verify(metaDocumentService, never()).saveMetaDocument(any()); assertThat(finished).isFalse();
} }
} }
private void callProcessor() { @Nested
processor.handleAntwortTransfernachricht(antwortTransfernachricht); class TestImportState {
@Nested
class TestCustomConstructor {
@Test
void shouldSetIndexChangedToTrue() {
var importState = new ImportState(100);
assertThat(importState.indexChanged()).isTrue();
} }
} }
@Nested @Nested
class TestProcessTransferOperation { class TestNextState {
private final AntwortTransfernachricht antwortTransfernachricht = AntwortTransfernachrichtTestFactory.create();
@Test @Test
void shouldProcessOneEntry() { void shouldHaveAntwortTransfernachricht() {
var entry = TransferOperationEntryTestFactory.createWriteEntry(); var importState = new ImportState(100);
var entries = TransferOperationTestFactory.createBuilder().entries(List.of(entry)).build();
processor.processTransferOperation(entries); var nextState = importState.nextState(antwortTransfernachricht);
entryProcessors.forEach(entryProcessor -> verify(entryProcessor).process(entry)); assertThat(nextState.antwortTransfernachricht()).isEqualTo(antwortTransfernachricht);
} }
@Test @Test
void shouldProcessMultipleEntries() { void shouldHaveIndex() {
var entry1 = TransferOperationEntryTestFactory.createWriteEntry(); var importState = new ImportState(100);
var entry2 = TransferOperationEntryTestFactory.createWriteEntry();
var entry3 = TransferOperationEntryTestFactory.createDeleteEntry();
var entries = TransferOperationTestFactory.createBuilder().entries(List.of(entry1, entry2, entry3)).build();
processor.processTransferOperation(entries); var nextState = importState.nextState(antwortTransfernachricht);
entryProcessors.forEach(entryProcessor -> verify(entryProcessor).process(entry1)); assertThat(nextState.index()).isEqualTo(AntwortTransfernachrichtTestFactory.NEXT_INDEX);
entryProcessors.forEach(entryProcessor -> verify(entryProcessor).process(entry2));
entryProcessors.forEach(entryProcessor -> verify(entryProcessor).process(entry3));
} }
@Nested
class OnNaechsterIndexEqualsIndex {
@Test
void shouldHaveIndexChangedEqualsFalse() {
var importState = new ImportState(AntwortTransfernachrichtTestFactory.NEXT_INDEX);
var nextState = importState.nextState(antwortTransfernachricht);
assertThat(nextState.indexChanged()).isFalse();
}
} }
@Nested
class OnNaechsterIndexDiffersFromIndex {
@Test
void shouldHaveIndexChangedEqualsTrue() {
var importState = new ImportState(AntwortTransfernachrichtTestFactory.NEXT_INDEX - 100);
var nextState = importState.nextState(antwortTransfernachricht);
assertThat(nextState.indexChanged()).isTrue();
}
}
}
}
} }
...@@ -38,8 +38,6 @@ import org.mockito.Spy; ...@@ -38,8 +38,6 @@ import org.mockito.Spy;
import com.thedeanda.lorem.LoremIpsum; import com.thedeanda.lorem.LoremIpsum;
import de.ozgcloud.zufi.schema.TransferOperation040502;
class PvogServiceTest { class PvogServiceTest {
@Spy @Spy
...@@ -49,10 +47,6 @@ class PvogServiceTest { ...@@ -49,10 +47,6 @@ class PvogServiceTest {
private ZufiProperties zufiProperties; private ZufiProperties zufiProperties;
@Mock @Mock
private PvogRemoteService remoteService; private PvogRemoteService remoteService;
@Mock
private TransferOperationMapper mapper;
@Mock
private XzufiObjekteUnmarshaller xzufiObjekteUnmarshaller;
@Nested @Nested
class TestGetIncrementVerwaltungsObjekte { class TestGetIncrementVerwaltungsObjekte {
...@@ -82,7 +76,7 @@ class PvogServiceTest { ...@@ -82,7 +76,7 @@ class PvogServiceTest {
} }
private AntwortTransfernachricht callService() { private AntwortTransfernachricht callService() {
return service.getIncrementVerwaltungsObjekte(index); return service.getVerwaltungsObjekteAt(index);
} }
} }
...@@ -110,40 +104,6 @@ class PvogServiceTest { ...@@ -110,40 +104,6 @@ class PvogServiceTest {
} }
} }
@Nested
class TestParseXml {
@Mock
private TransferOperation040502 jaxbTransferOperation;
@BeforeEach
void init() {
when(xzufiObjekteUnmarshaller.unmarshal(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE)).thenReturn(jaxbTransferOperation);
when(mapper.fromJaxb(jaxbTransferOperation)).thenReturn(TransferOperationTestFactory.create());
}
@Test
void shouldUnmarshalXzufiObjekte() {
service.parseXml(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE);
verify(xzufiObjekteUnmarshaller).unmarshal(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE);
}
@Test
void shouldMapToTransferOperation() {
service.parseXml(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE);
verify(mapper).fromJaxb(jaxbTransferOperation);
}
@Test
void shouldReturnTransferOperation() {
var transferOperation = service.parseXml(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE);
assertThat(transferOperation.getEntries()).isEqualTo(TransferOperationTestFactory.ENTRIES);
}
}
@DisplayName("Verify the xzufi data of the incomming AntwortTransfernachricht") @DisplayName("Verify the xzufi data of the incomming AntwortTransfernachricht")
@Nested @Nested
class TestDataAvailable { class TestDataAvailable {
...@@ -152,7 +112,7 @@ class PvogServiceTest { ...@@ -152,7 +112,7 @@ class PvogServiceTest {
void shouldHandleEmptyBody() { void shouldHandleEmptyBody() {
var emptyBody = AntwortTransfernachrichtTestFactory.createBuilder().xzufiObjekte("").build(); var emptyBody = AntwortTransfernachrichtTestFactory.createBuilder().xzufiObjekte("").build();
var result = service.dataAvailable(emptyBody); var result = service.containsVerwaltungsObjekte(emptyBody);
assertThat(result).isFalse(); assertThat(result).isFalse();
} }
...@@ -161,7 +121,7 @@ class PvogServiceTest { ...@@ -161,7 +121,7 @@ class PvogServiceTest {
void shouldHandleNullBody() { void shouldHandleNullBody() {
var nullBody = AntwortTransfernachrichtTestFactory.createBuilder().xzufiObjekte(null).build(); var nullBody = AntwortTransfernachrichtTestFactory.createBuilder().xzufiObjekte(null).build();
var result = service.dataAvailable(nullBody); var result = service.containsVerwaltungsObjekte(nullBody);
assertThat(result).isFalse(); assertThat(result).isFalse();
} }
...@@ -170,7 +130,7 @@ class PvogServiceTest { ...@@ -170,7 +130,7 @@ class PvogServiceTest {
void shouldReturnTrue() { void shouldReturnTrue() {
var validNachricht = AntwortTransfernachrichtTestFactory.create(); var validNachricht = AntwortTransfernachrichtTestFactory.create();
var result = service.dataAvailable(validNachricht); var result = service.containsVerwaltungsObjekte(validNachricht);
assertThat(result).isTrue(); assertThat(result).isTrue();
} }
......
...@@ -26,25 +26,25 @@ package de.ozgcloud.zufi.pvog; ...@@ -26,25 +26,25 @@ package de.ozgcloud.zufi.pvog;
import de.ozgcloud.zufi.schema.SchreibeObjekt; import de.ozgcloud.zufi.schema.SchreibeObjekt;
public class SchreibeObjektTestFactory { public class SchreibeObjektTestFactory {
public static final SchreibeObjekt createWithOrganisationseinheit() { public static SchreibeObjekt createWithOrganisationseinheit() {
var schreibeObjekt = new SchreibeObjekt(); var schreibeObjekt = new SchreibeObjekt();
schreibeObjekt.setOrganisationseinheit(OrganisationseinheitTestFactory.create()); schreibeObjekt.setOrganisationseinheit(OrganisationseinheitTestFactory.create());
return schreibeObjekt; return schreibeObjekt;
} }
public static final SchreibeObjekt createWithOrganisationseinheitWithoutAnschrift() { public static SchreibeObjekt createWithOrganisationseinheitWithoutAnschrift() {
var schreibeObjekt = new SchreibeObjekt(); var schreibeObjekt = new SchreibeObjekt();
schreibeObjekt.setOrganisationseinheit(OrganisationseinheitTestFactory.createWithoutAnschrift()); schreibeObjekt.setOrganisationseinheit(OrganisationseinheitTestFactory.createWithoutAnschrift());
return schreibeObjekt; return schreibeObjekt;
} }
public static final SchreibeObjekt createWithOrganisationseinheitWithoutVerwaltungspolitischeKodierung() { public static SchreibeObjekt createWithOrganisationseinheitWithoutVerwaltungspolitischeKodierung() {
var schreibeObjekt = new SchreibeObjekt(); var schreibeObjekt = new SchreibeObjekt();
schreibeObjekt.setOrganisationseinheit(OrganisationseinheitTestFactory.createWithoutVerwaltungspolitischeKodierung()); schreibeObjekt.setOrganisationseinheit(OrganisationseinheitTestFactory.createWithoutVerwaltungspolitischeKodierung());
return schreibeObjekt; return schreibeObjekt;
} }
public static final SchreibeObjekt createWithZustaendigkeit() { public static SchreibeObjekt createWithZustaendigkeit() {
var schreibeObjekt = new SchreibeObjekt(); var schreibeObjekt = new SchreibeObjekt();
schreibeObjekt.setZustaendigkeitTransferObjekt(ZustaendigkeitTransferObjektTestFactory.create()); schreibeObjekt.setZustaendigkeitTransferObjekt(ZustaendigkeitTransferObjektTestFactory.create());
return schreibeObjekt; return schreibeObjekt;
......
...@@ -69,7 +69,7 @@ class TransferOperationMapperITCase { ...@@ -69,7 +69,7 @@ class TransferOperationMapperITCase {
} }
private TransferOperation map() { private TransferOperation map() {
return mapper.fromJaxb(XzufiTestUtils.unmarshal(createLoescheTransferObject())); return mapper.fromXzufi(XzufiTestUtils.unmarshal(createLoescheTransferObject()));
} }
private String createLoescheTransferObject() { private String createLoescheTransferObject() {
...@@ -82,6 +82,6 @@ class TransferOperationMapperITCase { ...@@ -82,6 +82,6 @@ class TransferOperationMapperITCase {
} }
private TransferOperation map() { private TransferOperation map() {
return mapper.fromJaxb(XzufiTestUtils.unmarshal(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE)); return mapper.fromXzufi(XzufiTestUtils.unmarshal(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE));
} }
} }
...@@ -24,10 +24,9 @@ ...@@ -24,10 +24,9 @@
package de.ozgcloud.zufi.pvog; package de.ozgcloud.zufi.pvog;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
...@@ -35,19 +34,58 @@ import org.mockito.InjectMocks; ...@@ -35,19 +34,58 @@ import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
import de.ozgcloud.zufi.schema.TransferOperation040502;
class TransferOperationMapperTest { class TransferOperationMapperTest {
@Spy @Spy
@InjectMocks @InjectMocks
private TransferOperationMapper mapper = Mappers.getMapper(TransferOperationMapper.class); private final TransferOperationMapper mapper = Mappers.getMapper(TransferOperationMapper.class);
@Mock @Mock
private TransferOperationEntryMapper entryMapper = Mappers.getMapper(TransferOperationEntryMapper.class); private TransferOperationEntryMapper entryMapper;
@Mock
private XzufiObjekteUnmarshaller xzufiObjekteUnmarshaller;
@DisplayName("Verify the received transfer object")
@Nested @Nested
class TestFromJaxb { class TestFromAntwortTransfernachricht {
@Mock
private TransferOperation040502 xzufiTransferOperation;
@BeforeEach
void init() {
when(xzufiObjekteUnmarshaller.unmarshal(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE)).thenReturn(xzufiTransferOperation);
doReturn(TransferOperationTestFactory.create()).when(mapper).fromXzufi(xzufiTransferOperation);
}
@Test
void shouldUnmarshalXzufiObjekte() {
map();
verify(xzufiObjekteUnmarshaller).unmarshal(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE);
}
@Test
void shouldMapToTransferOperation() {
map();
verify(mapper).fromXzufi(xzufiTransferOperation);
}
@Test
void shouldReturnTransferOperation() {
var transferOperation = map();
assertThat(transferOperation.getEntries()).isEqualTo(TransferOperationTestFactory.ENTRIES);
}
private TransferOperation map() {
return mapper.fromAntwortTransfernachricht(AntwortTransfernachrichtTestFactory.create());
}
}
@Nested
class TestFromXzufi {
@Test @Test
void shouldCallTransferOperationEntryMapper() { void shouldCallTransferOperationEntryMapper() {
map(); map();
...@@ -62,9 +100,8 @@ class TransferOperationMapperTest { ...@@ -62,9 +100,8 @@ class TransferOperationMapperTest {
assertThat(data.getEntries()).hasSize(AntwortTransfernachrichtTestFactory.ANZAHL_OBJEKTE); assertThat(data.getEntries()).hasSize(AntwortTransfernachrichtTestFactory.ANZAHL_OBJEKTE);
} }
}
private TransferOperation map() { private TransferOperation map() {
return mapper.fromJaxb(XzufiTestUtils.unmarshal(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE)); return mapper.fromXzufi(XzufiTestUtils.unmarshal(AntwortTransfernachrichtTestFactory.XZUFI_OBJEKTE));
}
} }
} }
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
</parent> </parent>
<groupId>de.ozgcloud.zufi</groupId>
<artifactId>zufi-manager-server</artifactId> <artifactId>zufi-manager-server</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
<name>OZG-Cloud Zufi Manager Server</name> <name>OZG-Cloud Zufi Manager Server</name>
...@@ -49,8 +48,6 @@ ...@@ -49,8 +48,6 @@
<maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target> <maven.compiler.target>${java.version}</maven.compiler.target>
<testcontainer.version>1.19.7</testcontainer.version>
</properties> </properties>
<dependencies> <dependencies>
...@@ -208,29 +205,6 @@ ...@@ -208,29 +205,6 @@
</profiles> </profiles>
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.mycila</groupId>
<artifactId>license-maven-plugin</artifactId>
</plugin>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
......
...@@ -12,11 +12,11 @@ import net.devh.boot.grpc.server.service.GrpcService; ...@@ -12,11 +12,11 @@ import net.devh.boot.grpc.server.service.GrpcService;
@RequiredArgsConstructor @RequiredArgsConstructor
class VorgangManagerRoutingGrpcService extends VorgangManagerRoutingServiceImplBase { class VorgangManagerRoutingGrpcService extends VorgangManagerRoutingServiceImplBase {
private final VorgangManagerRoutingService RoutingService; private final VorgangManagerRoutingService routingService;
@Override @Override
public void routing(GrpcVorgangManagerRoutingRequest request, StreamObserver<GrpcVorgangManagerRoutingResponse> responseObserver) { public void routing(GrpcVorgangManagerRoutingRequest request, StreamObserver<GrpcVorgangManagerRoutingResponse> responseObserver) {
RoutingService.findVorgangManagerAddress(request.getOrganisationsEinheitId()).ifPresentOrElse( routingService.findVorgangManagerAddress(request.getOrganisationsEinheitId()).ifPresentOrElse(
result -> buildResponse(responseObserver, result), result -> buildResponse(responseObserver, result),
() -> throwException(request)); () -> throwException(request));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment