Skip to content

Commit cc50af0

Browse files
committed
Enhance unit tests for status quo for SpEL 'selector' support in messaging
See gh-30550
1 parent d08e408 commit cc50af0

File tree

1 file changed

+46
-17
lines changed

1 file changed

+46
-17
lines changed

spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ void registerSubscriptionWithDestinationPatternRegex() {
253253
}
254254

255255
@Test
256-
void registerSubscriptionWithSelector() {
256+
void registerSubscriptionWithSelectorHeaderEnabledByDefault() {
257257
String sessionId1 = "sess01";
258258
String sessionId2 = "sess02";
259259
String sessionId3 = "sess03";
@@ -278,41 +278,70 @@ void registerSubscriptionWithSelector() {
278278
accessor.setNativeHeader("foo", "bar");
279279
Message<?> message = MessageBuilder.createMessage("", accessor.getMessageHeaders());
280280

281-
MultiValueMap<String, String> actual = this.registry.findSubscriptions(message);
282-
assertThat(actual).hasSize(2);
281+
MultiValueMap<String, String> subscriptions = this.registry.findSubscriptions(message);
282+
assertThat(subscriptions).hasSize(2);
283283

284284
// Subscription #1 has a 'selector' header that DOES match.
285-
assertThat(actual.get(sessionId1)).containsExactly(subscriptionId1);
285+
assertThat(subscriptions.get(sessionId1)).containsExactly(subscriptionId1);
286286
// Subscription #2 has a 'selector' header that does NOT match.
287-
assertThat(actual.get(sessionId2)).isNull();
287+
assertThat(subscriptions.get(sessionId2)).isNull();
288288
// Subscription #3 does NOT have a 'selector' header, so it matches anyway.
289-
assertThat(actual.get(sessionId3)).containsExactly(subscriptionId3);
289+
assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3);
290290

291291
// Then try with message WITHOUT selected 'foo' header present
292292

293-
actual = this.registry.findSubscriptions(createMessage(destination));
293+
subscriptions = this.registry.findSubscriptions(createMessage(destination));
294+
assertThat(subscriptions).hasSize(1);
294295
// Subscription #3 does NOT have a 'selector' header, so it matches anyway.
295-
assertThat(actual.get(sessionId3)).containsExactly(subscriptionId3);
296+
assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3);
296297
}
297298

298299
@Test
299-
void registerSubscriptionWithSelectorNotSupported() {
300-
String sessionId = "sess01";
301-
String subscriptionId = "subs01";
300+
void registerSubscriptionWithSelectorHeaderDisabled() {
301+
String sessionId1 = "sess01";
302+
String sessionId2 = "sess02";
303+
String sessionId3 = "sess03";
304+
String subscriptionId1 = "subs01";
305+
String subscriptionId2 = "subs02";
306+
String subscriptionId3 = "subs02";
302307
String destination = "/foo";
303-
String selector = "headers.foo == 'bar'";
308+
String selector1 = "headers.foo == 'bar'";
309+
String selector2 = "headers.foo == 'enigma'";
304310

311+
// Explicitly disable selector header support
305312
this.registry.setSelectorHeaderName(null);
306-
this.registry.registerSubscription(subscribeMessage(sessionId, subscriptionId, destination, selector));
313+
314+
// Register subscription with matching selector header
315+
this.registry.registerSubscription(subscribeMessage(sessionId1, subscriptionId1, destination, selector1));
316+
// Register subscription with non-matching selector header
317+
this.registry.registerSubscription(subscribeMessage(sessionId2, subscriptionId2, destination, selector2));
318+
// Register subscription without a selector header
319+
this.registry.registerSubscription(subscribeMessage(sessionId3, subscriptionId3, destination, null));
320+
321+
// First, try with message WITH selected 'foo' header present
307322

308323
SimpMessageHeaderAccessor accessor = SimpMessageHeaderAccessor.create();
309324
accessor.setDestination(destination);
310-
accessor.setNativeHeader("foo", "bazz");
325+
accessor.setNativeHeader("foo", "bar");
311326
Message<?> message = MessageBuilder.createMessage("", accessor.getMessageHeaders());
312327

313-
MultiValueMap<String, String> actual = this.registry.findSubscriptions(message);
314-
assertThat(actual).hasSize(1);
315-
assertThat(actual.get(sessionId)).containsExactly(subscriptionId);
328+
MultiValueMap<String, String> subscriptions = this.registry.findSubscriptions(message);
329+
330+
// 'selector' header is ignored, so all 3 subscriptions should be found
331+
assertThat(subscriptions).hasSize(3);
332+
assertThat(subscriptions.get(sessionId1)).containsExactly(subscriptionId1);
333+
assertThat(subscriptions.get(sessionId2)).containsExactly(subscriptionId2);
334+
assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3);
335+
336+
// Then try with message WITHOUT selected 'foo' header present
337+
338+
subscriptions = this.registry.findSubscriptions(createMessage(destination));
339+
340+
// 'selector' header is ignored, so all 3 subscriptions should be found
341+
assertThat(subscriptions).hasSize(3);
342+
assertThat(subscriptions.get(sessionId1)).containsExactly(subscriptionId1);
343+
assertThat(subscriptions.get(sessionId2)).containsExactly(subscriptionId2);
344+
assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3);
316345
}
317346

318347
@Test // SPR-11931

0 commit comments

Comments
 (0)