Skip to content

Commit 0fd4cef

Browse files
author
NiMv1
committed
Add getR2dbcUrl() method to JdbcDatabaseContainer (#8797)
1 parent 43c6a97 commit 0fd4cef

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,26 @@ public JdbcDatabaseContainer(final DockerImageName dockerImageName) {
7676
*/
7777
public abstract String getJdbcUrl();
7878

79+
/**
80+
* Returns an R2DBC URL that may be used to connect to the dockerized DB using reactive drivers.
81+
* <p>
82+
* The default implementation converts the JDBC URL to R2DBC format by replacing
83+
* the "jdbc:" prefix with "r2dbc:". Subclasses may override this method if
84+
* a different conversion is required.
85+
*
86+
* @return an R2DBC URL for reactive database connections
87+
* @see <a href="https://r2dbc.io/spec/1.0.0.RELEASE/spec/html/">R2DBC Specification</a>
88+
*/
89+
public String getR2dbcUrl() {
90+
String jdbcUrl = getJdbcUrl();
91+
if (jdbcUrl != null && jdbcUrl.startsWith("jdbc:")) {
92+
return "r2dbc:" + jdbcUrl.substring(5);
93+
}
94+
throw new UnsupportedOperationException(
95+
"Cannot convert JDBC URL to R2DBC format. Override getR2dbcUrl() in subclass."
96+
);
97+
}
98+
7999
/**
80100
* @return the database name
81101
*/

modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,33 @@
77
import java.sql.Connection;
88
import java.sql.SQLException;
99

10+
import static org.assertj.core.api.Assertions.assertThat;
1011
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
1112
import static org.mockito.Mockito.mock;
1213

1314
class JdbcDatabaseContainerTest {
1415

16+
@Test
17+
void getR2dbcUrlConvertsJdbcUrlToR2dbcFormat() {
18+
JdbcDatabaseContainer<?> container = new JdbcDatabaseContainerStubWithUrl(
19+
"mysql:latest",
20+
"jdbc:mysql://localhost:3306/testdb"
21+
);
22+
23+
String r2dbcUrl = container.getR2dbcUrl();
24+
25+
assertThat(r2dbcUrl).isEqualTo("r2dbc:mysql://localhost:3306/testdb");
26+
}
27+
28+
@Test
29+
void getR2dbcUrlThrowsExceptionWhenJdbcUrlIsNull() {
30+
JdbcDatabaseContainer<?> container = new JdbcDatabaseContainerStub("mysql:latest");
31+
32+
assertThatExceptionOfType(UnsupportedOperationException.class)
33+
.isThrownBy(container::getR2dbcUrl)
34+
.withMessageContaining("Cannot convert JDBC URL to R2DBC format");
35+
}
36+
1537
@Test
1638
void anExceptionIsThrownIfJdbcIsNotAvailable() {
1739
JdbcDatabaseContainer<?> jdbcContainer = new JdbcDatabaseContainerStub("mysql:latest")
@@ -69,4 +91,19 @@ protected Logger logger() {
6991
@Override
7092
public void setDockerImageName(@NonNull String dockerImageName) {}
7193
}
94+
95+
static class JdbcDatabaseContainerStubWithUrl extends JdbcDatabaseContainerStub {
96+
97+
private final String jdbcUrl;
98+
99+
public JdbcDatabaseContainerStubWithUrl(@NonNull String dockerImageName, String jdbcUrl) {
100+
super(dockerImageName);
101+
this.jdbcUrl = jdbcUrl;
102+
}
103+
104+
@Override
105+
public String getJdbcUrl() {
106+
return jdbcUrl;
107+
}
108+
}
72109
}

0 commit comments

Comments
 (0)