Polish contribution and related code
This commit is contained in:
parent
afb8a0d1b1
commit
0415975dd1
|
|
@ -153,26 +153,25 @@ class BasicJsonWriter {
|
|||
private static String escape(CharSequence input) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
input.chars().forEach(c -> builder.append(
|
||||
switch (c) {
|
||||
case '"' -> "\\\"";
|
||||
case '\\' -> "\\\\";
|
||||
case '/' -> "\\/";
|
||||
case '\b' -> "\\b";
|
||||
case '\f' -> "\\f";
|
||||
case '\n' -> "\\n";
|
||||
case '\r' -> "\\r";
|
||||
case '\t' -> "\\t";
|
||||
default -> {
|
||||
if (c <= 0x1F) {
|
||||
yield String.format("\\u%04x", c);
|
||||
}
|
||||
else {
|
||||
yield (char) c;
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
);
|
||||
switch (c) {
|
||||
case '"' -> "\\\"";
|
||||
case '\\' -> "\\\\";
|
||||
case '/' -> "\\/";
|
||||
case '\b' -> "\\b";
|
||||
case '\f' -> "\\f";
|
||||
case '\n' -> "\\n";
|
||||
case '\r' -> "\\r";
|
||||
case '\t' -> "\\t";
|
||||
default -> {
|
||||
if (c <= 0x1F) {
|
||||
yield String.format("\\u%04x", c);
|
||||
}
|
||||
else {
|
||||
yield (char) c;
|
||||
}
|
||||
}
|
||||
}
|
||||
));
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ dependencies {
|
|||
testImplementation("io.reactivex.rxjava3:rxjava")
|
||||
testImplementation("org.jetbrains.kotlin:kotlin-reflect")
|
||||
testImplementation("org.jetbrains.kotlin:kotlin-stdlib")
|
||||
testImplementation("org.skyscreamer:jsonassert")
|
||||
testImplementation("org.xmlunit:xmlunit-assertj")
|
||||
testImplementation("org.xmlunit:xmlunit-matchers")
|
||||
testRuntimeOnly("com.sun.activation:jakarta.activation")
|
||||
|
|
|
|||
|
|
@ -16,12 +16,11 @@
|
|||
|
||||
package org.springframework.messaging.converter;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.protobuf.ExtensionRegistry;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.skyscreamer.jsonassert.JSONAssert;
|
||||
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.MessageHeaders;
|
||||
|
|
@ -35,113 +34,90 @@ import static org.springframework.messaging.MessageHeaders.CONTENT_TYPE;
|
|||
import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON;
|
||||
|
||||
/**
|
||||
* Test suite for {@link ProtobufMessageConverter}.
|
||||
* Tests for {@link ProtobufMessageConverter}.
|
||||
*
|
||||
* @author Parviz Rozikov
|
||||
* @author Sam Brannen
|
||||
*/
|
||||
public class ProtobufMessageConverterTests {
|
||||
class ProtobufMessageConverterTests {
|
||||
|
||||
private ProtobufMessageConverter converter;
|
||||
private final ProtobufMessageConverter converter = new ProtobufMessageConverter();
|
||||
|
||||
private ExtensionRegistry extensionRegistry;
|
||||
private Msg testMsg = Msg.newBuilder().setFoo("Foo").setBlah(SecondMsg.newBuilder().setBlah(123).build()).build();
|
||||
|
||||
private Msg testMsg;
|
||||
private Message<byte[]> message = MessageBuilder.withPayload(this.testMsg.toByteArray())
|
||||
.setHeader(CONTENT_TYPE, ProtobufMessageConverter.PROTOBUF).build();
|
||||
|
||||
private Message<byte[]> message;
|
||||
private Message<byte[]> messageWithoutContentType = MessageBuilder.withPayload(this.testMsg.toByteArray()).build();
|
||||
|
||||
private Message<byte[]> messageWithoutContentType;
|
||||
|
||||
private Message<String> messageJson;
|
||||
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.extensionRegistry = mock(ExtensionRegistry.class);
|
||||
this.converter = new ProtobufMessageConverter();
|
||||
this.testMsg = Msg.newBuilder().setFoo("Foo").setBlah(SecondMsg.newBuilder().setBlah(123).build()).build();
|
||||
this.message = MessageBuilder.withPayload(this.testMsg.toByteArray())
|
||||
.setHeader(CONTENT_TYPE, ProtobufMessageConverter.PROTOBUF).build();
|
||||
this.messageWithoutContentType = MessageBuilder.withPayload(this.testMsg.toByteArray()).build();
|
||||
this.messageJson = MessageBuilder.withPayload("""
|
||||
{
|
||||
"foo": "Foo",
|
||||
"blah": {
|
||||
"blah": 123
|
||||
}
|
||||
}""".replace("\t", " "))
|
||||
.setHeader(CONTENT_TYPE, APPLICATION_JSON)
|
||||
.build();
|
||||
}
|
||||
private final Message<String> messageJson = MessageBuilder.withPayload("""
|
||||
{
|
||||
"foo": "Foo",
|
||||
"blah": {
|
||||
"blah": 123
|
||||
}
|
||||
}
|
||||
""")
|
||||
.setHeader(CONTENT_TYPE, APPLICATION_JSON)
|
||||
.build();
|
||||
|
||||
|
||||
@Test
|
||||
public void extensionRegistryNull() {
|
||||
void extensionRegistryNull() {
|
||||
ProtobufMessageConverter converter = new ProtobufMessageConverter(null);
|
||||
assertThat(converter.extensionRegistry).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void defaultContentType() {
|
||||
assertThat(converter.getDefaultContentType(testMsg)).isEqualTo(ProtobufMessageConverter.PROTOBUF);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canConvertFrom() {
|
||||
void canConvertFrom() {
|
||||
assertThat(converter.canConvertFrom(message, Msg.class)).isTrue();
|
||||
assertThat(converter.canConvertFrom(messageWithoutContentType, Msg.class)).isTrue();
|
||||
assertThat(converter.canConvertFrom(messageJson, Msg.class)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canConvertTo() {
|
||||
void canConvertTo() {
|
||||
assertThat(converter.canConvertTo(testMsg, message.getHeaders())).isTrue();
|
||||
assertThat(converter.canConvertTo(testMsg, messageWithoutContentType.getHeaders())).isTrue();
|
||||
assertThat(converter.canConvertTo(testMsg, messageJson.getHeaders())).isTrue();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void convertFrom() {
|
||||
final Msg msg = (Msg) converter.fromMessage(message, Msg.class);
|
||||
assertThat(msg).isEqualTo(testMsg);
|
||||
void convertFrom() {
|
||||
assertThat(converter.fromMessage(message, Msg.class)).isEqualTo(testMsg);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void convertTo() {
|
||||
final Message<?> message = converter.toMessage(this.testMsg, this.message.getHeaders());
|
||||
void convertFromNoContentType(){
|
||||
assertThat(converter.fromMessage(messageWithoutContentType, Msg.class)).isEqualTo(testMsg);
|
||||
}
|
||||
|
||||
@Test
|
||||
void convertTo() {
|
||||
Message<?> message = converter.toMessage(testMsg, this.message.getHeaders());
|
||||
assertThat(message).isNotNull();
|
||||
assertThat(message.getPayload()).isEqualTo(this.message.getPayload());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void convertFromNoContentType(){
|
||||
Msg result = (Msg) converter.fromMessage(messageWithoutContentType, Msg.class);
|
||||
assertThat(result).isEqualTo(testMsg);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void defaultContentType() {
|
||||
assertThat(converter.getDefaultContentType(testMsg)).isEqualTo(ProtobufMessageConverter.PROTOBUF);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testJsonWithGoogleProtobuf() {
|
||||
this.converter = new ProtobufMessageConverter(
|
||||
void jsonWithGoogleProtobuf() throws Exception {
|
||||
ProtobufMessageConverter converter = new ProtobufMessageConverter(
|
||||
new ProtobufMessageConverter.ProtobufJavaUtilSupport(null, null),
|
||||
extensionRegistry);
|
||||
|
||||
final Map<String, Object> headers = new HashMap<>();
|
||||
headers.put(CONTENT_TYPE, APPLICATION_JSON);
|
||||
mock(ExtensionRegistry.class));
|
||||
|
||||
//convertTo
|
||||
final Message<?> message = this.converter.toMessage(this.testMsg, new MessageHeaders(headers));
|
||||
Message<?> message = converter.toMessage(testMsg, new MessageHeaders(Map.of(CONTENT_TYPE, APPLICATION_JSON)));
|
||||
assertThat(message).isNotNull();
|
||||
assertThat(message.getHeaders().get(CONTENT_TYPE)).isEqualTo(APPLICATION_JSON);
|
||||
assertThat(((String) message.getPayload()).length() > 0).isTrue();
|
||||
assertThat(((String) message.getPayload()).isEmpty()).as("Body is empty").isFalse();
|
||||
assertThat(((String) message.getPayload())).isEqualTo(this.messageJson.getPayload());
|
||||
JSONAssert.assertEquals(messageJson.getPayload(), message.getPayload().toString(), true);
|
||||
|
||||
//convertFrom
|
||||
final Msg msg = (Msg) converter.fromMessage(message, Msg.class);
|
||||
assertThat(msg).isEqualTo(this.testMsg);
|
||||
assertThat(converter.fromMessage(message, Msg.class)).isEqualTo(testMsg);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,11 +46,9 @@ public class TransactionManagementConfigurationSelector extends AdviceModeImport
|
|||
@Override
|
||||
protected String[] selectImports(AdviceMode adviceMode) {
|
||||
return switch (adviceMode) {
|
||||
case PROXY -> new String[]{
|
||||
AutoProxyRegistrar.class.getName(),
|
||||
ProxyTransactionManagementConfiguration.class.getName()
|
||||
};
|
||||
case ASPECTJ -> new String[]{determineTransactionAspectClass()};
|
||||
case PROXY -> new String[] {AutoProxyRegistrar.class.getName(),
|
||||
ProxyTransactionManagementConfiguration.class.getName()};
|
||||
case ASPECTJ -> new String[] {determineTransactionAspectClass()};
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||
* @author Sebastien Deleuze
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingTests {
|
||||
class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingTests {
|
||||
|
||||
private Jackson2JsonDecoder jsonDecoder = new Jackson2JsonDecoder();
|
||||
|
||||
|
|
@ -50,20 +50,20 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT
|
|||
|
||||
|
||||
@Test
|
||||
public void cantRead() {
|
||||
void cannotRead() {
|
||||
assertThat(reader.canRead(ResolvableType.forClass(Object.class), new MediaType("foo", "bar"))).isFalse();
|
||||
assertThat(reader.canRead(ResolvableType.forClass(Object.class), null)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canRead() {
|
||||
void canRead() {
|
||||
assertThat(reader.canRead(ResolvableType.forClass(Object.class), new MediaType("text", "event-stream"))).isTrue();
|
||||
assertThat(reader.canRead(ResolvableType.forClass(ServerSentEvent.class), new MediaType("foo", "bar"))).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void readServerSentEvents() {
|
||||
void readServerSentEvents() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.body(Mono.just(stringBuffer(
|
||||
"id:c42\nevent:foo\nretry:123\n:bla\n:bla bla\n:bla bla bla\ndata:bar\n\n" +
|
||||
|
|
@ -96,7 +96,7 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT
|
|||
|
||||
@Test
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void readServerSentEventsWithMultipleChunks() {
|
||||
void readServerSentEventsWithMultipleChunks() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.body(Flux.just(
|
||||
stringBuffer("id:c42\nev"),
|
||||
|
|
@ -127,7 +127,7 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT
|
|||
}
|
||||
|
||||
@Test
|
||||
public void readString() {
|
||||
void readString() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.body(Mono.just(stringBuffer("data:foo\ndata:bar\n\ndata:baz\n\n")));
|
||||
|
||||
|
|
@ -142,7 +142,7 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT
|
|||
}
|
||||
|
||||
@Test
|
||||
public void trimWhitespace() {
|
||||
void trimWhitespace() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.body(Mono.just(stringBuffer("data: \tfoo \ndata:bar\t\n\n")));
|
||||
|
||||
|
|
@ -156,15 +156,14 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT
|
|||
}
|
||||
|
||||
@Test
|
||||
public void readPojo() {
|
||||
void readPojo() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.body(Mono.just(stringBuffer(
|
||||
"""
|
||||
data:{"foo": "foofoo", "bar": "barbar"}
|
||||
.body(Mono.just(stringBuffer("""
|
||||
data:{"foo": "foofoo", "bar": "barbar"}
|
||||
|
||||
data:{"foo": "foofoofoo", "bar": "barbarbar"}
|
||||
data:{"foo": "foofoofoo", "bar": "barbarbar"}
|
||||
|
||||
""")));
|
||||
""")));
|
||||
|
||||
Flux<Pojo> data = reader.read(ResolvableType.forClass(Pojo.class), request,
|
||||
Collections.emptyMap()).cast(Pojo.class);
|
||||
|
|
@ -194,7 +193,7 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT
|
|||
}
|
||||
|
||||
@Test // SPR-15331
|
||||
public void decodeFullContentAsString() {
|
||||
void decodeFullContentAsString() {
|
||||
String body = "data:foo\ndata:bar\n\ndata:baz\n\n";
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.body(Mono.just(stringBuffer(body)));
|
||||
|
|
@ -208,13 +207,11 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT
|
|||
}
|
||||
|
||||
@Test
|
||||
public void readError() {
|
||||
Flux<DataBuffer> body =
|
||||
Flux.just(stringBuffer("data:foo\ndata:bar\n\ndata:baz\n\n"))
|
||||
.concatWith(Flux.error(new RuntimeException()));
|
||||
void readError() {
|
||||
Flux<DataBuffer> body = Flux.just(stringBuffer("data:foo\ndata:bar\n\ndata:baz\n\n"))
|
||||
.concatWith(Flux.error(new RuntimeException()));
|
||||
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
.body(body);
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/").body(body);
|
||||
|
||||
Flux<String> data = reader.read(ResolvableType.forClass(String.class),
|
||||
request, Collections.emptyMap()).cast(String.class);
|
||||
|
|
@ -227,7 +224,7 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT
|
|||
}
|
||||
|
||||
@Test
|
||||
public void maxInMemoryLimit() {
|
||||
void maxInMemoryLimit() {
|
||||
this.reader.setMaxInMemorySize(17);
|
||||
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/")
|
||||
|
|
@ -242,10 +239,10 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT
|
|||
}
|
||||
|
||||
@Test // gh-24312
|
||||
public void maxInMemoryLimitAllowsReadingPojoLargerThanDefaultSize() {
|
||||
void maxInMemoryLimitAllowsReadingPojoLargerThanDefaultSize() {
|
||||
int limit = this.jsonDecoder.getMaxInMemorySize();
|
||||
|
||||
String fooValue = getStringOfSize(limit) + "and then some more";
|
||||
String fooValue = "x".repeat(limit) + " and then some more";
|
||||
String content = "data:{\"foo\": \"" + fooValue + "\"}\n\n";
|
||||
MockServerHttpRequest request = MockServerHttpRequest.post("/").body(Mono.just(stringBuffer(content)));
|
||||
|
||||
|
|
@ -272,12 +269,4 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT
|
|||
return buffer;
|
||||
}
|
||||
|
||||
private static String getStringOfSize(long size) {
|
||||
StringBuilder content = new StringBuilder("Aa");
|
||||
while (content.length() < size) {
|
||||
content.append(content);
|
||||
}
|
||||
return content.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,10 +36,10 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||
*
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
public class StandardMultipartHttpServletRequestTests {
|
||||
class StandardMultipartHttpServletRequestTests {
|
||||
|
||||
@Test
|
||||
public void filename() throws Exception {
|
||||
void filename() {
|
||||
String disposition = "form-data; name=\"file\"; filename=\"myFile.txt\"";
|
||||
StandardMultipartHttpServletRequest request = requestWithPart("file", disposition, "");
|
||||
|
||||
|
|
@ -49,7 +49,7 @@ public class StandardMultipartHttpServletRequestTests {
|
|||
}
|
||||
|
||||
@Test // SPR-13319
|
||||
public void filenameRfc5987() throws Exception {
|
||||
void filenameRfc5987() {
|
||||
String disposition = "form-data; name=\"file\"; filename*=\"UTF-8''foo-%c3%a4-%e2%82%ac.html\"";
|
||||
StandardMultipartHttpServletRequest request = requestWithPart("file", disposition, "");
|
||||
|
||||
|
|
@ -59,7 +59,7 @@ public class StandardMultipartHttpServletRequestTests {
|
|||
}
|
||||
|
||||
@Test // SPR-15205
|
||||
public void filenameRfc2047() throws Exception {
|
||||
void filenameRfc2047() {
|
||||
String disposition = "form-data; name=\"file\"; filename=\"=?UTF-8?Q?Declara=C3=A7=C3=A3o.pdf?=\"";
|
||||
StandardMultipartHttpServletRequest request = requestWithPart("file", disposition, "");
|
||||
|
||||
|
|
@ -69,7 +69,7 @@ public class StandardMultipartHttpServletRequestTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void multipartFileResource() throws IOException {
|
||||
void multipartFileResource() throws IOException {
|
||||
String name = "file";
|
||||
String disposition = "form-data; name=\"" + name + "\"; filename=\"myFile.txt\"";
|
||||
StandardMultipartHttpServletRequest request = requestWithPart(name, disposition, "myBody");
|
||||
|
|
@ -83,18 +83,17 @@ public class StandardMultipartHttpServletRequestTests {
|
|||
MockHttpOutputMessage output = new MockHttpOutputMessage();
|
||||
new FormHttpMessageConverter().write(map, null, output);
|
||||
|
||||
assertThat(output.getBodyAsString(StandardCharsets.UTF_8)).contains(
|
||||
"""
|
||||
Content-Disposition: form-data; name="file"; filename="myFile.txt"\r
|
||||
Content-Type: text/plain\r
|
||||
Content-Length: 6\r
|
||||
\r
|
||||
myBody\r
|
||||
""");
|
||||
assertThat(output.getBodyAsString(StandardCharsets.UTF_8)).contains("""
|
||||
Content-Disposition: form-data; name="file"; filename="myFile.txt"
|
||||
Content-Type: text/plain
|
||||
Content-Length: 6
|
||||
|
||||
myBody
|
||||
""".replace("\n", "\r\n"));
|
||||
}
|
||||
|
||||
|
||||
private StandardMultipartHttpServletRequest requestWithPart(String name, String disposition, String content) {
|
||||
private static StandardMultipartHttpServletRequest requestWithPart(String name, String disposition, String content) {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockPart part = new MockPart(name, null, content.getBytes(StandardCharsets.UTF_8));
|
||||
part.getHeaders().set("Content-Disposition", disposition);
|
||||
|
|
|
|||
|
|
@ -65,14 +65,16 @@ import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRe
|
|||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||
import static org.assertj.core.api.InstanceOfAssertFactories.type;
|
||||
import static org.springframework.http.codec.json.Jackson2CodecSupport.JSON_VIEW_HINT;
|
||||
|
||||
/**
|
||||
* @author Arjen Poutsma
|
||||
* @author Sebastien Deleuze
|
||||
* @author Brian Clozel
|
||||
* @author Sam Brannen
|
||||
*/
|
||||
public class BodyExtractorsTests {
|
||||
class BodyExtractorsTests {
|
||||
|
||||
private BodyExtractor.Context context;
|
||||
|
||||
|
|
@ -82,7 +84,7 @@ public class BodyExtractorsTests {
|
|||
|
||||
|
||||
@BeforeEach
|
||||
public void createContext() {
|
||||
void createContext() {
|
||||
final List<HttpMessageReader<?>> messageReaders = new ArrayList<>();
|
||||
messageReaders.add(new DecoderHttpMessageReader<>(new ByteBufferDecoder()));
|
||||
messageReaders.add(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes()));
|
||||
|
|
@ -116,7 +118,7 @@ public class BodyExtractorsTests {
|
|||
|
||||
|
||||
@Test
|
||||
public void toMono() {
|
||||
void toMono() {
|
||||
BodyExtractor<Mono<String>, ReactiveHttpInputMessage> extractor = BodyExtractors.toMono(String.class);
|
||||
|
||||
DefaultDataBufferFactory factory = DefaultDataBufferFactory.sharedInstance;
|
||||
|
|
@ -134,7 +136,7 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void toMonoParameterizedTypeReference() {
|
||||
void toMonoParameterizedTypeReference() {
|
||||
BodyExtractor<Mono<Map<String, String>>, ReactiveHttpInputMessage> extractor =
|
||||
BodyExtractors.toMono(new ParameterizedTypeReference<Map<String, String>>() {});
|
||||
|
||||
|
|
@ -155,7 +157,7 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void toMonoWithHints() {
|
||||
void toMonoWithHints() {
|
||||
BodyExtractor<Mono<User>, ReactiveHttpInputMessage> extractor = BodyExtractors.toMono(User.class);
|
||||
this.hints.put(JSON_VIEW_HINT, SafeToDeserialize.class);
|
||||
|
||||
|
|
@ -179,7 +181,7 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test // SPR-15758
|
||||
public void toMonoWithEmptyBodyAndNoContentType() {
|
||||
void toMonoWithEmptyBodyAndNoContentType() {
|
||||
BodyExtractor<Mono<Map<String, String>>, ReactiveHttpInputMessage> extractor =
|
||||
BodyExtractors.toMono(new ParameterizedTypeReference<Map<String, String>>() {});
|
||||
|
||||
|
|
@ -190,7 +192,7 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void toMonoVoidAsClientShouldConsumeAndCancel() {
|
||||
void toMonoVoidAsClientShouldConsumeAndCancel() {
|
||||
byte[] bytes = "foo".getBytes(StandardCharsets.UTF_8);
|
||||
DefaultDataBuffer dataBuffer = DefaultDataBufferFactory.sharedInstance.wrap(ByteBuffer.wrap(bytes));
|
||||
TestPublisher<DataBuffer> body = TestPublisher.create();
|
||||
|
|
@ -210,7 +212,7 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void toMonoVoidAsClientWithEmptyBody() {
|
||||
void toMonoVoidAsClientWithEmptyBody() {
|
||||
TestPublisher<DataBuffer> body = TestPublisher.create();
|
||||
|
||||
BodyExtractor<Mono<Void>, ReactiveHttpInputMessage> extractor = BodyExtractors.toMono(Void.class);
|
||||
|
|
@ -226,7 +228,7 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void toFlux() {
|
||||
void toFlux() {
|
||||
BodyExtractor<Flux<String>, ReactiveHttpInputMessage> extractor = BodyExtractors.toFlux(String.class);
|
||||
|
||||
byte[] bytes = "foo".getBytes(StandardCharsets.UTF_8);
|
||||
|
|
@ -243,7 +245,7 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void toFluxWithHints() {
|
||||
void toFluxWithHints() {
|
||||
BodyExtractor<Flux<User>, ReactiveHttpInputMessage> extractor = BodyExtractors.toFlux(User.class);
|
||||
this.hints.put(JSON_VIEW_HINT, SafeToDeserialize.class);
|
||||
|
||||
|
|
@ -272,7 +274,7 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void toFluxUnacceptable() {
|
||||
void toFluxUnacceptable() {
|
||||
BodyExtractor<Flux<String>, ReactiveHttpInputMessage> extractor = BodyExtractors.toFlux(String.class);
|
||||
|
||||
byte[] bytes = "foo".getBytes(StandardCharsets.UTF_8);
|
||||
|
|
@ -307,7 +309,7 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void toFormData() {
|
||||
void toFormData() {
|
||||
byte[] bytes = "name+1=value+1&name+2=value+2%2B1&name+2=value+2%2B2&name+3".getBytes(StandardCharsets.UTF_8);
|
||||
DefaultDataBuffer dataBuffer = DefaultDataBufferFactory.sharedInstance.wrap(ByteBuffer.wrap(bytes));
|
||||
Flux<DataBuffer> body = Flux.just(dataBuffer);
|
||||
|
|
@ -320,10 +322,10 @@ public class BodyExtractorsTests {
|
|||
|
||||
StepVerifier.create(result)
|
||||
.consumeNextWith(form -> {
|
||||
assertThat(form.size()).as("Invalid result").isEqualTo(3);
|
||||
assertThat(form).as("Invalid result").hasSize(3);
|
||||
assertThat(form.getFirst("name 1")).as("Invalid result").isEqualTo("value 1");
|
||||
List<String> values = form.get("name 2");
|
||||
assertThat(values.size()).as("Invalid result").isEqualTo(2);
|
||||
assertThat(values).as("Invalid result").hasSize(2);
|
||||
assertThat(values.get(0)).as("Invalid result").isEqualTo("value 2+1");
|
||||
assertThat(values.get(1)).as("Invalid result").isEqualTo("value 2+2");
|
||||
assertThat(form.getFirst("name 3")).as("Invalid result").isNull();
|
||||
|
|
@ -333,28 +335,28 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void toParts() {
|
||||
void toParts() {
|
||||
BodyExtractor<Flux<Part>, ServerHttpRequest> extractor = BodyExtractors.toParts();
|
||||
|
||||
String bodyContents = """
|
||||
-----------------------------9051914041544843365972754266\r
|
||||
Content-Disposition: form-data; name="text"\r
|
||||
\r
|
||||
text default\r
|
||||
-----------------------------9051914041544843365972754266\r
|
||||
Content-Disposition: form-data; name="file1"; filename="a.txt"\r
|
||||
Content-Type: text/plain\r
|
||||
\r
|
||||
Content of a.txt.\r
|
||||
\r
|
||||
-----------------------------9051914041544843365972754266\r
|
||||
Content-Disposition: form-data; name="file2"; filename="a.html"\r
|
||||
Content-Type: text/html\r
|
||||
\r
|
||||
<!DOCTYPE html><title>Content of a.html.</title>\r
|
||||
\r
|
||||
-----------------------------9051914041544843365972754266--\r
|
||||
""";
|
||||
-----------------------------9051914041544843365972754266
|
||||
Content-Disposition: form-data; name="text"
|
||||
|
||||
text default
|
||||
-----------------------------9051914041544843365972754266
|
||||
Content-Disposition: form-data; name="file1"; filename="a.txt"
|
||||
Content-Type: text/plain
|
||||
|
||||
Content of a.txt.
|
||||
|
||||
-----------------------------9051914041544843365972754266
|
||||
Content-Disposition: form-data; name="file2"; filename="a.html"
|
||||
Content-Type: text/html
|
||||
|
||||
<!DOCTYPE html><title>Content of a.html.</title>
|
||||
|
||||
-----------------------------9051914041544843365972754266--
|
||||
""".replace("\n", "\r\n");
|
||||
|
||||
byte[] bytes = bodyContents.getBytes(StandardCharsets.UTF_8);
|
||||
DefaultDataBuffer dataBuffer = DefaultDataBufferFactory.sharedInstance.wrap(ByteBuffer.wrap(bytes));
|
||||
|
|
@ -369,33 +371,27 @@ public class BodyExtractorsTests {
|
|||
StepVerifier.create(result)
|
||||
.consumeNextWith(part -> {
|
||||
assertThat(part.name()).isEqualTo("text");
|
||||
boolean condition = part instanceof FormFieldPart;
|
||||
assertThat(condition).isTrue();
|
||||
FormFieldPart formFieldPart = (FormFieldPart) part;
|
||||
assertThat(formFieldPart.value()).isEqualTo("text default");
|
||||
assertThat(part).asInstanceOf(type(FormFieldPart.class)).satisfies(
|
||||
formFieldPart -> assertThat(formFieldPart.value()).isEqualTo("text default"));
|
||||
})
|
||||
.consumeNextWith(part -> {
|
||||
assertThat(part.name()).isEqualTo("file1");
|
||||
boolean condition = part instanceof FilePart;
|
||||
assertThat(condition).isTrue();
|
||||
FilePart filePart = (FilePart) part;
|
||||
assertThat(filePart.filename()).isEqualTo("a.txt");
|
||||
assertThat(filePart.headers().getContentType()).isEqualTo(MediaType.TEXT_PLAIN);
|
||||
assertThat(part).asInstanceOf(type(FilePart.class)).satisfies(
|
||||
filePart -> assertThat(filePart.filename()).isEqualTo("a.txt"),
|
||||
filePart -> assertThat(filePart.headers().getContentType()).isEqualTo(MediaType.TEXT_PLAIN));
|
||||
})
|
||||
.consumeNextWith(part -> {
|
||||
assertThat(part.name()).isEqualTo("file2");
|
||||
boolean condition = part instanceof FilePart;
|
||||
assertThat(condition).isTrue();
|
||||
FilePart filePart = (FilePart) part;
|
||||
assertThat(filePart.filename()).isEqualTo("a.html");
|
||||
assertThat(filePart.headers().getContentType()).isEqualTo(MediaType.TEXT_HTML);
|
||||
assertThat(part).asInstanceOf(type(FilePart.class)).satisfies(
|
||||
filePart -> assertThat(filePart.filename()).isEqualTo("a.html"),
|
||||
filePart -> assertThat(filePart.headers().getContentType()).isEqualTo(MediaType.TEXT_HTML));
|
||||
})
|
||||
.expectComplete()
|
||||
.verify();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toDataBuffers() {
|
||||
void toDataBuffers() {
|
||||
BodyExtractor<Flux<DataBuffer>, ReactiveHttpInputMessage> extractor = BodyExtractors.toDataBuffers();
|
||||
|
||||
byte[] bytes = "foo".getBytes(StandardCharsets.UTF_8);
|
||||
|
|
@ -412,7 +408,7 @@ public class BodyExtractorsTests {
|
|||
}
|
||||
|
||||
@Test // SPR-17054
|
||||
public void unsupportedMediaTypeShouldConsumeAndCancel() {
|
||||
void unsupportedMediaTypeShouldConsumeAndCancel() {
|
||||
NettyDataBufferFactory factory = new NettyDataBufferFactory(new PooledByteBufAllocator(true));
|
||||
NettyDataBuffer buffer = factory.wrap(ByteBuffer.wrap("spring".getBytes(StandardCharsets.UTF_8)));
|
||||
TestPublisher<DataBuffer> body = TestPublisher.create();
|
||||
|
|
@ -428,10 +424,8 @@ public class BodyExtractorsTests {
|
|||
body.emit(buffer);
|
||||
})
|
||||
.expectErrorSatisfies(throwable -> {
|
||||
boolean condition = throwable instanceof UnsupportedMediaTypeException;
|
||||
assertThat(condition).isTrue();
|
||||
assertThatExceptionOfType(IllegalReferenceCountException.class).isThrownBy(
|
||||
buffer::release);
|
||||
assertThat(throwable).isInstanceOf(UnsupportedMediaTypeException.class);
|
||||
assertThatExceptionOfType(IllegalReferenceCountException.class).isThrownBy(buffer::release);
|
||||
body.assertCancelled();
|
||||
}).verify();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ import org.springframework.web.testfixture.server.MockServerWebExchange;
|
|||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
import static org.assertj.core.api.InstanceOfAssertFactories.type;
|
||||
import static org.springframework.web.reactive.function.BodyExtractors.toMono;
|
||||
|
||||
/**
|
||||
|
|
@ -413,16 +414,16 @@ public class DefaultServerRequestTests {
|
|||
@Test
|
||||
public void multipartData() {
|
||||
String data = """
|
||||
--12345\r
|
||||
Content-Disposition: form-data; name="foo"\r
|
||||
\r
|
||||
bar\r
|
||||
--12345\r
|
||||
Content-Disposition: form-data; name="baz"\r
|
||||
\r
|
||||
qux\r
|
||||
--12345--\r
|
||||
""";
|
||||
--12345
|
||||
Content-Disposition: form-data; name="foo"
|
||||
|
||||
bar
|
||||
--12345
|
||||
Content-Disposition: form-data; name="baz"
|
||||
|
||||
qux
|
||||
--12345--
|
||||
""".replace("\n", "\r\n");
|
||||
byte[] bytes = data.getBytes(StandardCharsets.UTF_8);
|
||||
DefaultDataBuffer dataBuffer = DefaultDataBufferFactory.sharedInstance.wrap(ByteBuffer.wrap(bytes));
|
||||
Flux<DataBuffer> body = Flux.just(dataBuffer);
|
||||
|
|
@ -439,18 +440,10 @@ public class DefaultServerRequestTests {
|
|||
StepVerifier.create(resultData)
|
||||
.consumeNextWith(formData -> {
|
||||
assertThat(formData).hasSize(2);
|
||||
|
||||
Part part = formData.getFirst("foo");
|
||||
boolean condition1 = part instanceof FormFieldPart;
|
||||
assertThat(condition1).isTrue();
|
||||
FormFieldPart formFieldPart = (FormFieldPart) part;
|
||||
assertThat(formFieldPart.value()).isEqualTo("bar");
|
||||
|
||||
part = formData.getFirst("baz");
|
||||
boolean condition = part instanceof FormFieldPart;
|
||||
assertThat(condition).isTrue();
|
||||
formFieldPart = (FormFieldPart) part;
|
||||
assertThat(formFieldPart.value()).isEqualTo("qux");
|
||||
assertThat(formData.getFirst("foo")).asInstanceOf(type(FormFieldPart.class))
|
||||
.extracting(FormFieldPart::value).isEqualTo("bar");
|
||||
assertThat(formData.getFirst("baz")).asInstanceOf(type(FormFieldPart.class))
|
||||
.extracting(FormFieldPart::value).isEqualTo("qux");
|
||||
})
|
||||
.verifyComplete();
|
||||
}
|
||||
|
|
@ -740,7 +733,6 @@ public class DefaultServerRequestTests {
|
|||
@ParameterizedTest(name = "[{index}] {0}")
|
||||
@ValueSource(strings = {"GET", "HEAD"})
|
||||
@interface SafeHttpMethodsTest {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,10 +36,10 @@ import static org.springframework.web.reactive.function.server.RouterFunctions.r
|
|||
/**
|
||||
* @author Arjen Poutsma
|
||||
*/
|
||||
public class ToStringVisitorTests {
|
||||
class ToStringVisitorTests {
|
||||
|
||||
@Test
|
||||
public void nested() {
|
||||
void nested() {
|
||||
HandlerFunction<ServerResponse> handler = new SimpleHandlerFunction();
|
||||
RouterFunction<ServerResponse> routerFunction = route()
|
||||
.path("/foo", builder ->
|
||||
|
|
@ -53,16 +53,17 @@ public class ToStringVisitorTests {
|
|||
routerFunction.accept(visitor);
|
||||
String result = visitor.toString();
|
||||
|
||||
String expected = "/foo => {\n" +
|
||||
" /bar => {\n" +
|
||||
" (GET && /baz) -> \n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
String expected = """
|
||||
/foo => {
|
||||
/bar => {
|
||||
(GET && /baz) ->\s
|
||||
}
|
||||
}""".replace('\t', ' ');
|
||||
assertThat(result).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void predicates() {
|
||||
void predicates() {
|
||||
testPredicate(methods(HttpMethod.GET), "GET");
|
||||
testPredicate(methods(HttpMethod.GET, HttpMethod.POST), "[GET, POST]");
|
||||
|
||||
|
|
@ -95,9 +96,7 @@ public class ToStringVisitorTests {
|
|||
private void testPredicate(RequestPredicate predicate, String expected) {
|
||||
ToStringVisitor visitor = new ToStringVisitor();
|
||||
predicate.accept(visitor);
|
||||
String result = visitor.toString();
|
||||
|
||||
assertThat(result).isEqualTo(expected);
|
||||
assertThat(visitor).asString().isEqualTo(expected);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -16,10 +16,9 @@
|
|||
|
||||
package org.springframework.web.reactive.resource;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
|
@ -29,11 +28,11 @@ import reactor.test.StepVerifier;
|
|||
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.reactive.resource.EncodedResourceResolver.EncodedResource;
|
||||
import org.springframework.web.reactive.resource.GzipSupport.GzippedFiles;
|
||||
import org.springframework.web.testfixture.server.MockServerWebExchange;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest.get;
|
||||
|
||||
|
|
@ -44,18 +43,16 @@ import static org.springframework.web.testfixture.http.server.reactive.MockServe
|
|||
* @author Sam Brannen
|
||||
*/
|
||||
@ExtendWith(GzipSupport.class)
|
||||
public class CssLinkResourceTransformerTests {
|
||||
class CssLinkResourceTransformerTests {
|
||||
|
||||
private ResourceTransformerChain transformerChain;
|
||||
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
void setup() {
|
||||
VersionResourceResolver versionResolver = new VersionResourceResolver();
|
||||
versionResolver.setStrategyMap(Collections.singletonMap("/**", new ContentVersionStrategy()));
|
||||
List<ResourceResolver> resolvers = new ArrayList<>();
|
||||
resolvers.add(versionResolver);
|
||||
resolvers.add(new PathResourceResolver());
|
||||
List<ResourceResolver> resolvers = List.of(versionResolver, new PathResourceResolver());
|
||||
|
||||
CssLinkResourceTransformer cssLinkTransformer = new CssLinkResourceTransformer();
|
||||
cssLinkTransformer.setResourceUrlProvider(createUrlProvider(resolvers));
|
||||
|
|
@ -66,18 +63,17 @@ public class CssLinkResourceTransformerTests {
|
|||
|
||||
private ResourceUrlProvider createUrlProvider(List<ResourceResolver> resolvers) {
|
||||
ResourceWebHandler handler = new ResourceWebHandler();
|
||||
handler.setLocations(Collections.singletonList(new ClassPathResource("test/", getClass())));
|
||||
handler.setLocations(List.of(new ClassPathResource("test/", getClass())));
|
||||
handler.setResourceResolvers(resolvers);
|
||||
|
||||
ResourceUrlProvider urlProvider = new ResourceUrlProvider();
|
||||
urlProvider.registerHandlers(Collections.singletonMap("/static/**", handler));
|
||||
urlProvider.registerHandlers(Map.of("/static/**", handler));
|
||||
return urlProvider;
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void transform() {
|
||||
|
||||
void transform() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(get("/static/main.css"));
|
||||
Resource css = getResource("main.css");
|
||||
String expected = """
|
||||
|
|
@ -95,16 +91,15 @@ public class CssLinkResourceTransformerTests {
|
|||
StepVerifier.create(this.transformerChain.transform(exchange, css)
|
||||
.cast(TransformedResource.class))
|
||||
.consumeNextWith(transformedResource -> {
|
||||
String result = new String(transformedResource.getByteArray(), StandardCharsets.UTF_8);
|
||||
result = StringUtils.deleteAny(result, "\r");
|
||||
assertThat(result).isEqualTo(expected);
|
||||
String result = new String(transformedResource.getByteArray(), UTF_8);
|
||||
assertThat(result).isEqualToNormalizingNewlines(expected);
|
||||
})
|
||||
.expectComplete()
|
||||
.verify();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void transformNoLinks() {
|
||||
void transformNoLinks() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(get("/static/foo.css"));
|
||||
Resource expected = getResource("foo.css");
|
||||
|
||||
|
|
@ -114,7 +109,7 @@ public class CssLinkResourceTransformerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void transformExtLinksNotAllowed() {
|
||||
void transformExtLinksNotAllowed() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(get("/static/external.css"));
|
||||
|
||||
List<ResourceTransformer> transformers = Collections.singletonList(new CssLinkResourceTransformer());
|
||||
|
|
@ -130,9 +125,8 @@ public class CssLinkResourceTransformerTests {
|
|||
StepVerifier.create(chain.transform(exchange, resource)
|
||||
.cast(TransformedResource.class))
|
||||
.consumeNextWith(transformedResource -> {
|
||||
String result = new String(transformedResource.getByteArray(), StandardCharsets.UTF_8);
|
||||
result = StringUtils.deleteAny(result, "\r");
|
||||
assertThat(result).isEqualTo(expected);
|
||||
String result = new String(transformedResource.getByteArray(), UTF_8);
|
||||
assertThat(result).isEqualToNormalizingNewlines(expected);
|
||||
})
|
||||
.expectComplete()
|
||||
.verify();
|
||||
|
|
@ -144,7 +138,7 @@ public class CssLinkResourceTransformerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void transformSkippedForNonCssResource() {
|
||||
void transformSkippedForNonCssResource() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(get("/static/images/image.png"));
|
||||
Resource expected = getResource("images/image.png");
|
||||
|
||||
|
|
@ -155,7 +149,7 @@ public class CssLinkResourceTransformerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void transformSkippedForGzippedResource(GzippedFiles gzippedFiles) throws Exception {
|
||||
void transformSkippedForGzippedResource(GzippedFiles gzippedFiles) throws Exception {
|
||||
gzippedFiles.create("main.css");
|
||||
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(get("/static/main.css"));
|
||||
|
|
@ -169,20 +163,19 @@ public class CssLinkResourceTransformerTests {
|
|||
}
|
||||
|
||||
@Test // https://github.com/spring-projects/spring-framework/issues/22602
|
||||
public void transformEmptyUrlFunction() throws Exception {
|
||||
void transformEmptyUrlFunction() throws Exception {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(get("/static/empty_url_function.css"));
|
||||
Resource css = getResource("empty_url_function.css");
|
||||
String expected = """
|
||||
.fooStyle {
|
||||
\tbackground: transparent url() no-repeat left top;
|
||||
background: transparent url() no-repeat left top;
|
||||
}""";
|
||||
|
||||
StepVerifier.create(this.transformerChain.transform(exchange, css)
|
||||
.cast(TransformedResource.class))
|
||||
.consumeNextWith(transformedResource -> {
|
||||
String result = new String(transformedResource.getByteArray(), StandardCharsets.UTF_8);
|
||||
result = StringUtils.deleteAny(result, "\r");
|
||||
assertThat(result).isEqualTo(expected);
|
||||
String result = new String(transformedResource.getByteArray(), UTF_8);
|
||||
assertThat(result).isEqualToNormalizingNewlines(expected);
|
||||
})
|
||||
.expectComplete()
|
||||
.verify();
|
||||
|
|
|
|||
|
|
@ -66,8 +66,8 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
|
|||
*/
|
||||
class DefaultServerRequestTests {
|
||||
|
||||
private final List<HttpMessageConverter<?>> messageConverters = Collections.singletonList(
|
||||
new StringHttpMessageConverter());
|
||||
private final List<HttpMessageConverter<?>> messageConverters = List.of(new StringHttpMessageConverter());
|
||||
|
||||
|
||||
@Test
|
||||
void method() {
|
||||
|
|
@ -84,8 +84,7 @@ class DefaultServerRequestTests {
|
|||
servletRequest.setScheme("https");
|
||||
servletRequest.setServerPort(443);
|
||||
|
||||
DefaultServerRequest request =
|
||||
new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
assertThat(request.uri()).isEqualTo(URI.create("https://example.com/"));
|
||||
}
|
||||
|
|
@ -95,8 +94,7 @@ class DefaultServerRequestTests {
|
|||
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/path", true);
|
||||
servletRequest.setQueryString("a=1");
|
||||
|
||||
DefaultServerRequest request =
|
||||
new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
URI result = request.uriBuilder().build();
|
||||
assertThat(result.getScheme()).isEqualTo("http");
|
||||
|
|
@ -111,8 +109,7 @@ class DefaultServerRequestTests {
|
|||
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/", true);
|
||||
servletRequest.setAttribute("foo", "bar");
|
||||
|
||||
DefaultServerRequest request =
|
||||
new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
assertThat(request.attribute("foo")).isEqualTo(Optional.of("bar"));
|
||||
}
|
||||
|
|
@ -122,8 +119,7 @@ class DefaultServerRequestTests {
|
|||
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/", true);
|
||||
servletRequest.setParameter("foo", "bar");
|
||||
|
||||
DefaultServerRequest request =
|
||||
new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
assertThat(request.param("foo")).isEqualTo(Optional.of("bar"));
|
||||
}
|
||||
|
|
@ -137,8 +133,7 @@ class DefaultServerRequestTests {
|
|||
servletRequest.addPart(formPart);
|
||||
servletRequest.addPart(filePart);
|
||||
|
||||
DefaultServerRequest request =
|
||||
new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
MultiValueMap<String, Part> result = request.multipartData();
|
||||
|
||||
|
|
@ -152,8 +147,7 @@ class DefaultServerRequestTests {
|
|||
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/", true);
|
||||
servletRequest.setParameter("foo", "");
|
||||
|
||||
DefaultServerRequest request =
|
||||
new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
assertThat(request.param("foo")).isEqualTo(Optional.of(""));
|
||||
}
|
||||
|
|
@ -163,8 +157,7 @@ class DefaultServerRequestTests {
|
|||
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/", true);
|
||||
servletRequest.setParameter("foo", "");
|
||||
|
||||
DefaultServerRequest request =
|
||||
new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
assertThat(request.param("bar")).isEqualTo(Optional.empty());
|
||||
}
|
||||
|
|
@ -173,11 +166,9 @@ class DefaultServerRequestTests {
|
|||
void pathVariable() {
|
||||
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/", true);
|
||||
Map<String, String> pathVariables = Collections.singletonMap("foo", "bar");
|
||||
servletRequest
|
||||
.setAttribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables);
|
||||
servletRequest.setAttribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables);
|
||||
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest,
|
||||
this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
assertThat(request.pathVariable("foo")).isEqualTo("bar");
|
||||
}
|
||||
|
|
@ -186,25 +177,20 @@ class DefaultServerRequestTests {
|
|||
void pathVariableNotFound() {
|
||||
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/", true);
|
||||
Map<String, String> pathVariables = Collections.singletonMap("foo", "bar");
|
||||
servletRequest
|
||||
.setAttribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables);
|
||||
servletRequest.setAttribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables);
|
||||
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest,
|
||||
this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
||||
request.pathVariable("baz"));
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> request.pathVariable("baz"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void pathVariables() {
|
||||
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/", true);
|
||||
Map<String, String> pathVariables = Collections.singletonMap("foo", "bar");
|
||||
servletRequest
|
||||
.setAttribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables);
|
||||
servletRequest.setAttribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables);
|
||||
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest,
|
||||
this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
assertThat(request.pathVariables()).isEqualTo(pathVariables);
|
||||
}
|
||||
|
|
@ -212,8 +198,7 @@ class DefaultServerRequestTests {
|
|||
@Test
|
||||
void header() {
|
||||
HttpHeaders httpHeaders = new HttpHeaders();
|
||||
List<MediaType> accept =
|
||||
Collections.singletonList(MediaType.APPLICATION_JSON);
|
||||
List<MediaType> accept = Collections.singletonList(MediaType.APPLICATION_JSON);
|
||||
httpHeaders.setAccept(accept);
|
||||
List<Charset> acceptCharset = Collections.singletonList(UTF_8);
|
||||
httpHeaders.setAcceptCharset(acceptCharset);
|
||||
|
|
@ -230,8 +215,7 @@ class DefaultServerRequestTests {
|
|||
httpHeaders.forEach(servletRequest::addHeader);
|
||||
servletRequest.setContentType(MediaType.TEXT_PLAIN_VALUE);
|
||||
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest,
|
||||
this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
ServerRequest.Headers headers = request.headers();
|
||||
assertThat(headers.accept()).isEqualTo(accept);
|
||||
|
|
@ -250,8 +234,7 @@ class DefaultServerRequestTests {
|
|||
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/", true);
|
||||
servletRequest.setCookies(cookie);
|
||||
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest,
|
||||
this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
MultiValueMap<String, Cookie> expected = new LinkedMultiValueMap<>();
|
||||
expected.add("foo", cookie);
|
||||
|
|
@ -266,8 +249,7 @@ class DefaultServerRequestTests {
|
|||
servletRequest.setContentType(MediaType.TEXT_PLAIN_VALUE);
|
||||
servletRequest.setContent("foo".getBytes(UTF_8));
|
||||
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest,
|
||||
this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
String result = request.body(String.class);
|
||||
assertThat(result).isEqualTo("foo");
|
||||
|
|
@ -280,7 +262,7 @@ class DefaultServerRequestTests {
|
|||
servletRequest.setContent("[\"foo\",\"bar\"]".getBytes(UTF_8));
|
||||
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest,
|
||||
Collections.singletonList(new MappingJackson2HttpMessageConverter()));
|
||||
List.of(new MappingJackson2HttpMessageConverter()));
|
||||
|
||||
List<String> result = request.body(new ParameterizedTypeReference<List<String>>() {});
|
||||
assertThat(result).hasSize(2);
|
||||
|
|
@ -294,11 +276,10 @@ class DefaultServerRequestTests {
|
|||
servletRequest.setContentType(MediaType.TEXT_PLAIN_VALUE);
|
||||
servletRequest.setContent("foo".getBytes(UTF_8));
|
||||
|
||||
DefaultServerRequest request =
|
||||
new DefaultServerRequest(servletRequest, Collections.emptyList());
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, Collections.emptyList());
|
||||
|
||||
assertThatExceptionOfType(HttpMediaTypeNotSupportedException.class).isThrownBy(() ->
|
||||
request.body(String.class));
|
||||
assertThatExceptionOfType(HttpMediaTypeNotSupportedException.class)
|
||||
.isThrownBy(() -> request.body(String.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -307,11 +288,9 @@ class DefaultServerRequestTests {
|
|||
MockHttpSession session = new MockHttpSession();
|
||||
servletRequest.setSession(session);
|
||||
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest,
|
||||
this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
assertThat(request.session()).isEqualTo(session);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -320,8 +299,7 @@ class DefaultServerRequestTests {
|
|||
Principal principal = () -> "foo";
|
||||
servletRequest.setUserPrincipal(principal);
|
||||
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest,
|
||||
this.messageConverters);
|
||||
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
|
||||
|
||||
assertThat(request.principal().get()).isEqualTo(principal);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,10 +35,10 @@ import static org.springframework.web.servlet.function.RouterFunctions.route;
|
|||
/**
|
||||
* @author Arjen Poutsma
|
||||
*/
|
||||
public class ToStringVisitorTests {
|
||||
class ToStringVisitorTests {
|
||||
|
||||
@Test
|
||||
public void nested() {
|
||||
void nested() {
|
||||
HandlerFunction<ServerResponse> handler = new SimpleHandlerFunction();
|
||||
RouterFunction<ServerResponse> routerFunction = route()
|
||||
.path("/foo", builder ->
|
||||
|
|
@ -62,7 +62,7 @@ public class ToStringVisitorTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void predicates() {
|
||||
void predicates() {
|
||||
testPredicate(methods(HttpMethod.GET), "GET");
|
||||
testPredicate(methods(HttpMethod.GET, HttpMethod.POST), "[GET, POST]");
|
||||
|
||||
|
|
@ -95,9 +95,7 @@ public class ToStringVisitorTests {
|
|||
private void testPredicate(RequestPredicate predicate, String expected) {
|
||||
ToStringVisitor visitor = new ToStringVisitor();
|
||||
predicate.accept(visitor);
|
||||
String result = visitor.toString();
|
||||
|
||||
assertThat(result).isEqualTo(expected);
|
||||
assertThat(visitor).asString().isEqualTo(expected);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -16,10 +16,9 @@
|
|||
|
||||
package org.springframework.web.servlet.resource;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
|
@ -28,11 +27,11 @@ import org.mockito.Mockito;
|
|||
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.servlet.resource.EncodedResourceResolver.EncodedResource;
|
||||
import org.springframework.web.servlet.resource.GzipSupport.GzippedFiles;
|
||||
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
|
|
@ -44,7 +43,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||
* @since 4.1
|
||||
*/
|
||||
@ExtendWith(GzipSupport.class)
|
||||
public class CssLinkResourceTransformerTests {
|
||||
class CssLinkResourceTransformerTests {
|
||||
|
||||
private ResourceTransformerChain transformerChain;
|
||||
|
||||
|
|
@ -52,14 +51,12 @@ public class CssLinkResourceTransformerTests {
|
|||
|
||||
|
||||
@BeforeEach
|
||||
public void setUp() {
|
||||
void setUp() {
|
||||
VersionResourceResolver versionResolver = new VersionResourceResolver();
|
||||
versionResolver.setStrategyMap(Collections.singletonMap("/**", new ContentVersionStrategy()));
|
||||
PathResourceResolver pathResolver = new PathResourceResolver();
|
||||
pathResolver.setAllowedLocations(new ClassPathResource("test/", getClass()));
|
||||
List<ResourceResolver> resolvers = new ArrayList<>();
|
||||
resolvers.add(versionResolver);
|
||||
resolvers.add(new PathResourceResolver());
|
||||
List<ResourceResolver> resolvers = List.of(versionResolver, new PathResourceResolver());
|
||||
ResourceUrlProvider resourceUrlProvider = createUrlProvider(resolvers);
|
||||
|
||||
CssLinkResourceTransformer cssLinkTransformer = new CssLinkResourceTransformer();
|
||||
|
|
@ -72,16 +69,16 @@ public class CssLinkResourceTransformerTests {
|
|||
private ResourceUrlProvider createUrlProvider(List<ResourceResolver> resolvers) {
|
||||
ResourceHttpRequestHandler resourceHandler = new ResourceHttpRequestHandler();
|
||||
resourceHandler.setResourceResolvers(resolvers);
|
||||
resourceHandler.setLocations(Collections.singletonList(new ClassPathResource("test/", getClass())));
|
||||
resourceHandler.setLocations(List.of(new ClassPathResource("test/", getClass())));
|
||||
|
||||
ResourceUrlProvider resourceUrlProvider = new ResourceUrlProvider();
|
||||
resourceUrlProvider.setHandlerMap(Collections.singletonMap("/static/**", resourceHandler));
|
||||
resourceUrlProvider.setHandlerMap(Map.of("/static/**", resourceHandler));
|
||||
return resourceUrlProvider;
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void transform() throws Exception {
|
||||
void transform() throws Exception {
|
||||
this.request = new MockHttpServletRequest("GET", "/static/main.css");
|
||||
Resource css = getResource("main.css");
|
||||
String expected = """
|
||||
|
|
@ -97,13 +94,12 @@ public class CssLinkResourceTransformerTests {
|
|||
""";
|
||||
|
||||
TransformedResource actual = (TransformedResource) this.transformerChain.transform(this.request, css);
|
||||
String result = new String(actual.getByteArray(), StandardCharsets.UTF_8);
|
||||
result = StringUtils.deleteAny(result, "\r");
|
||||
assertThat(result).isEqualTo(expected);
|
||||
String result = new String(actual.getByteArray(), UTF_8);
|
||||
assertThat(result).isEqualToNormalizingNewlines(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void transformNoLinks() throws Exception {
|
||||
void transformNoLinks() throws Exception {
|
||||
this.request = new MockHttpServletRequest("GET", "/static/foo.css");
|
||||
Resource expected = getResource("foo.css");
|
||||
Resource actual = this.transformerChain.transform(this.request, expected);
|
||||
|
|
@ -111,7 +107,7 @@ public class CssLinkResourceTransformerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void transformExtLinksNotAllowed() throws Exception {
|
||||
void transformExtLinksNotAllowed() throws Exception {
|
||||
this.request = new MockHttpServletRequest("GET", "/static/external.css");
|
||||
|
||||
List<ResourceTransformer> transformers = Collections.singletonList(new CssLinkResourceTransformer());
|
||||
|
|
@ -125,18 +121,17 @@ public class CssLinkResourceTransformerTests {
|
|||
figure { background: url("//example.org/style.css")}""";
|
||||
|
||||
TransformedResource transformedResource = (TransformedResource) chain.transform(this.request, resource);
|
||||
String result = new String(transformedResource.getByteArray(), StandardCharsets.UTF_8);
|
||||
result = StringUtils.deleteAny(result, "\r");
|
||||
assertThat(result).isEqualTo(expected);
|
||||
String result = new String(transformedResource.getByteArray(), UTF_8);
|
||||
assertThat(result).isEqualToNormalizingNewlines(expected);
|
||||
|
||||
List<Resource> locations = Collections.singletonList(resource);
|
||||
List<Resource> locations = List.of(resource);
|
||||
Mockito.verify(mockChain, Mockito.never()).resolveUrlPath("https://example.org/fonts/css", locations);
|
||||
Mockito.verify(mockChain, Mockito.never()).resolveUrlPath("file:///home/spring/image.png", locations);
|
||||
Mockito.verify(mockChain, Mockito.never()).resolveUrlPath("//example.org/style.css", locations);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void transformSkippedForNonCssResource() throws Exception {
|
||||
void transformSkippedForNonCssResource() throws Exception {
|
||||
this.request = new MockHttpServletRequest("GET", "/static/images/image.png");
|
||||
Resource expected = getResource("images/image.png");
|
||||
Resource actual = this.transformerChain.transform(this.request, expected);
|
||||
|
|
@ -145,7 +140,7 @@ public class CssLinkResourceTransformerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void transformSkippedForGzippedResource(GzippedFiles gzippedFiles) throws Exception {
|
||||
void transformSkippedForGzippedResource(GzippedFiles gzippedFiles) throws Exception {
|
||||
gzippedFiles.create("main.css");
|
||||
|
||||
this.request = new MockHttpServletRequest("GET", "/static/main.css");
|
||||
|
|
@ -157,18 +152,17 @@ public class CssLinkResourceTransformerTests {
|
|||
}
|
||||
|
||||
@Test // https://github.com/spring-projects/spring-framework/issues/22602
|
||||
public void transformEmptyUrlFunction() throws Exception {
|
||||
void transformEmptyUrlFunction() throws Exception {
|
||||
this.request = new MockHttpServletRequest("GET", "/static/empty_url_function.css");
|
||||
Resource css = getResource("empty_url_function.css");
|
||||
String expected = """
|
||||
.fooStyle {
|
||||
\tbackground: transparent url() no-repeat left top;
|
||||
background: transparent url() no-repeat left top;
|
||||
}""";
|
||||
|
||||
TransformedResource actual = (TransformedResource) this.transformerChain.transform(this.request, css);
|
||||
String result = new String(actual.getByteArray(), StandardCharsets.UTF_8);
|
||||
result = StringUtils.deleteAny(result, "\r");
|
||||
assertThat(result).isEqualTo(expected);
|
||||
String result = new String(actual.getByteArray(), UTF_8);
|
||||
assertThat(result).isEqualToNormalizingNewlines(expected);
|
||||
}
|
||||
|
||||
private Resource getResource(String filePath) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue