Skip to content

Commit 6b673e9

Browse files
committed
Introduce abstract baseclass for integration tests
[#185]
1 parent d854b19 commit 6b673e9

8 files changed

+123
-122
lines changed

src/test/java/io/r2dbc/postgresql/AbstractCodecIntegrationTests.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,9 @@
2222
import io.r2dbc.postgresql.api.PostgresqlResult;
2323
import io.r2dbc.postgresql.api.PostgresqlStatement;
2424
import io.r2dbc.postgresql.codec.Json;
25-
import io.r2dbc.postgresql.util.PostgresqlServerExtension;
2625
import io.r2dbc.spi.Connection;
2726
import org.assertj.core.data.Offset;
2827
import org.junit.jupiter.api.Test;
29-
import org.junit.jupiter.api.extension.RegisterExtension;
3028
import org.springframework.util.StreamUtils;
3129
import reactor.core.publisher.Mono;
3230
import reactor.test.StepVerifier;
@@ -56,14 +54,7 @@
5654

5755
import static org.assertj.core.api.Assertions.assertThat;
5856

59-
abstract class AbstractCodecIntegrationTests {
60-
61-
@RegisterExtension
62-
static final PostgresqlServerExtension SERVER = new PostgresqlServerExtension();
63-
64-
private final PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(getConfiguration(SERVER));
65-
66-
protected abstract PostgresqlConnectionConfiguration getConfiguration(PostgresqlServerExtension server);
57+
abstract class AbstractCodecIntegrationTests extends AbstractIntegrationTests {
6758

6859
@Test
6960
void bigDecimal() {
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Copyright 2019 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.r2dbc.postgresql;
18+
19+
import io.r2dbc.postgresql.api.PostgresqlConnection;
20+
import io.r2dbc.postgresql.util.PostgresqlServerExtension;
21+
import org.junit.jupiter.api.AfterEach;
22+
import org.junit.jupiter.api.BeforeEach;
23+
import org.junit.jupiter.api.extension.RegisterExtension;
24+
import reactor.test.StepVerifier;
25+
26+
/**
27+
* Support class for integration tests using {@link PostgresqlConnection}.
28+
*/
29+
abstract class AbstractIntegrationTests {
30+
31+
@RegisterExtension
32+
static final PostgresqlServerExtension SERVER = new PostgresqlServerExtension();
33+
34+
PostgresqlConnectionFactory connectionFactory;
35+
36+
PostgresqlConnection connection;
37+
38+
/**
39+
* Entry-point to obtain a {@link PostgresqlConnectionFactory}.
40+
*
41+
* @return a {@link PostgresqlConnectionFactory}.
42+
*/
43+
protected PostgresqlConnectionFactory getConnectionFactory() {
44+
45+
PostgresqlConnectionConfiguration.Builder builder = PostgresqlConnectionConfiguration.builder()
46+
.database(SERVER.getDatabase())
47+
.host(SERVER.getHost())
48+
.port(SERVER.getPort())
49+
.password(SERVER.getPassword())
50+
.username(SERVER.getUsername());
51+
52+
customize(builder);
53+
return new PostgresqlConnectionFactory(builder.build());
54+
}
55+
56+
/**
57+
* Template method to customize {@link PostgresqlConnectionConfiguration.Builder}.
58+
*
59+
* @param builder builder to customize.
60+
*/
61+
protected void customize(PostgresqlConnectionConfiguration.Builder builder) {
62+
63+
}
64+
65+
@BeforeEach
66+
void setUp() {
67+
this.connectionFactory = getConnectionFactory();
68+
this.connection = this.connectionFactory.create().block();
69+
}
70+
71+
@AfterEach
72+
void tearDown() {
73+
this.connection.close().as(StepVerifier::create).verifyComplete();
74+
}
75+
}

src/test/java/io/r2dbc/postgresql/CodecBinaryFormatIntegrationTests.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,11 @@
1616

1717
package io.r2dbc.postgresql;
1818

19-
import io.r2dbc.postgresql.util.PostgresqlServerExtension;
20-
2119
final class CodecBinaryFormatIntegrationTests extends AbstractCodecIntegrationTests {
2220

2321
@Override
24-
protected PostgresqlConnectionConfiguration getConfiguration(PostgresqlServerExtension server) {
25-
return PostgresqlConnectionConfiguration.builder()
26-
.database(SERVER.getDatabase())
27-
.host(SERVER.getHost())
28-
.port(SERVER.getPort())
29-
.password(SERVER.getPassword())
30-
.username(SERVER.getUsername())
31-
.forceBinary(true)
32-
.build();
22+
protected void customize(PostgresqlConnectionConfiguration.Builder builder) {
23+
builder.forceBinary(true);
3324
}
25+
3426
}

src/test/java/io/r2dbc/postgresql/CodecExtensionIntegrationTests.java

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,55 +26,42 @@
2626
import io.r2dbc.postgresql.message.Format;
2727
import io.r2dbc.postgresql.type.PostgresqlObjectId;
2828
import io.r2dbc.postgresql.util.ByteBufUtils;
29-
import io.r2dbc.postgresql.util.PostgresqlServerExtension;
3029
import org.junit.jupiter.api.AfterEach;
3130
import org.junit.jupiter.api.BeforeEach;
3231
import org.junit.jupiter.api.Test;
33-
import org.junit.jupiter.api.extension.RegisterExtension;
3432
import org.reactivestreams.Publisher;
3533
import reactor.core.publisher.Mono;
3634
import reactor.test.StepVerifier;
3735

3836
import static org.assertj.core.api.Assertions.assertThat;
3937

40-
public class CodecExtensionIntegrationTests {
41-
42-
@RegisterExtension
43-
static final PostgresqlServerExtension SERVER = new PostgresqlServerExtension();
44-
45-
private final PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(PostgresqlConnectionConfiguration.builder()
46-
.database(SERVER.getDatabase())
47-
.host(SERVER.getHost())
48-
.port(SERVER.getPort())
49-
.password(SERVER.getPassword())
50-
.username(SERVER.getUsername())
51-
.build());
38+
public class CodecExtensionIntegrationTests extends AbstractIntegrationTests {
5239

5340
@BeforeEach
5441
void setUp() {
5542
JsonCodecRegistrar.REGISTER = true;
43+
super.setUp();
5644
}
5745

5846
@AfterEach
5947
void tearDown() {
6048
JsonCodecRegistrar.REGISTER = false;
49+
super.tearDown();
6150
}
6251

6352
@Test
6453
void shouldRegisterCodec() {
6554

66-
PostgresqlConnection connection = (PostgresqlConnection) this.connectionFactory.create().block();
67-
68-
connection.createStatement("DROP TABLE IF EXISTS codec_json_test;CREATE TABLE codec_json_test (my_value json);")
55+
this.connection.createStatement("DROP TABLE IF EXISTS codec_json_test;CREATE TABLE codec_json_test (my_value json);")
6956
.execute().flatMap(PostgresqlResult::getRowsUpdated).then()
7057
.as(StepVerifier::create).verifyComplete();
7158

72-
connection.createStatement("INSERT INTO codec_json_test VALUES('{ \"customer\": \"John Doe\", \"items\": {\"product\": \"Beer\",\"qty\": 6}}')")
59+
this.connection.createStatement("INSERT INTO codec_json_test VALUES('{ \"customer\": \"John Doe\", \"items\": {\"product\": \"Beer\",\"qty\": 6}}')")
7360
.execute().flatMap(PostgresqlResult::getRowsUpdated).then()
7461
.as(StepVerifier::create).verifyComplete();
7562

7663

77-
connection.createStatement("SELECT * FROM codec_json_test")
64+
this.connection.createStatement("SELECT * FROM codec_json_test")
7865
.execute()
7966
.flatMap(it -> it.map((row, rowMetadata) -> row.get(0)))
8067
.cast(Json.class)

src/test/java/io/r2dbc/postgresql/CodecTextFormatIntegrationTests.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,6 @@
1616

1717
package io.r2dbc.postgresql;
1818

19-
import io.r2dbc.postgresql.util.PostgresqlServerExtension;
20-
2119
final class CodecTextFormatIntegrationTests extends AbstractCodecIntegrationTests {
2220

23-
@Override
24-
protected PostgresqlConnectionConfiguration getConfiguration(PostgresqlServerExtension server) {
25-
return PostgresqlConnectionConfiguration.builder()
26-
.database(SERVER.getDatabase())
27-
.host(SERVER.getHost())
28-
.port(SERVER.getPort())
29-
.password(SERVER.getPassword())
30-
.username(SERVER.getUsername())
31-
.build();
32-
}
3321
}

src/test/java/io/r2dbc/postgresql/PostgresNotificationIntegrationTests.java

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717
package io.r2dbc.postgresql;
1818

1919
import io.r2dbc.postgresql.api.Notification;
20-
import io.r2dbc.postgresql.util.PostgresqlServerExtension;
2120
import org.junit.jupiter.api.Test;
22-
import org.junit.jupiter.api.extension.RegisterExtension;
2321
import reactor.core.Disposable;
2422
import reactor.test.StepVerifier;
2523

@@ -30,36 +28,22 @@
3028

3129
import static org.assertj.core.api.Assertions.assertThat;
3230

33-
final class PostgresNotificationIntegrationTests {
34-
35-
@RegisterExtension
36-
static final PostgresqlServerExtension SERVER = new PostgresqlServerExtension();
37-
38-
private final PostgresqlConnectionConfiguration configuration = PostgresqlConnectionConfiguration.builder()
39-
.database(SERVER.getDatabase())
40-
.host(SERVER.getHost())
41-
.port(SERVER.getPort())
42-
.password(SERVER.getPassword())
43-
.username(SERVER.getUsername())
44-
.forceBinary(true)
45-
.build();
46-
47-
private final PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(this.configuration);
31+
final class PostgresNotificationIntegrationTests extends AbstractIntegrationTests {
4832

4933
@Test
5034
void shouldReceivePubSubNotifications() throws Exception {
5135

5236
BlockingQueue<Notification> notifications = new LinkedBlockingQueue<>();
5337

5438
CountDownLatch await = new CountDownLatch(1);
55-
Disposable listener = connectionFactory.create().flatMapMany(it -> {
39+
Disposable listener = this.connectionFactory.create().flatMapMany(it -> {
5640
return it.createStatement("LISTEN mymessage").execute().doOnComplete(await::countDown)
5741
.thenMany(it.getNotifications()).doOnCancel(() -> it.close().subscribe());
5842
}).doOnNext(notifications::add).subscribe();
5943

6044
await.await(10, TimeUnit.SECONDS);
6145

62-
connectionFactory.create().flatMapMany(it -> it.createStatement("NOTIFY mymessage, 'Mötorhead'").execute().thenMany(it.close()))
46+
this.connectionFactory.create().flatMapMany(it -> it.createStatement("NOTIFY mymessage, 'Mötorhead'").execute().thenMany(it.close()))
6347
.as(StepVerifier::create).verifyComplete();
6448

6549
Notification notification = notifications.poll(10, TimeUnit.SECONDS);

src/test/java/io/r2dbc/postgresql/PostgresqlStatementErrorsIntegrationTests.java

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,64 +16,35 @@
1616

1717
package io.r2dbc.postgresql;
1818

19-
import io.r2dbc.postgresql.util.PostgresqlServerExtension;
20-
import io.r2dbc.spi.Connection;
21-
import io.r2dbc.spi.ConnectionFactories;
22-
import io.r2dbc.spi.ConnectionFactory;
23-
import io.r2dbc.spi.ConnectionFactoryOptions;
2419
import io.r2dbc.spi.R2dbcDataIntegrityViolationException;
2520
import io.r2dbc.spi.Result;
2621
import org.junit.jupiter.api.AfterEach;
2722
import org.junit.jupiter.api.BeforeEach;
2823
import org.junit.jupiter.api.Test;
29-
import org.junit.jupiter.api.extension.RegisterExtension;
3024
import reactor.core.publisher.Flux;
31-
import reactor.core.publisher.Mono;
3225
import reactor.test.StepVerifier;
3326

34-
import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.POSTGRESQL_DRIVER;
35-
import static io.r2dbc.spi.ConnectionFactoryOptions.DATABASE;
36-
import static io.r2dbc.spi.ConnectionFactoryOptions.DRIVER;
37-
import static io.r2dbc.spi.ConnectionFactoryOptions.HOST;
38-
import static io.r2dbc.spi.ConnectionFactoryOptions.PASSWORD;
39-
import static io.r2dbc.spi.ConnectionFactoryOptions.PORT;
40-
import static io.r2dbc.spi.ConnectionFactoryOptions.USER;
41-
42-
final class PostgresqlStatementErrorsIntegrationTests {
43-
44-
@RegisterExtension
45-
static final PostgresqlServerExtension SERVER = new PostgresqlServerExtension();
46-
47-
ConnectionFactory connectionFactory = ConnectionFactories.get(ConnectionFactoryOptions.builder()
48-
.option(DRIVER, POSTGRESQL_DRIVER)
49-
.option(DATABASE, SERVER.getDatabase())
50-
.option(HOST, SERVER.getHost())
51-
.option(PORT, SERVER.getPort())
52-
.option(PASSWORD, SERVER.getPassword())
53-
.option(USER, SERVER.getUsername())
54-
.build());
55-
56-
Connection connection;
27+
final class PostgresqlStatementErrorsIntegrationTests extends AbstractIntegrationTests {
5728

5829
@BeforeEach
5930
void setUp() {
31+
super.setUp();
6032
SERVER.getJdbcOperations().execute("DROP TABLE IF EXISTS test");
61-
connection = Mono.from(connectionFactory.create()).block();
6233
}
6334

6435

6536
@AfterEach
6637
void tearDown() {
38+
super.tearDown();
6739
SERVER.getJdbcOperations().execute("DROP TABLE IF EXISTS test");
68-
Mono.from(connection.close()).block();
6940
}
7041

7142
@Test
7243
void shouldReportDataIntegrityViolationUsingSimpleFlow() {
7344

7445
SERVER.getJdbcOperations().execute("CREATE TABLE test (id SERIAL PRIMARY KEY)");
7546

76-
Flux<Integer> insert = Flux.from(connection.createStatement("INSERT INTO test (id) VALUES (1) RETURNING *").execute()).flatMap(Result::getRowsUpdated);
47+
Flux<Integer> insert = Flux.from(this.connection.createStatement("INSERT INTO test (id) VALUES (1) RETURNING *").execute()).flatMap(Result::getRowsUpdated);
7748

7849
insert.thenMany(insert).as(StepVerifier::create).verifyError(R2dbcDataIntegrityViolationException.class);
7950
}
@@ -83,7 +54,7 @@ void shouldReportDataIntegrityViolationUsingExtendedFlow() {
8354

8455
SERVER.getJdbcOperations().execute("CREATE TABLE test (id SERIAL PRIMARY KEY)");
8556

86-
Flux<Integer> insert = Flux.from(connection.createStatement("INSERT INTO test (id) VALUES ($1) RETURNING *").bind("$1", 1).execute()).flatMap(Result::getRowsUpdated);
57+
Flux<Integer> insert = Flux.from(this.connection.createStatement("INSERT INTO test (id) VALUES ($1) RETURNING *").bind("$1", 1).execute()).flatMap(Result::getRowsUpdated);
8758

8859
insert.thenMany(insert).as(StepVerifier::create).verifyError(R2dbcDataIntegrityViolationException.class);
8960
}

0 commit comments

Comments
 (0)