Browse Source
This commit adds tests for Servlet.fn, the servlet-based version of HandlerFunctions and RouterFunctions. See gh-21490pull/22540/head
15 changed files with 2193 additions and 0 deletions
@ -0,0 +1,208 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.time.ZonedDateTime; |
||||||
|
import java.time.format.DateTimeFormatter; |
||||||
|
import java.time.temporal.ChronoUnit; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.EnumSet; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Set; |
||||||
|
import javax.servlet.ServletException; |
||||||
|
import javax.servlet.http.Cookie; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.http.CacheControl; |
||||||
|
import org.springframework.http.HttpHeaders; |
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.http.HttpStatus; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
import org.springframework.http.converter.HttpMessageConverter; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletResponse; |
||||||
|
import org.springframework.util.LinkedMultiValueMap; |
||||||
|
import org.springframework.util.MultiValueMap; |
||||||
|
import org.springframework.web.servlet.ModelAndView; |
||||||
|
|
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
public class DefaultEntityResponseBuilderTests { |
||||||
|
|
||||||
|
static final ServerResponse.Context EMPTY_CONTEXT = new ServerResponse.Context() { |
||||||
|
@Override |
||||||
|
public List<HttpMessageConverter<?>> messageConverters() { |
||||||
|
return Collections.emptyList(); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
@Test |
||||||
|
public void fromObject() { |
||||||
|
String body = "foo"; |
||||||
|
EntityResponse<String> response = EntityResponse.fromObject(body).build(); |
||||||
|
assertSame(body, response.entity()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void status() { |
||||||
|
String body = "foo"; |
||||||
|
EntityResponse<String> result = |
||||||
|
EntityResponse.fromObject(body).status(HttpStatus.CREATED).build(); |
||||||
|
|
||||||
|
assertEquals(HttpStatus.CREATED, result.statusCode()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void allow() { |
||||||
|
String body = "foo"; |
||||||
|
EntityResponse<String> result = |
||||||
|
EntityResponse.fromObject(body).allow(HttpMethod.GET).build(); |
||||||
|
Set<HttpMethod> expected = EnumSet.of(HttpMethod.GET); |
||||||
|
assertEquals(expected, result.headers().getAllow()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void contentLength() { |
||||||
|
String body = "foo"; |
||||||
|
EntityResponse<String> result = EntityResponse.fromObject(body).contentLength(42).build(); |
||||||
|
assertEquals(42, result.headers().getContentLength()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void contentType() { |
||||||
|
String body = "foo"; |
||||||
|
EntityResponse<String> |
||||||
|
result = |
||||||
|
EntityResponse.fromObject(body).contentType(MediaType.APPLICATION_JSON).build(); |
||||||
|
|
||||||
|
assertEquals(MediaType.APPLICATION_JSON, result.headers().getContentType()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void etag() { |
||||||
|
String body = "foo"; |
||||||
|
EntityResponse<String> result = EntityResponse.fromObject(body).eTag("foo").build(); |
||||||
|
|
||||||
|
assertEquals("\"foo\"", result.headers().getETag()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void lastModified() { |
||||||
|
ZonedDateTime now = ZonedDateTime.now(); |
||||||
|
String body = "foo"; |
||||||
|
EntityResponse<String> result = EntityResponse.fromObject(body).lastModified(now).build(); |
||||||
|
long expected = now.toInstant().toEpochMilli() / 1000; |
||||||
|
assertEquals(expected, result.headers().getLastModified() / 1000); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void cacheControlTag() { |
||||||
|
String body = "foo"; |
||||||
|
EntityResponse<String> result = |
||||||
|
EntityResponse.fromObject(body).cacheControl(CacheControl.noCache()).build(); |
||||||
|
assertEquals("no-cache", result.headers().getCacheControl()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void varyBy() { |
||||||
|
String body = "foo"; |
||||||
|
EntityResponse<String> result = EntityResponse.fromObject(body).varyBy("foo").build(); |
||||||
|
List<String> expected = Collections.singletonList("foo"); |
||||||
|
assertEquals(expected, result.headers().getVary()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void header() { |
||||||
|
String body = "foo"; |
||||||
|
EntityResponse<String> result = EntityResponse.fromObject(body).header("foo", "bar").build(); |
||||||
|
assertEquals("bar", result.headers().getFirst("foo")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void headers() { |
||||||
|
String body = "foo"; |
||||||
|
HttpHeaders headers = new HttpHeaders(); |
||||||
|
headers.set("foo", "bar"); |
||||||
|
EntityResponse<String> result = EntityResponse.fromObject(body).headers(headers).build(); |
||||||
|
assertEquals(headers, result.headers()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void cookie() { |
||||||
|
Cookie cookie = new Cookie("name", "value"); |
||||||
|
EntityResponse<String> result = |
||||||
|
EntityResponse.fromObject("foo").cookie(cookie) |
||||||
|
.build(); |
||||||
|
assertTrue(result.cookies().get("name").contains(cookie)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void cookies() { |
||||||
|
MultiValueMap<String, Cookie> newCookies = new LinkedMultiValueMap<>(); |
||||||
|
newCookies.add("name", new Cookie("name", "value")); |
||||||
|
EntityResponse<String> result = |
||||||
|
EntityResponse.fromObject("foo").cookies(cookies -> cookies.addAll(newCookies)) |
||||||
|
.build(); |
||||||
|
assertEquals(newCookies, result.cookies()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void notModifiedEtag() throws Exception { |
||||||
|
String etag = "\"foo\""; |
||||||
|
EntityResponse<String> entityResponse = EntityResponse.fromObject("bar") |
||||||
|
.eTag(etag) |
||||||
|
.build(); |
||||||
|
|
||||||
|
MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
mockRequest.addHeader(HttpHeaders.IF_NONE_MATCH, etag); |
||||||
|
|
||||||
|
MockHttpServletResponse mockResponse = new MockHttpServletResponse(); |
||||||
|
|
||||||
|
ModelAndView mav = entityResponse.writeTo(mockRequest, mockResponse, EMPTY_CONTEXT); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
assertEquals(HttpStatus.NOT_MODIFIED.value(), mockResponse.getStatus()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void notModifiedLastModified() throws ServletException, IOException { |
||||||
|
ZonedDateTime now = ZonedDateTime.now(); |
||||||
|
ZonedDateTime oneMinuteBeforeNow = now.minus(1, ChronoUnit.MINUTES); |
||||||
|
|
||||||
|
EntityResponse<String> entityResponse = EntityResponse.fromObject("bar") |
||||||
|
.lastModified(oneMinuteBeforeNow) |
||||||
|
.build(); |
||||||
|
|
||||||
|
MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
mockRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, DateTimeFormatter.RFC_1123_DATE_TIME.format(now)); |
||||||
|
|
||||||
|
MockHttpServletResponse mockResponse = new MockHttpServletResponse(); |
||||||
|
|
||||||
|
ModelAndView mav = entityResponse.writeTo(mockRequest, mockResponse, EMPTY_CONTEXT); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
assertEquals(HttpStatus.NOT_MODIFIED.value(), mockResponse.getStatus()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,190 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.time.ZonedDateTime; |
||||||
|
import java.time.format.DateTimeFormatter; |
||||||
|
import java.time.temporal.ChronoUnit; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import javax.servlet.http.Cookie; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.http.HttpHeaders; |
||||||
|
import org.springframework.http.HttpStatus; |
||||||
|
import org.springframework.http.converter.HttpMessageConverter; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletResponse; |
||||||
|
import org.springframework.util.LinkedMultiValueMap; |
||||||
|
import org.springframework.util.MultiValueMap; |
||||||
|
import org.springframework.web.servlet.ModelAndView; |
||||||
|
|
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
public class DefaultRenderingResponseTests { |
||||||
|
|
||||||
|
static final ServerResponse.Context EMPTY_CONTEXT = new ServerResponse.Context() { |
||||||
|
@Override |
||||||
|
public List<HttpMessageConverter<?>> messageConverters() { |
||||||
|
return Collections.emptyList(); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
@Test |
||||||
|
public void create() throws Exception { |
||||||
|
String name = "foo"; |
||||||
|
RenderingResponse result = RenderingResponse.create(name).build(); |
||||||
|
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = result.writeTo(request, response, EMPTY_CONTEXT); |
||||||
|
|
||||||
|
assertEquals(name, mav.getViewName()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void status() throws Exception { |
||||||
|
HttpStatus status = HttpStatus.I_AM_A_TEAPOT; |
||||||
|
RenderingResponse result = RenderingResponse.create("foo").status(status).build(); |
||||||
|
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = result.writeTo(request, response, EMPTY_CONTEXT); |
||||||
|
assertNotNull(mav); |
||||||
|
assertEquals(status.value(), response.getStatus()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void headers() throws Exception { |
||||||
|
HttpHeaders headers = new HttpHeaders(); |
||||||
|
headers.set("foo", "bar"); |
||||||
|
RenderingResponse result = RenderingResponse.create("foo").headers(headers).build(); |
||||||
|
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = result.writeTo(request, response, EMPTY_CONTEXT); |
||||||
|
assertNotNull(mav); |
||||||
|
|
||||||
|
assertEquals("bar", response.getHeader("foo")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void modelAttribute() throws Exception { |
||||||
|
RenderingResponse result = RenderingResponse.create("foo") |
||||||
|
.modelAttribute("foo", "bar").build(); |
||||||
|
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = result.writeTo(request, response, EMPTY_CONTEXT); |
||||||
|
assertNotNull(mav); |
||||||
|
|
||||||
|
assertEquals("bar", mav.getModel().get("foo")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void modelAttributeConventions() throws Exception { |
||||||
|
RenderingResponse result = RenderingResponse.create("foo") |
||||||
|
.modelAttribute("bar").build(); |
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = result.writeTo(request, response, EMPTY_CONTEXT); |
||||||
|
assertNotNull(mav); |
||||||
|
assertEquals("bar", mav.getModel().get("string")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void modelAttributes() throws Exception { |
||||||
|
Map<String, String> model = Collections.singletonMap("foo", "bar"); |
||||||
|
RenderingResponse result = RenderingResponse.create("foo") |
||||||
|
.modelAttributes(model).build(); |
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = result.writeTo(request, response, EMPTY_CONTEXT); |
||||||
|
assertNotNull(mav); |
||||||
|
assertEquals("bar", mav.getModel().get("foo")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void modelAttributesConventions() throws Exception { |
||||||
|
RenderingResponse result = RenderingResponse.create("foo") |
||||||
|
.modelAttributes("bar").build(); |
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = result.writeTo(request, response, EMPTY_CONTEXT); |
||||||
|
assertNotNull(mav); |
||||||
|
assertEquals("bar", mav.getModel().get("string")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void cookies() throws Exception { |
||||||
|
MultiValueMap<String, Cookie> newCookies = new LinkedMultiValueMap<>(); |
||||||
|
newCookies.add("name", new Cookie("name", "value")); |
||||||
|
RenderingResponse result = |
||||||
|
RenderingResponse.create("foo").cookies(cookies -> cookies.addAll(newCookies)).build(); |
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = result.writeTo(request, response, EMPTY_CONTEXT); |
||||||
|
assertNotNull(mav); |
||||||
|
assertEquals(1, response.getCookies().length); |
||||||
|
assertEquals("name", response.getCookies()[0].getName()); |
||||||
|
assertEquals("value", response.getCookies()[0].getValue()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void notModifiedEtag() throws Exception { |
||||||
|
String etag = "\"foo\""; |
||||||
|
RenderingResponse result = RenderingResponse.create("bar") |
||||||
|
.header(HttpHeaders.ETAG, etag) |
||||||
|
.build(); |
||||||
|
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
request.addHeader(HttpHeaders.IF_NONE_MATCH, etag); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
|
||||||
|
ModelAndView mav = result.writeTo(request, response, EMPTY_CONTEXT); |
||||||
|
assertNull(mav); |
||||||
|
assertEquals(HttpStatus.NOT_MODIFIED.value(), response.getStatus()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void notModifiedLastModified() throws Exception { |
||||||
|
ZonedDateTime now = ZonedDateTime.now(); |
||||||
|
ZonedDateTime oneMinuteBeforeNow = now.minus(1, ChronoUnit.MINUTES); |
||||||
|
|
||||||
|
RenderingResponse result = RenderingResponse.create("bar") |
||||||
|
.header(HttpHeaders.LAST_MODIFIED, DateTimeFormatter.RFC_1123_DATE_TIME.format(oneMinuteBeforeNow)) |
||||||
|
.build(); |
||||||
|
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
request.addHeader(HttpHeaders.IF_MODIFIED_SINCE,DateTimeFormatter.RFC_1123_DATE_TIME.format(now)); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
|
||||||
|
ModelAndView mav = result.writeTo(request, response, EMPTY_CONTEXT); |
||||||
|
assertNull(mav); |
||||||
|
assertEquals(HttpStatus.NOT_MODIFIED.value(), response.getStatus()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,76 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.List; |
||||||
|
import javax.servlet.ServletException; |
||||||
|
import javax.servlet.http.Cookie; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.http.converter.HttpMessageConverter; |
||||||
|
import org.springframework.http.converter.StringHttpMessageConverter; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
|
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
public class DefaultServerRequestBuilderTests { |
||||||
|
|
||||||
|
private final List<HttpMessageConverter<?>> messageConverters = Collections.singletonList( |
||||||
|
new StringHttpMessageConverter()); |
||||||
|
|
||||||
|
@Test |
||||||
|
public void from() throws ServletException, IOException { |
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest("POST", "http://example.com"); |
||||||
|
request.addHeader("foo", "bar"); |
||||||
|
|
||||||
|
ServerRequest other = ServerRequest.create(request, messageConverters); |
||||||
|
|
||||||
|
ServerRequest result = ServerRequest.from(other) |
||||||
|
.method(HttpMethod.HEAD) |
||||||
|
.header("foo", "bar") |
||||||
|
.headers(httpHeaders -> httpHeaders.set("baz", "qux")) |
||||||
|
.cookie("foo", "bar") |
||||||
|
.cookies(cookies -> cookies.set("baz", new Cookie("baz", "qux"))) |
||||||
|
.attribute("foo", "bar") |
||||||
|
.attributes(attributes -> attributes.put("baz", "qux")) |
||||||
|
.body("baz") |
||||||
|
.build(); |
||||||
|
|
||||||
|
assertEquals(HttpMethod.HEAD, result.method()); |
||||||
|
assertEquals(2, result.headers().asHttpHeaders().size()); |
||||||
|
assertEquals("bar", result.headers().asHttpHeaders().getFirst("foo")); |
||||||
|
assertEquals("qux", result.headers().asHttpHeaders().getFirst("baz")); |
||||||
|
assertEquals(2, result.cookies().size()); |
||||||
|
assertEquals("bar", result.cookies().getFirst("foo").getValue()); |
||||||
|
assertEquals("qux", result.cookies().getFirst("baz").getValue()); |
||||||
|
assertEquals(2, result.attributes().size()); |
||||||
|
assertEquals("bar", result.attributes().get("foo")); |
||||||
|
assertEquals("qux", result.attributes().get("baz")); |
||||||
|
|
||||||
|
String body = result.body(String.class); |
||||||
|
assertEquals("baz", body); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,296 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.net.InetSocketAddress; |
||||||
|
import java.net.URI; |
||||||
|
import java.nio.charset.Charset; |
||||||
|
import java.security.Principal; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Optional; |
||||||
|
import java.util.OptionalLong; |
||||||
|
import javax.servlet.http.Cookie; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.core.ParameterizedTypeReference; |
||||||
|
import org.springframework.http.HttpHeaders; |
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.http.HttpRange; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
import org.springframework.http.converter.HttpMessageConverter; |
||||||
|
import org.springframework.http.converter.StringHttpMessageConverter; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
import org.springframework.mock.web.test.MockHttpSession; |
||||||
|
import org.springframework.util.LinkedMultiValueMap; |
||||||
|
import org.springframework.util.MultiValueMap; |
||||||
|
import org.springframework.web.HttpMediaTypeNotSupportedException; |
||||||
|
|
||||||
|
import static java.nio.charset.StandardCharsets.UTF_8; |
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
* @since 5.1 |
||||||
|
*/ |
||||||
|
public class DefaultServerRequestTests { |
||||||
|
|
||||||
|
private final List<HttpMessageConverter<?>> messageConverters = Collections.singletonList( |
||||||
|
new StringHttpMessageConverter()); |
||||||
|
|
||||||
|
@Test |
||||||
|
public void method() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("HEAD", "/"); |
||||||
|
DefaultServerRequest request = |
||||||
|
new DefaultServerRequest(servletRequest, this.messageConverters); |
||||||
|
|
||||||
|
assertEquals(HttpMethod.HEAD, request.method()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void uri() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
servletRequest.setServerName("example.com"); |
||||||
|
servletRequest.setScheme("https"); |
||||||
|
servletRequest.setServerPort(443); |
||||||
|
|
||||||
|
DefaultServerRequest request = |
||||||
|
new DefaultServerRequest(servletRequest, this.messageConverters); |
||||||
|
|
||||||
|
assertEquals(URI.create("https://example.com/"), request.uri()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void uriBuilder() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/path"); |
||||||
|
servletRequest.setQueryString("a=1"); |
||||||
|
|
||||||
|
DefaultServerRequest request = |
||||||
|
new DefaultServerRequest(servletRequest, this.messageConverters); |
||||||
|
|
||||||
|
URI result = request.uriBuilder().build(); |
||||||
|
assertEquals("http", result.getScheme()); |
||||||
|
assertEquals("localhost", result.getHost()); |
||||||
|
assertEquals(-1, result.getPort()); |
||||||
|
assertEquals("/path", result.getPath()); |
||||||
|
assertEquals("a=1", result.getQuery()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void attribute() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
servletRequest.setAttribute("foo", "bar"); |
||||||
|
|
||||||
|
DefaultServerRequest request = |
||||||
|
new DefaultServerRequest(servletRequest, this.messageConverters); |
||||||
|
|
||||||
|
assertEquals(Optional.of("bar"), request.attribute("foo")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void params() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
servletRequest.setParameter("foo", "bar"); |
||||||
|
|
||||||
|
DefaultServerRequest request = |
||||||
|
new DefaultServerRequest(servletRequest, this.messageConverters); |
||||||
|
|
||||||
|
assertEquals(Optional.of("bar"), request.param("foo")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void emptyQueryParam() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
servletRequest.setParameter("foo", ""); |
||||||
|
|
||||||
|
DefaultServerRequest request = |
||||||
|
new DefaultServerRequest(servletRequest, this.messageConverters); |
||||||
|
|
||||||
|
assertEquals(Optional.of(""), request.param("foo")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void absentQueryParam() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
servletRequest.setParameter("foo", ""); |
||||||
|
|
||||||
|
DefaultServerRequest request = |
||||||
|
new DefaultServerRequest(servletRequest, this.messageConverters); |
||||||
|
|
||||||
|
assertEquals(Optional.empty(), request.param("bar")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void pathVariable() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
Map<String, String> pathVariables = Collections.singletonMap("foo", "bar"); |
||||||
|
servletRequest |
||||||
|
.setAttribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables); |
||||||
|
|
||||||
|
DefaultServerRequest request = new DefaultServerRequest(servletRequest, |
||||||
|
this.messageConverters); |
||||||
|
|
||||||
|
assertEquals("bar", request.pathVariable("foo")); |
||||||
|
} |
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class) |
||||||
|
public void pathVariableNotFound() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
Map<String, String> pathVariables = Collections.singletonMap("foo", "bar"); |
||||||
|
servletRequest |
||||||
|
.setAttribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables); |
||||||
|
|
||||||
|
DefaultServerRequest request = new DefaultServerRequest(servletRequest, |
||||||
|
this.messageConverters); |
||||||
|
|
||||||
|
request.pathVariable("baz"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void pathVariables() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
Map<String, String> pathVariables = Collections.singletonMap("foo", "bar"); |
||||||
|
servletRequest |
||||||
|
.setAttribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables); |
||||||
|
|
||||||
|
DefaultServerRequest request = new DefaultServerRequest(servletRequest, |
||||||
|
this.messageConverters); |
||||||
|
|
||||||
|
assertEquals(pathVariables, request.pathVariables()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void header() { |
||||||
|
HttpHeaders httpHeaders = new HttpHeaders(); |
||||||
|
List<MediaType> accept = |
||||||
|
Collections.singletonList(MediaType.APPLICATION_JSON); |
||||||
|
httpHeaders.setAccept(accept); |
||||||
|
List<Charset> acceptCharset = Collections.singletonList(UTF_8); |
||||||
|
httpHeaders.setAcceptCharset(acceptCharset); |
||||||
|
long contentLength = 42L; |
||||||
|
httpHeaders.setContentLength(contentLength); |
||||||
|
MediaType contentType = MediaType.TEXT_PLAIN; |
||||||
|
httpHeaders.setContentType(contentType); |
||||||
|
InetSocketAddress host = InetSocketAddress.createUnresolved("localhost", 80); |
||||||
|
httpHeaders.setHost(host); |
||||||
|
List<HttpRange> range = Collections.singletonList(HttpRange.createByteRange(0, 42)); |
||||||
|
httpHeaders.setRange(range); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
httpHeaders.forEach(servletRequest::addHeader); |
||||||
|
servletRequest.setContentType(MediaType.TEXT_PLAIN_VALUE); |
||||||
|
|
||||||
|
DefaultServerRequest request = new DefaultServerRequest(servletRequest, |
||||||
|
this.messageConverters); |
||||||
|
|
||||||
|
ServerRequest.Headers headers = request.headers(); |
||||||
|
assertEquals(accept, headers.accept()); |
||||||
|
assertEquals(acceptCharset, headers.acceptCharset()); |
||||||
|
assertEquals(OptionalLong.of(contentLength), headers.contentLength()); |
||||||
|
assertEquals(Optional.of(contentType), headers.contentType()); |
||||||
|
assertEquals(httpHeaders, headers.asHttpHeaders()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void cookies() { |
||||||
|
Cookie cookie = new Cookie("foo", "bar"); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
servletRequest.setCookies(cookie); |
||||||
|
|
||||||
|
DefaultServerRequest request = new DefaultServerRequest(servletRequest, |
||||||
|
this.messageConverters); |
||||||
|
|
||||||
|
MultiValueMap<String, Cookie> expected = new LinkedMultiValueMap<>(); |
||||||
|
expected.add("foo", cookie); |
||||||
|
|
||||||
|
assertEquals(expected, request.cookies()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void bodyClass() throws Exception { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
servletRequest.setContentType(MediaType.TEXT_PLAIN_VALUE); |
||||||
|
servletRequest.setContent("foo".getBytes(UTF_8)); |
||||||
|
|
||||||
|
DefaultServerRequest request = new DefaultServerRequest(servletRequest, |
||||||
|
this.messageConverters); |
||||||
|
|
||||||
|
String result = request.body(String.class); |
||||||
|
assertEquals("foo", result); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void bodyParameterizedTypeReference() throws Exception { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
servletRequest.setContentType(MediaType.TEXT_PLAIN_VALUE); |
||||||
|
servletRequest.setContent("foo".getBytes(UTF_8)); |
||||||
|
|
||||||
|
DefaultServerRequest request = new DefaultServerRequest(servletRequest, |
||||||
|
this.messageConverters); |
||||||
|
|
||||||
|
String result = request.body(new ParameterizedTypeReference<String>() {}); |
||||||
|
assertEquals("foo", result); |
||||||
|
} |
||||||
|
|
||||||
|
@Test(expected = HttpMediaTypeNotSupportedException.class) |
||||||
|
public void bodyUnacceptable() throws Exception { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
servletRequest.setContentType(MediaType.TEXT_PLAIN_VALUE); |
||||||
|
servletRequest.setContent("foo".getBytes(UTF_8)); |
||||||
|
|
||||||
|
DefaultServerRequest request = |
||||||
|
new DefaultServerRequest(servletRequest, Collections.emptyList()); |
||||||
|
|
||||||
|
request.body(String.class); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void session() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
MockHttpSession session = new MockHttpSession(); |
||||||
|
servletRequest.setSession(session); |
||||||
|
|
||||||
|
DefaultServerRequest request = new DefaultServerRequest(servletRequest, |
||||||
|
this.messageConverters); |
||||||
|
|
||||||
|
assertEquals(session, request.session()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void principal() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
Principal principal = new Principal() { |
||||||
|
@Override |
||||||
|
public String getName() { |
||||||
|
return "foo"; |
||||||
|
} |
||||||
|
}; |
||||||
|
servletRequest.setUserPrincipal(principal); |
||||||
|
|
||||||
|
DefaultServerRequest request = new DefaultServerRequest(servletRequest, |
||||||
|
this.messageConverters); |
||||||
|
|
||||||
|
assertEquals(principal, request.principal().get()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,327 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.net.URI; |
||||||
|
import java.time.ZonedDateTime; |
||||||
|
import java.time.format.DateTimeFormatter; |
||||||
|
import java.time.temporal.ChronoUnit; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.EnumSet; |
||||||
|
import java.util.List; |
||||||
|
import java.util.concurrent.CompletableFuture; |
||||||
|
import java.util.concurrent.CompletionStage; |
||||||
|
import javax.servlet.http.Cookie; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
import org.reactivestreams.Publisher; |
||||||
|
import reactor.core.publisher.Mono; |
||||||
|
|
||||||
|
import org.springframework.http.CacheControl; |
||||||
|
import org.springframework.http.HttpHeaders; |
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.http.HttpStatus; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
import org.springframework.http.converter.HttpMessageConverter; |
||||||
|
import org.springframework.http.converter.StringHttpMessageConverter; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletResponse; |
||||||
|
import org.springframework.util.LinkedMultiValueMap; |
||||||
|
import org.springframework.util.MultiValueMap; |
||||||
|
import org.springframework.web.servlet.ModelAndView; |
||||||
|
|
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
public class DefaultServerResponseBuilderTests { |
||||||
|
|
||||||
|
static final ServerResponse.Context EMPTY_CONTEXT = new ServerResponse.Context() { |
||||||
|
@Override |
||||||
|
public List<HttpMessageConverter<?>> messageConverters() { |
||||||
|
return Collections.emptyList(); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
@Test |
||||||
|
public void status() { |
||||||
|
ServerResponse response = ServerResponse.status(HttpStatus.CREATED).build(); |
||||||
|
assertEquals(HttpStatus.CREATED, response.statusCode()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void from() { |
||||||
|
ServerResponse other = ServerResponse.ok().header("foo", "bar").build(); |
||||||
|
ServerResponse result = ServerResponse.from(other).build(); |
||||||
|
assertEquals(HttpStatus.OK, result.statusCode()); |
||||||
|
assertEquals("bar", result.headers().getFirst("foo")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void ok() { |
||||||
|
ServerResponse response = ServerResponse.ok().build(); |
||||||
|
|
||||||
|
assertEquals(HttpStatus.OK, response.statusCode()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void created() { |
||||||
|
URI location = URI.create("http://example.com"); |
||||||
|
ServerResponse response = ServerResponse.created(location).build(); |
||||||
|
assertEquals(HttpStatus.CREATED, response.statusCode()); |
||||||
|
assertEquals(location, response.headers().getLocation()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void accepted() { |
||||||
|
ServerResponse response = ServerResponse.accepted().build(); |
||||||
|
assertEquals(HttpStatus.ACCEPTED, response.statusCode()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void noContent() { |
||||||
|
ServerResponse response = ServerResponse.noContent().build(); |
||||||
|
assertEquals(HttpStatus.NO_CONTENT, response.statusCode()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void seeOther() { |
||||||
|
URI location = URI.create("http://example.com"); |
||||||
|
ServerResponse response = ServerResponse.seeOther(location).build(); |
||||||
|
assertEquals(HttpStatus.SEE_OTHER, response.statusCode()); |
||||||
|
assertEquals(location, response.headers().getLocation()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void temporaryRedirect() { |
||||||
|
URI location = URI.create("http://example.com"); |
||||||
|
ServerResponse response = ServerResponse.temporaryRedirect(location).build(); |
||||||
|
assertEquals(HttpStatus.TEMPORARY_REDIRECT, response.statusCode()); |
||||||
|
assertEquals(location, response.headers().getLocation()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void permanentRedirect() { |
||||||
|
URI location = URI.create("http://example.com"); |
||||||
|
ServerResponse response = ServerResponse.permanentRedirect(location).build(); |
||||||
|
assertEquals(HttpStatus.PERMANENT_REDIRECT, response.statusCode()); |
||||||
|
assertEquals(location, response.headers().getLocation()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void badRequest() { |
||||||
|
ServerResponse response = ServerResponse.badRequest().build(); |
||||||
|
assertEquals(HttpStatus.BAD_REQUEST, response.statusCode()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void notFound() { |
||||||
|
ServerResponse response = ServerResponse.notFound().build(); |
||||||
|
assertEquals(HttpStatus.NOT_FOUND, response.statusCode()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void unprocessableEntity() { |
||||||
|
ServerResponse response = ServerResponse.unprocessableEntity().build(); |
||||||
|
assertEquals(HttpStatus.UNPROCESSABLE_ENTITY, response.statusCode()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void allow() { |
||||||
|
ServerResponse response = ServerResponse.ok().allow(HttpMethod.GET).build(); |
||||||
|
assertEquals(EnumSet.of(HttpMethod.GET), response.headers().getAllow()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void contentLength() { |
||||||
|
ServerResponse response = ServerResponse.ok().contentLength(42).build(); |
||||||
|
assertEquals(42L, response.headers().getContentLength()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void contentType() { |
||||||
|
ServerResponse response = ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).build(); |
||||||
|
assertEquals(MediaType.APPLICATION_JSON, response.headers().getContentType()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void eTag() { |
||||||
|
ServerResponse response = ServerResponse.ok().eTag("foo").build(); |
||||||
|
assertEquals("\"foo\"", response.headers().getETag()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void lastModified() { |
||||||
|
ZonedDateTime now = ZonedDateTime.now(); |
||||||
|
ServerResponse response = ServerResponse.ok().lastModified(now).build(); |
||||||
|
long expected = now.toInstant().toEpochMilli() / 1000; |
||||||
|
assertEquals(expected, response.headers().getLastModified() / 1000); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void cacheControlTag() { |
||||||
|
ServerResponse response = ServerResponse.ok().cacheControl(CacheControl.noCache()).build(); |
||||||
|
assertEquals("no-cache", response.headers().getCacheControl()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void varyBy() { |
||||||
|
ServerResponse response = ServerResponse.ok().varyBy("foo").build(); |
||||||
|
List<String> expected = Collections.singletonList("foo"); |
||||||
|
assertEquals(expected, response.headers().getVary()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void statusCode() { |
||||||
|
HttpStatus statusCode = HttpStatus.ACCEPTED; |
||||||
|
ServerResponse response = ServerResponse.status(statusCode).build(); |
||||||
|
assertEquals(statusCode, response.statusCode()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void headers() { |
||||||
|
HttpHeaders newHeaders = new HttpHeaders(); |
||||||
|
newHeaders.set("foo", "bar"); |
||||||
|
ServerResponse response = ServerResponse.ok() |
||||||
|
.headers(headers -> headers.addAll(newHeaders)) |
||||||
|
.build(); |
||||||
|
assertEquals(newHeaders, response.headers()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void cookies() { |
||||||
|
MultiValueMap<String, Cookie> newCookies = new LinkedMultiValueMap<>(); |
||||||
|
newCookies.add("name", new Cookie("name", "value")); |
||||||
|
ServerResponse response = ServerResponse.ok() |
||||||
|
.cookies(cookies -> cookies.addAll(newCookies)) |
||||||
|
.build(); |
||||||
|
assertEquals(newCookies, response.cookies()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void build() throws Exception { |
||||||
|
Cookie cookie = new Cookie("name", "value"); |
||||||
|
ServerResponse response = ServerResponse.status(HttpStatus.CREATED) |
||||||
|
.header("MyKey", "MyValue") |
||||||
|
.cookie(cookie) |
||||||
|
.build(); |
||||||
|
|
||||||
|
MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
MockHttpServletResponse mockResponse = new MockHttpServletResponse(); |
||||||
|
|
||||||
|
ModelAndView mav = response.writeTo(mockRequest, mockResponse, EMPTY_CONTEXT); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
assertEquals(HttpStatus.CREATED.value(), mockResponse.getStatus()); |
||||||
|
assertEquals("MyValue", mockResponse.getHeader("MyKey")); |
||||||
|
assertEquals("value", mockResponse.getCookie("name").getValue()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void notModifiedEtag() throws Exception { |
||||||
|
String etag = "\"foo\""; |
||||||
|
ServerResponse response = ServerResponse.ok() |
||||||
|
.eTag(etag) |
||||||
|
.body("bar"); |
||||||
|
|
||||||
|
MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
mockRequest.addHeader(HttpHeaders.IF_NONE_MATCH, etag); |
||||||
|
|
||||||
|
MockHttpServletResponse mockResponse = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = response.writeTo(mockRequest, mockResponse, EMPTY_CONTEXT); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
assertEquals(HttpStatus.NOT_MODIFIED.value(), mockResponse.getStatus()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void notModifiedLastModified() throws Exception { |
||||||
|
ZonedDateTime now = ZonedDateTime.now(); |
||||||
|
ZonedDateTime oneMinuteBeforeNow = now.minus(1, ChronoUnit.MINUTES); |
||||||
|
|
||||||
|
ServerResponse response = ServerResponse.ok() |
||||||
|
.lastModified(oneMinuteBeforeNow) |
||||||
|
.body("bar"); |
||||||
|
|
||||||
|
MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
mockRequest.addHeader(HttpHeaders.IF_MODIFIED_SINCE, DateTimeFormatter.RFC_1123_DATE_TIME.format(now)); |
||||||
|
|
||||||
|
MockHttpServletResponse mockResponse = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = response.writeTo(mockRequest, mockResponse, EMPTY_CONTEXT); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
assertEquals(HttpStatus.NOT_MODIFIED.value(), mockResponse.getStatus()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void body() throws Exception { |
||||||
|
String body = "foo"; |
||||||
|
ServerResponse response = ServerResponse.ok().body(body); |
||||||
|
|
||||||
|
MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
MockHttpServletResponse mockResponse = new MockHttpServletResponse(); |
||||||
|
ServerResponse.Context context = () -> Collections.singletonList(new StringHttpMessageConverter()); |
||||||
|
|
||||||
|
ModelAndView mav = response.writeTo(mockRequest, mockResponse, context); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
assertEquals(body, mockResponse.getContentAsString()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void asyncBodyCompletionStage() throws Exception { |
||||||
|
String body = "foo"; |
||||||
|
CompletionStage<String> completionStage = CompletableFuture.completedFuture(body); |
||||||
|
ServerResponse response = ServerResponse.ok().asyncBody(completionStage); |
||||||
|
|
||||||
|
MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
MockHttpServletResponse mockResponse = new MockHttpServletResponse(); |
||||||
|
mockRequest.setAsyncSupported(true); |
||||||
|
|
||||||
|
ServerResponse.Context context = () -> Collections.singletonList(new StringHttpMessageConverter()); |
||||||
|
|
||||||
|
ModelAndView mav = response.writeTo(mockRequest, mockResponse, context); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
|
||||||
|
assertEquals(body, mockResponse.getContentAsString()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void asyncBodyPublisher() throws Exception { |
||||||
|
String body = "foo"; |
||||||
|
Publisher<String> publisher = Mono.just(body); |
||||||
|
ServerResponse response = ServerResponse.ok().asyncBody(publisher); |
||||||
|
|
||||||
|
MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
MockHttpServletResponse mockResponse = new MockHttpServletResponse(); |
||||||
|
mockRequest.setAsyncSupported(true); |
||||||
|
|
||||||
|
ServerResponse.Context context = () -> Collections.singletonList(new StringHttpMessageConverter()); |
||||||
|
|
||||||
|
ModelAndView mav = response.writeTo(mockRequest, mockResponse, context); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
assertEquals(body, mockResponse.getContentAsString()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,120 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.Optional; |
||||||
|
import java.util.function.Function; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.core.io.ClassPathResource; |
||||||
|
import org.springframework.core.io.Resource; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
|
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
public class PathResourceLookupFunctionTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void normal() throws Exception { |
||||||
|
ClassPathResource location = |
||||||
|
new ClassPathResource("org/springframework/web/servlet/function/"); |
||||||
|
|
||||||
|
PathResourceLookupFunction function = |
||||||
|
new PathResourceLookupFunction("/resources/**", location); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = |
||||||
|
new MockHttpServletRequest("GET", "/resources/response.txt"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.emptyList()); |
||||||
|
|
||||||
|
Optional<Resource> result = function.apply(request); |
||||||
|
assertTrue(result.isPresent()); |
||||||
|
|
||||||
|
File expected = new ClassPathResource("response.txt", getClass()).getFile(); |
||||||
|
assertEquals(expected, result.get().getFile()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void subPath() throws Exception { |
||||||
|
ClassPathResource location = |
||||||
|
new ClassPathResource("org/springframework/web/servlet/function/"); |
||||||
|
|
||||||
|
PathResourceLookupFunction function = |
||||||
|
new PathResourceLookupFunction("/resources/**", location); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = |
||||||
|
new MockHttpServletRequest("GET", "/resources/child/response.txt"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.emptyList()); |
||||||
|
|
||||||
|
Optional<Resource> result = function.apply(request); |
||||||
|
assertTrue(result.isPresent()); |
||||||
|
|
||||||
|
File expected = |
||||||
|
new ClassPathResource("org/springframework/web/servlet/function/child/response.txt") |
||||||
|
.getFile(); |
||||||
|
assertEquals(expected, result.get().getFile()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void notFound() { |
||||||
|
ClassPathResource location = |
||||||
|
new ClassPathResource("org/springframework/web/reactive/function/server/"); |
||||||
|
|
||||||
|
PathResourceLookupFunction function = |
||||||
|
new PathResourceLookupFunction("/resources/**", location); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = |
||||||
|
new MockHttpServletRequest("GET", "/resources/foo.txt"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.emptyList()); |
||||||
|
|
||||||
|
Optional<Resource> result = function.apply(request); |
||||||
|
assertFalse(result.isPresent()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void composeResourceLookupFunction() throws Exception { |
||||||
|
ClassPathResource defaultResource = new ClassPathResource("response.txt", getClass()); |
||||||
|
|
||||||
|
Function<ServerRequest, Optional<Resource>> lookupFunction = |
||||||
|
new PathResourceLookupFunction("/resources/**", |
||||||
|
new ClassPathResource("org/springframework/web/servlet/function/")); |
||||||
|
|
||||||
|
Function<ServerRequest, Optional<Resource>> customLookupFunction = |
||||||
|
lookupFunction.andThen((Optional<Resource> optionalResource) -> { |
||||||
|
if (optionalResource.isPresent()) { |
||||||
|
return optionalResource; |
||||||
|
} |
||||||
|
else { |
||||||
|
return Optional.of(defaultResource); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/resources/foo"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.emptyList()); |
||||||
|
|
||||||
|
Optional<Resource> result = customLookupFunction.apply(request); |
||||||
|
assertTrue(result.isPresent()); |
||||||
|
|
||||||
|
assertEquals(defaultResource.getFile(), result.get().getFile()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,76 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.util.Collections; |
||||||
|
|
||||||
|
import org.junit.Before; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
|
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
public class RequestPredicateTests { |
||||||
|
|
||||||
|
private ServerRequest request; |
||||||
|
|
||||||
|
@Before |
||||||
|
public void createRequest() { |
||||||
|
this.request = new DefaultServerRequest(new MockHttpServletRequest(), |
||||||
|
Collections.emptyList()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void and() { |
||||||
|
RequestPredicate predicate1 = request -> true; |
||||||
|
RequestPredicate predicate2 = request -> true; |
||||||
|
RequestPredicate predicate3 = request -> false; |
||||||
|
|
||||||
|
assertTrue(predicate1.and(predicate2).test(request)); |
||||||
|
assertTrue(predicate2.and(predicate1).test(request)); |
||||||
|
assertFalse(predicate1.and(predicate3).test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void negate() { |
||||||
|
RequestPredicate predicate = request -> false; |
||||||
|
RequestPredicate negated = predicate.negate(); |
||||||
|
|
||||||
|
assertTrue(negated.test(request)); |
||||||
|
|
||||||
|
predicate = request -> true; |
||||||
|
negated = predicate.negate(); |
||||||
|
|
||||||
|
assertFalse(negated.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void or() { |
||||||
|
RequestPredicate predicate1 = request -> true; |
||||||
|
RequestPredicate predicate2 = request -> false; |
||||||
|
RequestPredicate predicate3 = request -> false; |
||||||
|
|
||||||
|
assertTrue(predicate1.or(predicate2).test(request)); |
||||||
|
assertTrue(predicate2.or(predicate1).test(request)); |
||||||
|
assertFalse(predicate2.or(predicate3).test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,230 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.util.Collections; |
||||||
|
import java.util.function.Function; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
import org.springframework.web.util.pattern.PathPatternParser; |
||||||
|
|
||||||
|
import static java.util.Collections.emptyList; |
||||||
|
import static org.junit.Assert.*; |
||||||
|
import static org.springframework.http.MediaType.TEXT_XML_VALUE; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
public class RequestPredicatesTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void all() { |
||||||
|
RequestPredicate predicate = RequestPredicates.all(); |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest(); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void method() { |
||||||
|
HttpMethod httpMethod = HttpMethod.GET; |
||||||
|
RequestPredicate predicate = RequestPredicates.method(httpMethod); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
servletRequest.setMethod("POST"); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void methods() { |
||||||
|
RequestPredicate predicate = RequestPredicates.methods(HttpMethod.GET, HttpMethod.HEAD); |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "http://example.com"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
servletRequest.setMethod("HEAD"); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
servletRequest.setMethod("POST"); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void allMethods() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/path"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
RequestPredicate predicate = RequestPredicates.GET("/p*"); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
predicate = RequestPredicates.HEAD("/p*"); |
||||||
|
servletRequest.setMethod("HEAD"); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
predicate = RequestPredicates.POST("/p*"); |
||||||
|
servletRequest.setMethod("POST"); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
predicate = RequestPredicates.PUT("/p*"); |
||||||
|
servletRequest.setMethod("PUT"); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
predicate = RequestPredicates.PATCH("/p*"); |
||||||
|
servletRequest.setMethod("PATCH"); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
predicate = RequestPredicates.DELETE("/p*"); |
||||||
|
servletRequest.setMethod("DELETE"); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
predicate = RequestPredicates.OPTIONS("/p*"); |
||||||
|
servletRequest.setMethod("OPTIONS"); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void path() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/path"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
RequestPredicate predicate = RequestPredicates.path("/p*"); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest("GET", "/foo"); |
||||||
|
request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void pathEncoded() { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/foo%20bar"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
RequestPredicate predicate = RequestPredicates.path("/foo bar"); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest(); |
||||||
|
request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void pathPredicates() { |
||||||
|
PathPatternParser parser = new PathPatternParser(); |
||||||
|
parser.setCaseSensitive(false); |
||||||
|
Function<String, RequestPredicate> pathPredicates = RequestPredicates.pathPredicates(parser); |
||||||
|
|
||||||
|
RequestPredicate predicate = pathPredicates.apply("/P*"); |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/path"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void headers() { |
||||||
|
String name = "MyHeader"; |
||||||
|
String value = "MyValue"; |
||||||
|
RequestPredicate predicate = |
||||||
|
RequestPredicates.headers( |
||||||
|
headers -> headers.header(name).equals(Collections.singletonList(value))); |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/path"); |
||||||
|
servletRequest.addHeader(name, value); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest(); |
||||||
|
request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void contentType() { |
||||||
|
MediaType json = MediaType.APPLICATION_JSON; |
||||||
|
RequestPredicate predicate = RequestPredicates.contentType(json); |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/path"); |
||||||
|
servletRequest.setContentType(json.toString()); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest(); |
||||||
|
request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void accept() { |
||||||
|
MediaType json = MediaType.APPLICATION_JSON; |
||||||
|
RequestPredicate predicate = RequestPredicates.accept(json); |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/path"); |
||||||
|
servletRequest.addHeader("Accept", json.toString()); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest(); |
||||||
|
servletRequest.addHeader("Accept", TEXT_XML_VALUE); |
||||||
|
request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void pathExtension() { |
||||||
|
RequestPredicate predicate = RequestPredicates.pathExtension("txt"); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/file.txt"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest("GET", "/FILE.TXT"); |
||||||
|
request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
predicate = RequestPredicates.pathExtension("bar"); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest("GET", "/file.foo"); |
||||||
|
request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void param() { |
||||||
|
RequestPredicate predicate = RequestPredicates.param("foo", "bar"); |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/path"); |
||||||
|
servletRequest.addParameter("foo", "bar"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
predicate = RequestPredicates.param("foo", s -> s.equals("bar")); |
||||||
|
assertTrue(predicate.test(request)); |
||||||
|
|
||||||
|
predicate = RequestPredicates.param("foo", "baz"); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
|
||||||
|
predicate = RequestPredicates.param("foo", s -> s.equals("baz")); |
||||||
|
assertFalse(predicate.test(request)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,136 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.file.Files; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.EnumSet; |
||||||
|
import java.util.List; |
||||||
|
import javax.servlet.ServletException; |
||||||
|
|
||||||
|
import org.junit.Before; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.core.io.ClassPathResource; |
||||||
|
import org.springframework.core.io.Resource; |
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.http.HttpStatus; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
import org.springframework.http.converter.HttpMessageConverter; |
||||||
|
import org.springframework.http.converter.ResourceHttpMessageConverter; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletResponse; |
||||||
|
import org.springframework.web.servlet.ModelAndView; |
||||||
|
|
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
public class ResourceHandlerFunctionTests { |
||||||
|
|
||||||
|
private final Resource resource = new ClassPathResource("response.txt", getClass()); |
||||||
|
|
||||||
|
private final ResourceHandlerFunction handlerFunction = new ResourceHandlerFunction(this.resource); |
||||||
|
|
||||||
|
private ServerResponse.Context context; |
||||||
|
|
||||||
|
private ResourceHttpMessageConverter messageConverter; |
||||||
|
|
||||||
|
@Before |
||||||
|
public void createContext() { |
||||||
|
this.messageConverter = new ResourceHttpMessageConverter(); |
||||||
|
this.context = new ServerResponse.Context() { |
||||||
|
@Override |
||||||
|
public List<HttpMessageConverter<?>> messageConverters() { |
||||||
|
return Collections.singletonList(messageConverter); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void get() throws IOException, ServletException { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.singletonList(messageConverter)); |
||||||
|
|
||||||
|
ServerResponse response = this.handlerFunction.handle(request); |
||||||
|
assertEquals(HttpStatus.OK, response.statusCode()); |
||||||
|
assertTrue(response instanceof EntityResponse); |
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
EntityResponse<Resource> entityResponse = (EntityResponse<Resource>) response; |
||||||
|
assertEquals(this.resource, entityResponse.entity()); |
||||||
|
|
||||||
|
MockHttpServletResponse servletResponse = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = response.writeTo(servletRequest, servletResponse, this.context); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
assertEquals(200, servletResponse.getStatus()); |
||||||
|
byte[] expectedBytes = Files.readAllBytes(this.resource.getFile().toPath()); |
||||||
|
byte[] actualBytes = servletResponse.getContentAsByteArray(); |
||||||
|
assertArrayEquals(expectedBytes, actualBytes); |
||||||
|
assertEquals(MediaType.TEXT_PLAIN_VALUE, servletResponse.getContentType()); |
||||||
|
assertEquals(this.resource.contentLength(),servletResponse.getContentLength()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void head() throws IOException, ServletException { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("HEAD", "/"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.singletonList(messageConverter)); |
||||||
|
|
||||||
|
ServerResponse response = this.handlerFunction.handle(request); |
||||||
|
assertEquals(HttpStatus.OK, response.statusCode()); |
||||||
|
assertTrue(response instanceof EntityResponse); |
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
EntityResponse<Resource> entityResponse = (EntityResponse<Resource>) response; |
||||||
|
assertEquals(this.resource.getFilename(), entityResponse.entity().getFilename()); |
||||||
|
|
||||||
|
|
||||||
|
MockHttpServletResponse servletResponse = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = response.writeTo(servletRequest, servletResponse, this.context); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
assertEquals(200, servletResponse.getStatus()); |
||||||
|
byte[] actualBytes = servletResponse.getContentAsByteArray(); |
||||||
|
assertEquals(0, actualBytes.length); |
||||||
|
assertEquals(MediaType.TEXT_PLAIN_VALUE, servletResponse.getContentType()); |
||||||
|
assertEquals(this.resource.contentLength(),servletResponse.getContentLength()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void options() throws ServletException, IOException { |
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("OPTIONS", "/"); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.singletonList(messageConverter)); |
||||||
|
|
||||||
|
ServerResponse response = this.handlerFunction.handle(request); |
||||||
|
assertEquals(HttpStatus.OK, response.statusCode()); |
||||||
|
assertEquals(EnumSet.of(HttpMethod.GET, HttpMethod.HEAD, HttpMethod.OPTIONS), response.headers().getAllow()); |
||||||
|
|
||||||
|
MockHttpServletResponse servletResponse = new MockHttpServletResponse(); |
||||||
|
ModelAndView mav = response.writeTo(servletRequest, servletResponse, this.context); |
||||||
|
assertNull(mav); |
||||||
|
|
||||||
|
assertEquals(200, servletResponse.getStatus()); |
||||||
|
assertEquals("GET,HEAD,OPTIONS", servletResponse.getHeader("Allow")); |
||||||
|
byte[] actualBytes = servletResponse.getContentAsByteArray(); |
||||||
|
assertEquals(0, actualBytes.length); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,188 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.util.Optional; |
||||||
|
import java.util.concurrent.atomic.AtomicInteger; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.core.io.ClassPathResource; |
||||||
|
import org.springframework.core.io.Resource; |
||||||
|
import org.springframework.http.HttpStatus; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
|
||||||
|
import static java.util.Collections.emptyList; |
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
public class RouterFunctionBuilderTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void route() { |
||||||
|
RouterFunction<ServerResponse> route = RouterFunctions.route() |
||||||
|
.GET("/foo", request -> ServerResponse.ok().build()) |
||||||
|
.POST("/", RequestPredicates.contentType(MediaType.TEXT_PLAIN), |
||||||
|
request -> ServerResponse.noContent().build()) |
||||||
|
.build(); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/foo"); |
||||||
|
ServerRequest fooRequest = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
Optional<Integer> responseStatus = route.route(fooRequest) |
||||||
|
.map(handlerFunction -> handle(handlerFunction, fooRequest)) |
||||||
|
.map(ServerResponse::statusCode) |
||||||
|
.map(HttpStatus::value); |
||||||
|
assertEquals(200, responseStatus.get().intValue()); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest("POST", "/"); |
||||||
|
servletRequest.setContentType("text/plain"); |
||||||
|
ServerRequest barRequest = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
responseStatus = route.route(barRequest) |
||||||
|
.map(handlerFunction -> handle(handlerFunction, barRequest)) |
||||||
|
.map(ServerResponse::statusCode) |
||||||
|
.map(HttpStatus::value); |
||||||
|
assertEquals(204, responseStatus.get().intValue()); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest("POST", "/"); |
||||||
|
ServerRequest invalidRequest = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
responseStatus = route.route(invalidRequest) |
||||||
|
.map(handlerFunction -> handle(handlerFunction, invalidRequest)) |
||||||
|
.map(ServerResponse::statusCode) |
||||||
|
.map(HttpStatus::value); |
||||||
|
|
||||||
|
assertFalse(responseStatus.isPresent()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private static ServerResponse handle(HandlerFunction<ServerResponse> handlerFunction, |
||||||
|
ServerRequest request) { |
||||||
|
try { |
||||||
|
return handlerFunction.handle(request); |
||||||
|
} |
||||||
|
catch (Exception e) { |
||||||
|
fail(e.getMessage()); |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void resources() { |
||||||
|
Resource resource = new ClassPathResource("/org/springframework/web/servlet/function/"); |
||||||
|
assertTrue(resource.exists()); |
||||||
|
|
||||||
|
RouterFunction<ServerResponse> route = RouterFunctions.route() |
||||||
|
.resources("/resources/**", resource) |
||||||
|
.build(); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = |
||||||
|
new MockHttpServletRequest("GET", "/resources/response.txt"); |
||||||
|
ServerRequest resourceRequest = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
Optional<Integer> responseStatus = route.route(resourceRequest) |
||||||
|
.map(handlerFunction -> handle(handlerFunction, resourceRequest)) |
||||||
|
.map(ServerResponse::statusCode) |
||||||
|
.map(HttpStatus::value); |
||||||
|
assertEquals(200, responseStatus.get().intValue()); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest("POST", "/resources/foo.txt"); |
||||||
|
ServerRequest invalidRequest = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
responseStatus = route.route(invalidRequest) |
||||||
|
.map(handlerFunction -> handle(handlerFunction, invalidRequest)) |
||||||
|
.map(ServerResponse::statusCode) |
||||||
|
.map(HttpStatus::value); |
||||||
|
assertFalse(responseStatus.isPresent()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void nest() { |
||||||
|
RouterFunction<ServerResponse> route = RouterFunctions.route() |
||||||
|
.path("/foo", builder -> |
||||||
|
builder.path("/bar", |
||||||
|
() -> RouterFunctions.route() |
||||||
|
.GET("/baz", request -> ServerResponse.ok().build()) |
||||||
|
.build())) |
||||||
|
.build(); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/foo/bar/baz"); |
||||||
|
ServerRequest fooRequest = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
Optional<Integer> responseStatus = route.route(fooRequest) |
||||||
|
.map(handlerFunction -> handle(handlerFunction, fooRequest)) |
||||||
|
.map(ServerResponse::statusCode) |
||||||
|
.map(HttpStatus::value); |
||||||
|
assertEquals(200, responseStatus.get().intValue()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void filters() { |
||||||
|
AtomicInteger filterCount = new AtomicInteger(); |
||||||
|
|
||||||
|
RouterFunction<ServerResponse> route = RouterFunctions.route() |
||||||
|
.GET("/foo", request -> ServerResponse.ok().build()) |
||||||
|
.GET("/bar", request -> { |
||||||
|
throw new IllegalStateException(); |
||||||
|
}) |
||||||
|
.before(request -> { |
||||||
|
int count = filterCount.getAndIncrement(); |
||||||
|
assertEquals(0, count); |
||||||
|
return request; |
||||||
|
}) |
||||||
|
.after((request, response) -> { |
||||||
|
int count = filterCount.getAndIncrement(); |
||||||
|
assertEquals(3, count); |
||||||
|
return response; |
||||||
|
}) |
||||||
|
.filter((request, next) -> { |
||||||
|
int count = filterCount.getAndIncrement(); |
||||||
|
assertEquals(1, count); |
||||||
|
ServerResponse responseMono = next.handle(request); |
||||||
|
count = filterCount.getAndIncrement(); |
||||||
|
assertEquals(2, count); |
||||||
|
return responseMono; |
||||||
|
}) |
||||||
|
.onError(IllegalStateException.class, |
||||||
|
(e, request) -> ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR) |
||||||
|
.build()) |
||||||
|
.build(); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest("GET", "/foo"); |
||||||
|
ServerRequest fooRequest = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
Optional<ServerResponse> fooResponse = route.route(fooRequest) |
||||||
|
.map(handlerFunction -> handle(handlerFunction, fooRequest)); |
||||||
|
assertEquals(4, filterCount.get()); |
||||||
|
|
||||||
|
filterCount.set(0); |
||||||
|
|
||||||
|
servletRequest = new MockHttpServletRequest("GET", "/bar"); |
||||||
|
ServerRequest barRequest = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
Optional<Integer> responseStatus = route.route(barRequest) |
||||||
|
.map(handlerFunction -> handle(handlerFunction, barRequest)) |
||||||
|
.map(ServerResponse::statusCode) |
||||||
|
.map(HttpStatus::value); |
||||||
|
assertEquals(500, responseStatus.get().intValue()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,125 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.util.Optional; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
|
||||||
|
import static java.util.Collections.emptyList; |
||||||
|
import static org.junit.Assert.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public class RouterFunctionTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void and() { |
||||||
|
HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().build(); |
||||||
|
RouterFunction<ServerResponse> routerFunction1 = request -> Optional.empty(); |
||||||
|
RouterFunction<ServerResponse> routerFunction2 = request -> Optional.of(handlerFunction); |
||||||
|
|
||||||
|
RouterFunction<ServerResponse> result = routerFunction1.and(routerFunction2); |
||||||
|
assertNotNull(result); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest(); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
Optional<HandlerFunction<ServerResponse>> resultHandlerFunction = result.route(request); |
||||||
|
assertTrue(resultHandlerFunction.isPresent()); |
||||||
|
assertEquals(handlerFunction, resultHandlerFunction.get()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void andOther() { |
||||||
|
HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().body("42"); |
||||||
|
RouterFunction<?> routerFunction1 = request -> Optional.empty(); |
||||||
|
RouterFunction<ServerResponse> routerFunction2 = request -> Optional.of(handlerFunction); |
||||||
|
|
||||||
|
RouterFunction<?> result = routerFunction1.andOther(routerFunction2); |
||||||
|
assertNotNull(result); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest(); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
Optional<? extends HandlerFunction<?>> resultHandlerFunction = result.route(request); |
||||||
|
assertTrue(resultHandlerFunction.isPresent()); |
||||||
|
assertEquals(handlerFunction, resultHandlerFunction.get()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void andRoute() { |
||||||
|
RouterFunction<ServerResponse> routerFunction1 = request -> Optional.empty(); |
||||||
|
RequestPredicate requestPredicate = request -> true; |
||||||
|
|
||||||
|
RouterFunction<ServerResponse> result = routerFunction1.andRoute(requestPredicate, this::handlerMethod); |
||||||
|
assertNotNull(result); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest(); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
Optional<? extends HandlerFunction<?>> resultHandlerFunction = result.route(request); |
||||||
|
assertTrue(resultHandlerFunction.isPresent()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
public void filter() { |
||||||
|
String string = "42"; |
||||||
|
HandlerFunction<EntityResponse<String>> handlerFunction = |
||||||
|
request -> EntityResponse.fromObject(string).build(); |
||||||
|
RouterFunction<EntityResponse<String>> routerFunction = |
||||||
|
request -> Optional.of(handlerFunction); |
||||||
|
|
||||||
|
HandlerFilterFunction<EntityResponse<String>, EntityResponse<Integer>> filterFunction = |
||||||
|
(request, next) -> { |
||||||
|
String stringResponse = next.handle(request).entity(); |
||||||
|
Integer intResponse = Integer.parseInt(stringResponse); |
||||||
|
return EntityResponse.fromObject(intResponse).build(); |
||||||
|
}; |
||||||
|
|
||||||
|
RouterFunction<EntityResponse<Integer>> result = routerFunction.filter(filterFunction); |
||||||
|
assertNotNull(result); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest(); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList()); |
||||||
|
|
||||||
|
Optional<EntityResponse<Integer>> resultHandlerFunction = result.route(request) |
||||||
|
.map(hf -> { |
||||||
|
try { |
||||||
|
return hf.handle(request); |
||||||
|
} |
||||||
|
catch (Exception e) { |
||||||
|
fail(e.getMessage()); |
||||||
|
return null; |
||||||
|
} |
||||||
|
}); |
||||||
|
assertTrue(resultHandlerFunction.isPresent()); |
||||||
|
assertEquals(42, (int)resultHandlerFunction.get().entity()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private ServerResponse handlerMethod(ServerRequest request) { |
||||||
|
return ServerResponse.ok().body("42"); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,104 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import java.util.Collections; |
||||||
|
import java.util.Optional; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.mock.web.test.MockHttpServletRequest; |
||||||
|
|
||||||
|
import static org.junit.Assert.*; |
||||||
|
import static org.mockito.Mockito.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public class RouterFunctionsTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void routeMatch() { |
||||||
|
HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().build(); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest(); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.emptyList()); |
||||||
|
RequestPredicate requestPredicate = mock(RequestPredicate.class); |
||||||
|
when(requestPredicate.test(request)).thenReturn(true); |
||||||
|
|
||||||
|
RouterFunction<ServerResponse> |
||||||
|
result = RouterFunctions.route(requestPredicate, handlerFunction); |
||||||
|
assertNotNull(result); |
||||||
|
|
||||||
|
Optional<HandlerFunction<ServerResponse>> resultHandlerFunction = result.route(request); |
||||||
|
assertTrue(resultHandlerFunction.isPresent()); |
||||||
|
assertEquals(handlerFunction, resultHandlerFunction.get()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void routeNoMatch() { |
||||||
|
HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().build(); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest(); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.emptyList()); |
||||||
|
RequestPredicate requestPredicate = mock(RequestPredicate.class); |
||||||
|
when(requestPredicate.test(request)).thenReturn(false); |
||||||
|
|
||||||
|
RouterFunction<ServerResponse> result = RouterFunctions.route(requestPredicate, handlerFunction); |
||||||
|
assertNotNull(result); |
||||||
|
|
||||||
|
Optional<HandlerFunction<ServerResponse>> resultHandlerFunction = result.route(request); |
||||||
|
assertFalse(resultHandlerFunction.isPresent()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void nestMatch() { |
||||||
|
HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().build(); |
||||||
|
RouterFunction<ServerResponse> routerFunction = request -> Optional.of(handlerFunction); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest(); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.emptyList()); |
||||||
|
RequestPredicate requestPredicate = mock(RequestPredicate.class); |
||||||
|
when(requestPredicate.nest(request)).thenReturn(Optional.of(request)); |
||||||
|
|
||||||
|
RouterFunction<ServerResponse> result = RouterFunctions.nest(requestPredicate, routerFunction); |
||||||
|
assertNotNull(result); |
||||||
|
|
||||||
|
Optional<HandlerFunction<ServerResponse>> resultHandlerFunction = result.route(request); |
||||||
|
assertTrue(resultHandlerFunction.isPresent()); |
||||||
|
assertEquals(handlerFunction, resultHandlerFunction.get()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void nestNoMatch() { |
||||||
|
HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().build(); |
||||||
|
RouterFunction<ServerResponse> routerFunction = request -> Optional.of(handlerFunction); |
||||||
|
|
||||||
|
MockHttpServletRequest servletRequest = new MockHttpServletRequest(); |
||||||
|
ServerRequest request = new DefaultServerRequest(servletRequest, Collections.emptyList()); |
||||||
|
RequestPredicate requestPredicate = mock(RequestPredicate.class); |
||||||
|
when(requestPredicate.nest(request)).thenReturn(Optional.empty()); |
||||||
|
|
||||||
|
RouterFunction<ServerResponse> result = RouterFunctions.nest(requestPredicate, routerFunction); |
||||||
|
assertNotNull(result); |
||||||
|
|
||||||
|
Optional<HandlerFunction<ServerResponse>> resultHandlerFunction = result.route(request); |
||||||
|
assertFalse(resultHandlerFunction.isPresent()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,113 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2019 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.web.servlet.function; |
||||||
|
|
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
|
||||||
|
import static org.junit.Assert.*; |
||||||
|
import static org.springframework.web.servlet.function.RequestPredicates.GET; |
||||||
|
import static org.springframework.web.servlet.function.RequestPredicates.accept; |
||||||
|
import static org.springframework.web.servlet.function.RequestPredicates.contentType; |
||||||
|
import static org.springframework.web.servlet.function.RequestPredicates.method; |
||||||
|
import static org.springframework.web.servlet.function.RequestPredicates.methods; |
||||||
|
import static org.springframework.web.servlet.function.RequestPredicates.param; |
||||||
|
import static org.springframework.web.servlet.function.RequestPredicates.path; |
||||||
|
import static org.springframework.web.servlet.function.RequestPredicates.pathExtension; |
||||||
|
import static org.springframework.web.servlet.function.RouterFunctions.route; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Arjen Poutsma |
||||||
|
*/ |
||||||
|
public class ToStringVisitorTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void nested() { |
||||||
|
HandlerFunction<ServerResponse> handler = new SimpleHandlerFunction(); |
||||||
|
RouterFunction<ServerResponse> routerFunction = route() |
||||||
|
.path("/foo", builder -> { |
||||||
|
builder.path("/bar", () -> route() |
||||||
|
.GET("/baz", handler) |
||||||
|
.build()); |
||||||
|
}) |
||||||
|
.build(); |
||||||
|
|
||||||
|
ToStringVisitor visitor = new ToStringVisitor(); |
||||||
|
routerFunction.accept(visitor); |
||||||
|
String result = visitor.toString(); |
||||||
|
|
||||||
|
String expected = "/foo => {\n" + |
||||||
|
" /bar => {\n" + |
||||||
|
" (GET && /baz) -> \n" + |
||||||
|
" }\n" + |
||||||
|
"}"; |
||||||
|
assertEquals(expected, result); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void predicates() { |
||||||
|
testPredicate(methods(HttpMethod.GET), "GET"); |
||||||
|
testPredicate(methods(HttpMethod.GET, HttpMethod.POST), "[GET, POST]"); |
||||||
|
|
||||||
|
testPredicate(path("/foo"), "/foo"); |
||||||
|
|
||||||
|
testPredicate(pathExtension("foo"), "*.foo"); |
||||||
|
|
||||||
|
testPredicate(contentType(MediaType.APPLICATION_JSON), "Content-Type: application/json"); |
||||||
|
testPredicate(contentType(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN), "Content-Type: [application/json, text/plain]"); |
||||||
|
|
||||||
|
testPredicate(accept(MediaType.APPLICATION_JSON), "Accept: application/json"); |
||||||
|
|
||||||
|
testPredicate(param("foo", "bar"), "?foo == bar"); |
||||||
|
|
||||||
|
testPredicate(method(HttpMethod.GET).and(path("/foo")), "(GET && /foo)"); |
||||||
|
|
||||||
|
testPredicate(method(HttpMethod.GET).or(path("/foo")), "(GET || /foo)"); |
||||||
|
|
||||||
|
testPredicate(method(HttpMethod.GET).negate(), "!(GET)"); |
||||||
|
|
||||||
|
testPredicate(GET("/foo") |
||||||
|
.or(contentType(MediaType.TEXT_PLAIN)) |
||||||
|
.and(accept(MediaType.APPLICATION_JSON).negate()), |
||||||
|
"(((GET && /foo) || Content-Type: text/plain) && !(Accept: application/json))"); |
||||||
|
} |
||||||
|
|
||||||
|
private void testPredicate(RequestPredicate predicate, String expected) { |
||||||
|
ToStringVisitor visitor = new ToStringVisitor(); |
||||||
|
predicate.accept(visitor); |
||||||
|
String result = visitor.toString(); |
||||||
|
|
||||||
|
assertEquals(expected, result); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private static class SimpleHandlerFunction implements HandlerFunction<ServerResponse> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public ServerResponse handle(ServerRequest request) { |
||||||
|
return ServerResponse.ok().build(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,2 @@ |
|||||||
|
Hello World |
||||||
|
This is a sample response text file. |
||||||
Loading…
Reference in new issue