|
|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2002-2019 the original author or authors. |
|
|
|
|
* Copyright 2002-2020 the original author or authors. |
|
|
|
|
* |
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
|
@ -16,11 +16,13 @@
@@ -16,11 +16,13 @@
|
|
|
|
|
|
|
|
|
|
package org.springframework.beans.factory.config; |
|
|
|
|
|
|
|
|
|
import java.net.URL; |
|
|
|
|
import java.util.LinkedHashMap; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
|
import org.yaml.snakeyaml.constructor.ConstructorException; |
|
|
|
|
import org.yaml.snakeyaml.parser.ParserException; |
|
|
|
|
import org.yaml.snakeyaml.scanner.ScannerException; |
|
|
|
|
|
|
|
|
|
@ -29,6 +31,7 @@ import org.springframework.core.io.ByteArrayResource;
@@ -29,6 +31,7 @@ import org.springframework.core.io.ByteArrayResource;
|
|
|
|
|
import static java.util.stream.Collectors.toList; |
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType; |
|
|
|
|
import static org.assertj.core.api.Assertions.entry; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Tests for {@link YamlProcessor}. |
|
|
|
|
@ -37,14 +40,14 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -37,14 +40,14 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
|
|
|
|
* @author Juergen Hoeller |
|
|
|
|
* @author Sam Brannen |
|
|
|
|
*/ |
|
|
|
|
public class YamlProcessorTests { |
|
|
|
|
class YamlProcessorTests { |
|
|
|
|
|
|
|
|
|
private final YamlProcessor processor = new YamlProcessor() {}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void arrayConvertedToIndexedBeanReference() { |
|
|
|
|
this.processor.setResources(new ByteArrayResource("foo: bar\nbar: [1,2,3]".getBytes())); |
|
|
|
|
void arrayConvertedToIndexedBeanReference() { |
|
|
|
|
setYaml("foo: bar\nbar: [1,2,3]"); |
|
|
|
|
this.processor.process((properties, map) -> { |
|
|
|
|
assertThat(properties.size()).isEqualTo(4); |
|
|
|
|
assertThat(properties.get("foo")).isEqualTo("bar"); |
|
|
|
|
@ -59,30 +62,30 @@ public class YamlProcessorTests {
@@ -59,30 +62,30 @@ public class YamlProcessorTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void stringResource() { |
|
|
|
|
this.processor.setResources(new ByteArrayResource("foo # a document that is a literal".getBytes())); |
|
|
|
|
void stringResource() { |
|
|
|
|
setYaml("foo # a document that is a literal"); |
|
|
|
|
this.processor.process((properties, map) -> assertThat(map.get("document")).isEqualTo("foo")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void badDocumentStart() { |
|
|
|
|
this.processor.setResources(new ByteArrayResource("foo # a document\nbar: baz".getBytes())); |
|
|
|
|
void badDocumentStart() { |
|
|
|
|
setYaml("foo # a document\nbar: baz"); |
|
|
|
|
assertThatExceptionOfType(ParserException.class) |
|
|
|
|
.isThrownBy(() -> this.processor.process((properties, map) -> {})) |
|
|
|
|
.withMessageContaining("line 2, column 1"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void badResource() { |
|
|
|
|
this.processor.setResources(new ByteArrayResource("foo: bar\ncd\nspam:\n foo: baz".getBytes())); |
|
|
|
|
void badResource() { |
|
|
|
|
setYaml("foo: bar\ncd\nspam:\n foo: baz"); |
|
|
|
|
assertThatExceptionOfType(ScannerException.class) |
|
|
|
|
.isThrownBy(() -> this.processor.process((properties, map) -> {})) |
|
|
|
|
.withMessageContaining("line 3, column 1"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void mapConvertedToIndexedBeanReference() { |
|
|
|
|
this.processor.setResources(new ByteArrayResource("foo: bar\nbar:\n spam: bucket".getBytes())); |
|
|
|
|
void mapConvertedToIndexedBeanReference() { |
|
|
|
|
setYaml("foo: bar\nbar:\n spam: bucket"); |
|
|
|
|
this.processor.process((properties, map) -> { |
|
|
|
|
assertThat(properties.get("bar.spam")).isEqualTo("bucket"); |
|
|
|
|
assertThat(properties).hasSize(2); |
|
|
|
|
@ -90,8 +93,8 @@ public class YamlProcessorTests {
@@ -90,8 +93,8 @@ public class YamlProcessorTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void integerKeyBehaves() { |
|
|
|
|
this.processor.setResources(new ByteArrayResource("foo: bar\n1: bar".getBytes())); |
|
|
|
|
void integerKeyBehaves() { |
|
|
|
|
setYaml("foo: bar\n1: bar"); |
|
|
|
|
this.processor.process((properties, map) -> { |
|
|
|
|
assertThat(properties.get("[1]")).isEqualTo("bar"); |
|
|
|
|
assertThat(properties).hasSize(2); |
|
|
|
|
@ -99,8 +102,8 @@ public class YamlProcessorTests {
@@ -99,8 +102,8 @@ public class YamlProcessorTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void integerDeepKeyBehaves() { |
|
|
|
|
this.processor.setResources(new ByteArrayResource("foo:\n 1: bar".getBytes())); |
|
|
|
|
void integerDeepKeyBehaves() { |
|
|
|
|
setYaml("foo:\n 1: bar"); |
|
|
|
|
this.processor.process((properties, map) -> { |
|
|
|
|
assertThat(properties.get("foo[1]")).isEqualTo("bar"); |
|
|
|
|
assertThat(properties).hasSize(1); |
|
|
|
|
@ -109,8 +112,8 @@ public class YamlProcessorTests {
@@ -109,8 +112,8 @@ public class YamlProcessorTests {
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
|
public void flattenedMapIsSameAsPropertiesButOrdered() { |
|
|
|
|
this.processor.setResources(new ByteArrayResource("cat: dog\nfoo: bar\nbar:\n spam: bucket".getBytes())); |
|
|
|
|
void flattenedMapIsSameAsPropertiesButOrdered() { |
|
|
|
|
setYaml("cat: dog\nfoo: bar\nbar:\n spam: bucket"); |
|
|
|
|
this.processor.process((properties, map) -> { |
|
|
|
|
Map<String, Object> flattenedMap = processor.getFlattenedMap(map); |
|
|
|
|
assertThat(flattenedMap).isInstanceOf(LinkedHashMap.class); |
|
|
|
|
@ -134,4 +137,43 @@ public class YamlProcessorTests {
@@ -134,4 +137,43 @@ public class YamlProcessorTests {
|
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void customTypeSupportedByDefault() throws Exception { |
|
|
|
|
URL url = new URL("https://localhost:9000/"); |
|
|
|
|
setYaml("value: !!java.net.URL [\"" + url + "\"]"); |
|
|
|
|
|
|
|
|
|
this.processor.process((properties, map) -> { |
|
|
|
|
assertThat(properties).containsExactly(entry("value", url)); |
|
|
|
|
assertThat(map).containsExactly(entry("value", url)); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void customTypesSupportedDueToExplicitConfiguration() throws Exception { |
|
|
|
|
this.processor.setSupportedTypes(URL.class, String.class); |
|
|
|
|
|
|
|
|
|
URL url = new URL("https://localhost:9000/"); |
|
|
|
|
setYaml("value: !!java.net.URL [!!java.lang.String [\"" + url + "\"]]"); |
|
|
|
|
|
|
|
|
|
this.processor.process((properties, map) -> { |
|
|
|
|
assertThat(properties).containsExactly(entry("value", url)); |
|
|
|
|
assertThat(map).containsExactly(entry("value", url)); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void customTypeNotSupportedDueToExplicitConfiguration() { |
|
|
|
|
this.processor.setSupportedTypes(List.class); |
|
|
|
|
|
|
|
|
|
setYaml("value: !!java.net.URL [\"https://localhost:9000/\"]"); |
|
|
|
|
|
|
|
|
|
assertThatExceptionOfType(ConstructorException.class) |
|
|
|
|
.isThrownBy(() -> this.processor.process((properties, map) -> {})) |
|
|
|
|
.withMessageContaining("Unsupported type encountered in YAML document: java.net.URL"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setYaml(String yaml) { |
|
|
|
|
this.processor.setResources(new ByteArrayResource(yaml.getBytes())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|