diff --git a/docs/modules/databases/neo4j.md b/docs/modules/databases/neo4j.md index 18f7a957ea2..a8570fe7270 100644 --- a/docs/modules/databases/neo4j.md +++ b/docs/modules/databases/neo4j.md @@ -29,7 +29,7 @@ You are not limited to Unit tests, and you can use an instance of the Neo4j Test A custom password can be provided: -[Custom password](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:withAdminPassword +[Custom password](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:withAdminPassword ### Disable authentication @@ -37,7 +37,7 @@ A custom password can be provided: Authentication can be disabled: -[Disable authentication](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:withoutAuthentication +[Disable authentication](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:withoutAuthentication ### Random password @@ -45,7 +45,7 @@ Authentication can be disabled: A random (`UUID`-random based) password can be set: -[Random password](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:withRandomPassword +[Random password](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:withRandomPassword ### Neo4j-Configuration @@ -54,7 +54,7 @@ Neo4j's Docker image needs Neo4j configuration options in a dedicated format. The container takes care of that, and you can configure the database with standard options like the following: -[Neo4j configuration](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:neo4jConfiguration +[Neo4j configuration](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:neo4jConfiguration ### Add custom plugins @@ -62,13 +62,13 @@ The container takes care of that, and you can configure the database with standa Custom plugins, like APOC, can be copied over to the container from any classpath or host resource like this: -[Plugin jar](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:registerPluginsJar +[Plugin jar](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:registerPluginsJar Whole directories work as well: -[Plugin folder](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:registerPluginsPath +[Plugin folder](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:registerPluginsPath ### Add Neo4j Docker Labs plugins @@ -81,7 +81,7 @@ or [Neo4j 5 plugin list](https://neo4j.com/docs/operations-manual/5/configuratio Please the method `withPlugins(String... plugins)`. -[Configure Neo4j Labs Plugins](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:configureLabsPlugins +[Configure Neo4j Labs Plugins](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:configureLabsPlugins @@ -90,7 +90,7 @@ or [Neo4j 5 plugin list](https://neo4j.com/docs/operations-manual/5/configuratio If you have an existing database (`graph.db`) you want to work with, copy it over to the container like this: -[Copy database](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:copyDatabase +[Copy database](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:copyDatabase !!! note @@ -101,7 +101,7 @@ If you have an existing database (`graph.db`) you want to work with, copy it ove If you need the Neo4j enterprise license, you can declare your Neo4j container like this: -[Enterprise edition](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:enterpriseEdition +[Enterprise edition](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:enterpriseEdition This creates a Testcontainers based on the Docker image build with the Enterprise version of Neo4j 4.4. diff --git a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java index bd3499567d4..64c4df9f350 100644 --- a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java +++ b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java @@ -30,7 +30,10 @@ *
+ * Supported image: {@code neo4j} + *
+ * Exposed ports: + *
neo4j). A null value or an empty string + * disables authentication. + * + * @param adminPassword The admin password for the default database account. + * @return This container. + */ + public Neo4jContainer withAdminPassword(final String adminPassword) { + if (adminPassword != null && adminPassword.length() < 8) { + logger().warn("Your provided admin password is too short and will not work with Neo4j 5.3+."); + } + this.adminPassword = adminPassword; + return self(); + } + + /** + * Disables authentication. + * + * @return This container. + */ + public Neo4jContainer withoutAuthentication() { + return withAdminPassword(null); + } + + /** + * Copies an existing {@code graph.db} folder into the container. This can either be a classpath resource or a + * host resource. Please have a look at the factory methods in {@link MountableFile}. + *
+ * @Container
+ * private static final Neo4jContainer databaseServer = new Neo4jContainer<>()
+ * .withClasspathResourceMapping("/test-graph.db", "/data/databases/graph.db", BindMode.READ_WRITE);
+ *
+ *
+ * @param graphDb The graph.db folder to copy into the container
+ * @throws IllegalArgumentException If the database version is not 3.5.
+ * @return This container.
+ */
+ public Neo4jContainer withDatabase(MountableFile graphDb) {
+ if (!isNeo4jDatabaseVersionSupportingDbCopy()) {
+ throw new IllegalArgumentException(
+ "Copying database folder is not supported for Neo4j instances with version 4.0 or higher."
+ );
+ }
+ return withCopyFileToContainer(graphDb, "/data/databases/graph.db");
+ }
+
+ /**
+ * Adds plugins to the given directory to the container. If {@code plugins} denotes a directory, than all of that
+ * directory is mapped to Neo4j's plugins. Otherwise, single resources are copied over.
+ * neo4j account or literal null if auth is disabled.
+ */
+ public String getAdminPassword() {
+ return adminPassword;
+ }
+
+ /**
+ * Registers one or more Neo4j plugins for server startup.
+ * The plugins are listed here
+ *
+ *
+ * @param plugins The Neo4j plugins that should get started with the server.
+ * @return This container.
+ */
+ public Neo4jContainer withPlugins(String... plugins) {
+ this.labsPlugins.addAll(Arrays.asList(plugins));
+ return self();
+ }
+
+ private static String formatConfigurationKey(String plainConfigKey) {
+ final String prefix = "NEO4J_";
+
+ return String.format("%s%s", prefix, plainConfigKey.replaceAll("_", "__").replaceAll("\\.", "_"));
+ }
+
+ private boolean isNeo4jDatabaseVersionSupportingDbCopy() {
+ String usedImageVersion = DockerImageName.parse(getDockerImageName()).getVersionPart();
+ ComparableVersion usedComparableVersion = new ComparableVersion(usedImageVersion);
+
+ boolean versionSupportingDbCopy =
+ usedComparableVersion.isLessThan("4.0") && usedComparableVersion.isGreaterThanOrEqualTo("2");
+
+ if (versionSupportingDbCopy) {
+ return true;
+ }
+ if (!usedComparableVersion.isSemanticVersion()) {
+ logger()
+ .warn(
+ "Version {} is not a semantic version. The function \"withDatabase\" will fail.",
+ usedImageVersion
+ );
+ logger().warn("Copying databases is only supported for Neo4j versions 3.5.x");
+ }
+
+ return false;
+ }
+
+ public Neo4jContainer withRandomPassword() {
+ return withAdminPassword(UUID.randomUUID().toString());
+ }
+}
diff --git a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java b/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java
similarity index 98%
rename from modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java
rename to modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java
index 997e90c4788..82e8bc16e08 100644
--- a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java
+++ b/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java
@@ -1,4 +1,4 @@
-package org.testcontainers.containers;
+package org.testcontainers.neo4j;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
@@ -263,7 +263,7 @@ void shouldRespectCustomWaitStrategy() {
neo4jContainer.configure();
- assertThat(neo4jContainer.getWaitStrategy()).isInstanceOf(CustomDummyWaitStrategy.class);
+ assertThat(neo4jContainer).extracting("waitStrategy").isInstanceOf(CustomDummyWaitStrategy.class);
}
@Test