From 6433278806a62ca6b28b4c65bcc0029415ef4604 Mon Sep 17 00:00:00 2001 From: jakn Date: Sun, 19 Oct 2025 16:38:59 +0200 Subject: [PATCH 1/4] Add getR2dbcurl to interface --- .../r2dbc/R2DBCDatabaseContainer.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/r2dbc/src/main/java/org/testcontainers/r2dbc/R2DBCDatabaseContainer.java b/modules/r2dbc/src/main/java/org/testcontainers/r2dbc/R2DBCDatabaseContainer.java index 8bf0401fe69..bed36e8a8f7 100644 --- a/modules/r2dbc/src/main/java/org/testcontainers/r2dbc/R2DBCDatabaseContainer.java +++ b/modules/r2dbc/src/main/java/org/testcontainers/r2dbc/R2DBCDatabaseContainer.java @@ -5,4 +5,17 @@ public interface R2DBCDatabaseContainer extends Startable { ConnectionFactoryOptions configure(ConnectionFactoryOptions options); + + /** + * Returns the R2DBC URL for connecting to the database. + *

+ * The default implementation throws {@link UnsupportedOperationException}. + * Implementations should override this method to provide the actual R2DBC URL. + * + * @return the R2DBC URL in the format: r2dbc:driver://username:password@host:port/database + * @throws UnsupportedOperationException if the implementation does not support R2DBC URLs + */ + default String getR2dbcUrl() { + throw new UnsupportedOperationException("R2DBC URL is not supported by this container"); + } } From a31913ea2d24a0bbdef11af1f7a5f6a57f2d7703 Mon Sep 17 00:00:00 2001 From: jakn Date: Sun, 19 Oct 2025 17:31:17 +0200 Subject: [PATCH 2/4] Add getR2dbcUrl to postgres --- .../PostgreSQLR2DBCDatabaseContainer.java | 23 ++++++++++++ .../PostgreSQLR2DBCDatabaseContainerTest.java | 35 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java b/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java index d99d638b100..f27fccf5ba8 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java @@ -24,6 +24,24 @@ public static ConnectionFactoryOptions getOptions(PostgreSQLContainer container) return new PostgreSQLR2DBCDatabaseContainer(container).configure(options); } + /** + * Returns the R2DBC URL for connecting to the PostgreSQL database. + * + * @param container the PostgreSQL container instance + * @return the R2DBC URL in the format: r2dbc:postgresql://username:password@host:port/database + */ + public static String getR2dbcUrl(PostgreSQLContainer container) { + return String.format( + "r2dbc:%s://%s:%s@%s:%d/%s", + PostgresqlConnectionFactoryProvider.POSTGRESQL_DRIVER, + container.getUsername(), + container.getPassword(), + container.getHost(), + container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT), + container.getDatabaseName() + ); + } + @Override public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) { return options @@ -55,4 +73,9 @@ public void stop() { public void close() { this.container.close(); } + + @Override + public String getR2dbcUrl() { + return getR2dbcUrl(this.container); + } } diff --git a/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java index 4f5386d9f58..a2e47bb8710 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java @@ -27,4 +27,39 @@ protected ConnectionFactoryOptions getOptions(PostgreSQLContainer container) { protected String createR2DBCUrl() { return "r2dbc:tc:postgresql:///db?TC_IMAGE_TAG=10-alpine"; } + + @org.junit.jupiter.api.Test + void testGetR2dbcUrl() { + try (PostgreSQLContainer container = createContainer()) { + container.start(); + + // Test static method + String r2dbcUrlStatic = PostgreSQLR2DBCDatabaseContainer.getR2dbcUrl(container); + + org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).isNotNull(); + org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).startsWith("r2dbc:postgresql://"); + org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).contains(container.getHost()); + org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).contains(String.valueOf(container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT))); + org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).contains(container.getDatabaseName()); + org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).contains(container.getUsername()); + org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).contains(container.getPassword()); + + // Verify the format: r2dbc:postgresql://username:password@host:port/database + String expectedUrl = String.format( + "r2dbc:postgresql://%s:%s@%s:%d/%s", + container.getUsername(), + container.getPassword(), + container.getHost(), + container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT), + container.getDatabaseName() + ); + org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).isEqualTo(expectedUrl); + + // Test instance method + PostgreSQLR2DBCDatabaseContainer r2dbcContainer = new PostgreSQLR2DBCDatabaseContainer(container); + String r2dbcUrlInstance = r2dbcContainer.getR2dbcUrl(); + + org.assertj.core.api.Assertions.assertThat(r2dbcUrlInstance).isEqualTo(r2dbcUrlStatic); + } + } } From 9090d5b52e38648f8dcf4a547c3e0d299f58ff8f Mon Sep 17 00:00:00 2001 From: jakn Date: Sun, 19 Oct 2025 17:36:46 +0200 Subject: [PATCH 3/4] Fix tests --- .../PostgreSQLR2DBCDatabaseContainerTest.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java index a2e47bb8710..264d7888640 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java @@ -1,9 +1,12 @@ package org.testcontainers.postgresql; import io.r2dbc.spi.ConnectionFactoryOptions; +import org.junit.jupiter.api.Test; import org.testcontainers.PostgreSQLTestImages; import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; +import static org.assertj.core.api.Assertions.assertThat; + public class PostgreSQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest { @Override @@ -28,7 +31,7 @@ protected String createR2DBCUrl() { return "r2dbc:tc:postgresql:///db?TC_IMAGE_TAG=10-alpine"; } - @org.junit.jupiter.api.Test + @Test void testGetR2dbcUrl() { try (PostgreSQLContainer container = createContainer()) { container.start(); @@ -36,13 +39,13 @@ void testGetR2dbcUrl() { // Test static method String r2dbcUrlStatic = PostgreSQLR2DBCDatabaseContainer.getR2dbcUrl(container); - org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).isNotNull(); - org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).startsWith("r2dbc:postgresql://"); - org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).contains(container.getHost()); - org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).contains(String.valueOf(container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT))); - org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).contains(container.getDatabaseName()); - org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).contains(container.getUsername()); - org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).contains(container.getPassword()); + assertThat(r2dbcUrlStatic).isNotNull(); + assertThat(r2dbcUrlStatic).startsWith("r2dbc:postgresql://"); + assertThat(r2dbcUrlStatic).contains(container.getHost()); + assertThat(r2dbcUrlStatic).contains(String.valueOf(container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT))); + assertThat(r2dbcUrlStatic).contains(container.getDatabaseName()); + assertThat(r2dbcUrlStatic).contains(container.getUsername()); + assertThat(r2dbcUrlStatic).contains(container.getPassword()); // Verify the format: r2dbc:postgresql://username:password@host:port/database String expectedUrl = String.format( @@ -53,13 +56,13 @@ void testGetR2dbcUrl() { container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT), container.getDatabaseName() ); - org.assertj.core.api.Assertions.assertThat(r2dbcUrlStatic).isEqualTo(expectedUrl); + assertThat(r2dbcUrlStatic).isEqualTo(expectedUrl); // Test instance method PostgreSQLR2DBCDatabaseContainer r2dbcContainer = new PostgreSQLR2DBCDatabaseContainer(container); String r2dbcUrlInstance = r2dbcContainer.getR2dbcUrl(); - org.assertj.core.api.Assertions.assertThat(r2dbcUrlInstance).isEqualTo(r2dbcUrlStatic); + assertThat(r2dbcUrlInstance).isEqualTo(r2dbcUrlStatic); } } } From 6223fcac625d8505c458d1f13e3d39436a3e2c47 Mon Sep 17 00:00:00 2001 From: jakn Date: Mon, 20 Oct 2025 19:27:43 +0200 Subject: [PATCH 4/4] Add try with in postgres test and remove public modifier --- .../postgresql/PostgreSQLR2DBCDatabaseContainerTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java index 264d7888640..3f4a70915d3 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java @@ -7,7 +7,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class PostgreSQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest { +class PostgreSQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest { @Override protected PostgreSQLContainer createContainer() { @@ -59,10 +59,11 @@ void testGetR2dbcUrl() { assertThat(r2dbcUrlStatic).isEqualTo(expectedUrl); // Test instance method - PostgreSQLR2DBCDatabaseContainer r2dbcContainer = new PostgreSQLR2DBCDatabaseContainer(container); + try(PostgreSQLR2DBCDatabaseContainer r2dbcContainer = new PostgreSQLR2DBCDatabaseContainer(container)) { String r2dbcUrlInstance = r2dbcContainer.getR2dbcUrl(); assertThat(r2dbcUrlInstance).isEqualTo(r2dbcUrlStatic); + } } } }