Browse Source

Enhance unit tests for status quo for SpEL 'selector' support in messaging

See gh-30550
pull/30619/head
Sam Brannen 1 year ago
parent
commit
cc50af08e4
  1. 63
      spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java

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

@ -253,7 +253,7 @@ class DefaultSubscriptionRegistryTests { @@ -253,7 +253,7 @@ class DefaultSubscriptionRegistryTests {
}
@Test
void registerSubscriptionWithSelector() {
void registerSubscriptionWithSelectorHeaderEnabledByDefault() {
String sessionId1 = "sess01";
String sessionId2 = "sess02";
String sessionId3 = "sess03";
@ -278,41 +278,70 @@ class DefaultSubscriptionRegistryTests { @@ -278,41 +278,70 @@ class DefaultSubscriptionRegistryTests {
accessor.setNativeHeader("foo", "bar");
Message<?> message = MessageBuilder.createMessage("", accessor.getMessageHeaders());
MultiValueMap<String, String> actual = this.registry.findSubscriptions(message);
assertThat(actual).hasSize(2);
MultiValueMap<String, String> subscriptions = this.registry.findSubscriptions(message);
assertThat(subscriptions).hasSize(2);
// Subscription #1 has a 'selector' header that DOES match.
assertThat(actual.get(sessionId1)).containsExactly(subscriptionId1);
assertThat(subscriptions.get(sessionId1)).containsExactly(subscriptionId1);
// Subscription #2 has a 'selector' header that does NOT match.
assertThat(actual.get(sessionId2)).isNull();
assertThat(subscriptions.get(sessionId2)).isNull();
// Subscription #3 does NOT have a 'selector' header, so it matches anyway.
assertThat(actual.get(sessionId3)).containsExactly(subscriptionId3);
assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3);
// Then try with message WITHOUT selected 'foo' header present
actual = this.registry.findSubscriptions(createMessage(destination));
subscriptions = this.registry.findSubscriptions(createMessage(destination));
assertThat(subscriptions).hasSize(1);
// Subscription #3 does NOT have a 'selector' header, so it matches anyway.
assertThat(actual.get(sessionId3)).containsExactly(subscriptionId3);
assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3);
}
@Test
void registerSubscriptionWithSelectorNotSupported() {
String sessionId = "sess01";
String subscriptionId = "subs01";
void registerSubscriptionWithSelectorHeaderDisabled() {
String sessionId1 = "sess01";
String sessionId2 = "sess02";
String sessionId3 = "sess03";
String subscriptionId1 = "subs01";
String subscriptionId2 = "subs02";
String subscriptionId3 = "subs02";
String destination = "/foo";
String selector = "headers.foo == 'bar'";
String selector1 = "headers.foo == 'bar'";
String selector2 = "headers.foo == 'enigma'";
// Explicitly disable selector header support
this.registry.setSelectorHeaderName(null);
this.registry.registerSubscription(subscribeMessage(sessionId, subscriptionId, destination, selector));
// Register subscription with matching selector header
this.registry.registerSubscription(subscribeMessage(sessionId1, subscriptionId1, destination, selector1));
// Register subscription with non-matching selector header
this.registry.registerSubscription(subscribeMessage(sessionId2, subscriptionId2, destination, selector2));
// Register subscription without a selector header
this.registry.registerSubscription(subscribeMessage(sessionId3, subscriptionId3, destination, null));
// First, try with message WITH selected 'foo' header present
SimpMessageHeaderAccessor accessor = SimpMessageHeaderAccessor.create();
accessor.setDestination(destination);
accessor.setNativeHeader("foo", "bazz");
accessor.setNativeHeader("foo", "bar");
Message<?> message = MessageBuilder.createMessage("", accessor.getMessageHeaders());
MultiValueMap<String, String> actual = this.registry.findSubscriptions(message);
assertThat(actual).hasSize(1);
assertThat(actual.get(sessionId)).containsExactly(subscriptionId);
MultiValueMap<String, String> subscriptions = this.registry.findSubscriptions(message);
// 'selector' header is ignored, so all 3 subscriptions should be found
assertThat(subscriptions).hasSize(3);
assertThat(subscriptions.get(sessionId1)).containsExactly(subscriptionId1);
assertThat(subscriptions.get(sessionId2)).containsExactly(subscriptionId2);
assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3);
// Then try with message WITHOUT selected 'foo' header present
subscriptions = this.registry.findSubscriptions(createMessage(destination));
// 'selector' header is ignored, so all 3 subscriptions should be found
assertThat(subscriptions).hasSize(3);
assertThat(subscriptions.get(sessionId1)).containsExactly(subscriptionId1);
assertThat(subscriptions.get(sessionId2)).containsExactly(subscriptionId2);
assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3);
}
@Test // SPR-11931

Loading…
Cancel
Save