diff --git a/src/main/java/io/ebean/test/containers/EbeanAdapter.java b/src/main/java/io/ebean/test/containers/EbeanAdapter.java new file mode 100644 index 0000000..b8496f0 --- /dev/null +++ b/src/main/java/io/ebean/test/containers/EbeanAdapter.java @@ -0,0 +1,48 @@ +package io.ebean.test.containers; + +final class EbeanAdapter implements EbeanSDK { + + private final InternalConfigDb dbConfig; + + EbeanAdapter(InternalConfigDb dbConfig) { + this.dbConfig = dbConfig; + } + + @Override + public io.ebean.DatabaseBuilder builder() { + return io.ebean.Database.builder() + .dataSourceBuilder(dataSourceBuilder()) + .name(dbConfig.getDbName()) + .register(false) + .ddlGenerate(true) + .ddlRun(true); + } + + + @Override + public io.ebean.datasource.DataSourceBuilder dataSourceBuilder() { + return io.ebean.datasource.DataSourceBuilder.create() + .url(dbConfig.jdbcUrl()) + .username(dbConfig.getUsername()) + .password(dbConfig.getPassword()); + } + + + @Override + public io.ebean.datasource.DataSourceBuilder extraDataSourceBuilder() { + return io.ebean.datasource.DataSourceBuilder.create() + .url(dbConfig.jdbcExtraUrl()) + .username(dbConfig.getExtraDbUserWithDefault()) + .password(dbConfig.getExtraDbPasswordWithDefault()); + } + + @Override + public io.ebean.DatabaseBuilder extraDatabaseBuilder() { + return io.ebean.Database.builder() + .dataSourceBuilder(extraDataSourceBuilder()) + .name(dbConfig.getExtraDb()) + .defaultDatabase(false) + .register(false); + } + +} diff --git a/src/main/java/io/ebean/test/containers/EbeanSDK.java b/src/main/java/io/ebean/test/containers/EbeanSDK.java new file mode 100644 index 0000000..5b68a91 --- /dev/null +++ b/src/main/java/io/ebean/test/containers/EbeanSDK.java @@ -0,0 +1,43 @@ +package io.ebean.test.containers; + +/** + * Ebean SDK extension to create builders for Ebean Database and DataSource. + *
{@code
+ *
+ * PostgresContainer container = PostgresContainer.builder("15")
+ * .dbName("my_test")
+ * .build()
+ * .start();
+ *
+ * io.ebean.Database ebean = container.ebean().builder().build();
+ * // create ebean database and use it
+ *
+ * }
+ */
+public interface EbeanSDK {
+
+ /**
+ * Return an ebean Database builder for the underlying database (url, username, password).
+ * + * The name of the ebean database will be dbName set for the container. + *
+ * This builder will have ddlGenerate set to true and ddlRun set to true. Alternatively, + * set runMigrations(true) to run database migrations on startup. + */ + io.ebean.DatabaseBuilder builder(); + + /** + * Return a java.sql.DataSource builder for the underlying database (url, username, password). + */ + io.ebean.datasource.DataSourceBuilder dataSourceBuilder(); + + /** + * Return a java.sql.DataSource builder for the underlying database (url, username, password). + */ + io.ebean.datasource.DataSourceBuilder extraDataSourceBuilder(); + + /** + * Return an ebean Database builder for the EXTRA database (extraUrl, extraDbUser, extraDbPassword). + */ + io.ebean.DatabaseBuilder extraDatabaseBuilder(); +} diff --git a/src/main/java/io/ebean/test/containers/InternalConfigDb.java b/src/main/java/io/ebean/test/containers/InternalConfigDb.java index 2dbedac..7045166 100644 --- a/src/main/java/io/ebean/test/containers/InternalConfigDb.java +++ b/src/main/java/io/ebean/test/containers/InternalConfigDb.java @@ -30,8 +30,12 @@ interface InternalConfigDb extends InternalConfig { String getExtraDbUser(); + String getExtraDbUserWithDefault(); + String getExtraDbPassword(); + String getExtraDbPasswordWithDefault(); + String getExtraDbExtensions(); String getExtraDbInitSqlFile(); diff --git a/src/main/java/io/ebean/test/containers/PostgresContainer.java b/src/main/java/io/ebean/test/containers/PostgresContainer.java index 7521432..4418131 100644 --- a/src/main/java/io/ebean/test/containers/PostgresContainer.java +++ b/src/main/java/io/ebean/test/containers/PostgresContainer.java @@ -1,7 +1,15 @@ package io.ebean.test.containers; /** - * Commands for controlling a postgres docker container. + * Run a postgres docker container for testing purposes. + *
{@code
+ *
+ * PostgresContainer container = PostgresContainer.builder("15")
+ * .dbName("my_test")
+ * .build()
+ * .start();
+ *
+ * }
*/
public class PostgresContainer extends BasePostgresContainer{@code
+ *
+ * PostgresContainer container = PostgresContainer.builder("15")
+ * .dbName("my_test")
+ * .build()
+ * .start();
+ *
+ * }
*/
public static Builder builder(String version) {
return new Builder(version);
diff --git a/src/test/java/io/ebean/test/containers/PostgisContainerTest.java b/src/test/java/io/ebean/test/containers/PostgisContainerTest.java
index 4342e46..550cc7b 100644
--- a/src/test/java/io/ebean/test/containers/PostgisContainerTest.java
+++ b/src/test/java/io/ebean/test/containers/PostgisContainerTest.java
@@ -1,5 +1,7 @@
package io.ebean.test.containers;
+import io.ebean.Database;
+import io.ebean.datasource.DataSourcePool;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
@@ -11,7 +13,7 @@
class PostgisContainerTest {
@Test
- void extraDb() {
+ void extraDb() throws java.sql.SQLException {
PostgisContainer container = PostgisContainer.builder("15")
.port(0)
.extraDb("myextra")
@@ -26,6 +28,19 @@ void extraDb() {
String jdbcUrl = container.config().jdbcUrl();
assertThat(jdbcUrl).contains(":" + containerConfig.port());
runSomeSql(container);
+
+ DataSourcePool dataSource = container.ebean().dataSourceBuilder().build();
+ try (Connection connection = dataSource.getConnection()) {
+ exeSql(connection, "insert into test_junk2 (acol) values (44)");
+ }
+ dataSource.shutdown();
+
+ Database ebean = container.ebean().builder().build();
+ ebean.sqlUpdate("insert into test_junk2 (acol) values (?)")
+ .setParameter(45)
+ .execute();
+
+ ebean.shutdown();
}
private void runSomeSql(PostgisContainer container) {
@@ -39,9 +54,9 @@ private void runSomeSql(PostgisContainer container) {
}
}
- private void exeSql(Connection connection, String sql) throws SQLException {
- PreparedStatement st = connection.prepareStatement(sql);
- st.execute();
- st.close();
+ private static void exeSql(Connection connection, String sql) throws SQLException {
+ try (PreparedStatement st = connection.prepareStatement(sql)) {
+ st.execute();
+ }
}
}
diff --git a/src/test/java/io/ebean/test/containers/PostgresContainerTest.java b/src/test/java/io/ebean/test/containers/PostgresContainerTest.java
index 0cb3656..bfb49db 100644
--- a/src/test/java/io/ebean/test/containers/PostgresContainerTest.java
+++ b/src/test/java/io/ebean/test/containers/PostgresContainerTest.java
@@ -1,6 +1,8 @@
package io.ebean.test.containers;
import io.avaje.applog.AppLog;
+import io.ebean.Database;
+import io.ebean.datasource.DataSourcePool;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
@@ -60,8 +62,10 @@ void randomPort() {
@Test
void defaultPort() {
PostgresContainer container = PostgresContainer.builder("15")
+ .dbName("my_test")
.extensions("hstore")
- .build();
+ .build()
+ .start();
container.startMaybe();
runSomeSql(container);
@@ -141,8 +145,30 @@ void start() throws SQLException, InterruptedException {
exeSql(connection, "drop table if exists test_doesnotexist");
}
- final String url = container.jdbcUrl();
- assertEquals(url, "jdbc:postgresql://localhost:9828/main_db");
+ assertEquals("jdbc:postgresql://localhost:9828/main_db", container.jdbcUrl());
+
+ Database ebean = container.ebean().builder().build();
+ ebean.sqlUpdate("insert into foo_main (mcol) values (?)")
+ .setParameter(2)
+ .execute();
+
+ Database extraEbean = container.ebean().extraDatabaseBuilder().build();
+ extraEbean.sqlUpdate("insert into foo_extra (acol) values (?)")
+ .setParameter(2)
+ .execute();
+
+ DataSourcePool dataSource = container.ebean().dataSourceBuilder().build();
+ try (Connection connection = dataSource.getConnection()) {
+ exeSql(connection, "insert into foo_main (mcol) values (1)");
+ }
+ dataSource.shutdown();
+
+ DataSourcePool extraDataSource = container.ebean().extraDataSourceBuilder().build();
+ try (Connection connection = extraDataSource.getConnection()) {
+ exeSql(connection, "insert into foo_extra (acol) values (1)");
+ }
+ extraDataSource.shutdown();
+
container.stopRemove();
log.log(INFO, "start() finished");
}