2222import java .sql .SQLException ;
2323import java .util .LinkedHashMap ;
2424import java .util .Map ;
25- import java .util .Set ;
2625import java .util .stream .Stream ;
2726
2827import javax .sql .DataSource ;
2928
29+ import org .assertj .core .api .InstanceOfAssertFactories ;
3030import org .junit .jupiter .api .AfterEach ;
3131import org .junit .jupiter .api .BeforeEach ;
3232import org .junit .jupiter .api .Test ;
@@ -68,6 +68,7 @@ class TransactionalStringRedisTemplateTests {
6868 }
6969 }
7070
71+ @ SuppressWarnings ({"rawtypes" , "unchecked" })
7172 @ BeforeEach
7273 void beforeEach () {
7374
@@ -78,14 +79,14 @@ void beforeEach() {
7879 stringTemplate .afterPropertiesSet ();
7980
8081 stringTemplate .execute ((RedisCallback ) con -> {
81- con .flushDb ();
82+ con .serverCommands (). flushDb ();
8283 return null ;
8384 });
8485 }
8586
8687 @ AfterEach
8788 void afterEach () {
88- redisConnectionFactory .getConnection ().flushAll ();
89+ redisConnectionFactory .getConnection ().serverCommands (). flushAll ();
8990 }
9091
9192 @ Test // GH-3191
@@ -119,7 +120,6 @@ void visibilityDuringManagedTransaction() throws SQLException {
119120 .containsEntry ("isMember(inside)" , false );
120121 }
121122
122- @ SuppressWarnings ("unchecked" )
123123 @ Test // GH-3187
124124 void allRangeWithScoresMethodsShouldExecuteImmediatelyInTransaction () throws SQLException {
125125
@@ -138,77 +138,55 @@ void allRangeWithScoresMethodsShouldExecuteImmediatelyInTransaction() throws SQL
138138 Map <String , Object > ops = new LinkedHashMap <>();
139139
140140 // Query data added outside transaction (should execute immediately)
141- ops .put ("rangeWithScores_before " ,
141+ ops .put ("rangeWithScores_outside " ,
142142 stringTemplate .opsForZSet ().rangeWithScores ("testzset" , 0 , -1 ));
143- ops .put ("reverseRangeWithScores_before " ,
143+ ops .put ("reverseRangeWithScores_outside " ,
144144 stringTemplate .opsForZSet ().reverseRangeWithScores ("testzset" , 0 , -1 ));
145- ops .put ("rangeByScoreWithScores_before " ,
145+ ops .put ("rangeByScoreWithScores_outside " ,
146146 stringTemplate .opsForZSet ().rangeByScoreWithScores ("testzset" , 1.0 , 2.0 ));
147- ops .put ("reverseRangeByScoreWithScores_before " ,
147+ ops .put ("reverseRangeByScoreWithScores_outside " ,
148148 stringTemplate .opsForZSet ().reverseRangeByScoreWithScores ("testzset" , 1.0 , 2.0 ));
149149
150150 // Add inside transaction (goes into multi/exec queue)
151- ops .put ("add_result " , stringTemplate .opsForZSet ().add ("testzset" , "inside" , 3.0 ));
151+ ops .put ("add_inside " , stringTemplate .opsForZSet ().add ("testzset" , "inside" , 3.0 ));
152152
153153 // Changes made inside transaction should not be visible yet (read executes immediately)
154- ops .put ("rangeWithScores_after " ,
154+ ops .put ("rangeWithScores_inside " ,
155155 stringTemplate .opsForZSet ().rangeWithScores ("testzset" , 0 , -1 ));
156- ops .put ("reverseRangeWithScores_after " ,
156+ ops .put ("reverseRangeWithScores_inside " ,
157157 stringTemplate .opsForZSet ().reverseRangeWithScores ("testzset" , 0 , -1 ));
158- ops .put ("rangeByScoreWithScores_after " ,
158+ ops .put ("rangeByScoreWithScores_inside " ,
159159 stringTemplate .opsForZSet ().rangeByScoreWithScores ("testzset" , 1.0 , 3.0 ));
160- ops .put ("reverseRangeByScoreWithScores_after " ,
160+ ops .put ("reverseRangeByScoreWithScores_inside " ,
161161 stringTemplate .opsForZSet ().reverseRangeByScoreWithScores ("testzset" , 1.0 , 3.0 ));
162162
163163 return ops ;
164164 });
165165
166166 // add result is null (no result until exec)
167- assertThat (result ).containsEntry ("add_result" , null );
168-
169- // before: only data added outside transaction is visible
170- assertThat ((Set <TypedTuple <String >>) result .get ("rangeWithScores_before" ))
171- .hasSize (2 )
172- .extracting (TypedTuple ::getValue )
173- .containsExactly ("outside1" , "outside2" );
174-
175- assertThat ((Set <TypedTuple <String >>) result .get ("reverseRangeWithScores_before" ))
176- .hasSize (2 )
177- .extracting (TypedTuple ::getValue )
178- .containsExactly ("outside2" , "outside1" );
179-
180- assertThat ((Set <TypedTuple <String >>) result .get ("rangeByScoreWithScores_before" ))
181- .hasSize (2 )
182- .extracting (TypedTuple ::getValue )
183- .containsExactly ("outside1" , "outside2" );
184-
185- assertThat ((Set <TypedTuple <String >>) result .get ("reverseRangeByScoreWithScores_before" ))
186- .hasSize (2 )
187- .extracting (TypedTuple ::getValue )
188- .containsExactly ("outside2" , "outside1" );
189-
190- // after: changes made inside transaction are still not visible
191- assertThat ((Set <TypedTuple <String >>) result .get ("rangeWithScores_after" ))
192- .hasSize (2 )
193- .extracting (TypedTuple ::getValue )
194- .containsExactly ("outside1" , "outside2" );
195-
196- assertThat ((Set <TypedTuple <String >>) result .get ("reverseRangeWithScores_after" ))
197- .hasSize (2 )
198- .extracting (TypedTuple ::getValue )
199- .containsExactly ("outside2" , "outside1" );
200-
201- assertThat ((Set <TypedTuple <String >>) result .get ("rangeByScoreWithScores_after" ))
202- .hasSize (2 )
203- .extracting (TypedTuple ::getValue )
204- .containsExactly ("outside1" , "outside2" );
205-
206- assertThat ((Set <TypedTuple <String >>) result .get ("reverseRangeByScoreWithScores_after" ))
207- .hasSize (2 )
208- .extracting (TypedTuple ::getValue )
209- .containsExactly ("outside2" , "outside1" );
167+ assertThat (result ).containsEntry ("add_inside" , null );
168+
169+ // changes made outside transaction are visible
170+ assertThatResultForOperationContainsExactly (result , "rangeWithScores_outside" , "outside1" , "outside2" );
171+ assertThatResultForOperationContainsExactly (result , "reverseRangeWithScores_outside" , "outside2" , "outside1" );
172+ assertThatResultForOperationContainsExactly (result , "rangeByScoreWithScores_outside" , "outside1" , "outside2" );
173+ assertThatResultForOperationContainsExactly (result , "reverseRangeByScoreWithScores_outside" , "outside2" , "outside1" );
174+
175+ // changes made inside transaction are not visible (i.e. a 3rd element was added but not detected in range op)
176+ assertThatResultForOperationContainsExactly (result , "rangeWithScores_inside" , "outside1" , "outside2" );
177+ assertThatResultForOperationContainsExactly (result , "reverseRangeWithScores_inside" , "outside2" , "outside1" );
178+ assertThatResultForOperationContainsExactly (result , "rangeByScoreWithScores_inside" , "outside1" , "outside2" );
179+ assertThatResultForOperationContainsExactly (result , "reverseRangeByScoreWithScores_inside" , "outside2" , "outside1" );
210180 }
211181
182+ private void assertThatResultForOperationContainsExactly (Map <String , Object > result , String operation , String ... expectedValues ) {
183+ assertThat (result .get (operation ))
184+ .asInstanceOf (InstanceOfAssertFactories .set (TypedTuple .class ))
185+ .hasSize (expectedValues .length )
186+ .extracting (TypedTuple ::getValue )
187+ .containsExactly (expectedValues );
188+ }
189+
212190 static Stream <Arguments > argumentsStream () {
213191
214192 LettuceConnectionFactory lcf = new LettuceConnectionFactory (SettingsUtils .standaloneConfiguration ());
0 commit comments