Fix containsDescendantOf for random sources

Fix the `containsDescendantOf` logic for random property sources to
ensure that ancestors are correctly matched.

Closes gh-21654
This commit is contained in:
Phillip Webb 2020-06-02 10:53:12 -07:00
parent 14e6c734a9
commit 09a47c9aad
2 changed files with 26 additions and 1 deletions

View File

@ -190,7 +190,7 @@ class SpringConfigurationPropertySource implements ConfigurationPropertySource {
}
private static ConfigurationPropertyState containsDescendantOfForRandom(ConfigurationPropertyName name) {
if (name.isAncestorOf(RANDOM) || name.equals(RANDOM)) {
if (RANDOM.isAncestorOf(name) || name.equals(RANDOM)) {
return ConfigurationPropertyState.PRESENT;
}
return ConfigurationPropertyState.ABSENT;

View File

@ -21,6 +21,7 @@ import java.util.Map;
import org.junit.jupiter.api.Test;
import org.springframework.boot.env.RandomValuePropertySource;
import org.springframework.boot.origin.Origin;
import org.springframework.boot.origin.OriginLookup;
import org.springframework.core.env.MapPropertySource;
@ -148,6 +149,30 @@ class SpringConfigurationPropertySourceTests {
.isInstanceOf(IterableConfigurationPropertySource.class);
}
@Test
void containsDescendantOfWhenRandomSourceAndRandomPropertyReturnsPresent() {
SpringConfigurationPropertySource source = SpringConfigurationPropertySource
.from(new RandomValuePropertySource());
assertThat(source.containsDescendantOf(ConfigurationPropertyName.of("random")))
.isEqualTo(ConfigurationPropertyState.PRESENT);
}
@Test
void containsDescendantOfWhenRandomSourceAndRandomPrefixedPropertyReturnsPresent() {
SpringConfigurationPropertySource source = SpringConfigurationPropertySource
.from(new RandomValuePropertySource());
assertThat(source.containsDescendantOf(ConfigurationPropertyName.of("random.something")))
.isEqualTo(ConfigurationPropertyState.PRESENT);
}
@Test
void containsDescendantOfWhenRandomSourceAndNonRandomPropertyReturnsAbsent() {
SpringConfigurationPropertySource source = SpringConfigurationPropertySource
.from(new RandomValuePropertySource());
assertThat(source.containsDescendantOf(ConfigurationPropertyName.of("abandon.something")))
.isEqualTo(ConfigurationPropertyState.ABSENT);
}
/**
* Test {@link PropertySource} that's also an {@link OriginLookup}.
*