Skip to content

Commit a3fc84e

Browse files
authored
Merge pull request #120 from ebean-orm/feature/Add-ebean-sdk
Add EbeanSDK to make it easy to programmatically create a test ebean …
2 parents 7df6c93 + bec8e99 commit a3fc84e

File tree

10 files changed

+190
-15
lines changed

10 files changed

+190
-15
lines changed

pom.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@
9999
<optional>true</optional>
100100
</dependency>
101101

102+
<dependency>
103+
<groupId>io.ebean</groupId>
104+
<artifactId>ebean</artifactId>
105+
<version>17.0.0-RC2</version>
106+
<scope>provided</scope>
107+
<optional>true</optional>
108+
</dependency>
109+
102110
<dependency>
103111
<groupId>io.avaje</groupId>
104112
<artifactId>junit</artifactId>

src/main/java/io/ebean/test/containers/BaseDbBuilder.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,11 +478,21 @@ public String getExtraDbUser() {
478478
return extraDbUser;
479479
}
480480

481+
@Override
482+
public String getExtraDbUserWithDefault() {
483+
return extraDbUser != null ? extraDbUser : extraDb;
484+
}
485+
481486
@Override
482487
public String getExtraDbPassword() {
483488
return extraDbPassword;
484489
}
485490

491+
@Override
492+
public String getExtraDbPasswordWithDefault() {
493+
return extraDbPassword != null ? extraDbPassword : password;
494+
}
495+
486496
@Override
487497
public String getExtraDbExtensions() {
488498
return extraDbExtensions;

src/main/java/io/ebean/test/containers/BasePostgresContainer.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private void createExtraDb(Connection connection, boolean withDrop) {
5858
dropDatabaseIfExists(connection, extraDb);
5959
dropRoleIfExists(connection, extraUser);
6060
}
61-
createRole(connection, extraUser, getWithDefault(dbConfig.getExtraDbPassword(), dbConfig.getPassword()));
61+
createRole(connection, extraUser, dbConfig.getExtraDbPasswordWithDefault());
6262
if (databaseNotExists(connection, extraDb)) {
6363
createExtraDatabase(connection, extraDb, extraUser);
6464
}
@@ -127,7 +127,7 @@ private void addExtensions(String dbExtensions, String jdbcUrl) {
127127
* Additionally we don't create an extra user IF it is the same as the main db user.
128128
*/
129129
private String getExtraDbUser() {
130-
String extraUser = getWithDefault(dbConfig.getExtraDbUser(), dbConfig.getExtraDb());
130+
String extraUser = dbConfig.getExtraDbUserWithDefault();
131131
return extraUser != null && !extraUser.equals(dbConfig.getUsername()) ? extraUser : null;
132132
}
133133

@@ -147,10 +147,6 @@ private ProcessBuilder sqlFileProcess(String dbUser, String dbName, String conta
147147
return createProcessBuilder(args);
148148
}
149149

150-
private String getWithDefault(String value, String defaultValue) {
151-
return value == null ? defaultValue : value;
152-
}
153-
154150
private List<String> parseExtensions(String dbExtn) {
155151
return TrimSplit.split(dbExtn);
156152
}

src/main/java/io/ebean/test/containers/DbContainer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,14 @@ public boolean startContainerOnly() {
107107
return true;
108108
}
109109

110+
/**
111+
* Return the Ebean SDK to obtain Ebean Database and Ebean DataSource builders
112+
* for the underlying container.
113+
*/
114+
public EbeanSDK ebean() {
115+
return new EbeanAdapter(dbConfig);
116+
}
117+
110118
/**
111119
* If we are using FastStartMode just check is the DB exists and if so assume it is all created correctly.
112120
* <p>
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.ebean.test.containers;
2+
3+
final class EbeanAdapter implements EbeanSDK {
4+
5+
private final InternalConfigDb dbConfig;
6+
7+
EbeanAdapter(InternalConfigDb dbConfig) {
8+
this.dbConfig = dbConfig;
9+
}
10+
11+
@Override
12+
public io.ebean.DatabaseBuilder builder() {
13+
return io.ebean.Database.builder()
14+
.dataSourceBuilder(dataSourceBuilder())
15+
.name(dbConfig.getDbName())
16+
.register(false)
17+
.ddlGenerate(true)
18+
.ddlRun(true);
19+
}
20+
21+
22+
@Override
23+
public io.ebean.datasource.DataSourceBuilder dataSourceBuilder() {
24+
return io.ebean.datasource.DataSourceBuilder.create()
25+
.url(dbConfig.jdbcUrl())
26+
.username(dbConfig.getUsername())
27+
.password(dbConfig.getPassword());
28+
}
29+
30+
31+
@Override
32+
public io.ebean.datasource.DataSourceBuilder extraDataSourceBuilder() {
33+
return io.ebean.datasource.DataSourceBuilder.create()
34+
.url(dbConfig.jdbcExtraUrl())
35+
.username(dbConfig.getExtraDbUserWithDefault())
36+
.password(dbConfig.getExtraDbPasswordWithDefault());
37+
}
38+
39+
@Override
40+
public io.ebean.DatabaseBuilder extraDatabaseBuilder() {
41+
return io.ebean.Database.builder()
42+
.dataSourceBuilder(extraDataSourceBuilder())
43+
.name(dbConfig.getExtraDb())
44+
.defaultDatabase(false)
45+
.register(false);
46+
}
47+
48+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package io.ebean.test.containers;
2+
3+
/**
4+
* Ebean SDK extension to create builders for Ebean Database and DataSource.
5+
* <pre>{@code
6+
*
7+
* PostgresContainer container = PostgresContainer.builder("15")
8+
* .dbName("my_test")
9+
* .build()
10+
* .start();
11+
*
12+
* io.ebean.Database ebean = container.ebean().builder().build();
13+
* // create ebean database and use it
14+
*
15+
* }</pre>
16+
*/
17+
public interface EbeanSDK {
18+
19+
/**
20+
* Return an ebean Database builder for the underlying database (url, username, password).
21+
* <p>
22+
* The name of the ebean database will be dbName set for the container.
23+
* <p>
24+
* This builder will have ddlGenerate set to true and ddlRun set to true. Alternatively,
25+
* set runMigrations(true) to run database migrations on startup.
26+
*/
27+
io.ebean.DatabaseBuilder builder();
28+
29+
/**
30+
* Return a java.sql.DataSource builder for the underlying database (url, username, password).
31+
*/
32+
io.ebean.datasource.DataSourceBuilder dataSourceBuilder();
33+
34+
/**
35+
* Return a java.sql.DataSource builder for the underlying database (url, username, password).
36+
*/
37+
io.ebean.datasource.DataSourceBuilder extraDataSourceBuilder();
38+
39+
/**
40+
* Return an ebean Database builder for the EXTRA database (extraUrl, extraDbUser, extraDbPassword).
41+
*/
42+
io.ebean.DatabaseBuilder extraDatabaseBuilder();
43+
}

src/main/java/io/ebean/test/containers/InternalConfigDb.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,12 @@ interface InternalConfigDb extends InternalConfig {
3030

3131
String getExtraDbUser();
3232

33+
String getExtraDbUserWithDefault();
34+
3335
String getExtraDbPassword();
3436

37+
String getExtraDbPasswordWithDefault();
38+
3539
String getExtraDbExtensions();
3640

3741
String getExtraDbInitSqlFile();

src/main/java/io/ebean/test/containers/PostgresContainer.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
package io.ebean.test.containers;
22

33
/**
4-
* Commands for controlling a postgres docker container.
4+
* Run a postgres docker container for testing purposes.
5+
* <pre>{@code
6+
*
7+
* PostgresContainer container = PostgresContainer.builder("15")
8+
* .dbName("my_test")
9+
* .build()
10+
* .start();
11+
*
12+
* }</pre>
513
*/
614
public class PostgresContainer extends BasePostgresContainer<PostgresContainer> {
715

@@ -13,6 +21,15 @@ public PostgresContainer start() {
1321

1422
/**
1523
* Create a builder for PostgresContainer.
24+
*
25+
* <pre>{@code
26+
*
27+
* PostgresContainer container = PostgresContainer.builder("15")
28+
* .dbName("my_test")
29+
* .build()
30+
* .start();
31+
*
32+
* }</pre>
1633
*/
1734
public static Builder builder(String version) {
1835
return new Builder(version);

src/test/java/io/ebean/test/containers/PostgisContainerTest.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.ebean.test.containers;
22

3+
import io.ebean.Database;
4+
import io.ebean.datasource.DataSourcePool;
35
import org.junit.jupiter.api.Test;
46

57
import java.sql.Connection;
@@ -11,7 +13,7 @@
1113
class PostgisContainerTest {
1214

1315
@Test
14-
void extraDb() {
16+
void extraDb() throws java.sql.SQLException {
1517
PostgisContainer container = PostgisContainer.builder("15")
1618
.port(0)
1719
.extraDb("myextra")
@@ -26,6 +28,19 @@ void extraDb() {
2628
String jdbcUrl = container.config().jdbcUrl();
2729
assertThat(jdbcUrl).contains(":" + containerConfig.port());
2830
runSomeSql(container);
31+
32+
DataSourcePool dataSource = container.ebean().dataSourceBuilder().build();
33+
try (Connection connection = dataSource.getConnection()) {
34+
exeSql(connection, "insert into test_junk2 (acol) values (44)");
35+
}
36+
dataSource.shutdown();
37+
38+
Database ebean = container.ebean().builder().build();
39+
ebean.sqlUpdate("insert into test_junk2 (acol) values (?)")
40+
.setParameter(45)
41+
.execute();
42+
43+
ebean.shutdown();
2944
}
3045

3146
private void runSomeSql(PostgisContainer container) {
@@ -39,9 +54,9 @@ private void runSomeSql(PostgisContainer container) {
3954
}
4055
}
4156

42-
private void exeSql(Connection connection, String sql) throws SQLException {
43-
PreparedStatement st = connection.prepareStatement(sql);
44-
st.execute();
45-
st.close();
57+
private static void exeSql(Connection connection, String sql) throws SQLException {
58+
try (PreparedStatement st = connection.prepareStatement(sql)) {
59+
st.execute();
60+
}
4661
}
4762
}

src/test/java/io/ebean/test/containers/PostgresContainerTest.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.ebean.test.containers;
22

33
import io.avaje.applog.AppLog;
4+
import io.ebean.Database;
5+
import io.ebean.datasource.DataSourcePool;
46
import org.junit.jupiter.api.Test;
57

68
import java.sql.Connection;
@@ -60,8 +62,10 @@ void randomPort() {
6062
@Test
6163
void defaultPort() {
6264
PostgresContainer container = PostgresContainer.builder("15")
65+
.dbName("my_test")
6366
.extensions("hstore")
64-
.build();
67+
.build()
68+
.start();
6569

6670
container.startMaybe();
6771
runSomeSql(container);
@@ -141,8 +145,30 @@ void start() throws SQLException, InterruptedException {
141145
exeSql(connection, "drop table if exists test_doesnotexist");
142146
}
143147

144-
final String url = container.jdbcUrl();
145-
assertEquals(url, "jdbc:postgresql://localhost:9828/main_db");
148+
assertEquals("jdbc:postgresql://localhost:9828/main_db", container.jdbcUrl());
149+
150+
Database ebean = container.ebean().builder().build();
151+
ebean.sqlUpdate("insert into foo_main (mcol) values (?)")
152+
.setParameter(2)
153+
.execute();
154+
155+
Database extraEbean = container.ebean().extraDatabaseBuilder().build();
156+
extraEbean.sqlUpdate("insert into foo_extra (acol) values (?)")
157+
.setParameter(2)
158+
.execute();
159+
160+
DataSourcePool dataSource = container.ebean().dataSourceBuilder().build();
161+
try (Connection connection = dataSource.getConnection()) {
162+
exeSql(connection, "insert into foo_main (mcol) values (1)");
163+
}
164+
dataSource.shutdown();
165+
166+
DataSourcePool extraDataSource = container.ebean().extraDataSourceBuilder().build();
167+
try (Connection connection = extraDataSource.getConnection()) {
168+
exeSql(connection, "insert into foo_extra (acol) values (1)");
169+
}
170+
extraDataSource.shutdown();
171+
146172
container.stopRemove();
147173
log.log(INFO, "start() finished");
148174
}

0 commit comments

Comments
 (0)