33
33
34
34
import org .junit .Before ;
35
35
import org .junit .Test ;
36
-
37
36
import org .springframework .beans .factory .annotation .Autowired ;
38
37
import org .springframework .dao .DataAccessException ;
38
+ import org .springframework .dao .OptimisticLockingFailureException ;
39
39
import org .springframework .data .annotation .Id ;
40
+ import org .springframework .data .annotation .Version ;
40
41
import org .springframework .data .domain .Persistable ;
41
42
import org .springframework .data .r2dbc .convert .MappingR2dbcConverter ;
42
43
import org .springframework .data .r2dbc .core .DatabaseClient ;
53
54
* Abstract integration tests for {@link SimpleR2dbcRepository} to be ran against various databases.
54
55
*
55
56
* @author Mark Paluch
57
+ * @author Bogdan Ilchyshyn
56
58
*/
57
59
public abstract class AbstractSimpleR2dbcRepositoryIntegrationTests extends R2dbcIntegrationTestSupport {
58
60
@@ -117,6 +119,42 @@ public void shouldSaveNewObject() {
117
119
assertThat (map ).containsEntry ("name" , "SCHAUFELRADBAGGER" ).containsEntry ("manual" , 12 ).containsKey ("id" );
118
120
}
119
121
122
+ @ Test
123
+ public void shouldSaveNewObjectAndSetVersionIfWrapperVersionPropertyExists () {
124
+
125
+ LegoSetVersionable legoSet = new LegoSetVersionable (null , "SCHAUFELRADBAGGER" , 12 , null );
126
+
127
+ repository .save (legoSet ) //
128
+ .as (StepVerifier ::create ) //
129
+ .consumeNextWith (actual -> assertThat (actual .getVersion ()).isEqualTo (0 )) //
130
+ .verifyComplete ();
131
+
132
+ Map <String , Object > map = jdbc .queryForMap ("SELECT * FROM legoset" );
133
+ assertThat (map ) //
134
+ .containsEntry ("name" , "SCHAUFELRADBAGGER" ) //
135
+ .containsEntry ("manual" , 12 ) //
136
+ .containsEntry ("version" , 0 ) //
137
+ .containsKey ("id" );
138
+ }
139
+
140
+ @ Test
141
+ public void shouldSaveNewObjectAndSetVersionIfPrimitiveVersionPropertyExists () {
142
+
143
+ LegoSetPrimitiveVersionable legoSet = new LegoSetPrimitiveVersionable (null , "SCHAUFELRADBAGGER" , 12 , -1 );
144
+
145
+ repository .save (legoSet ) //
146
+ .as (StepVerifier ::create ) //
147
+ .consumeNextWith (actual -> assertThat (actual .getVersion ()).isEqualTo (1 )) //
148
+ .verifyComplete ();
149
+
150
+ Map <String , Object > map = jdbc .queryForMap ("SELECT * FROM legoset" );
151
+ assertThat (map ) //
152
+ .containsEntry ("name" , "SCHAUFELRADBAGGER" ) //
153
+ .containsEntry ("manual" , 12 ) //
154
+ .containsEntry ("version" , 1 ) //
155
+ .containsKey ("id" );
156
+ }
157
+
120
158
@ Test
121
159
public void shouldUpdateObject () {
122
160
@@ -135,6 +173,44 @@ public void shouldUpdateObject() {
135
173
assertThat (map ).containsEntry ("name" , "SCHAUFELRADBAGGER" ).containsEntry ("manual" , 14 ).containsKey ("id" );
136
174
}
137
175
176
+ @ Test
177
+ public void shouldUpdateVersionableObjectAndIncreaseVersion () {
178
+
179
+ jdbc .execute ("INSERT INTO legoset (name, manual, version) VALUES('SCHAUFELRADBAGGER', 12, 42)" );
180
+ Integer id = jdbc .queryForObject ("SELECT id FROM legoset" , Integer .class );
181
+
182
+ LegoSetVersionable legoSet = new LegoSetVersionable (id , "SCHAUFELRADBAGGER" , 12 , 42 );
183
+ legoSet .setManual (14 );
184
+
185
+ repository .save (legoSet ) //
186
+ .as (StepVerifier ::create ) //
187
+ .expectNextCount (1 ) //
188
+ .verifyComplete ();
189
+
190
+ assertThat (legoSet .getVersion ()).isEqualTo (43 );
191
+
192
+ Map <String , Object > map = jdbc .queryForMap ("SELECT * FROM legoset" );
193
+ assertThat (map )
194
+ .containsEntry ("name" , "SCHAUFELRADBAGGER" ) //
195
+ .containsEntry ("manual" , 14 ) //
196
+ .containsEntry ("version" , 43 ) //
197
+ .containsKey ("id" );
198
+ }
199
+
200
+ @ Test
201
+ public void shouldFailWithOptimistickLockingWhenVersionDoesNotMatchOnUpdate () {
202
+
203
+ jdbc .execute ("INSERT INTO legoset (name, manual, version) VALUES('SCHAUFELRADBAGGER', 12, 42)" );
204
+ Integer id = jdbc .queryForObject ("SELECT id FROM legoset" , Integer .class );
205
+
206
+ LegoSetVersionable legoSet = new LegoSetVersionable (id , "SCHAUFELRADBAGGER" , 12 , 0 );
207
+
208
+ repository .save (legoSet ) //
209
+ .as (StepVerifier ::create ) //
210
+ .expectError (OptimisticLockingFailureException .class ) //
211
+ .verify ();
212
+ }
213
+
138
214
@ Test
139
215
public void shouldSaveObjectsUsingIterable () {
140
216
@@ -392,4 +468,28 @@ public boolean isNew() {
392
468
return true ;
393
469
}
394
470
}
471
+
472
+ @ Data
473
+ @ Table ("legoset" )
474
+ @ NoArgsConstructor
475
+ static class LegoSetVersionable extends LegoSet {
476
+ @ Version Integer version ;
477
+
478
+ public LegoSetVersionable (Integer id , String name , Integer manual , Integer version ) {
479
+ super (id , name , manual );
480
+ this .version = version ;
481
+ }
482
+ }
483
+
484
+ @ Data
485
+ @ Table ("legoset" )
486
+ @ NoArgsConstructor
487
+ static class LegoSetPrimitiveVersionable extends LegoSet {
488
+ @ Version int version ;
489
+
490
+ public LegoSetPrimitiveVersionable (Integer id , String name , Integer manual , int version ) {
491
+ super (id , name , manual );
492
+ this .version = version ;
493
+ }
494
+ }
395
495
}
0 commit comments