Skip to content

Commit 9718647

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 9718647

File tree

7 files changed

+181
-24
lines changed

7 files changed

+181
-24
lines changed

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

Lines changed: 85 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,30 @@
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
@@ -29,43 +40,93 @@ public void returnsNullForNull() {
2940
}
3041

3142
@Test
32-
public void invalidParameter() {
43+
public void missingUser() {
3344
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 );
45+
URI uri = DefaultSqlClientPool.parse( defaultUrl() );
46+
new DefaultSqlClientPoolConfiguration().connectOptions( uri );
3747
} );
3848
}
3949

4050
@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();
51+
public void testOptionsWithExtraProperties() {
52+
Map<String, String> params = new HashMap<>();
53+
params.put( "user", "hello" );
54+
params.put( "param1", "value1" );
55+
params.put( "param2", "value2" );
56+
params.put( "param3", "value3" );
57+
58+
assertOptions( createUrl( params ), defaultDb(), params );
4659
}
4760

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

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

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

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

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

Lines changed: 10 additions & 0 deletions
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 10 additions & 0 deletions
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 27 additions & 0 deletions
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

Lines changed: 39 additions & 0 deletions
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)