Browse Source
This commit copies the MockServerRequest to the spring-test module, in the mock.web.reactive.function.server package. Issue: SPR-15530pull/1310/merge
2 changed files with 399 additions and 14 deletions
@ -0,0 +1,392 @@
@@ -0,0 +1,392 @@
|
||||
/* |
||||
* Copyright 2002-2017 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.mock.web.reactive.function.server; |
||||
|
||||
import java.net.InetSocketAddress; |
||||
import java.net.URI; |
||||
import java.nio.charset.Charset; |
||||
import java.security.Principal; |
||||
import java.util.Collections; |
||||
import java.util.LinkedHashMap; |
||||
import java.util.List; |
||||
import java.util.Locale; |
||||
import java.util.Map; |
||||
import java.util.Optional; |
||||
import java.util.OptionalLong; |
||||
import java.util.concurrent.ConcurrentHashMap; |
||||
|
||||
import reactor.core.publisher.Flux; |
||||
import reactor.core.publisher.Mono; |
||||
|
||||
import org.springframework.http.HttpHeaders; |
||||
import org.springframework.http.HttpMethod; |
||||
import org.springframework.http.HttpRange; |
||||
import org.springframework.http.MediaType; |
||||
import org.springframework.http.server.reactive.ServerHttpRequest; |
||||
import org.springframework.lang.Nullable; |
||||
import org.springframework.util.Assert; |
||||
import org.springframework.util.LinkedMultiValueMap; |
||||
import org.springframework.util.MultiValueMap; |
||||
import org.springframework.web.reactive.function.BodyExtractor; |
||||
import org.springframework.web.reactive.function.server.ServerRequest; |
||||
import org.springframework.web.server.WebSession; |
||||
|
||||
/** |
||||
* Mock implementation of {@link ServerRequest}. |
||||
* @author Arjen Poutsma |
||||
* @since 5.0 |
||||
*/ |
||||
public class MockServerRequest implements ServerRequest { |
||||
|
||||
private final HttpMethod method; |
||||
|
||||
private final URI uri; |
||||
|
||||
private final MockHeaders headers; |
||||
|
||||
private final Object body; |
||||
|
||||
private final Map<String, Object> attributes; |
||||
|
||||
private final MultiValueMap<String, String> queryParams; |
||||
|
||||
private final Map<String, String> pathVariables; |
||||
|
||||
private final WebSession session; |
||||
|
||||
private Principal principal; |
||||
|
||||
private MockServerRequest(HttpMethod method, URI uri, |
||||
MockHeaders headers, @Nullable Object body, Map<String, Object> attributes, |
||||
MultiValueMap<String, String> queryParams, |
||||
Map<String, String> pathVariables, WebSession session, Principal principal) { |
||||
|
||||
this.method = method; |
||||
this.uri = uri; |
||||
this.headers = headers; |
||||
this.body = body; |
||||
this.attributes = attributes; |
||||
this.queryParams = queryParams; |
||||
this.pathVariables = pathVariables; |
||||
this.session = session; |
||||
this.principal = principal; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public HttpMethod method() { |
||||
return this.method; |
||||
} |
||||
|
||||
@Override |
||||
public URI uri() { |
||||
return this.uri; |
||||
} |
||||
|
||||
@Override |
||||
public Headers headers() { |
||||
return this.headers; |
||||
} |
||||
|
||||
@Override |
||||
@SuppressWarnings("unchecked") |
||||
public <S> S body(BodyExtractor<S, ? super ServerHttpRequest> extractor){ |
||||
return (S) this.body; |
||||
} |
||||
|
||||
@Override |
||||
@SuppressWarnings("unchecked") |
||||
public <S> S body(BodyExtractor<S, ? super ServerHttpRequest> extractor, Map<String, Object> hints) { |
||||
return (S) this.body; |
||||
} |
||||
|
||||
@Override |
||||
@SuppressWarnings("unchecked") |
||||
public <S> Mono<S> bodyToMono(Class<? extends S> elementClass) { |
||||
return (Mono<S>) this.body; |
||||
} |
||||
|
||||
@Override |
||||
@SuppressWarnings("unchecked") |
||||
public <S> Flux<S> bodyToFlux(Class<? extends S> elementClass) { |
||||
return (Flux<S>) this.body; |
||||
} |
||||
|
||||
@SuppressWarnings("unchecked") |
||||
@Override |
||||
public <S> Optional<S> attribute(String name) { |
||||
return Optional.ofNullable((S) this.attributes.get(name)); |
||||
} |
||||
|
||||
@Override |
||||
public Map<String, Object> attributes() { |
||||
return this.attributes; |
||||
} |
||||
|
||||
@Override |
||||
public List<String> queryParams(String name) { |
||||
return Collections.unmodifiableList(this.queryParams.get(name)); |
||||
} |
||||
|
||||
@Override |
||||
public Map<String, String> pathVariables() { |
||||
return Collections.unmodifiableMap(this.pathVariables); |
||||
} |
||||
|
||||
@Override |
||||
public Mono<WebSession> session() { |
||||
return Mono.justOrEmpty(this.session); |
||||
} |
||||
|
||||
@Override |
||||
public Mono<? extends Principal> principal() { |
||||
return Mono.justOrEmpty(this.principal); |
||||
} |
||||
|
||||
public static Builder builder() { |
||||
return new BuilderImpl(); |
||||
} |
||||
|
||||
/** |
||||
* Builder for {@link MockServerRequest}. |
||||
*/ |
||||
public interface Builder { |
||||
|
||||
Builder method(HttpMethod method); |
||||
|
||||
Builder uri(URI uri); |
||||
|
||||
Builder header(String key, String value); |
||||
|
||||
Builder headers(HttpHeaders headers); |
||||
|
||||
Builder attribute(String name, Object value); |
||||
|
||||
Builder attributes(Map<String, Object> attributes); |
||||
|
||||
Builder queryParam(String key, String value); |
||||
|
||||
Builder queryParams(MultiValueMap<String, String> queryParams); |
||||
|
||||
Builder pathVariable(String key, String value); |
||||
|
||||
Builder pathVariables(Map<String, String> pathVariables); |
||||
|
||||
Builder session(WebSession session); |
||||
|
||||
Builder session(Principal principal); |
||||
|
||||
MockServerRequest body(Object body); |
||||
|
||||
MockServerRequest build(); |
||||
} |
||||
|
||||
|
||||
private static class BuilderImpl implements Builder { |
||||
|
||||
private HttpMethod method = HttpMethod.GET; |
||||
|
||||
private URI uri = URI.create("http://localhost"); |
||||
|
||||
private MockHeaders headers = new MockHeaders(new HttpHeaders()); |
||||
|
||||
private Object body; |
||||
|
||||
private Map<String, Object> attributes = new ConcurrentHashMap<>(); |
||||
|
||||
private MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>(); |
||||
|
||||
private Map<String, String> pathVariables = new LinkedHashMap<>(); |
||||
|
||||
private WebSession session; |
||||
|
||||
private Principal principal; |
||||
|
||||
@Override |
||||
public Builder method(HttpMethod method) { |
||||
Assert.notNull(method, "'method' must not be null"); |
||||
this.method = method; |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder uri(URI uri) { |
||||
Assert.notNull(uri, "'uri' must not be null"); |
||||
this.uri = uri; |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder header(String key, String value) { |
||||
Assert.notNull(key, "'key' must not be null"); |
||||
Assert.notNull(value, "'value' must not be null"); |
||||
this.headers.header(key, value); |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder headers(HttpHeaders headers) { |
||||
Assert.notNull(headers, "'headers' must not be null"); |
||||
this.headers = new MockHeaders(headers); |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder attribute(String name, Object value) { |
||||
Assert.notNull(name, "'name' must not be null"); |
||||
Assert.notNull(value, "'value' must not be null"); |
||||
this.attributes.put(name, value); |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder attributes(Map<String, Object> attributes) { |
||||
Assert.notNull(attributes, "'attributes' must not be null"); |
||||
this.attributes = attributes; |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder queryParam(String key, String value) { |
||||
Assert.notNull(key, "'key' must not be null"); |
||||
Assert.notNull(value, "'value' must not be null"); |
||||
this.queryParams.add(key, value); |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder queryParams(MultiValueMap<String, String> queryParams) { |
||||
Assert.notNull(queryParams, "'queryParams' must not be null"); |
||||
this.queryParams = queryParams; |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder pathVariable(String key, String value) { |
||||
Assert.notNull(key, "'key' must not be null"); |
||||
Assert.notNull(value, "'value' must not be null"); |
||||
this.pathVariables.put(key, value); |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder pathVariables(Map<String, String> pathVariables) { |
||||
Assert.notNull(pathVariables, "'pathVariables' must not be null"); |
||||
this.pathVariables = pathVariables; |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder session(WebSession session) { |
||||
Assert.notNull(session, "'session' must not be null"); |
||||
this.session = session; |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder session(Principal principal) { |
||||
Assert.notNull(principal, "'principal' must not be null"); |
||||
this.principal = principal; |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public MockServerRequest body(Object body) { |
||||
this.body = body; |
||||
return new MockServerRequest(this.method, this.uri, this.headers, this.body, |
||||
this.attributes, this.queryParams, this.pathVariables, this.session, |
||||
this.principal); |
||||
} |
||||
|
||||
@Override |
||||
public MockServerRequest build() { |
||||
return new MockServerRequest(this.method, this.uri, this.headers, null, |
||||
this.attributes, this.queryParams, this.pathVariables, this.session, |
||||
this.principal); |
||||
} |
||||
} |
||||
|
||||
|
||||
private static class MockHeaders implements Headers { |
||||
|
||||
private final HttpHeaders headers; |
||||
|
||||
public MockHeaders(HttpHeaders headers) { |
||||
this.headers = headers; |
||||
} |
||||
|
||||
private HttpHeaders delegate() { |
||||
return this.headers; |
||||
} |
||||
|
||||
public void header(String key, String value) { |
||||
this.headers.add(key, value); |
||||
} |
||||
|
||||
@Override |
||||
public List<MediaType> accept() { |
||||
return delegate().getAccept(); |
||||
} |
||||
|
||||
@Override |
||||
public List<Charset> acceptCharset() { |
||||
return delegate().getAcceptCharset(); |
||||
} |
||||
|
||||
@Override |
||||
public List<Locale.LanguageRange> acceptLanguage() { |
||||
return delegate().getAcceptLanguage(); |
||||
} |
||||
|
||||
@Override |
||||
public OptionalLong contentLength() { |
||||
return toOptionalLong(delegate().getContentLength()); |
||||
} |
||||
|
||||
@Override |
||||
public Optional<MediaType> contentType() { |
||||
return Optional.ofNullable(delegate().getContentType()); |
||||
} |
||||
|
||||
@Override |
||||
public InetSocketAddress host() { |
||||
return delegate().getHost(); |
||||
} |
||||
|
||||
@Override |
||||
public List<HttpRange> range() { |
||||
return delegate().getRange(); |
||||
} |
||||
|
||||
@Override |
||||
public List<String> header(String headerName) { |
||||
List<String> headerValues = delegate().get(headerName); |
||||
return headerValues != null ? headerValues : Collections.emptyList(); |
||||
} |
||||
|
||||
@Override |
||||
public HttpHeaders asHttpHeaders() { |
||||
return HttpHeaders.readOnlyHttpHeaders(delegate()); |
||||
} |
||||
|
||||
private OptionalLong toOptionalLong(long value) { |
||||
return value != -1 ? OptionalLong.of(value) : OptionalLong.empty(); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue