Polish contribution and related code

This commit is contained in:
Sam Brannen 2023-01-11 13:50:46 +01:00
parent afb8a0d1b1
commit 0415975dd1
13 changed files with 240 additions and 330 deletions

View File

@ -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();
}

View File

@ -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")

View File

@ -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);
}
}

View File

@ -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()};
};
}

View File

@ -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();
}
}

View File

@ -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);

View File

@ -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();
}

View File

@ -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 {
}
}

View File

@ -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);
}

View File

@ -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();

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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) {