diff --git a/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java b/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java new file mode 100644 index 00000000000..d99d638b100 --- /dev/null +++ b/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java @@ -0,0 +1,58 @@ +package org.testcontainers.postgresql; + +import io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider; +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.lifecycle.Startable; +import org.testcontainers.r2dbc.R2DBCDatabaseContainer; + +import java.util.Set; + +public final class PostgreSQLR2DBCDatabaseContainer implements R2DBCDatabaseContainer { + + private final PostgreSQLContainer container; + + public PostgreSQLR2DBCDatabaseContainer(PostgreSQLContainer container) { + this.container = container; + } + + public static ConnectionFactoryOptions getOptions(PostgreSQLContainer container) { + ConnectionFactoryOptions options = ConnectionFactoryOptions + .builder() + .option(ConnectionFactoryOptions.DRIVER, PostgresqlConnectionFactoryProvider.POSTGRESQL_DRIVER) + .build(); + + return new PostgreSQLR2DBCDatabaseContainer(container).configure(options); + } + + @Override + public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) { + return options + .mutate() + .option(ConnectionFactoryOptions.HOST, container.getHost()) + .option(ConnectionFactoryOptions.PORT, container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT)) + .option(ConnectionFactoryOptions.DATABASE, container.getDatabaseName()) + .option(ConnectionFactoryOptions.USER, container.getUsername()) + .option(ConnectionFactoryOptions.PASSWORD, container.getPassword()) + .build(); + } + + @Override + public Set getDependencies() { + return this.container.getDependencies(); + } + + @Override + public void start() { + this.container.start(); + } + + @Override + public void stop() { + this.container.stop(); + } + + @Override + public void close() { + this.container.close(); + } +} diff --git a/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java new file mode 100644 index 00000000000..4f5386d9f58 --- /dev/null +++ b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java @@ -0,0 +1,30 @@ +package org.testcontainers.postgresql; + +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.PostgreSQLTestImages; +import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; + +public class PostgreSQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest { + + @Override + protected PostgreSQLContainer createContainer() { + return new PostgreSQLContainer(PostgreSQLTestImages.POSTGRES_TEST_IMAGE); + } + + @Override + protected ConnectionFactoryOptions getOptions(PostgreSQLContainer container) { + // spotless:off + // get_options { + ConnectionFactoryOptions options = PostgreSQLR2DBCDatabaseContainer.getOptions( + container + ); + // } + // spotless:on + + return options; + } + + protected String createR2DBCUrl() { + return "r2dbc:tc:postgresql:///db?TC_IMAGE_TAG=10-alpine"; + } +}