Skip to content

Commit 22487c5

Browse files
committed
[#1059] Test SqlConnectOptions creation
It basically updates the existing test case so that it can tests the options creation for all databases.
1 parent 6646a80 commit 22487c5

File tree

7 files changed

+185
-26
lines changed

7 files changed

+185
-26
lines changed

hibernate-reactive-core/src/test/java/org/hibernate/reactive/configuration/JdbcUrlParserTest.java

+89-26
Original file line numberDiff line numberDiff line change
@@ -5,67 +5,130 @@
55
*/
66
package org.hibernate.reactive.configuration;
77

8+
import java.net.URI;
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
812
import org.hibernate.HibernateError;
913
import org.hibernate.reactive.pool.impl.DefaultSqlClientPool;
1014
import org.hibernate.reactive.pool.impl.DefaultSqlClientPoolConfiguration;
1115

1216
import org.junit.Test;
1317

14-
import java.net.URI;
15-
1618
import io.vertx.sqlclient.SqlConnectOptions;
1719

1820
import static org.assertj.core.api.Assertions.assertThat;
21+
import static org.hibernate.reactive.containers.DatabaseConfiguration.DBType.SQLSERVER;
22+
import static org.hibernate.reactive.containers.DatabaseConfiguration.createJdbcUrl;
23+
import static org.hibernate.reactive.containers.DatabaseConfiguration.dbType;
1924
import static org.junit.Assert.assertThrows;
2025

26+
/**
27+
* Test the correct creation of the {@link SqlConnectOptions}
28+
* given a JDBC connection URL.
29+
* <p>
30+
* This test doesn't require docker.
31+
*/
2132
public class JdbcUrlParserTest {
2233

2334
@Test
2435
public void returnsNullForNull() {
25-
assertThrows( HibernateError.class, () -> {
36+
final HibernateError error = assertThrows( HibernateError.class, () -> {
2637
URI uri = DefaultSqlClientPool.parse( null );
2738
assertThat( uri ).isNull();
2839
} );
40+
assertThat( error.getMessage() ).contains( "was not provided" );
2941
}
3042

3143
@Test
32-
public void invalidParameter() {
33-
assertThrows( HibernateError.class, () -> {
34-
URI uri = DefaultSqlClientPool.parse( "jdbc:postgresql://localhost:5432/hreact" );
35-
DefaultSqlClientPoolConfiguration cfg = new DefaultSqlClientPoolConfiguration();
36-
final SqlConnectOptions connectOptions = cfg.connectOptions( uri );
44+
public void missingUser() {
45+
final HibernateError error = assertThrows( HibernateError.class, () -> {
46+
URI uri = DefaultSqlClientPool.parse( defaultUrl() );
47+
new DefaultSqlClientPoolConfiguration().connectOptions( uri );
3748
} );
49+
assertThat( error.getMessage() ).contains( "database username not specified" );
3850
}
3951

4052
@Test
41-
public void parameters() {
42-
URI uri = DefaultSqlClientPool.parse( "jdbc:postgresql://localhost:5432/hreact?user=hello");
43-
DefaultSqlClientPoolConfiguration cfg = new DefaultSqlClientPoolConfiguration();
44-
final SqlConnectOptions connectOptions = cfg.connectOptions( uri );
45-
assertThat(connectOptions).isNotNull();
53+
public void testOptionsWithExtraProperties() {
54+
Map<String, String> params = new HashMap<>();
55+
params.put( "user", "hello" );
56+
params.put( "param1", "value1" );
57+
params.put( "param2", "value2" );
58+
params.put( "param3", "value3" );
59+
60+
assertOptions( createUrl( params ), defaultDb(), params );
4661
}
4762

4863
@Test
49-
public void uriCreation() {
50-
URI uri = DefaultSqlClientPool.parse( "jdbc:postgresql://localhost:5432/hreact");
51-
assertThat(uri).isNotNull();
64+
public void testOptionsWithoutExtraProperties() {
65+
// Without a user we would have an exception
66+
Map<String, String> params = new HashMap<>();
67+
params.put( "user", "PerryThePlatypus" );
68+
69+
assertOptions( createUrl( params ), defaultDb(), params );
5270
}
5371

5472
@Test
55-
public void parsePort() {
56-
URI uri = DefaultSqlClientPool.parse( "jdbc:postgresql://localhost:5432/hreact");
57-
assertThat(uri).hasPort(5432);
73+
public void testOptionsWithPasswordAndProperties() {
74+
Map<String, String> params = new HashMap<>();
75+
params.put( "password", "helloPwd" );
76+
params.put( "user", "username" );
77+
params.put( "param2", "Value2" );
78+
79+
assertOptions( createUrl( params ), defaultDb(), params );
5880
}
5981

6082
@Test
61-
public void parseHost() {
62-
URI uri = DefaultSqlClientPool.parse( "jdbc:postgresql://localhost:5432/hreact");
63-
assertThat(uri).hasHost("localhost");
83+
public void testDatabaseAsProperty() {
84+
Map<String, String> params = new HashMap<>();
85+
params.put( "database", "helloDatabase" );
86+
params.put( "user", "PerryThePlatypus" );
87+
params.put( "password", "XxXxX" );
88+
params.put( "param2", "Value2" );
89+
90+
assertOptions( createUrl( params ), "helloDatabase", params );
6491
}
6592

66-
@Test
67-
public void parseScheme() {
68-
URI uri = DefaultSqlClientPool.parse( "jdbc:postgresql://localhost:5432/hreact");
69-
assertThat(uri).hasScheme("postgresql");
93+
/**
94+
* Create the default {@link SqlConnectOptions} with the given extra properties
95+
* and assert that's correct.
96+
*
97+
* @return the created options in case a test needs custom extra assertions
98+
*/
99+
private SqlConnectOptions assertOptions(String url, String expectedDbName, Map<String, String> parameters) {
100+
URI uri = DefaultSqlClientPool.parse( url );
101+
SqlConnectOptions options = new DefaultSqlClientPoolConfiguration().connectOptions( uri );
102+
103+
// These keys won't be mapped as properties
104+
String username = parameters.remove( "user" );
105+
String password = parameters.remove( "password" );
106+
parameters.remove( "database" );
107+
108+
assertThat( options ).as( "URL: " + url ).isNotNull();
109+
assertThat( options.getUser() ).as( "URL: " + url ).isEqualTo( username );
110+
assertThat( options.getPassword() ).as( "URL: " + url ).isEqualTo( password );
111+
assertThat( options.getDatabase() ).as( "URL: " + url ).isEqualTo( expectedDbName );
112+
assertThat( options.getHost() ).as( "URL: " + url ).isEqualTo( "localhost" );
113+
assertThat( options.getPort() ).as( "URL: " + url ).isEqualTo( dbType().getDefaultPort() );
114+
115+
// Check extra properties
116+
assertThat( options.getProperties() ).as( "URL: " + url ).containsExactlyInAnyOrderEntriesOf( parameters );
117+
return options;
118+
}
119+
120+
private String defaultUrl() {
121+
return createUrl( new HashMap<>() );
122+
}
123+
124+
/**
125+
* Create the JDBC Url with the additional extra properties (if any)
126+
*/
127+
private String createUrl(Map<String, String> properties) {
128+
return createJdbcUrl( "localhost", dbType().getDefaultPort(), defaultDb(), properties );
129+
}
130+
131+
private String defaultDb() {
132+
return dbType() == SQLSERVER ? "" : "hreactDB";
70133
}
71134
}

hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/DB2Database.java

+10
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,16 @@ private String address() {
125125
return getRegularJdbcUrl();
126126
}
127127

128+
@Override
129+
public String jdbcStartQuery() {
130+
return ":";
131+
}
132+
133+
@Override
134+
public String jdbcParamDelimiter() {
135+
return ";";
136+
}
137+
128138
private static String buildJdbcUrlWithCredentials(String jdbcUrl) {
129139
return jdbcUrl + ":user=" + db2.getUsername() + ";password=" + db2.getPassword() + ";";
130140
}

hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/DatabaseConfiguration.java

+5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.hibernate.reactive.containers;
77

88
import java.util.Arrays;
9+
import java.util.Map;
910
import java.util.Objects;
1011
import java.util.stream.Stream;
1112

@@ -92,6 +93,10 @@ public static String getUri() {
9293
return dbType().configuration.getUri();
9394
}
9495

96+
public static String createJdbcUrl(String host, int port, String database, Map<String, String> properties) {
97+
return dbType().configuration.createJdbcUrl( host, port, database, properties );
98+
}
99+
95100
public static String getDatatypeQuery(String tableName, String columnName) {
96101
return dbType().configuration.getNativeDatatypeQuery( tableName, columnName );
97102
}

hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MSSQLServerDatabase.java

+10
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,16 @@ private String address() {
126126
return getRegularJdbcUrl();
127127
}
128128

129+
@Override
130+
public String jdbcStartQuery() {
131+
return ";";
132+
}
133+
134+
@Override
135+
public String jdbcParamDelimiter() {
136+
return ";";
137+
}
138+
129139
private String buildJdbcUrlWithCredentials(String jdbcUrl) {
130140
return jdbcUrl + ";user=" + mssqlserver.getUsername() + ";password=" + mssqlserver.getPassword();
131141
}

hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MariaDatabase.java

+5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ public String getJdbcUrl() {
3333
return buildJdbcUrlWithCredentials( address() );
3434
}
3535

36+
@Override
37+
public String getScheme() {
38+
return "mariadb:";
39+
}
40+
3641
@Override
3742
public String getUri() {
3843
return buildUriWithCredentials( address() );

hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/OracleDatabase.java

+27
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,33 @@ private String getRegularJdbcUrl() {
9898
return "jdbc:oracle:thin:" + getCredentials() + "@localhost:1521/" + oracle.getDatabaseName();
9999
}
100100

101+
@Override
102+
public String createJdbcUrl(String host, int port, String database, Map<String, String> params) {
103+
final StringBuilder paramsBuilder = new StringBuilder();
104+
if ( params != null && !params.isEmpty() ) {
105+
params.forEach( (key, value) -> {
106+
paramsBuilder.append( jdbcParamDelimiter() );
107+
paramsBuilder.append( key );
108+
paramsBuilder.append( "=" );
109+
paramsBuilder.append( value );
110+
} );
111+
}
112+
113+
String url = "jdbc:oracle:thin:@" + host + ":" + port;
114+
if ( database != null && !database.isBlank() ) {
115+
url += "/" + database;
116+
}
117+
if ( paramsBuilder.length() > 0 ) {
118+
url += jdbcStartQuery() + paramsBuilder.substring( 1 );
119+
}
120+
return url;
121+
}
122+
123+
@Override
124+
public String getScheme() {
125+
return "oracle:thin:";
126+
}
127+
101128
@Override
102129
public String getUri() {
103130
// The url is different here because we expect it to work with io.vertx.oracleclient.impl.OracleConnectionUriParser

hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/TestableDatabase.java

+39
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
*/
66
package org.hibernate.reactive.containers;
77

8+
import java.util.Map;
9+
10+
import static org.hibernate.reactive.containers.DatabaseConfiguration.dbType;
11+
812
/**
913
* A database that we use for testing.
1014
*/
@@ -14,9 +18,44 @@ public interface TestableDatabase {
1418

1519
String getUri();
1620

21+
/**
22+
* @return the database scheme for the connection. Example: {@code mysql:}
23+
*/
24+
default String getScheme() {
25+
return dbType().name().toLowerCase() + ":";
26+
}
27+
1728
default String getNativeDatatypeQuery(String tableName, String columnName) {
1829
return "select data_type from information_schema.columns where table_name = '" + tableName + "' and column_name = '" + columnName + "'";
1930
}
2031

2132
String getExpectedNativeDatatype(Class<?> dataType);
33+
34+
default String createJdbcUrl(String host, int port, String database, Map<String, String> params) {
35+
final StringBuilder paramsBuilder = new StringBuilder();
36+
if ( params != null && !params.isEmpty() ) {
37+
params.forEach( (key, value) -> {
38+
paramsBuilder.append( jdbcParamDelimiter() );
39+
paramsBuilder.append( key );
40+
paramsBuilder.append( "=" );
41+
paramsBuilder.append( value );
42+
} );
43+
}
44+
String url = "jdbc:" + getScheme() + "//" + host + ":" + port;
45+
if ( database != null && !database.isBlank() ) {
46+
url += "/" + database;
47+
}
48+
if ( paramsBuilder.length() > 0 ) {
49+
url += jdbcStartQuery() + paramsBuilder.substring( 1 );
50+
}
51+
return url;
52+
}
53+
54+
default String jdbcStartQuery() {
55+
return "?";
56+
}
57+
58+
default String jdbcParamDelimiter() {
59+
return "&";
60+
}
2261
}

0 commit comments

Comments
 (0)