From adb9000f9c6b0e7838b21150efd80ba48fbaf64e Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Wed, 19 Jun 2024 17:39:14 +0200 Subject: [PATCH] OZG-5957 Replaced elasticsearch with mongodb in zufi-server --- pom.xml | 1 + .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 62547 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + zufi-manager-model/lombok.config | 30 ++ zufi-manager-model/mvnw | 308 ++++++++++++++++++ zufi-manager-model/mvnw.cmd | 205 ++++++++++++ zufi-manager-model/pom.xml | 82 +++++ .../OrganisationsEinheit.java | 26 ++ .../OrganisationsEinheitRepository.java | 32 ++ .../OrganisationsEinheitRepositoryITCase.java | 84 +++++ .../OrganisationsEinheitTestFactory.java | 56 ++++ .../org.junit.jupiter.api.extension.Extension | 1 + .../test/resources/junit-platform.properties | 1 + zufi-manager-pvog/pom.xml | 26 ++ .../OrganisationsEinheit.java | 3 +- ...fiManagerPvogSpringApplicationITCase.java} | 4 +- .../OrganisationsEinheitTestFactory.java | 5 +- .../ozgcloud/zufi/pvog/PvogProcessorTest.java | 4 +- zufi-manager-server/pom.xml | 16 +- .../zufi/ZufiManagerServerApplication.java | 4 +- .../OrganisationsEinheitCustomRepository.java | 7 - ...anisationsEinheitCustomRepositoryImpl.java | 54 --- .../OrganisationsEinheitService.java | 27 +- ...VorgangManagerRegistrationGrpcService.java | 8 +- .../ozgcloud/zufi/SearchTestInitializer.java | 81 ----- .../OrganisationsEinheit.java | 17 - ...isationsEinheitCustomRepositoryITCase.java | 261 ++++++++------- ...anisationsEinheitCustomRepositoryTest.java | 154 --------- .../OrganisationsEinheitServiceTest.java | 96 +++++- .../OrganisationsEinheitTestFactory.java | 25 -- ...gManagerRegistrationGrpcServiceITCase.java | 5 +- 31 files changed, 1128 insertions(+), 497 deletions(-) create mode 100644 zufi-manager-model/.mvn/wrapper/maven-wrapper.jar create mode 100644 zufi-manager-model/.mvn/wrapper/maven-wrapper.properties create mode 100644 zufi-manager-model/lombok.config create mode 100755 zufi-manager-model/mvnw create mode 100644 zufi-manager-model/mvnw.cmd create mode 100644 zufi-manager-model/pom.xml create mode 100644 zufi-manager-model/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java create mode 100644 zufi-manager-model/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitRepository.java create mode 100644 zufi-manager-model/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitRepositoryITCase.java create mode 100644 zufi-manager-model/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java create mode 100644 zufi-manager-model/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension create mode 100644 zufi-manager-model/src/test/resources/junit-platform.properties rename zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/{ZufiManagerPvogSpringApplicationITCase copy.java => ZufiManagerPvogSpringApplicationITCase.java} (69%) delete mode 100644 zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepository.java delete mode 100644 zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryImpl.java delete mode 100644 zufi-manager-server/src/test/java/de/ozgcloud/zufi/SearchTestInitializer.java delete mode 100644 zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java delete mode 100644 zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryTest.java delete mode 100644 zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java diff --git a/pom.xml b/pom.xml index 290c22fb..97790600 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,7 @@ <packaging>pom</packaging> <modules> + <module>zufi-manager-model</module> <module>zufi-manager-pvog</module> <module>zufi-manager-interface</module> <module>zufi-manager-server</module> diff --git a/zufi-manager-model/.mvn/wrapper/maven-wrapper.jar b/zufi-manager-model/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cb28b0e37c7d206feb564310fdeec0927af4123a GIT binary patch literal 62547 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�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 literal 0 HcmV?d00001 diff --git a/zufi-manager-model/.mvn/wrapper/maven-wrapper.properties b/zufi-manager-model/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..e70e7bc8 --- /dev/null +++ b/zufi-manager-model/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/zufi-manager-model/lombok.config b/zufi-manager-model/lombok.config new file mode 100644 index 00000000..d07dd9b0 --- /dev/null +++ b/zufi-manager-model/lombok.config @@ -0,0 +1,30 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +lombok.log.fieldName=LOG +lombok.log.slf4j.flagUsage = ERROR +lombok.log.log4j.flagUsage = ERROR +lombok.data.flagUsage = ERROR +lombok.nonNull.exceptionType = IllegalArgumentException +lombok.addLombokGeneratedAnnotation = true \ No newline at end of file diff --git a/zufi-manager-model/mvnw b/zufi-manager-model/mvnw new file mode 100755 index 00000000..66df2854 --- /dev/null +++ b/zufi-manager-model/mvnw @@ -0,0 +1,308 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/zufi-manager-model/mvnw.cmd b/zufi-manager-model/mvnw.cmd new file mode 100644 index 00000000..95ba6f54 --- /dev/null +++ b/zufi-manager-model/mvnw.cmd @@ -0,0 +1,205 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/zufi-manager-model/pom.xml b/zufi-manager-model/pom.xml new file mode 100644 index 00000000..dc083a22 --- /dev/null +++ b/zufi-manager-model/pom.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>de.ozgcloud.zufi</groupId> + <artifactId>zufi-manager</artifactId> + <version>1.0.0-SNAPSHOT</version> + </parent> + <groupId>de.ozgcloud.zufi</groupId> + <artifactId>zufi-manager-model</artifactId> + <version>1.0.0-SNAPSHOT</version> + <name>OZG-Cloud Zufi Manager Model</name> + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-mongodb</artifactId> + </dependency> + <!-- Tools --> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <optional>true</optional> + </dependency> + <!-- Tests --> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>mongodb</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <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> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.3.0</version> + <executions> + <execution> + <id>Jar Tests Package</id> + <phase>package</phase> + <goals> + <goal>test-jar</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <configuration> + <skip>true</skip> + </configuration> + </plugin> + </plugins> + </build> + +</project> diff --git a/zufi-manager-model/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java b/zufi-manager-model/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java new file mode 100644 index 00000000..02e0d812 --- /dev/null +++ b/zufi-manager-model/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java @@ -0,0 +1,26 @@ +package de.ozgcloud.zufi.organisationseinheit; + +import org.springframework.data.annotation.Id; + +import lombok.Builder; +import lombok.Getter; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Builder(toBuilder = true) +@Jacksonized +public class OrganisationsEinheit { + + @Id + private String id; + private String name; + + private String bundesland; + private String bezirk; + private String kreis; + private String gemeindeSchluessel; + private String regionalSchluessel; + private String gemeindeTeilschluessel; + + private String vorgangManagerAddress; +} \ No newline at end of file diff --git a/zufi-manager-model/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitRepository.java b/zufi-manager-model/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitRepository.java new file mode 100644 index 00000000..f9c07dd3 --- /dev/null +++ b/zufi-manager-model/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitRepository.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.zufi.organisationseinheit; + +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface OrganisationsEinheitRepository extends MongoRepository<OrganisationsEinheit, String> { + +} diff --git a/zufi-manager-model/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitRepositoryITCase.java b/zufi-manager-model/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitRepositoryITCase.java new file mode 100644 index 00000000..ddaec962 --- /dev/null +++ b/zufi-manager-model/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitRepositoryITCase.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.zufi.organisationseinheit; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Optional; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.ContextConfiguration; + +import de.ozgcloud.common.test.DbInitializer; +import de.ozgcloud.common.test.ITCase; + +@ITCase +@ContextConfiguration(initializers = { DbInitializer.class }) +public class OrganisationsEinheitRepositoryITCase { + + @Autowired + private OrganisationsEinheitRepository organisationsEinheitRepository; + + @DisplayName("Test inserting OrganisationsEinheit objects") + @Nested + class TestInserting { + + @Test + void shouldInsert() { + var data = organisationsEinheitRepository.save(OrganisationsEinheitTestFactory.create()); + + var responseEntity = searchById(data.getId()); + assertThat(responseEntity).isNotEmpty(); + } + } + + @DisplayName("Test deleting OrganisationsEinheit objects") + @Nested + class TestDeleting { + String id; + + @BeforeEach + void initDatabase() { + id = organisationsEinheitRepository.save(OrganisationsEinheitTestFactory.create()).getId(); + } + + @Test + void shouldDelete() { + organisationsEinheitRepository.deleteById(id); + + var responseEntity = searchById(id); + assertThat(responseEntity).isEmpty(); + } + + } + + Optional<OrganisationsEinheit> searchById(String id) { + return organisationsEinheitRepository.findById(id); + } +} diff --git a/zufi-manager-model/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java b/zufi-manager-model/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java new file mode 100644 index 00000000..943d1542 --- /dev/null +++ b/zufi-manager-model/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.zufi.organisationseinheit; + +import java.util.UUID; + +import com.thedeanda.lorem.LoremIpsum; + +public class OrganisationsEinheitTestFactory { + public static final String ID = UUID.randomUUID().toString(); + public static final String NAME = LoremIpsum.getInstance().getName(); + public static final String BEZIRK = LoremIpsum.getInstance().getCity(); + public static final String BUNDESLAND = LoremIpsum.getInstance().getStateFull(); + public static final String KREIS = LoremIpsum.getInstance().getCity(); + public static final String GEMEINDESCHLUESSEL = UUID.randomUUID().toString(); + public static final String GEMEINDETEILSCHLUESSEL = UUID.randomUUID().toString(); + public static final String REGINALSCHLUESSEL = UUID.randomUUID().toString(); + public static final String VORGANG_MANAGER_ADDRESS = LoremIpsum.getInstance().getUrl(); + + public static OrganisationsEinheit create() { + return createBuilder().build(); + } + + public static OrganisationsEinheit.OrganisationsEinheitBuilder createBuilder() { + return OrganisationsEinheit.builder() + .id(ID) + .name(NAME) + .bezirk(BEZIRK) + .bundesland(BUNDESLAND) + .gemeindeSchluessel(GEMEINDESCHLUESSEL) + .gemeindeTeilschluessel(GEMEINDETEILSCHLUESSEL) + .regionalSchluessel(REGINALSCHLUESSEL) + .vorgangManagerAddress(VORGANG_MANAGER_ADDRESS); + } +} diff --git a/zufi-manager-model/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/zufi-manager-model/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension new file mode 100644 index 00000000..79b126e6 --- /dev/null +++ b/zufi-manager-model/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension @@ -0,0 +1 @@ +org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/zufi-manager-model/src/test/resources/junit-platform.properties b/zufi-manager-model/src/test/resources/junit-platform.properties new file mode 100644 index 00000000..1cebb76d --- /dev/null +++ b/zufi-manager-model/src/test/resources/junit-platform.properties @@ -0,0 +1 @@ +junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file diff --git a/zufi-manager-pvog/pom.xml b/zufi-manager-pvog/pom.xml index 73665792..797fe2e0 100644 --- a/zufi-manager-pvog/pom.xml +++ b/zufi-manager-pvog/pom.xml @@ -13,6 +13,11 @@ <name>OZG-Cloud Zufi Manager PVOG</name> <dependencies> + <dependency> + <groupId>de.ozgcloud.zufi</groupId> + <artifactId>zufi-manager-model</artifactId> + <version>${project.version}</version> + </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> @@ -122,6 +127,13 @@ <artifactId>wiremock-standalone</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>de.ozgcloud.zufi</groupId> + <artifactId>zufi-manager-model</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> </dependencies> <build> @@ -209,6 +221,20 @@ </compilerArgs> </configuration> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.3.0</version> + <executions> + <execution> + <id>Jar Tests Package</id> + <phase>package</phase> + <goals> + <goal>test-jar</goal> + </goals> + </execution> + </executions> + </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> diff --git a/zufi-manager-pvog/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java b/zufi-manager-pvog/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java index ab3f3bc0..02e0d812 100644 --- a/zufi-manager-pvog/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java +++ b/zufi-manager-pvog/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java @@ -7,7 +7,7 @@ import lombok.Getter; import lombok.extern.jackson.Jacksonized; @Getter -@Builder +@Builder(toBuilder = true) @Jacksonized public class OrganisationsEinheit { @@ -22,4 +22,5 @@ public class OrganisationsEinheit { private String regionalSchluessel; private String gemeindeTeilschluessel; + private String vorgangManagerAddress; } \ No newline at end of file diff --git a/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/ZufiManagerPvogSpringApplicationITCase copy.java b/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/ZufiManagerPvogSpringApplicationITCase.java similarity index 69% rename from zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/ZufiManagerPvogSpringApplicationITCase copy.java rename to zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/ZufiManagerPvogSpringApplicationITCase.java index ad7a9d90..708c8262 100644 --- a/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/ZufiManagerPvogSpringApplicationITCase copy.java +++ b/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/ZufiManagerPvogSpringApplicationITCase.java @@ -3,12 +3,12 @@ package de.ozgcloud.zufi; import org.junit.jupiter.api.Test; import org.springframework.test.context.ContextConfiguration; +import de.ozgcloud.common.test.DbInitializer; import de.ozgcloud.common.test.ITCase; import de.ozgcloud.zufi.common.Oauth2Initializer; -import de.ozgcloud.zufi.common.SearchInitializer; @ITCase -@ContextConfiguration(initializers = { SearchInitializer.class, Oauth2Initializer.class }) +@ContextConfiguration(initializers = { DbInitializer.class, Oauth2Initializer.class }) class ZufiManagerPvogSpringApplicationITCase { @Test diff --git a/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java b/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java index 5ce7619a..943d1542 100644 --- a/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java +++ b/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java @@ -36,6 +36,7 @@ public class OrganisationsEinheitTestFactory { public static final String GEMEINDESCHLUESSEL = UUID.randomUUID().toString(); public static final String GEMEINDETEILSCHLUESSEL = UUID.randomUUID().toString(); public static final String REGINALSCHLUESSEL = UUID.randomUUID().toString(); + public static final String VORGANG_MANAGER_ADDRESS = LoremIpsum.getInstance().getUrl(); public static OrganisationsEinheit create() { return createBuilder().build(); @@ -49,7 +50,7 @@ public class OrganisationsEinheitTestFactory { .bundesland(BUNDESLAND) .gemeindeSchluessel(GEMEINDESCHLUESSEL) .gemeindeTeilschluessel(GEMEINDETEILSCHLUESSEL) - .regionalSchluessel(REGINALSCHLUESSEL); - + .regionalSchluessel(REGINALSCHLUESSEL) + .vorgangManagerAddress(VORGANG_MANAGER_ADDRESS); } } diff --git a/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/pvog/PvogProcessorTest.java b/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/pvog/PvogProcessorTest.java index c0dc4ff9..656f9ed9 100644 --- a/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/pvog/PvogProcessorTest.java +++ b/zufi-manager-pvog/src/test/java/de/ozgcloud/zufi/pvog/PvogProcessorTest.java @@ -223,8 +223,8 @@ class PvogProcessorTest { doThrow(new RuntimeException()).when(processor).processTransferOperations(any()); assertThatExceptionOfType(TechnicalException.class).isThrownBy( // NOSONAR - () -> processor.handleAntwortTransfernachricht( - AntwortTransfernachrichtTestFactory.create())) + () -> processor.handleAntwortTransfernachricht( + AntwortTransfernachrichtTestFactory.create())) .withMessageContaining(PvogProcessor.GENERAL_ERROR_PROCESSING_PVOG_DATA); verify(metaDocumentService, never()).saveMetaDocument(any()); diff --git a/zufi-manager-server/pom.xml b/zufi-manager-server/pom.xml index 9d984c51..a33e275e 100644 --- a/zufi-manager-server/pom.xml +++ b/zufi-manager-server/pom.xml @@ -55,6 +55,11 @@ <artifactId>zufi-manager-interface</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>de.ozgcloud.zufi</groupId> + <artifactId>zufi-manager-model</artifactId> + <version>${project.version}</version> + </dependency> <!-- Spring --> <dependency> @@ -75,7 +80,7 @@ </dependency> <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-elasticsearch</artifactId> + <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <!-- aspectJ --> @@ -152,7 +157,14 @@ </dependency> <dependency> <groupId>org.testcontainers</groupId> - <artifactId>elasticsearch</artifactId> + <artifactId>mongodb</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>de.ozgcloud.zufi</groupId> + <artifactId>zufi-manager-model</artifactId> + <version>${project.version}</version> + <type>test-jar</type> <scope>test</scope> </dependency> </dependencies> diff --git a/zufi-manager-server/src/main/java/de/ozgcloud/zufi/ZufiManagerServerApplication.java b/zufi-manager-server/src/main/java/de/ozgcloud/zufi/ZufiManagerServerApplication.java index 995996ca..533ec368 100644 --- a/zufi-manager-server/src/main/java/de/ozgcloud/zufi/ZufiManagerServerApplication.java +++ b/zufi-manager-server/src/main/java/de/ozgcloud/zufi/ZufiManagerServerApplication.java @@ -29,7 +29,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; import org.springframework.context.annotation.EnableAspectJAutoProxy; -import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @@ -38,7 +38,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @EnableAspectJAutoProxy(proxyTargetClass = true) @ConfigurationPropertiesScan("de.ozgcloud.zufi.*") -@EnableElasticsearchRepositories(basePackages = "de.ozgcloud.zufi.*") +@EnableMongoRepositories public class ZufiManagerServerApplication { public static void main(String[] args) { diff --git a/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepository.java b/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepository.java deleted file mode 100644 index 5d7929b6..00000000 --- a/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.ozgcloud.zufi.organisationseinheit; - -interface OrganisationsEinheitCustomRepository { - String VORGANG_MANAGER_ADDRESS_FIELD = "vorgangManagerAddress"; - - boolean updateVorgangManagerAddress(String organisationsEinheitId, String vorgangManagerAddress); -} diff --git a/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryImpl.java b/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryImpl.java deleted file mode 100644 index f61d146e..00000000 --- a/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package de.ozgcloud.zufi.organisationseinheit; - -import java.util.Map; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.document.Document; -import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; -import org.springframework.data.elasticsearch.core.query.UpdateQuery; -import org.springframework.data.elasticsearch.core.query.UpdateResponse; -import org.springframework.stereotype.Repository; - -import lombok.extern.log4j.Log4j2; - -@Repository -@Log4j2 -class OrganisationsEinheitCustomRepositoryImpl implements OrganisationsEinheitCustomRepository { - - private final IndexCoordinates indexCoordinates; - - private final ElasticsearchTemplate elasticsearchTemplate; - - public OrganisationsEinheitCustomRepositoryImpl( - @Value("${ozgcloud.zufi.index.name:zufi-manager}") String indexName, - ElasticsearchTemplate elasticsearchTemplate) { - this.indexCoordinates = IndexCoordinates.of(indexName); - this.elasticsearchTemplate = elasticsearchTemplate; - } - - @Override - public boolean updateVorgangManagerAddress(String organisationsEinheitId, String vorgangManagerAddress) { - UpdateQuery updateQuery = createUpdateQuery(organisationsEinheitId, vorgangManagerAddress); - UpdateResponse.Result result = elasticsearchTemplate.update(updateQuery, indexCoordinates).getResult(); - - return isSuccess(result); - } - - UpdateQuery createUpdateQuery(String organisationsEinheitId, String vorgangManagerAddress) { - return UpdateQuery.builder(organisationsEinheitId) - .withDocument(asDocument(vorgangManagerAddress)) - .build(); - } - - Document asDocument(String vorgangManagerAddress) { - return Document.from( - Map.of(VORGANG_MANAGER_ADDRESS_FIELD, vorgangManagerAddress) - ); - } - - boolean isSuccess(UpdateResponse.Result result) { - return UpdateResponse.Result.UPDATED.equals(result) || UpdateResponse.Result.NOOP.equals(result); - } - -} diff --git a/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitService.java b/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitService.java index 664d4e77..183f9fab 100644 --- a/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitService.java +++ b/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitService.java @@ -23,24 +23,33 @@ */ package de.ozgcloud.zufi.organisationseinheit; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Service +@RequiredArgsConstructor @Log4j2 -public class OrganisationsEinheitService { +class OrganisationsEinheitService { - @Autowired - private OrganisationsEinheitCustomRepository repository; + private final OrganisationsEinheitRepository repository; public void updateVorgangManagerAddress(String vorgangManagerAddress, String organisationsEinheitId) { - var updateResult = repository.updateVorgangManagerAddress(organisationsEinheitId, vorgangManagerAddress); + var organisationsEinheit = repository.findById(organisationsEinheitId); + organisationsEinheit.ifPresentOrElse(einheit -> updateOrganisationsEinheit(einheit, vorgangManagerAddress), + () -> LOG.error( + "No Organisationseinheit in ZufiManager for Id {} received from VorgangsManager. VorgangsManager not registered!", + organisationsEinheitId)); + } + + void updateOrganisationsEinheit(OrganisationsEinheit organisationsEinheit, String vorgangManagerAddress) { + repository.save(setVorgangManagerAddress(organisationsEinheit, vorgangManagerAddress)); + } - if (!updateResult) { - LOG.error("No Organisationseinheit in ZufiManager for Id %s received from VorgangsManager. VorgangsManager not registered!" - .formatted(organisationsEinheitId)); - } + OrganisationsEinheit setVorgangManagerAddress(OrganisationsEinheit organisationsEinheit, String vorgangManagerAddress) { + return organisationsEinheit.toBuilder() + .vorgangManagerAddress(vorgangManagerAddress) + .build(); } } diff --git a/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/VorgangManagerRegistrationGrpcService.java b/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/VorgangManagerRegistrationGrpcService.java index 674c266c..9bcae4fd 100644 --- a/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/VorgangManagerRegistrationGrpcService.java +++ b/zufi-manager-server/src/main/java/de/ozgcloud/zufi/organisationseinheit/VorgangManagerRegistrationGrpcService.java @@ -25,18 +25,18 @@ package de.ozgcloud.zufi.organisationseinheit; import java.util.stream.Stream; -import org.springframework.beans.factory.annotation.Autowired; - import de.ozgcloud.zufi.grpc.registration.GrpcVorgangManagerRegistrationRequest; import de.ozgcloud.zufi.grpc.registration.GrpcVorgangManagerRegistrationResponse; import de.ozgcloud.zufi.grpc.registration.VorgangManagerRegistrationServiceGrpc.VorgangManagerRegistrationServiceImplBase; import io.grpc.stub.StreamObserver; +import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.server.service.GrpcService; @GrpcService +@RequiredArgsConstructor public class VorgangManagerRegistrationGrpcService extends VorgangManagerRegistrationServiceImplBase { - @Autowired - private OrganisationsEinheitService service; + + private final OrganisationsEinheitService service; @Override public void register(GrpcVorgangManagerRegistrationRequest request, StreamObserver<GrpcVorgangManagerRegistrationResponse> responseObserver) { diff --git a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/SearchTestInitializer.java b/zufi-manager-server/src/test/java/de/ozgcloud/zufi/SearchTestInitializer.java deleted file mode 100644 index 40ad2143..00000000 --- a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/SearchTestInitializer.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.zufi; - -import java.time.Duration; - -import org.springframework.boot.test.util.TestPropertyValues; -import org.springframework.context.ApplicationContextInitializer; -import org.springframework.context.ConfigurableApplicationContext; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.elasticsearch.ElasticsearchContainer; -import org.testcontainers.utility.DockerImageName; - -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class SearchTestInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { - private static final String ELASTICSEARCH_IMAGE = "docker.elastic.co/elasticsearch/elasticsearch"; - private static final String ELASTICSEARCH_VERSION = "8.3.2"; - - private static ElasticsearchContainer elasticsearchContainer; - - private final static String PASSWORD = "sUpers3cret!"; - private static final String USERNAME = "elastic"; - - @Override - public void initialize(ConfigurableApplicationContext applicationContext) { - initContainer(); - - setProperties(elasticsearchContainer, applicationContext); - } - - @SuppressWarnings("resource") - private void initContainer() { - if (elasticsearchContainer == null) { - LOG.info("Creating elasticsearchContainer ..."); - elasticsearchContainer = new ElasticsearchContainer(DockerImageName.parse(ELASTICSEARCH_IMAGE).withTag(ELASTICSEARCH_VERSION)) - .withPassword(PASSWORD); - elasticsearchContainer.getEnvMap().put("xpack.security.enabled", "false"); - } - - if (!elasticsearchContainer.isRunning()) { - LOG.info("Starting elasticsearchContainer ..."); - elasticsearchContainer.setWaitStrategy( - Wait.forLogMessage(".*message\":\"started.*", 1).withStartupTimeout(Duration.ofMinutes(3))); - elasticsearchContainer.start(); - LOG.info("ecs started"); - } - } - - protected void setProperties(ElasticsearchContainer container, ConfigurableApplicationContext applicationContext) { - var uriString = String.format("http://%s:%d", container.getHost(), container.getFirstMappedPort()); - LOG.info("Uri: {} ", uriString); - - TestPropertyValues.of( - "spring.elasticsearch.uris= http://" + container.getHost() + ":" + container.getFirstMappedPort(), - "spring.elasticsearch.username= " + USERNAME, - "spring.elasticsearch.password= " + PASSWORD).applyTo(applicationContext); - } -} diff --git a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java b/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java deleted file mode 100644 index 0a467f64..00000000 --- a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheit.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.ozgcloud.zufi.organisationseinheit; - -import org.springframework.data.elasticsearch.annotations.Document; - -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Document(indexName = "test-index") -@Setter -@Getter -@Builder -public class OrganisationsEinheit { - private String id; - private String vorgangManagerAddress; - private String otherKey; -} diff --git a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryITCase.java b/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryITCase.java index 90914980..9629579c 100644 --- a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryITCase.java +++ b/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryITCase.java @@ -1,123 +1,138 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.zufi.organisationseinheit; - -import static de.ozgcloud.zufi.organisationseinheit.OrganisationsEinheitTestFactory.*; -import static org.assertj.core.api.Assertions.*; - -import java.util.UUID; - -import org.assertj.core.api.*; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.elasticsearch.ResourceNotFoundException; -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; -import org.springframework.test.context.ContextConfiguration; - -import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.zufi.SearchTestInitializer; - -@ITCase -@ContextConfiguration(initializers = SearchTestInitializer.class) -class OrganisationsEinheitCustomRepositoryITCase { - public static final String VORGANG_MANAGER_ADDRESS = "url://vorgangmanager:9090"; - public static final IndexCoordinates INDEX = IndexCoordinates.of("test-index"); - public static final String INDEX_FIELD_VORGANG_MANAGER_ADDRESS = "vorgangManagerAddress"; - - @Autowired - private OrganisationsEinheitCustomRepository repository; - - @Autowired - private ElasticsearchOperations elasticsearchOperations; - - @BeforeEach - void initDatabase() { - elasticsearchOperations.indexOps(INDEX).delete(); - - indexDocument(); - } - - @Nested - class TestUpdateVorgangManagerAddress { - - @Test - void shouldReturnUpdateSuccess() { - var updateSuccess = callService(); - - assertThat(updateSuccess).isTrue(); - } - - @Test - void shouldDoUpdate() { - callService(); - - var doc = elasticsearchOperations.get(ORGANISATIONS_EINHEIT_ID, OrganisationsEinheit.class); - assertThat(doc) - .hasFieldOrPropertyWithValue(INDEX_FIELD_VORGANG_MANAGER_ADDRESS, VORGANG_MANAGER_ADDRESS); - } - - @Test - void shouldDoUpdateSameExistingAddress() { - OrganisationsEinheit organisationsEinheit = createBuilder().vorgangManagerAddress(VORGANG_MANAGER_ADDRESS).build(); - elasticsearchOperations.save(organisationsEinheit); - - callService(); - - var doc = elasticsearchOperations.get(ORGANISATIONS_EINHEIT_ID, OrganisationsEinheit.class); - assertThat(doc) - .hasFieldOrPropertyWithValue(INDEX_FIELD_VORGANG_MANAGER_ADDRESS, VORGANG_MANAGER_ADDRESS); - } - - @Test - void shouldOnlyAddServiceAddress() { - callService(); - - var doc = elasticsearchOperations.get(ORGANISATIONS_EINHEIT_ID, OrganisationsEinheit.class); - assertThat(doc) - .hasFieldOrPropertyWithValue("id", ORGANISATIONS_EINHEIT_ID) - .hasFieldOrPropertyWithValue("otherKey", OrganisationsEinheitTestFactory.OTHER_VALUE) - .hasFieldOrPropertyWithValue(INDEX_FIELD_VORGANG_MANAGER_ADDRESS, VORGANG_MANAGER_ADDRESS); - } - - @Test - void shouldNotUpdate() { - ThrowableAssert.ThrowingCallable updateCall = () -> repository.updateVorgangManagerAddress(UUID.randomUUID().toString(), - VORGANG_MANAGER_ADDRESS); - - assertThatThrownBy(updateCall).isInstanceOf( - ResourceNotFoundException.class); - } - } - - private boolean callService() { - return repository.updateVorgangManagerAddress(ORGANISATIONS_EINHEIT_ID, VORGANG_MANAGER_ADDRESS); - } - - private void indexDocument() { - elasticsearchOperations.save(OrganisationsEinheitTestFactory.create(), INDEX); - } -} +// /* +// * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +// * Ministerpräsidenten des Landes Schleswig-Holstein +// * Staatskanzlei +// * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +// * +// * Lizenziert unter der EUPL, Version 1.2 oder - sobald +// * diese von der Europäischen Kommission genehmigt wurden - +// * Folgeversionen der EUPL ("Lizenz"); +// * Sie dürfen dieses Werk ausschließlich gemäß +// * dieser Lizenz nutzen. +// * Eine Kopie der Lizenz finden Sie hier: +// * +// * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +// * +// * Sofern nicht durch anwendbare Rechtsvorschriften +// * gefordert oder in schriftlicher Form vereinbart, wird +// * die unter der Lizenz verbreitete Software "so wie sie +// * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +// * ausdrücklich oder stillschweigend - verbreitet. +// * Die sprachspezifischen Genehmigungen und Beschränkungen +// * unter der Lizenz sind dem Lizenztext zu entnehmen. +// */ +// package de.ozgcloud.zufi.organisationseinheit; + +// import static +// de.ozgcloud.zufi.organisationseinheit.OrganisationsEinheitTestFactory.*; +// import static org.assertj.core.api.Assertions.*; + +// import java.util.UUID; + +// import org.assertj.core.api.*; +// import org.junit.jupiter.api.BeforeEach; +// import org.junit.jupiter.api.Nested; +// import org.junit.jupiter.api.Test; +// import org.springframework.beans.factory.annotation.Autowired; +// import org.springframework.data.elasticsearch.ResourceNotFoundException; +// import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +// import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; +// import org.springframework.test.context.ContextConfiguration; + +// import de.ozgcloud.common.test.ITCase; +// import de.ozgcloud.zufi.SearchTestInitializer; + +// @ITCase +// @ContextConfiguration(initializers = SearchTestInitializer.class) +// class OrganisationsEinheitCustomRepositoryITCase { +// public static final String VORGANG_MANAGER_ADDRESS = +// "url://vorgangmanager:9090"; +// public static final IndexCoordinates INDEX = +// IndexCoordinates.of("test-index"); +// public static final String INDEX_FIELD_VORGANG_MANAGER_ADDRESS = +// "vorgangManagerAddress"; + +// @Autowired +// private OrganisationsEinheitCustomRepository repository; + +// @Autowired +// private ElasticsearchOperations elasticsearchOperations; + +// @BeforeEach +// void initDatabase() { +// elasticsearchOperations.indexOps(INDEX).delete(); + +// indexDocument(); +// } + +// @Nested +// class TestUpdateVorgangManagerAddress { + +// @Test +// void shouldReturnUpdateSuccess() { +// var updateSuccess = callService(); + +// assertThat(updateSuccess).isTrue(); +// } + +// @Test +// void shouldDoUpdate() { +// callService(); + +// var doc = elasticsearchOperations.get(ORGANISATIONS_EINHEIT_ID, +// OrganisationsEinheit.class); +// assertThat(doc) +// .hasFieldOrPropertyWithValue(INDEX_FIELD_VORGANG_MANAGER_ADDRESS, +// VORGANG_MANAGER_ADDRESS); +// } + +// @Test +// void shouldDoUpdateSameExistingAddress() { +// OrganisationsEinheit organisationsEinheit = +// createBuilder().vorgangManagerAddress(VORGANG_MANAGER_ADDRESS).build(); +// elasticsearchOperations.save(organisationsEinheit); + +// callService(); + +// var doc = elasticsearchOperations.get(ORGANISATIONS_EINHEIT_ID, +// OrganisationsEinheit.class); +// assertThat(doc) +// .hasFieldOrPropertyWithValue(INDEX_FIELD_VORGANG_MANAGER_ADDRESS, +// VORGANG_MANAGER_ADDRESS); +// } + +// @Test +// void shouldOnlyAddServiceAddress() { +// callService(); + +// var doc = elasticsearchOperations.get(ORGANISATIONS_EINHEIT_ID, +// OrganisationsEinheit.class); +// assertThat(doc) +// .hasFieldOrPropertyWithValue("id", ORGANISATIONS_EINHEIT_ID) +// .hasFieldOrPropertyWithValue("otherKey", +// OrganisationsEinheitTestFactory.OTHER_VALUE) +// .hasFieldOrPropertyWithValue(INDEX_FIELD_VORGANG_MANAGER_ADDRESS, +// VORGANG_MANAGER_ADDRESS); +// } + +// @Test +// void shouldNotUpdate() { +// ThrowableAssert.ThrowingCallable updateCall = () -> +// repository.updateVorgangManagerAddress(UUID.randomUUID().toString(), +// VORGANG_MANAGER_ADDRESS); + +// assertThatThrownBy(updateCall).isInstanceOf( +// ResourceNotFoundException.class); +// } +// } + +// private boolean callService() { +// return repository.updateVorgangManagerAddress(ORGANISATIONS_EINHEIT_ID, +// VORGANG_MANAGER_ADDRESS); +// } + +// private void indexDocument() { +// elasticsearchOperations.save(OrganisationsEinheitTestFactory.create(), +// INDEX); +// } +// } diff --git a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryTest.java b/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryTest.java deleted file mode 100644 index 41dab394..00000000 --- a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitCustomRepositoryTest.java +++ /dev/null @@ -1,154 +0,0 @@ -package de.ozgcloud.zufi.organisationseinheit; - -import static de.ozgcloud.zufi.organisationseinheit.OrganisationsEinheitCustomRepository.*; -import static de.ozgcloud.zufi.organisationseinheit.OrganisationsEinheitTestFactory.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -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.provider.EnumSource; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.Mock; -import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.document.Document; -import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; -import org.springframework.data.elasticsearch.core.query.UpdateQuery; -import org.springframework.data.elasticsearch.core.query.UpdateResponse; -import org.springframework.data.elasticsearch.core.query.UpdateResponse.Result; - -class OrganisationsEinheitCustomRepositoryTest { - - public static final String VORGANG_MANAGER_ADDRESS = "url://vorgangmanager:9090"; - public static final String TEST_INDEX = "test-index"; - - private OrganisationsEinheitCustomRepositoryImpl repository; - - @Mock - private ElasticsearchTemplate elasticsearchTemplate; - - private final IndexCoordinates indexCoordinates = IndexCoordinates.of(TEST_INDEX); - - @BeforeEach - void init() { - repository = spy(new OrganisationsEinheitCustomRepositoryImpl(TEST_INDEX, elasticsearchTemplate)); - } - - @Nested - class TestUpdateVorgangManagerAddress { - - @Mock - private UpdateQuery queryMock; - private final Result resultFlag = Result.UPDATED; - private final UpdateResponse updateResponse = UpdateResponse.of(resultFlag); - - @BeforeEach - void init() { - doReturn(queryMock).when(repository).createUpdateQuery(ORGANISATIONS_EINHEIT_ID, VORGANG_MANAGER_ADDRESS); - doReturn(updateResponse).when(elasticsearchTemplate).update(queryMock, indexCoordinates); - } - - @Test - void shouldCreateUpdateQuery() { - callService(); - - verify(repository).createUpdateQuery(ORGANISATIONS_EINHEIT_ID, VORGANG_MANAGER_ADDRESS); - } - - @Test - void shouldDoUpdate() { - callService(); - - verify(elasticsearchTemplate).update(queryMock, indexCoordinates); - } - - @ParameterizedTest - @ValueSource(booleans = { true, false }) - void shouldReturnIsSuccess(boolean success) { - doReturn(success).when(repository).isSuccess(resultFlag); - - var result = callService(); - - assertThat(result).isEqualTo(success); - } - - private boolean callService() { - return repository.updateVorgangManagerAddress(ORGANISATIONS_EINHEIT_ID, VORGANG_MANAGER_ADDRESS); - } - } - - @Nested - class TestIsSuccess { - - @ParameterizedTest - @EnumSource(value = Result.class, names = { "UPDATED", "NOOP" }) - void shouldReturnTrue(Result queryResult) { - var resultFlag = repository.isSuccess(queryResult); - - assertThat(resultFlag).isTrue(); - } - - @ParameterizedTest - @EnumSource(value = Result.class, names = { "UPDATED", "NOOP" }, mode = EnumSource.Mode.EXCLUDE) - void shouldReturnFalse(Result queryResult) { - var resultFlag = repository.isSuccess(queryResult); - - assertThat(resultFlag).isFalse(); - } - - } - - @Nested - class TestCreateUpdateQuery { - - @Mock - private Document document; - - @BeforeEach - void init() { - doReturn(document).when(repository).asDocument(VORGANG_MANAGER_ADDRESS); - } - - @Test - void shouldQueryHaveIdAndDocument() { - var updateQuery = callService(); - - assertThat(updateQuery) - .extracting( - UpdateQuery::getId, - UpdateQuery::getDocument) - .containsExactly( - ORGANISATIONS_EINHEIT_ID, - document); - } - - @Test - void shouldQueryContainNecessaryFields() { - var updateQuery = callService(); - - assertThat(updateQuery) - .hasAllNullFieldsOrPropertiesExcept("id", "document"); - } - - UpdateQuery callService() { - return repository.createUpdateQuery(ORGANISATIONS_EINHEIT_ID, VORGANG_MANAGER_ADDRESS); - } - } - - @Nested - class TestAsDocument { - - @Test - void shouldReturnDocument() { - var result = callService(); - - assertThat(result).containsEntry(VORGANG_MANAGER_ADDRESS_FIELD, VORGANG_MANAGER_ADDRESS); - } - - Document callService() { - return repository.asDocument(VORGANG_MANAGER_ADDRESS); - } - } -} diff --git a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitServiceTest.java b/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitServiceTest.java index c40f2bd8..7fc0c2f2 100644 --- a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitServiceTest.java +++ b/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitServiceTest.java @@ -23,9 +23,12 @@ */ package de.ozgcloud.zufi.organisationseinheit; -import static de.ozgcloud.zufi.organisationseinheit.OrganisationsEinheitTestFactory.*; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.util.Optional; + import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -33,22 +36,95 @@ import org.mockito.Mock; import org.mockito.Spy; class OrganisationsEinheitServiceTest { - private static final String VORGANG_MANAGER_ADDRESS = "static://127.0.0.1:9090"; + private static final String VORGANG_MANAGER_ADDRESS = OrganisationsEinheitTestFactory.VORGANG_MANAGER_ADDRESS; + private static final String ORGANISATIONS_EINHEIT_ID = OrganisationsEinheitTestFactory.ID; + + @Spy + @InjectMocks + private OrganisationsEinheitService service; + + @Mock + private OrganisationsEinheitRepository repository; @Nested class TestUpdateVorgangManagerAddress { - @Spy - @InjectMocks - private OrganisationsEinheitService service; + @Test + void shouldFindOrganisationseinheit() { + callService(); + + verify(repository).findById(ORGANISATIONS_EINHEIT_ID); + } - @Mock - private OrganisationsEinheitCustomRepository repository; + @Nested + class TestWithPresentOrganisationsEinheit { + private OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.createBuilder().vorgangManagerAddress(null).build(); - @Test - void shouldCallUpdate() { + @Test + void shouldUpdateOrganisationseinheit() { + when(repository.findById(ORGANISATIONS_EINHEIT_ID)).thenReturn(Optional.of(organisationsEinheit)); + + callService(); + + verify(service).updateOrganisationsEinheit(organisationsEinheit, VORGANG_MANAGER_ADDRESS); + } + + } + + @Nested + class TestWithMissingOrganisationseinheit { + @Test + void shouldNotUpdate() { + when(repository.findById(ORGANISATIONS_EINHEIT_ID)).thenReturn(Optional.empty()); + + callService(); + + verify(service, never()).updateOrganisationsEinheit(any(), any()); + } + + } + + private void callService() { service.updateVorgangManagerAddress(VORGANG_MANAGER_ADDRESS, ORGANISATIONS_EINHEIT_ID); + } + } + + @Nested + class TestUpdateOrganisationsEinheit { + private OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.createBuilder().vorgangManagerAddress(null).build(); + + @Test + void shouldSetVorgangmanagerAddress() { + callService(); + + verify(service).setVorgangManagerAddress(organisationsEinheit, VORGANG_MANAGER_ADDRESS); + + } + + @Test + void shouldSaveUpdatedOrganisationseinheit() { + var updatedOrganisationsEinheit = OrganisationsEinheitTestFactory.create(); + doReturn(updatedOrganisationsEinheit).when(service).setVorgangManagerAddress(organisationsEinheit, VORGANG_MANAGER_ADDRESS); + + callService(); + + verify(repository).save(updatedOrganisationsEinheit); + + } + + private void callService() { + service.updateOrganisationsEinheit(organisationsEinheit, VORGANG_MANAGER_ADDRESS); + } + } + + @Nested + class TestSetVorgangManagerAddress { + private OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.createBuilder().vorgangManagerAddress(null).build(); + + @Test + void shouldSetVorgangManagerAddress() { + var resultOrganisationseinheit = service.setVorgangManagerAddress(organisationsEinheit, VORGANG_MANAGER_ADDRESS); - verify(repository).updateVorgangManagerAddress(ORGANISATIONS_EINHEIT_ID, VORGANG_MANAGER_ADDRESS); + assertThat(resultOrganisationseinheit).usingRecursiveComparison().isEqualTo(OrganisationsEinheitTestFactory.create()); } } } diff --git a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java b/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java deleted file mode 100644 index 25c0d4cb..00000000 --- a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/OrganisationsEinheitTestFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.ozgcloud.zufi.organisationseinheit; - -import java.util.UUID; - -import com.thedeanda.lorem.LoremIpsum; - -public class OrganisationsEinheitTestFactory { - - public static final String ORGANISATIONS_EINHEIT_ID = UUID.randomUUID().toString(); - public static final String VORGANGMANAGER = "static://address:9090"; - public static final String OTHER_VALUE = LoremIpsum.getInstance().getWords(5); - - public static OrganisationsEinheit create() { - return createBuilder().build(); - } - - public static OrganisationsEinheit.OrganisationsEinheitBuilder createBuilder() { - return OrganisationsEinheit.builder() - .id(ORGANISATIONS_EINHEIT_ID) - .vorgangManagerAddress(VORGANGMANAGER) - .otherKey(OTHER_VALUE); - } - - -} diff --git a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/VorgangManagerRegistrationGrpcServiceITCase.java b/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/VorgangManagerRegistrationGrpcServiceITCase.java index f584414f..789aef94 100644 --- a/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/VorgangManagerRegistrationGrpcServiceITCase.java +++ b/zufi-manager-server/src/test/java/de/ozgcloud/zufi/organisationseinheit/VorgangManagerRegistrationGrpcServiceITCase.java @@ -53,11 +53,12 @@ class VorgangManagerRegistrationGrpcServiceITCase { private StreamObserver<GrpcVorgangManagerRegistrationResponse> responseObserver; @MockBean - private OrganisationsEinheitCustomRepository repository; + private OrganisationsEinheitRepository repository; @Test void shouldRegister() { - when(repository.updateVorgangManagerAddress(anyString(), anyString())).thenReturn(true); + // when(repository.updateVorgangManagerAddress(anyString(), + // anyString())).thenReturn(true); grpcService.register(GrpcVorgangManagerRegistrationTestFactory.createRequest(), responseObserver); -- GitLab