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