diff --git a/ci/change_version.sh b/ci/change_version.sh
index 73bf9f28c..806396a6f 100755
--- a/ci/change_version.sh
+++ b/ci/change_version.sh
@@ -23,7 +23,7 @@ set -e #fail fast
# Arguments:
# $1: exit code
function helpAndExit() {
- cat "$0" | grep "^#H" | cut -c4- | sed -e "s/%FILE%/$(basename "$0")/g"
+ grep "^#H" "$0" | cut -c4- | sed -e "s/%FILE%/$(basename "$0")/g"
exit "$1"
}
@@ -38,7 +38,7 @@ function increment_version() {
echo "'$1' does not match tag pattern." >&2
exit 1
fi
- echo "${1%\.*}.$(expr ${1##*\.*\.} + 1)"
+ echo "${1%\.*}.$(("${1##*\.*\.}" + 1))"
}
# changing version in pom and all its children
@@ -48,7 +48,7 @@ function increment_version() {
# Environment variable:
# REL: relative path to this file
function change_version() {
- $REL/../mvnw -q versions:set -f "$1" -DnewVersion="$2" -DartifactId=* -DgroupId=* versions:commit
+ "$REL/../mvnw" -q versions:set -f "$1" -DnewVersion="$2" -DartifactId=* -DgroupId=* versions:commit
}
function main() {
@@ -65,7 +65,7 @@ function main() {
echo "missing parameter for argument '-m|--modules'" >&2
exit 1
fi
- MODULES=($2)
+ MODULES=("$2")
shift # passed argument
shift # passed value
;;
@@ -82,8 +82,8 @@ function main() {
fi
if [[ "$GITHUB_REF" =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
- version=$([[ -n "$INCREMENT" ]] && echo $(increment_version "${GITHUB_REF##refs/tags/v}")-SNAPSHOT || echo "${GITHUB_REF##refs/tags/v}")
- for dir in ${MODULES[@]}; do
+ version=$([[ -n "$INCREMENT" ]] && echo "$(increment_version "${GITHUB_REF##refs/tags/v}")-SNAPSHOT" || echo "${GITHUB_REF##refs/tags/v}")
+ for dir in "${MODULES[@]}"; do
change_version "$dir" "$version"
done
else
diff --git a/ci/commitPoms.sh b/ci/commitPoms.sh
index 4da06c1eb..6e864251b 100755
--- a/ci/commitPoms.sh
+++ b/ci/commitPoms.sh
@@ -18,7 +18,7 @@ set -e # fail fast
# Arguments:
# $1: exit code
function helpAndExit() {
- cat "$0" | grep "^#H" | cut -c4- | sed -e "s/%FILE%/$(basename "$0")/g"
+ grep "^#H" "$0" | cut -c4- | sed -e "s/%FILE%/$(basename "$0")/g"
exit "$1"
}
@@ -33,7 +33,7 @@ function increment_version() {
echo "'$1' does not match tag pattern." >&2
exit 1
fi
- echo "${1%\.*}.$(expr ${1##*\.*\.} + 1)"
+ echo "${1%\.*}.$(("${1##*\.*\.}" + 1))"
}
function main() {
@@ -65,7 +65,7 @@ function main() {
for file in "$@"; do
[[ -n "$file" ]] && git add "$file"
done
- git commit -m "Updated poms to version $(increment_version ${GITHUB_REF##refs/tags/v})-SNAPSHOT"
+ git commit -m "Updated poms to version $(increment_version "${GITHUB_REF##refs/tags/v}")-SNAPSHOT"
git push
else
echo "Nothing to push - this is not a release!"
diff --git a/ci/update_taskana_dependency_for_wildfly.sh b/ci/update_taskana_dependency_for_wildfly.sh
index 3423a5d4b..4f02bb6b3 100755
--- a/ci/update_taskana_dependency_for_wildfly.sh
+++ b/ci/update_taskana_dependency_for_wildfly.sh
@@ -14,7 +14,7 @@ set -e #fail fast
# Arguments:
# $1: exit code
function helpAndExit() {
- cat "$0" | grep "^#H" | cut -c4- | sed -e "s/%FILE%/$(basename "$0")/g"
+ grep "^#H" "$0" | cut -c4- | sed -e "s/%FILE%/$(basename "$0")/g"
exit "$1"
}
@@ -29,7 +29,7 @@ function increment_version() {
echo "'$1' does not match tag pattern." >&2
exit 1
fi
- echo "${1%\.*}.$(expr ${1##*\.*\.} + 1)"
+ echo "${1%\.*}.$(("${1##*\.*\.}" + 1))"
}
function main() {
@@ -37,14 +37,15 @@ function main() {
if [[ "$GITHUB_REF" =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
REL=$(dirname "$0")
FILES=(
- $REL/../rest/taskana-rest-spring-example-wildfly/pom.xml
+ "$REL/../rest/taskana-rest-spring-example-wildfly/pom.xml"
+ "$REL/../rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/AbstractAccTest.java"
)
- for file in ${FILES[@]}; do
- sed -i "s/[0-9]\+\.[0-9]\+\.[0-9]\+-SNAPSHOT/$(increment_version "${GITHUB_REF##refs/tags/v}")-SNAPSHOT/g" $file
+ for file in "${FILES[@]}"; do
+ sed -i "s/[0-9]\+\.[0-9]\+\.[0-9]\+-SNAPSHOT/$(increment_version "${GITHUB_REF##refs/tags/v}")-SNAPSHOT/g" "$file"
done
else
echo "skipped version change for wildfly because this is not a release build"
fi
}
-main "$@"
\ No newline at end of file
+main "$@"
diff --git a/ci/verify_docs_alive.sh b/ci/verify_docs_alive.sh
index a2fc334fa..04a06b99b 100755
--- a/ci/verify_docs_alive.sh
+++ b/ci/verify_docs_alive.sh
@@ -3,12 +3,12 @@ set -e # fail fast
set -x
BASE_URL=https://taskana.mybluemix.net/taskana
-test 200 -eq $(curl -sw %{http_code} -o /dev/null "$BASE_URL/docs/rest/rest-api.html")
-test 200 -eq $(curl -sw %{http_code} -o /dev/null "$BASE_URL/docs/rest/simplehistory-rest-api.html")
-test 200 -eq $(curl -sw %{http_code} -o /dev/null "$BASE_URL/docs/rest/routing-rest-api.html")
+test 200 -eq "$(curl -sw "%{http_code}" -o /dev/null "$BASE_URL/docs/rest/rest-api.html")"
+test 200 -eq "$(curl -sw "%{http_code}" -o /dev/null "$BASE_URL/docs/rest/simplehistory-rest-api.html")"
+test 200 -eq "$(curl -sw "%{http_code}" -o /dev/null "$BASE_URL/docs/rest/routing-rest-api.html")"
for module in taskana-core taskana-spring; do
- test 200 -eq $(curl -sw %{http_code} -o /dev/null "$BASE_URL/docs/java/$module/pro/taskana/package-summary.html")
+ test 200 -eq "$(curl -sw "%{http_code}" -o /dev/null "$BASE_URL/docs/java/$module/pro/taskana/package-summary.html")"
done
for module in taskana-cdi; do
- test 200 -eq $(curl -sw %{http_code} -o /dev/null "$BASE_URL/docs/java/$module/pro/taskana/common/internal/package-summary.html")
+ test 200 -eq "$(curl -sw "%{http_code}" -o /dev/null "$BASE_URL/docs/java/$module/pro/taskana/common/internal/package-summary.html")"
done
diff --git a/ci/verify_docs_jar.sh b/ci/verify_docs_jar.sh
index e91b7b7da..662e2fa99 100755
--- a/ci/verify_docs_jar.sh
+++ b/ci/verify_docs_jar.sh
@@ -4,7 +4,7 @@ set -e #fail fast
#check that first dir has same amount of files as second dir
function verifyDocs() {
test -d "$1"
- test $(find "$1" | wc -l) -eq $(grep "$2" <<<"$JAR_CONTENT" | wc -l)
+ test "$(find "$1" | wc -l)" -eq "$(grep -c "$2" <<<"$JAR_CONTENT")"
}
REL=$(dirname "$0")
@@ -18,8 +18,8 @@ set -x
verifyDocs "$REL/../lib/taskana-core/target/apidocs" "/static/docs/java/taskana-core"
verifyDocs "$REL/../lib/taskana-cdi/target/apidocs" "/static/docs/java/taskana-cdi"
verifyDocs "$REL/../lib/taskana-spring/target/apidocs" "/static/docs/java/taskana-spring"
-test -n "$(jar -tf $JAR_FILE_LOCATION | grep /static/docs/rest/rest-api.html)"
-test -n "$(jar -tf $JAR_FILE_LOCATION | grep /static/docs/rest/simplehistory-rest-api.html)"
-test -n "$(jar -tf $JAR_FILE_LOCATION | grep /static/docs/rest/routing-rest-api.html)"
+test -n "$(jar -tf "$JAR_FILE_LOCATION" | grep /static/docs/rest/rest-api.html)"
+test -n "$(jar -tf "$JAR_FILE_LOCATION" | grep /static/docs/rest/simplehistory-rest-api.html)"
+test -n "$(jar -tf "$JAR_FILE_LOCATION" | grep /static/docs/rest/routing-rest-api.html)"
set +x
echo "the jar file '$JAR_FILE_LOCATION' contains documentation"
diff --git a/pom.xml b/pom.xml
index 0ca783909..77ca05302 100644
--- a/pom.xml
+++ b/pom.xml
@@ -78,7 +78,7 @@
5.0.1.Final
2.7.0.Final
8.0.1
- 1.6.0.Final
+ 1.5.0.Final
3.0.1.Final
diff --git a/rest/taskana-rest-spring-example-wildfly/pom.xml b/rest/taskana-rest-spring-example-wildfly/pom.xml
index 0db74661d..494e47c4c 100644
--- a/rest/taskana-rest-spring-example-wildfly/pom.xml
+++ b/rest/taskana-rest-spring-example-wildfly/pom.xml
@@ -95,12 +95,6 @@
-
- pro.taskana
- taskana-common-test
- ${project.version}
- test
-
pro.taskana.history
taskana-simplehistory-rest-spring
@@ -127,11 +121,22 @@
junit
test
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
org.springframework
spring-test
test
+
+ org.springframework.boot
+ spring-boot-test
+ test
+
+
diff --git a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/common/test/rest/RestHelper.java b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/common/test/rest/RestHelper.java
new file mode 100644
index 000000000..bad4a7b82
--- /dev/null
+++ b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/common/test/rest/RestHelper.java
@@ -0,0 +1,92 @@
+package pro.taskana.common.test.rest;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.Optional;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.hateoas.MediaTypes;
+import org.springframework.hateoas.mediatype.hal.Jackson2HalModule;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+/** Helps to simplify rest api testing. */
+@Component
+public class RestHelper {
+
+ public static final RestTemplate TEMPLATE = getRestTemplate();
+
+ private Environment environment;
+ private int port;
+
+ @Autowired
+ public RestHelper(Environment environment) {
+ this.environment = environment;
+ }
+
+ public RestHelper(int port) {
+ this.port = port;
+ }
+
+ public String toUrl(String relativeUrl, Object... uriVariables) {
+ return UriComponentsBuilder.fromPath(relativeUrl)
+ .scheme("http")
+ .host("127.0.0.1")
+ .port(getPort())
+ .build(false)
+ .expand(uriVariables)
+ .toString();
+ }
+
+ public static HttpHeaders generateHeadersForUser(String user) {
+ HttpHeaders headers = new HttpHeaders();
+ headers.add("Authorization", encodeUserAndPasswordAsBasicAuth(user));
+ headers.add("Content-Type", MediaTypes.HAL_JSON_VALUE);
+ return headers;
+ }
+
+ public static String encodeUserAndPasswordAsBasicAuth(String user) {
+ String toEncode = user + ":" + user;
+ return "Basic " + Base64.getEncoder().encodeToString(toEncode.getBytes(StandardCharsets.UTF_8));
+ }
+
+ private int getPort() {
+ return Optional.ofNullable(environment)
+ .map(e -> e.getRequiredProperty("local.server.port", int.class))
+ .orElse(port);
+ }
+
+ /**
+ * Return a REST template which is capable of dealing with responses in HAL format.
+ *
+ * @return RestTemplate
+ */
+ private static RestTemplate getRestTemplate() {
+ ObjectMapper mapper =
+ new ObjectMapper()
+ .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
+ .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
+ .registerModule(new Jackson2HalModule())
+ .registerModule(new ParameterNamesModule())
+ .registerModule(new Jdk8Module())
+ .registerModule(new JavaTimeModule());
+ MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+ converter.setSupportedMediaTypes(Collections.singletonList(MediaTypes.HAL_JSON));
+ converter.setObjectMapper(mapper);
+
+ RestTemplate template = new RestTemplate();
+ // important to add first to ensure priority
+ template.getMessageConverters().add(0, converter);
+ return template;
+ }
+}
diff --git a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/common/test/rest/TaskanaSpringBootTest.java b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/common/test/rest/TaskanaSpringBootTest.java
new file mode 100644
index 000000000..6d40f3e74
--- /dev/null
+++ b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/common/test/rest/TaskanaSpringBootTest.java
@@ -0,0 +1,22 @@
+package pro.taskana.common.test.rest;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ActiveProfiles;
+
+/** Use this annotation to test with a spring context and a standardized configuration. */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+// DirtiesContext is required to make the integration tests run with embedded LDAP.
+// Otherwise the LDAP server is not shut down correctly and will not come up again. (socket busy)
+@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
+@ActiveProfiles({"test"})
+@SpringBootTest(
+ classes = TestConfiguration.class,
+ webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public @interface TaskanaSpringBootTest {}
diff --git a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/common/test/rest/TestConfiguration.java b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/common/test/rest/TestConfiguration.java
new file mode 100644
index 000000000..169fe02c6
--- /dev/null
+++ b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/common/test/rest/TestConfiguration.java
@@ -0,0 +1,30 @@
+package pro.taskana.common.test.rest;
+
+import javax.sql.DataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import pro.taskana.sampledata.SampleDataGenerator;
+
+@SpringBootApplication
+@ComponentScan("pro.taskana")
+@DependsOn("getTaskanaEngine") // wait for schema to be created BEFORE inserting test data
+public class TestConfiguration {
+
+ @Autowired
+ public TestConfiguration(
+ @Value("${taskana.schemaName:TASKANA}") String schemaName, DataSource dataSource) {
+ new SampleDataGenerator(dataSource, schemaName).generateSampleData();
+ }
+
+ @Bean
+ public PlatformTransactionManager txManager(DataSource dataSource) {
+ return new DataSourceTransactionManager(dataSource);
+ }
+}
diff --git a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/AbstractAccTest.java b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/AbstractAccTest.java
index b5c847012..7487605b8 100644
--- a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/AbstractAccTest.java
+++ b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/AbstractAccTest.java
@@ -22,6 +22,7 @@ import pro.taskana.workbasket.rest.models.WorkbasketSummaryRepresentationModel;
public class AbstractAccTest {
protected RestHelper restHelper = new RestHelper(8080);
+ protected static final String DEPENDENCY_VERSION = "4.12.1-SNAPSHOT";
protected TaskRepresentationModel getTaskResourceSample() {
ClassificationSummaryRepresentationModel classificationResource =
diff --git a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithHistoryLoggerEnabledTest.java b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithHistoryLoggerEnabledTest.java
index 9ab3ad834..29976f39e 100644
--- a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithHistoryLoggerEnabledTest.java
+++ b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithHistoryLoggerEnabledTest.java
@@ -47,7 +47,7 @@ public class TaskanaWildflyWithHistoryLoggerEnabledTest extends AbstractAccTest
MavenCoordinates.createCoordinate(
"pro.taskana.history",
"taskana-loghistory-provider",
- "${project.version}",
+ DEPENDENCY_VERSION,
PackagingType.JAR,
null);
diff --git a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithSimpleHistoryAndHistoryLoggerEnabledTest.java b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithSimpleHistoryAndHistoryLoggerEnabledTest.java
index f2d549291..1e86c9447 100644
--- a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithSimpleHistoryAndHistoryLoggerEnabledTest.java
+++ b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithSimpleHistoryAndHistoryLoggerEnabledTest.java
@@ -53,7 +53,7 @@ public class TaskanaWildflyWithSimpleHistoryAndHistoryLoggerEnabledTest extends
MavenCoordinates.createCoordinate(
"pro.taskana.history",
"taskana-simplehistory-rest-spring",
- "${project.version}",
+ DEPENDENCY_VERSION,
PackagingType.JAR,
null);
@@ -64,7 +64,7 @@ public class TaskanaWildflyWithSimpleHistoryAndHistoryLoggerEnabledTest extends
MavenCoordinates.createCoordinate(
"pro.taskana.history",
"taskana-loghistory-provider",
- "${project.version}",
+ DEPENDENCY_VERSION,
PackagingType.JAR,
null);
diff --git a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithSimpleHistoryEnabledTest.java b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithSimpleHistoryEnabledTest.java
index 960013949..a382b7b29 100644
--- a/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithSimpleHistoryEnabledTest.java
+++ b/rest/taskana-rest-spring-example-wildfly/src/test/java/pro/taskana/example/wildfly/TaskanaWildflyWithSimpleHistoryEnabledTest.java
@@ -53,7 +53,7 @@ public class TaskanaWildflyWithSimpleHistoryEnabledTest extends AbstractAccTest
MavenCoordinates.createCoordinate(
"pro.taskana.history",
"taskana-simplehistory-rest-spring",
- "${project.version}",
+ DEPENDENCY_VERSION,
PackagingType.JAR,
null);
diff --git a/rest/taskana-rest-spring-example-wildfly/src/test/resources/module.xml b/rest/taskana-rest-spring-example-wildfly/src/test/resources/module.xml
index 24fe55521..8fe759a26 100644
--- a/rest/taskana-rest-spring-example-wildfly/src/test/resources/module.xml
+++ b/rest/taskana-rest-spring-example-wildfly/src/test/resources/module.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/rest/taskana-rest-spring-example-wildfly/src/test/resources/taskana-test.ldif b/rest/taskana-rest-spring-example-wildfly/src/test/resources/taskana-test.ldif
new file mode 100644
index 000000000..2c05e7969
--- /dev/null
+++ b/rest/taskana-rest-spring-example-wildfly/src/test/resources/taskana-test.ldif
@@ -0,0 +1,449 @@
+######################
+# Base Structure
+######################
+dn: OU=Test,O=TASKANA
+ou: Organisationseinheit
+objectclass: top
+objectclass: organizationalUnit
+
+dn: cn=groups,OU=Test,O=TASKANA
+cn: groups
+objectclass: top
+objectclass: container
+
+dn: cn=users,OU=Test,O=TASKANA
+cn: users
+objectclass: top
+objectclass: container
+
+dn: cn=other-users,OU=Test,O=TASKANA
+cn: users
+objectclass: top
+objectclass: container
+
+dn: cn=organisation,OU=Test,O=TASKANA
+cn: organisation
+objectclass: top
+objectclass: container
+
+
+########################
+# Users General
+########################
+dn: uid=monitor,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Monitor
+description: desc
+uid: monitor
+sn: Monitor
+ou: Organisationseinheit/Organisationseinheit IT
+cn: monitor monitor
+userPassword: monitor
+
+dn: uid=taskadmin,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Task
+description: desc
+uid: taskadmin
+sn: Admin
+ou: Organisationseinheit/Organisationseinheit IT
+cn: Task admin
+userPassword: taskadmin
+
+dn: uid=admin,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Admin
+description: desc
+uid: admin
+sn: Admin
+ou: Organisationseinheit/Organisationseinheit IT
+cn: Admin Admin
+userPassword: admin
+
+dn: uid=businessadmin,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Business
+description: desc
+memberOf: cn=business-admins,cn=groups,OU=Test,O=TASKANA
+uid: businessadmin
+sn: Admin
+ou: Organisationseinheit/Organisationseinheit IT
+cn: Business Admin
+userPassword: businessadmin
+
+########################
+# Users KSC 1
+########################
+dn: uid=teamlead-1,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Titus
+description: desc
+phoneNumber: 012345678
+mobileNumber: 09876554321
+email: Titus.Toll@taskana.de
+orgLevel1: ABC
+orgLevel2: DEF/GHI
+someDepartement: JKL
+orgLevel4: MNO/PQR
+memberOf: cn=Organisationseinheit KSC 1,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+memberOf: cn=monitor-users,cn=groups,OU=Test,O=TASKANA
+memberOf: cn=business-admins,cn=groups,OU=Test,O=TASKANA
+memberOf: cn=ksc-teamleads,cn=groups,OU=Test,O=TASKANA
+uid: teamlead-1
+sn: Toll
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
+cn: Titus Toll
+userPassword: teamlead-1
+
+dn: uid=user-1-1,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Max
+description: desc
+memberOf: cn=ksc-users,cn=groups,OU=Test,O=TASKANA
+memberOf: cn=Organisationseinheit KSC 1,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: user-1-1
+sn: Mustermann
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
+cn: Max Mustermann
+userPassword: user-1-1
+
+dn: uid=user-1-2,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Elena
+description: desc
+memberOf: cn=ksc-users,cn=groups,OU=Test,O=TASKANA
+memberOf: cn=Organisationseinheit KSC 1,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: user-1-2
+sn: Eifrig
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
+cn: Elena Eifrig
+userPassword: user-1-2
+
+dn: uid=user-1-3,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Elena
+description: desc
+uid: user-1-3
+sn: Faul
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
+cn: Elena Faul
+userPassword: user-1-3
+
+########################
+# Users KSC 2
+########################
+dn: uid=teamlead-2,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Frauke
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+memberOf: cn=monitor-users,cn=groups,OU=Test,O=TASKANA
+memberOf: cn=business-admins,cn=groups,OU=Test,O=TASKANA
+memberOf: cn=ksc-teamleads,cn=groups,OU=Test,O=TASKANA
+uid: teamlead-2
+sn: Faul
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Frauke Faul
+userPassword: teamlead-2
+
+dn: uid=user-2-1,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Simone
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+memberOf: cn=ksc-users,cn=groups,OU=Test,O=TASKANA
+uid: user-2-1
+sn: Müller
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Simone Müller
+userPassword: user-2-1
+
+dn: uid=user-2-2,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Tim
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+memberOf: cn=ksc-users,cn=groups,OU=Test,O=TASKANA
+uid: user-2-2
+sn:: U2NobMOkZnJpZw==
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn:: VGltIFNjaGzDpGZyaWc=
+userPassword: user-2-2
+
+dn: uid=user-2-3,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Thomas
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: user-2-3
+sn: Bach
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Thomas Bach
+userPassword: user-2-3
+
+dn: uid=user-2-4,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Rolf
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: user-2-4
+sn: Wieland
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Rolf Wieland
+userPassword: user-2-4
+
+dn: uid=user-2-5,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Heike
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: user-2-5
+sn: Schmidt
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Heike Schmidt
+userPassword: user-2-5
+
+dn: uid=user-2-6,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Kurt
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: user-2-6
+sn: Maier
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Kurt Maier
+userPassword: user-2-6
+
+dn: uid=user-2-7,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Wiebke
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: user-2-7
+sn: Meyer
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Wiebke Meyer
+userPassword: user-2-7
+
+dn: uid=user-2-8,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Jana
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: user-2-8
+sn: Heeg
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Jana Heeg
+userPassword: user-2-8
+
+dn: uid=user-2-9,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Nathalie
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: user-2-9
+sn: Fuchs
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Nathalie Fuchs
+userPassword: user-2-9
+
+dn: uid=user-2-10,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Johannes
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: user-2-10
+sn: Renz
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Johannes Renz
+userPassword: user-2-10
+
+dn: uid=das_ist_eine_sehr_sehr_sehr_sehr_sehr_lange_user_id,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Max
+description: desc
+memberOf: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uid: das_ist_eine_sehr_sehr_sehr_sehr_sehr_lange_user_id
+sn: Renz
+ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
+cn: Max Renz
+userPassword: user-2-11
+
+########################
+# Users Domäne B
+########################
+dn: uid=user-b-1,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Bernd
+description: desc
+uid: user-b-1
+sn: Bern
+ou: Organisationseinheit/Organisationseinheit B
+cn: Bernd Bern
+userPassword: user-b-1
+
+dn: uid=User-b-2,cn=users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Brunhilde
+description: desc
+uid: User-b-2
+sn: Bio
+ou: Organisationseinheit/Organisationseinheit B
+cn: Brunhilde Bio
+userPassword: user-b-2
+
+########################
+# Users in other cn
+########################
+dn: uid=otheruser,cn=other-users,OU=Test,O=TASKANA
+objectclass: inetorgperson
+objectclass: organizationalperson
+objectclass: person
+objectclass: top
+givenName: Other
+description: User in other cn than search root
+uid: otheruser
+sn: User
+ou: Other
+cn: Other User
+userPassword: otheruser
+
+
+########################
+# Groups
+########################
+dn: cn=ksc-users,cn=groups,OU=Test,O=TASKANA
+uniquemember: uid=user-1-1,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-1-2,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-1,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-2,cn=users,OU=Test,O=TASKANA
+cn: ksc-users
+objectclass: groupofuniquenames
+objectclass: top
+
+dn: cn=ksc-teamleads,cn=groups,OU=Test,O=TASKANA
+uniquemember: uid=teamlead-1,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=teamlead-2,cn=users,OU=Test,O=TASKANA
+cn: ksc-teamleads
+objectclass: groupofuniquenames
+objectclass: top
+
+dn: cn=business-admins,cn=groups,OU=Test,O=TASKANA
+uniquemember: uid=teamlead-1,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=teamlead-2,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=businessadmin,cn=users,OU=Test,O=TASKANA
+cn: business-admins
+objectclass: groupofuniquenames
+objectclass: top
+
+dn: cn=monitor-users,cn=groups,OU=Test,O=TASKANA
+uniquemember: uid=teamlead-1,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=teamlead-2,cn=users,OU=Test,O=TASKANA
+cn: monitor-users
+objectclass: groupofuniquenames
+objectclass: top
+
+######################
+# Organizational Units
+######################
+dn: cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+cn: Organisationseinheit KSC
+uniquemember: cn=Organisationseinheit KSC 1,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uniquemember: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+objectclass: groupofuniquenames
+objectclass: top
+
+dn: cn=Organisationseinheit KSC 1,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uniquemember: uid=teamlead-1,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-1-1,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-1-2,cn=users,OU=Test,O=TASKANA
+cn: Organisationseinheit KSC 1
+objectclass: groupofuniquenames
+objectclass: top
+
+dn: cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA
+uniquemember: uid=teamlead-2,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-1,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-2,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-3,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-4,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-5,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-6,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-7,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-8,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-9,cn=users,OU=Test,O=TASKANA
+uniquemember: uid=user-2-10,cn=users,OU=Test,O=TASKANA
+cn: Organisationseinheit KSC 2
+objectclass: groupofuniquenames
+objectclass: top
+
+dn: cn=Organisationseinheit B,cn=organisation,OU=Test,O=TASKANA
+cn: Organisationseinheit B
+objectclass: groupofuniquenames
+objectclass: top