20
20
import io .r2dbc .postgresql .PostgresqlConnectionConfiguration ;
21
21
import io .r2dbc .postgresql .PostgresqlConnectionFactory ;
22
22
import io .r2dbc .postgresql .api .PostgresqlConnection ;
23
+ import io .r2dbc .postgresql .api .PostgresqlResult ;
24
+ import io .r2dbc .spi .Parameters ;
25
+ import org .junit .jupiter .api .BeforeAll ;
23
26
import org .junit .jupiter .api .Test ;
24
27
import reactor .test .StepVerifier ;
25
28
28
31
*/
29
32
final class EnumCodecIntegrationTests extends AbstractIntegrationTests {
30
33
34
+ @ BeforeAll
35
+ static void createEnum () {
36
+ try {
37
+ SERVER .getJdbcOperations ().execute ("CREATE TYPE my_enum AS ENUM ('HELLO', 'WORLD')" );
38
+ } catch (DataAccessException e ) {
39
+ // ignore duplicate types
40
+ }
41
+ }
42
+
43
+ @ Override
44
+ protected void customize (PostgresqlConnectionConfiguration .Builder builder ) {
45
+ builder .codecRegistrar (EnumCodec .builder ().withEnum ("my_enum" , MyEnum .class ).build ());
46
+ }
47
+
31
48
@ Test
32
49
void shouldReportUnresolvableTypes () {
33
50
@@ -46,6 +63,111 @@ void shouldReportUnresolvableTypes() {
46
63
// we cannot really assert logs so that's up to you.
47
64
}
48
65
66
+ @ Test
67
+ void shouldBindEnumTypeAsString () {
68
+
69
+ SERVER .getJdbcOperations ().execute ("DROP TABLE IF EXISTS enum_test" );
70
+ SERVER .getJdbcOperations ().execute ("CREATE TABLE enum_test (the_value my_enum);" );
71
+
72
+ PostgresTypes types = PostgresTypes .from (this .connection );
73
+ PostgresTypes .PostgresType type = types .lookupType ("my_enum" ).block ();
74
+
75
+ this .connection .createStatement ("INSERT INTO enum_test VALUES($1)" )
76
+ .bind ("$1" , Parameters .in (type , "HELLO" ))
77
+ .execute ()
78
+ .flatMap (PostgresqlResult ::getRowsUpdated )
79
+ .as (StepVerifier ::create )
80
+ .expectNext (1 )
81
+ .verifyComplete ();
82
+
83
+ String result = SERVER .getJdbcOperations ().queryForObject ("SELECT the_value FROM enum_test" , String .class );
84
+ assertThat (result ).isEqualTo ("HELLO" );
85
+
86
+ this .connection .createStatement ("SELECT * FROM enum_test" )
87
+ .execute ()
88
+ .flatMap (it -> it .map (((row , rowMetadata ) -> row .get (0 , MyEnum .class ))))
89
+ .as (StepVerifier ::create )
90
+ .consumeNextWith (actual -> {
91
+ assertThat (actual ).isEqualTo (MyEnum .HELLO );
92
+ })
93
+ .verifyComplete ();
94
+
95
+ this .connection .createStatement ("SELECT * FROM enum_test" )
96
+ .execute ()
97
+ .flatMap (it -> it .map (((row , rowMetadata ) -> row .get (0 , String .class ))))
98
+ .as (StepVerifier ::create )
99
+ .consumeNextWith (actual -> {
100
+ assertThat (actual ).isEqualTo ("HELLO" );
101
+ })
102
+ .verifyComplete ();
103
+ }
104
+
105
+ @ Test
106
+ void shouldBindEnumArrayTypeAsString () {
107
+
108
+ SERVER .getJdbcOperations ().execute ("DROP TABLE IF EXISTS enum_test" );
109
+ SERVER .getJdbcOperations ().execute ("CREATE TABLE enum_test (the_value my_enum[]);" );
110
+
111
+ PostgresTypes types = PostgresTypes .from (this .connection );
112
+ PostgresTypes .PostgresType type = types .lookupType ("my_enum" ).block ().asArrayType ();
113
+
114
+ this .connection .createStatement ("INSERT INTO enum_test VALUES($1)" )
115
+ .bind ("$1" , Parameters .in (type , new String []{"HELLO" , "WORLD" }))
116
+ .execute ()
117
+ .flatMap (PostgresqlResult ::getRowsUpdated )
118
+ .as (StepVerifier ::create )
119
+ .expectNext (1 )
120
+ .verifyComplete ();
121
+
122
+ String result = SERVER .getJdbcOperations ().queryForObject ("SELECT the_value FROM enum_test" , String .class );
123
+ assertThat (result ).isEqualTo ("{HELLO,WORLD}" );
124
+
125
+ this .connection .createStatement ("SELECT the_value FROM enum_test" )
126
+ .execute ()
127
+ .flatMap (it -> it .map (((row , rowMetadata ) -> row .get (0 , String [].class ))))
128
+ .as (StepVerifier ::create )
129
+ .consumeNextWith (actual -> {
130
+ assertThat (actual ).contains ("HELLO" , "WORLD" );
131
+ })
132
+ .verifyComplete ();
133
+ }
134
+
135
+ @ Test
136
+ void shouldBindEnumArrayType () {
137
+
138
+ SERVER .getJdbcOperations ().execute ("DROP TABLE IF EXISTS enum_test" );
139
+ SERVER .getJdbcOperations ().execute ("CREATE TABLE enum_test (the_value my_enum[]);" );
140
+
141
+ this .connection .createStatement ("INSERT INTO enum_test VALUES($1)" )
142
+ .bind ("$1" , MyEnum .values ())
143
+ .execute ()
144
+ .flatMap (PostgresqlResult ::getRowsUpdated )
145
+ .as (StepVerifier ::create )
146
+ .expectNext (1 )
147
+ .verifyComplete ();
148
+
149
+ this .connection .createStatement ("SELECT * FROM enum_test" )
150
+ .execute ()
151
+ .flatMap (it -> it .map (((row , rowMetadata ) -> row .get (0 ))))
152
+ .as (StepVerifier ::create )
153
+ .consumeNextWith (actual -> {
154
+
155
+ assertThat (actual ).isInstanceOf (MyEnum [].class );
156
+ assertThat ((MyEnum []) actual ).contains (MyEnum .values ());
157
+
158
+ })
159
+ .verifyComplete ();
160
+
161
+ this .connection .createStatement ("SELECT * FROM enum_test" )
162
+ .execute ()
163
+ .flatMap (it -> it .map (((row , rowMetadata ) -> row .get (0 , MyEnum [].class ))))
164
+ .as (StepVerifier ::create )
165
+ .consumeNextWith (actual -> {
166
+ assertThat (actual ).contains (MyEnum .values ());
167
+ })
168
+ .verifyComplete ();
169
+ }
170
+
49
171
enum MyEnum {
50
172
HELLO ;
51
173
}
0 commit comments