Skip to content

Commit 1602236

Browse files
committed
feat: add getR2dbcUrl() helper to PostgreSQL, MySQL, and MariaDB R2DBC containers
Add a static getR2dbcUrl(container) method to each R2DBCDatabaseContainer implementation for PostgreSQL, MySQL, and MariaDB. This mirrors the existing getJdbcUrl() ergonomics, making R2DBC URL discovery straightforward for reactive backend workflows. Both modern and compatibility package classes are updated. Integration tests verify URL correctness (database name assertion) and actual connectivity with custom credentials. Closes #8797
1 parent 95c616e commit 1602236

File tree

12 files changed

+222
-0
lines changed

12 files changed

+222
-0
lines changed

modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@ public class MariaDBR2DBCDatabaseContainer implements R2DBCDatabaseContainer {
1212
@Delegate(types = Startable.class)
1313
private final MariaDBContainer<?> container;
1414

15+
public static String getR2dbcUrl(MariaDBContainer<?> container) {
16+
return String.format(
17+
"r2dbc:mariadb://%s:%d/%s",
18+
container.getHost(),
19+
container.getMappedPort(MariaDBContainer.MARIADB_PORT),
20+
container.getDatabaseName()
21+
);
22+
}
23+
1524
public static ConnectionFactoryOptions getOptions(MariaDBContainer<?> container) {
1625
ConnectionFactoryOptions options = ConnectionFactoryOptions
1726
.builder()

modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBR2DBCDatabaseContainer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ public MariaDBR2DBCDatabaseContainer(MariaDBContainer container) {
1515
this.container = container;
1616
}
1717

18+
public static String getR2dbcUrl(MariaDBContainer container) {
19+
return String.format(
20+
"r2dbc:mariadb://%s:%d/%s",
21+
container.getHost(),
22+
container.getMappedPort(MariaDBContainer.MARIADB_PORT),
23+
container.getDatabaseName()
24+
);
25+
}
26+
1827
public static ConnectionFactoryOptions getOptions(MariaDBContainer container) {
1928
ConnectionFactoryOptions options = ConnectionFactoryOptions
2029
.builder()

modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package org.testcontainers.containers;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import io.r2dbc.spi.ConnectionFactories;
6+
import io.r2dbc.spi.ConnectionFactory;
37
import io.r2dbc.spi.ConnectionFactoryOptions;
8+
import org.junit.jupiter.api.Test;
49
import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest;
510
import org.testcontainers.utility.DockerImageName;
611

@@ -20,4 +25,27 @@ protected String createR2DBCUrl() {
2025
protected MariaDBContainer<?> createContainer() {
2126
return new MariaDBContainer<>(DockerImageName.parse("mariadb:10.3.39"));
2227
}
28+
29+
@Test
30+
void testGetR2dbcUrl() {
31+
try (
32+
MariaDBContainer<?> container = new MariaDBContainer<>(DockerImageName.parse("mariadb:10.3.39"))
33+
.withDatabaseName("testdb")
34+
.withUsername("testuser")
35+
.withPassword("testpass")
36+
) {
37+
container.start();
38+
String url = MariaDBR2DBCDatabaseContainer.getR2dbcUrl(container);
39+
assertThat(url).contains("/testdb");
40+
ConnectionFactory connectionFactory = ConnectionFactories.get(
41+
ConnectionFactoryOptions
42+
.parse(url)
43+
.mutate()
44+
.option(ConnectionFactoryOptions.USER, container.getUsername())
45+
.option(ConnectionFactoryOptions.PASSWORD, container.getPassword())
46+
.build()
47+
);
48+
runTestQuery(connectionFactory);
49+
}
50+
}
2351
}

modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBR2DBCDatabaseContainerTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package org.testcontainers.mariadb;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import io.r2dbc.spi.ConnectionFactories;
6+
import io.r2dbc.spi.ConnectionFactory;
37
import io.r2dbc.spi.ConnectionFactoryOptions;
8+
import org.junit.jupiter.api.Test;
49
import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest;
510
import org.testcontainers.utility.DockerImageName;
611

@@ -20,4 +25,27 @@ protected String createR2DBCUrl() {
2025
protected MariaDBContainer createContainer() {
2126
return new MariaDBContainer(DockerImageName.parse("mariadb:10.3.39"));
2227
}
28+
29+
@Test
30+
void testGetR2dbcUrl() {
31+
try (
32+
MariaDBContainer container = new MariaDBContainer(DockerImageName.parse("mariadb:10.3.39"))
33+
.withDatabaseName("testdb")
34+
.withUsername("testuser")
35+
.withPassword("testpass")
36+
) {
37+
container.start();
38+
String url = MariaDBR2DBCDatabaseContainer.getR2dbcUrl(container);
39+
assertThat(url).contains("/testdb");
40+
ConnectionFactory connectionFactory = ConnectionFactories.get(
41+
ConnectionFactoryOptions
42+
.parse(url)
43+
.mutate()
44+
.option(ConnectionFactoryOptions.USER, container.getUsername())
45+
.option(ConnectionFactoryOptions.PASSWORD, container.getPassword())
46+
.build()
47+
);
48+
runTestQuery(connectionFactory);
49+
}
50+
}
2351
}

modules/mysql/src/main/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@ public class MySQLR2DBCDatabaseContainer implements R2DBCDatabaseContainer {
1212
@Delegate(types = Startable.class)
1313
private final MySQLContainer<?> container;
1414

15+
public static String getR2dbcUrl(MySQLContainer<?> container) {
16+
return String.format(
17+
"r2dbc:mysql://%s:%d/%s",
18+
container.getHost(),
19+
container.getMappedPort(MySQLContainer.MYSQL_PORT),
20+
container.getDatabaseName()
21+
);
22+
}
23+
1524
public static ConnectionFactoryOptions getOptions(MySQLContainer<?> container) {
1625
ConnectionFactoryOptions options = ConnectionFactoryOptions
1726
.builder()

modules/mysql/src/main/java/org/testcontainers/mysql/MySQLR2DBCDatabaseContainer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ public MySQLR2DBCDatabaseContainer(MySQLContainer container) {
1515
this.container = container;
1616
}
1717

18+
public static String getR2dbcUrl(MySQLContainer container) {
19+
return String.format(
20+
"r2dbc:mysql://%s:%d/%s",
21+
container.getHost(),
22+
container.getMappedPort(MySQLContainer.MYSQL_PORT),
23+
container.getDatabaseName()
24+
);
25+
}
26+
1827
public static ConnectionFactoryOptions getOptions(MySQLContainer container) {
1928
ConnectionFactoryOptions options = ConnectionFactoryOptions
2029
.builder()

modules/mysql/src/test/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package org.testcontainers.containers;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import io.r2dbc.spi.ConnectionFactories;
6+
import io.r2dbc.spi.ConnectionFactory;
37
import io.r2dbc.spi.ConnectionFactoryOptions;
8+
import org.junit.jupiter.api.Test;
49
import org.testcontainers.MySQLTestImages;
510
import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest;
611

@@ -20,4 +25,27 @@ protected String createR2DBCUrl() {
2025
protected MySQLContainer<?> createContainer() {
2126
return new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE);
2227
}
28+
29+
@Test
30+
void testGetR2dbcUrl() {
31+
try (
32+
MySQLContainer<?> container = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE)
33+
.withDatabaseName("testdb")
34+
.withUsername("testuser")
35+
.withPassword("testpass")
36+
) {
37+
container.start();
38+
String url = MySQLR2DBCDatabaseContainer.getR2dbcUrl(container);
39+
assertThat(url).contains("/testdb");
40+
ConnectionFactory connectionFactory = ConnectionFactories.get(
41+
ConnectionFactoryOptions
42+
.parse(url)
43+
.mutate()
44+
.option(ConnectionFactoryOptions.USER, container.getUsername())
45+
.option(ConnectionFactoryOptions.PASSWORD, container.getPassword())
46+
.build()
47+
);
48+
runTestQuery(connectionFactory);
49+
}
50+
}
2351
}

modules/mysql/src/test/java/org/testcontainers/mysql/MySQLR2DBCDatabaseContainerTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package org.testcontainers.mysql;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import io.r2dbc.spi.ConnectionFactories;
6+
import io.r2dbc.spi.ConnectionFactory;
37
import io.r2dbc.spi.ConnectionFactoryOptions;
8+
import org.junit.jupiter.api.Test;
49
import org.testcontainers.MySQLTestImages;
510
import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest;
611

@@ -20,4 +25,27 @@ protected String createR2DBCUrl() {
2025
protected MySQLContainer createContainer() {
2126
return new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE);
2227
}
28+
29+
@Test
30+
void testGetR2dbcUrl() {
31+
try (
32+
MySQLContainer container = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE)
33+
.withDatabaseName("testdb")
34+
.withUsername("testuser")
35+
.withPassword("testpass")
36+
) {
37+
container.start();
38+
String url = MySQLR2DBCDatabaseContainer.getR2dbcUrl(container);
39+
assertThat(url).contains("/testdb");
40+
ConnectionFactory connectionFactory = ConnectionFactories.get(
41+
ConnectionFactoryOptions
42+
.parse(url)
43+
.mutate()
44+
.option(ConnectionFactoryOptions.USER, container.getUsername())
45+
.option(ConnectionFactoryOptions.PASSWORD, container.getPassword())
46+
.build()
47+
);
48+
runTestQuery(connectionFactory);
49+
}
50+
}
2351
}

modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@ public final class PostgreSQLR2DBCDatabaseContainer implements R2DBCDatabaseCont
1212
@Delegate(types = Startable.class)
1313
private final PostgreSQLContainer<?> container;
1414

15+
public static String getR2dbcUrl(PostgreSQLContainer<?> container) {
16+
return String.format(
17+
"r2dbc:postgresql://%s:%d/%s",
18+
container.getHost(),
19+
container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT),
20+
container.getDatabaseName()
21+
);
22+
}
23+
1524
public static ConnectionFactoryOptions getOptions(PostgreSQLContainer<?> container) {
1625
ConnectionFactoryOptions options = ConnectionFactoryOptions
1726
.builder()

modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ public PostgreSQLR2DBCDatabaseContainer(PostgreSQLContainer container) {
1515
this.container = container;
1616
}
1717

18+
public static String getR2dbcUrl(PostgreSQLContainer container) {
19+
return String.format(
20+
"r2dbc:postgresql://%s:%d/%s",
21+
container.getHost(),
22+
container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT),
23+
container.getDatabaseName()
24+
);
25+
}
26+
1827
public static ConnectionFactoryOptions getOptions(PostgreSQLContainer container) {
1928
ConnectionFactoryOptions options = ConnectionFactoryOptions
2029
.builder()

0 commit comments

Comments
 (0)